summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/SCsub205
-rw-r--r--editor/animation_editor.cpp4331
-rw-r--r--editor/animation_editor.h355
-rw-r--r--editor/array_property_edit.cpp310
-rw-r--r--editor/array_property_edit.h69
-rw-r--r--editor/asset_library_editor_plugin.cpp1553
-rw-r--r--editor/asset_library_editor_plugin.h342
-rw-r--r--editor/call_dialog.cpp341
-rw-r--r--editor/call_dialog.h85
-rw-r--r--editor/code_editor.cpp1323
-rw-r--r--editor/code_editor.h261
-rw-r--r--editor/collada/SCsub7
-rw-r--r--editor/collada/collada.cpp2801
-rw-r--r--editor/collada/collada.h663
-rw-r--r--editor/connections_dialog.cpp890
-rw-r--r--editor/connections_dialog.h134
-rw-r--r--editor/create_dialog.cpp961
-rw-r--r--editor/create_dialog.h147
-rw-r--r--editor/dependency_editor.cpp725
-rw-r--r--editor/dependency_editor.h147
-rw-r--r--editor/doc/SCsub7
-rw-r--r--editor/doc/doc_data.cpp1148
-rw-r--r--editor/doc/doc_data.h111
-rw-r--r--editor/doc/doc_dump.cpp313
-rw-r--r--editor/doc/doc_dump.h41
-rw-r--r--editor/doc_code_font.h32
-rw-r--r--editor/doc_font.h32
-rw-r--r--editor/doc_title_font.h32
-rw-r--r--editor/editor_asset_installer.cpp359
-rw-r--r--editor/editor_asset_installer.h56
-rw-r--r--editor/editor_audio_buses.cpp1192
-rw-r--r--editor/editor_audio_buses.h186
-rw-r--r--editor/editor_autoload_settings.cpp610
-rw-r--r--editor/editor_autoload_settings.h94
-rw-r--r--editor/editor_data.cpp979
-rw-r--r--editor/editor_data.h269
-rw-r--r--editor/editor_dir_dialog.cpp276
-rw-r--r--editor/editor_dir_dialog.h71
-rw-r--r--editor/editor_export.cpp3231
-rw-r--r--editor/editor_export.h297
-rw-r--r--editor/editor_file_dialog.cpp1531
-rw-r--r--editor/editor_file_dialog.h252
-rw-r--r--editor/editor_file_system.cpp1550
-rw-r--r--editor/editor_file_system.h231
-rw-r--r--editor/editor_fonts.cpp168
-rw-r--r--editor/editor_fonts.h36
-rw-r--r--editor/editor_help.cpp1929
-rw-r--r--editor/editor_help.h222
-rw-r--r--editor/editor_icons.h36
-rw-r--r--editor/editor_initialize_ssl.cpp51
-rw-r--r--editor/editor_initialize_ssl.h34
-rw-r--r--editor/editor_log.cpp242
-rw-r--r--editor/editor_log.h80
-rw-r--r--editor/editor_name_dialog.cpp89
-rw-r--r--editor/editor_name_dialog.h57
-rw-r--r--editor/editor_node.cpp6587
-rw-r--r--editor/editor_node.h833
-rw-r--r--editor/editor_path.cpp215
-rw-r--r--editor/editor_path.h63
-rw-r--r--editor/editor_plugin.cpp432
-rw-r--r--editor/editor_plugin.h201
-rw-r--r--editor/editor_plugin_settings.cpp216
-rw-r--r--editor/editor_plugin_settings.h62
-rw-r--r--editor/editor_profiler.cpp784
-rw-r--r--editor/editor_profiler.h173
-rw-r--r--editor/editor_reimport_dialog.cpp148
-rw-r--r--editor/editor_reimport_dialog.h53
-rw-r--r--editor/editor_resource_preview.cpp439
-rw-r--r--editor/editor_resource_preview.h134
-rw-r--r--editor/editor_run.cpp211
-rw-r--r--editor/editor_run.h67
-rw-r--r--editor/editor_run_native.cpp189
-rw-r--r--editor/editor_run_native.h69
-rw-r--r--editor/editor_run_script.cpp97
-rw-r--r--editor/editor_run_script.h55
-rw-r--r--editor/editor_scale.cpp42
-rw-r--r--editor/editor_scale.h36
-rw-r--r--editor/editor_settings.cpp1158
-rw-r--r--editor/editor_settings.h180
-rw-r--r--editor/editor_sub_scene.cpp238
-rw-r--r--editor/editor_sub_scene.h69
-rw-r--r--editor/editor_themes.cpp82
-rw-r--r--editor/editor_themes.h38
-rw-r--r--editor/file_type_cache.cpp108
-rw-r--r--editor/file_type_cache.h58
-rw-r--r--editor/fileserver/SCsub5
-rw-r--r--editor/fileserver/editor_file_server.cpp361
-rw-r--r--editor/fileserver/editor_file_server.h87
-rw-r--r--editor/filesystem_dock.cpp1891
-rw-r--r--editor/filesystem_dock.h217
-rw-r--r--editor/groups_editor.cpp188
-rw-r--r--editor/groups_editor.h70
-rw-r--r--editor/icons/2x/icon_accept_dialog.pngbin0 -> 581 bytes
-rw-r--r--editor/icons/2x/icon_add.pngbin0 -> 151 bytes
-rw-r--r--editor/icons/2x/icon_add_track.pngbin0 -> 151 bytes
-rw-r--r--editor/icons/2x/icon_anchor.pngbin0 -> 828 bytes
-rw-r--r--editor/icons/2x/icon_animated_sprite.pngbin0 -> 1212 bytes
-rw-r--r--editor/icons/2x/icon_animated_sprite_3d.pngbin0 -> 1125 bytes
-rw-r--r--editor/icons/2x/icon_animation.pngbin0 -> 912 bytes
-rw-r--r--editor/icons/2x/icon_animation_player.pngbin0 -> 174 bytes
-rw-r--r--editor/icons/2x/icon_animation_tree.pngbin0 -> 471 bytes
-rw-r--r--editor/icons/2x/icon_animation_tree_player.pngbin0 -> 471 bytes
-rw-r--r--editor/icons/2x/icon_area.pngbin0 -> 209 bytes
-rw-r--r--editor/icons/2x/icon_area_2d.pngbin0 -> 211 bytes
-rw-r--r--editor/icons/2x/icon_arrow_left.pngbin0 -> 333 bytes
-rw-r--r--editor/icons/2x/icon_arrow_right.pngbin0 -> 308 bytes
-rw-r--r--editor/icons/2x/icon_arrow_up.pngbin0 -> 293 bytes
-rw-r--r--editor/icons/2x/icon_atlas_texture.pngbin0 -> 382 bytes
-rw-r--r--editor/icons/2x/icon_audio_stream_gibberish.pngbin0 -> 437 bytes
-rw-r--r--editor/icons/2x/icon_auto_play.pngbin0 -> 699 bytes
-rw-r--r--editor/icons/2x/icon_back.pngbin0 -> 323 bytes
-rw-r--r--editor/icons/2x/icon_back_buffer_copy.pngbin0 -> 190 bytes
-rw-r--r--editor/icons/2x/icon_bake.pngbin0 -> 267 bytes
-rw-r--r--editor/icons/2x/icon_baked_light.pngbin0 -> 267 bytes
-rw-r--r--editor/icons/2x/icon_baked_light_instance.pngbin0 -> 264 bytes
-rw-r--r--editor/icons/2x/icon_baked_light_sampler.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/2x/icon_bit_map.pngbin0 -> 148 bytes
-rw-r--r--editor/icons/2x/icon_bitmap_font.pngbin0 -> 191 bytes
-rw-r--r--editor/icons/2x/icon_blend.pngbin0 -> 1091 bytes
-rw-r--r--editor/icons/2x/icon_bone.pngbin0 -> 597 bytes
-rw-r--r--editor/icons/2x/icon_bone_attachment.pngbin0 -> 576 bytes
-rw-r--r--editor/icons/2x/icon_bone_track.pngbin0 -> 565 bytes
-rw-r--r--editor/icons/2x/icon_bool.pngbin0 -> 171 bytes
-rw-r--r--editor/icons/2x/icon_box_shape.pngbin0 -> 597 bytes
-rw-r--r--editor/icons/2x/icon_button.pngbin0 -> 186 bytes
-rw-r--r--editor/icons/2x/icon_button_group.pngbin0 -> 251 bytes
-rw-r--r--editor/icons/2x/icon_camera.pngbin0 -> 352 bytes
-rw-r--r--editor/icons/2x/icon_camera_2d.pngbin0 -> 364 bytes
-rw-r--r--editor/icons/2x/icon_canvas_item.pngbin0 -> 709 bytes
-rw-r--r--editor/icons/2x/icon_canvas_item_material.pngbin0 -> 640 bytes
-rw-r--r--editor/icons/2x/icon_canvas_item_shader.pngbin0 -> 716 bytes
-rw-r--r--editor/icons/2x/icon_canvas_item_shader_graph.pngbin0 -> 707 bytes
-rw-r--r--editor/icons/2x/icon_canvas_layer.pngbin0 -> 860 bytes
-rw-r--r--editor/icons/2x/icon_canvas_modulate.pngbin0 -> 273 bytes
-rw-r--r--editor/icons/2x/icon_capsule_shape.pngbin0 -> 372 bytes
-rw-r--r--editor/icons/2x/icon_capsule_shape_2d.pngbin0 -> 552 bytes
-rw-r--r--editor/icons/2x/icon_center_container.pngbin0 -> 478 bytes
-rw-r--r--editor/icons/2x/icon_check_box.pngbin0 -> 565 bytes
-rw-r--r--editor/icons/2x/icon_check_button.pngbin0 -> 528 bytes
-rw-r--r--editor/icons/2x/icon_circle_shape_2d.pngbin0 -> 838 bytes
-rw-r--r--editor/icons/2x/icon_class_list.pngbin0 -> 192 bytes
-rw-r--r--editor/icons/2x/icon_close.pngbin0 -> 461 bytes
-rw-r--r--editor/icons/2x/icon_collapse.pngbin0 -> 383 bytes
-rw-r--r--editor/icons/2x/icon_collision_2d.pngbin0 -> 407 bytes
-rw-r--r--editor/icons/2x/icon_collision_polygon.pngbin0 -> 397 bytes
-rw-r--r--editor/icons/2x/icon_collision_polygon_2d.pngbin0 -> 407 bytes
-rw-r--r--editor/icons/2x/icon_collision_shape.pngbin0 -> 439 bytes
-rw-r--r--editor/icons/2x/icon_collision_shape_2d.pngbin0 -> 235 bytes
-rw-r--r--editor/icons/2x/icon_color.pngbin0 -> 1406 bytes
-rw-r--r--editor/icons/2x/icon_color_pick.pngbin0 -> 822 bytes
-rw-r--r--editor/icons/2x/icon_color_picker.pngbin0 -> 837 bytes
-rw-r--r--editor/icons/2x/icon_color_picker_button.pngbin0 -> 942 bytes
-rw-r--r--editor/icons/2x/icon_color_ramp.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_color_rect.pngbin0 -> 289 bytes
-rw-r--r--editor/icons/2x/icon_concave_polygon_shape.pngbin0 -> 709 bytes
-rw-r--r--editor/icons/2x/icon_concave_polygon_shape_2d.pngbin0 -> 436 bytes
-rw-r--r--editor/icons/2x/icon_cone_twist_joint.pngbin0 -> 906 bytes
-rw-r--r--editor/icons/2x/icon_confirmation_dialog.pngbin0 -> 694 bytes
-rw-r--r--editor/icons/2x/icon_connect.pngbin0 -> 251 bytes
-rw-r--r--editor/icons/2x/icon_connection_and_groups.pngbin0 -> 397 bytes
-rw-r--r--editor/icons/2x/icon_container.pngbin0 -> 319 bytes
-rw-r--r--editor/icons/2x/icon_control.pngbin0 -> 825 bytes
-rw-r--r--editor/icons/2x/icon_control_align_bottom_center.pngbin0 -> 156 bytes
-rw-r--r--editor/icons/2x/icon_control_align_bottom_left.pngbin0 -> 154 bytes
-rw-r--r--editor/icons/2x/icon_control_align_bottom_right.pngbin0 -> 155 bytes
-rw-r--r--editor/icons/2x/icon_control_align_bottom_wide.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/2x/icon_control_align_center.pngbin0 -> 171 bytes
-rw-r--r--editor/icons/2x/icon_control_align_center_left.pngbin0 -> 130 bytes
-rw-r--r--editor/icons/2x/icon_control_align_center_right.pngbin0 -> 127 bytes
-rw-r--r--editor/icons/2x/icon_control_align_left_center.pngbin0 -> 169 bytes
-rw-r--r--editor/icons/2x/icon_control_align_left_wide.pngbin0 -> 143 bytes
-rw-r--r--editor/icons/2x/icon_control_align_right_center.pngbin0 -> 171 bytes
-rw-r--r--editor/icons/2x/icon_control_align_right_wide.pngbin0 -> 144 bytes
-rw-r--r--editor/icons/2x/icon_control_align_top_center.pngbin0 -> 165 bytes
-rw-r--r--editor/icons/2x/icon_control_align_top_left.pngbin0 -> 159 bytes
-rw-r--r--editor/icons/2x/icon_control_align_top_right.pngbin0 -> 167 bytes
-rw-r--r--editor/icons/2x/icon_control_align_top_wide.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/2x/icon_control_align_wide.pngbin0 -> 145 bytes
-rw-r--r--editor/icons/2x/icon_control_hcenter_wide.pngbin0 -> 169 bytes
-rw-r--r--editor/icons/2x/icon_control_vcenter_wide.pngbin0 -> 148 bytes
-rw-r--r--editor/icons/2x/icon_convex_polygon_shape.pngbin0 -> 648 bytes
-rw-r--r--editor/icons/2x/icon_convex_polygon_shape_2d.pngbin0 -> 373 bytes
-rw-r--r--editor/icons/2x/icon_copy_node_path.pngbin0 -> 356 bytes
-rw-r--r--editor/icons/2x/icon_create_new_scene_from.pngbin0 -> 639 bytes
-rw-r--r--editor/icons/2x/icon_cube_map.pngbin0 -> 159 bytes
-rw-r--r--editor/icons/2x/icon_curve_2d.pngbin0 -> 591 bytes
-rw-r--r--editor/icons/2x/icon_curve_3d.pngbin0 -> 522 bytes
-rw-r--r--editor/icons/2x/icon_curve_close.pngbin0 -> 610 bytes
-rw-r--r--editor/icons/2x/icon_curve_constant.pngbin0 -> 162 bytes
-rw-r--r--editor/icons/2x/icon_curve_create.pngbin0 -> 698 bytes
-rw-r--r--editor/icons/2x/icon_curve_curve.pngbin0 -> 744 bytes
-rw-r--r--editor/icons/2x/icon_curve_delete.pngbin0 -> 926 bytes
-rw-r--r--editor/icons/2x/icon_curve_edit.pngbin0 -> 954 bytes
-rw-r--r--editor/icons/2x/icon_curve_in.pngbin0 -> 449 bytes
-rw-r--r--editor/icons/2x/icon_curve_in_out.pngbin0 -> 494 bytes
-rw-r--r--editor/icons/2x/icon_curve_linear.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/2x/icon_curve_out.pngbin0 -> 459 bytes
-rw-r--r--editor/icons/2x/icon_curve_out_in.pngbin0 -> 489 bytes
-rw-r--r--editor/icons/2x/icon_damped_spring_joint_2d.pngbin0 -> 496 bytes
-rw-r--r--editor/icons/2x/icon_debug_continue.pngbin0 -> 525 bytes
-rw-r--r--editor/icons/2x/icon_debug_next.pngbin0 -> 284 bytes
-rw-r--r--editor/icons/2x/icon_debug_step.pngbin0 -> 317 bytes
-rw-r--r--editor/icons/2x/icon_dependency_changed.pngbin0 -> 731 bytes
-rw-r--r--editor/icons/2x/icon_dependency_changed_hl.pngbin0 -> 601 bytes
-rw-r--r--editor/icons/2x/icon_dependency_local_changed.pngbin0 -> 1104 bytes
-rw-r--r--editor/icons/2x/icon_dependency_local_changed_hl.pngbin0 -> 926 bytes
-rw-r--r--editor/icons/2x/icon_dependency_ok.pngbin0 -> 1015 bytes
-rw-r--r--editor/icons/2x/icon_dependency_ok_hl.pngbin0 -> 836 bytes
-rw-r--r--editor/icons/2x/icon_directional_light.pngbin0 -> 756 bytes
-rw-r--r--editor/icons/2x/icon_distraction_free.pngbin0 -> 575 bytes
-rw-r--r--editor/icons/2x/icon_duplicate.pngbin0 -> 225 bytes
-rw-r--r--editor/icons/2x/icon_dynamic_font.pngbin0 -> 383 bytes
-rw-r--r--editor/icons/2x/icon_dynamic_font_data.pngbin0 -> 379 bytes
-rw-r--r--editor/icons/2x/icon_edit.pngbin0 -> 525 bytes
-rw-r--r--editor/icons/2x/icon_edit_key.pngbin0 -> 641 bytes
-rw-r--r--editor/icons/2x/icon_edit_pivot.pngbin0 -> 595 bytes
-rw-r--r--editor/icons/2x/icon_edit_resource.pngbin0 -> 396 bytes
-rw-r--r--editor/icons/2x/icon_editor_3d_handle.pngbin0 -> 705 bytes
-rw-r--r--editor/icons/2x/icon_editor_handle.pngbin0 -> 427 bytes
-rw-r--r--editor/icons/2x/icon_editor_pivot.pngbin0 -> 198 bytes
-rw-r--r--editor/icons/2x/icon_editor_plugin.pngbin0 -> 469 bytes
-rw-r--r--editor/icons/2x/icon_enum.pngbin0 -> 137 bytes
-rw-r--r--editor/icons/2x/icon_environment.pngbin0 -> 1270 bytes
-rw-r--r--editor/icons/2x/icon_error.pngbin0 -> 155 bytes
-rw-r--r--editor/icons/2x/icon_error_sign.pngbin0 -> 441 bytes
-rw-r--r--editor/icons/2x/icon_event_player.pngbin0 -> 167 bytes
-rw-r--r--editor/icons/2x/icon_favorites.pngbin0 -> 702 bytes
-rw-r--r--editor/icons/2x/icon_file.pngbin0 -> 196 bytes
-rw-r--r--editor/icons/2x/icon_file_big.pngbin0 -> 505 bytes
-rw-r--r--editor/icons/2x/icon_file_dialog.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_file_list.pngbin0 -> 137 bytes
-rw-r--r--editor/icons/2x/icon_file_server.pngbin0 -> 172 bytes
-rw-r--r--editor/icons/2x/icon_file_server_active.pngbin0 -> 173 bytes
-rw-r--r--editor/icons/2x/icon_file_thumbnail.pngbin0 -> 137 bytes
-rw-r--r--editor/icons/2x/icon_filesystem.pngbin0 -> 192 bytes
-rw-r--r--editor/icons/2x/icon_fixed_material.pngbin0 -> 736 bytes
-rw-r--r--editor/icons/2x/icon_fixed_spatial_material.pngbin0 -> 768 bytes
-rw-r--r--editor/icons/2x/icon_folder.pngbin0 -> 228 bytes
-rw-r--r--editor/icons/2x/icon_folder_big.pngbin0 -> 991 bytes
-rw-r--r--editor/icons/2x/icon_font.pngbin0 -> 369 bytes
-rw-r--r--editor/icons/2x/icon_forward.pngbin0 -> 326 bytes
-rw-r--r--editor/icons/2x/icon_g_d_script.pngbin0 -> 759 bytes
-rw-r--r--editor/icons/2x/icon_g_i_probe.pngbin0 -> 680 bytes
-rw-r--r--editor/icons/2x/icon_g_i_probe_data.pngbin0 -> 662 bytes
-rw-r--r--editor/icons/2x/icon_generic_6_d_o_f_joint.pngbin0 -> 535 bytes
-rw-r--r--editor/icons/2x/icon_gizmo_directional_light.pngbin0 -> 8264 bytes
-rw-r--r--editor/icons/2x/icon_gizmo_light.pngbin0 -> 6282 bytes
-rw-r--r--editor/icons/2x/icon_gizmo_listener.pngbin0 -> 7636 bytes
-rw-r--r--editor/icons/2x/icon_gizmo_spatial_sample_player.pngbin0 -> 2831 bytes
-rw-r--r--editor/icons/2x/icon_gizmo_spatial_stream_player.pngbin0 -> 3649 bytes
-rw-r--r--editor/icons/2x/icon_godot.pngbin0 -> 1842 bytes
-rw-r--r--editor/icons/2x/icon_graph_color_ramp.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_graph_comment.pngbin0 -> 152 bytes
-rw-r--r--editor/icons/2x/icon_graph_cube_uniform.pngbin0 -> 795 bytes
-rw-r--r--editor/icons/2x/icon_graph_curve_map.pngbin0 -> 587 bytes
-rw-r--r--editor/icons/2x/icon_graph_default_texture.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/2x/icon_graph_edit.pngbin0 -> 815 bytes
-rw-r--r--editor/icons/2x/icon_graph_input.pngbin0 -> 521 bytes
-rw-r--r--editor/icons/2x/icon_graph_node.pngbin0 -> 710 bytes
-rw-r--r--editor/icons/2x/icon_graph_rgb.pngbin0 -> 951 bytes
-rw-r--r--editor/icons/2x/icon_graph_rgb_op.pngbin0 -> 219 bytes
-rw-r--r--editor/icons/2x/icon_graph_rgb_uniform.pngbin0 -> 696 bytes
-rw-r--r--editor/icons/2x/icon_graph_scalar.pngbin0 -> 461 bytes
-rw-r--r--editor/icons/2x/icon_graph_scalar_interp.pngbin0 -> 307 bytes
-rw-r--r--editor/icons/2x/icon_graph_scalar_op.pngbin0 -> 390 bytes
-rw-r--r--editor/icons/2x/icon_graph_scalar_uniform.pngbin0 -> 570 bytes
-rw-r--r--editor/icons/2x/icon_graph_scalars_to_vec.pngbin0 -> 255 bytes
-rw-r--r--editor/icons/2x/icon_graph_texscreen.pngbin0 -> 217 bytes
-rw-r--r--editor/icons/2x/icon_graph_texture_uniform.pngbin0 -> 394 bytes
-rw-r--r--editor/icons/2x/icon_graph_time.pngbin0 -> 819 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_dp.pngbin0 -> 482 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_interp.pngbin0 -> 307 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_length.pngbin0 -> 513 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_op.pngbin0 -> 387 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_scalar_op.pngbin0 -> 431 bytes
-rw-r--r--editor/icons/2x/icon_graph_vec_to_scalars.pngbin0 -> 257 bytes
-rw-r--r--editor/icons/2x/icon_graph_vecs_to_xform.pngbin0 -> 282 bytes
-rw-r--r--editor/icons/2x/icon_graph_vector.pngbin0 -> 620 bytes
-rw-r--r--editor/icons/2x/icon_graph_vector_uniform.pngbin0 -> 718 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform.pngbin0 -> 380 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_mult.pngbin0 -> 321 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_scalar_func.pngbin0 -> 467 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_to_vecs.pngbin0 -> 277 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_uniform.pngbin0 -> 526 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_vec_func.pngbin0 -> 476 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_vec_imult.pngbin0 -> 601 bytes
-rw-r--r--editor/icons/2x/icon_graph_xform_vec_mult.pngbin0 -> 600 bytes
-rw-r--r--editor/icons/2x/icon_grid.pngbin0 -> 194 bytes
-rw-r--r--editor/icons/2x/icon_grid_container.pngbin0 -> 329 bytes
-rw-r--r--editor/icons/2x/icon_grid_map.pngbin0 -> 138 bytes
-rw-r--r--editor/icons/2x/icon_groove_joint_2d.pngbin0 -> 179 bytes
-rw-r--r--editor/icons/2x/icon_group.pngbin0 -> 207 bytes
-rw-r--r--editor/icons/2x/icon_groups.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/2x/icon_h_box_container.pngbin0 -> 307 bytes
-rw-r--r--editor/icons/2x/icon_h_button_array.pngbin0 -> 224 bytes
-rw-r--r--editor/icons/2x/icon_h_scroll_bar.pngbin0 -> 324 bytes
-rw-r--r--editor/icons/2x/icon_h_separator.pngbin0 -> 148 bytes
-rw-r--r--editor/icons/2x/icon_h_slider.pngbin0 -> 360 bytes
-rw-r--r--editor/icons/2x/icon_h_split_container.pngbin0 -> 399 bytes
-rw-r--r--editor/icons/2x/icon_h_t_t_p_request.pngbin0 -> 425 bytes
-rw-r--r--editor/icons/2x/icon_headphones.pngbin0 -> 620 bytes
-rw-r--r--editor/icons/2x/icon_help.pngbin0 -> 1126 bytes
-rw-r--r--editor/icons/2x/icon_hidden.pngbin0 -> 640 bytes
-rw-r--r--editor/icons/2x/icon_hinge_joint.pngbin0 -> 663 bytes
-rw-r--r--editor/icons/2x/icon_history.pngbin0 -> 814 bytes
-rw-r--r--editor/icons/2x/icon_hsize.pngbin0 -> 247 bytes
-rw-r--r--editor/icons/2x/icon_image.pngbin0 -> 404 bytes
-rw-r--r--editor/icons/2x/icon_image_sky_box.pngbin0 -> 904 bytes
-rw-r--r--editor/icons/2x/icon_image_texture.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/2x/icon_immediate_geometry.pngbin0 -> 706 bytes
-rw-r--r--editor/icons/2x/icon_import_check.pngbin0 -> 386 bytes
-rw-r--r--editor/icons/2x/icon_import_fail.pngbin0 -> 464 bytes
-rw-r--r--editor/icons/2x/icon_instance.pngbin0 -> 817 bytes
-rw-r--r--editor/icons/2x/icon_instance_options.pngbin0 -> 708 bytes
-rw-r--r--editor/icons/2x/icon_integer.pngbin0 -> 147 bytes
-rw-r--r--editor/icons/2x/icon_interp_cubic.pngbin0 -> 483 bytes
-rw-r--r--editor/icons/2x/icon_interp_linear.pngbin0 -> 398 bytes
-rw-r--r--editor/icons/2x/icon_interp_raw.pngbin0 -> 221 bytes
-rw-r--r--editor/icons/2x/icon_interp_wrap_clamp.pngbin0 -> 348 bytes
-rw-r--r--editor/icons/2x/icon_interp_wrap_loop.pngbin0 -> 548 bytes
-rw-r--r--editor/icons/2x/icon_interpolated_camera.pngbin0 -> 454 bytes
-rw-r--r--editor/icons/2x/icon_invalid_key.pngbin0 -> 385 bytes
-rw-r--r--editor/icons/2x/icon_inverse_kinematics.pngbin0 -> 459 bytes
-rw-r--r--editor/icons/2x/icon_item_list.pngbin0 -> 338 bytes
-rw-r--r--editor/icons/2x/icon_joy_axis.pngbin0 -> 425 bytes
-rw-r--r--editor/icons/2x/icon_joy_button.pngbin0 -> 499 bytes
-rw-r--r--editor/icons/2x/icon_joypad.pngbin0 -> 380 bytes
-rw-r--r--editor/icons/2x/icon_key.pngbin0 -> 572 bytes
-rw-r--r--editor/icons/2x/icon_key_hover.pngbin0 -> 376 bytes
-rw-r--r--editor/icons/2x/icon_key_invalid.pngbin0 -> 385 bytes
-rw-r--r--editor/icons/2x/icon_key_next.pngbin0 -> 579 bytes
-rw-r--r--editor/icons/2x/icon_key_selected.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/2x/icon_key_value.pngbin0 -> 380 bytes
-rw-r--r--editor/icons/2x/icon_key_xform.pngbin0 -> 388 bytes
-rw-r--r--editor/icons/2x/icon_keyboard.pngbin0 -> 486 bytes
-rw-r--r--editor/icons/2x/icon_kinematic_body.pngbin0 -> 197 bytes
-rw-r--r--editor/icons/2x/icon_kinematic_body_2d.pngbin0 -> 204 bytes
-rw-r--r--editor/icons/2x/icon_label.pngbin0 -> 370 bytes
-rw-r--r--editor/icons/2x/icon_large_texture.pngbin0 -> 211 bytes
-rw-r--r--editor/icons/2x/icon_light_2d.pngbin0 -> 669 bytes
-rw-r--r--editor/icons/2x/icon_light_occluder_2d.pngbin0 -> 175 bytes
-rw-r--r--editor/icons/2x/icon_line_2d.pngbin0 -> 795 bytes
-rw-r--r--editor/icons/2x/icon_line_edit.pngbin0 -> 323 bytes
-rw-r--r--editor/icons/2x/icon_line_shape_2d.pngbin0 -> 597 bytes
-rw-r--r--editor/icons/2x/icon_link_button.pngbin0 -> 774 bytes
-rw-r--r--editor/icons/2x/icon_list_select.pngbin0 -> 653 bytes
-rw-r--r--editor/icons/2x/icon_listener.pngbin0 -> 885 bytes
-rw-r--r--editor/icons/2x/icon_load.pngbin0 -> 523 bytes
-rw-r--r--editor/icons/2x/icon_lock.pngbin0 -> 441 bytes
-rw-r--r--editor/icons/2x/icon_loop.pngbin0 -> 806 bytes
-rw-r--r--editor/icons/2x/icon_loop_interpolation.pngbin0 -> 709 bytes
-rw-r--r--editor/icons/2x/icon_main_play.pngbin0 -> 359 bytes
-rw-r--r--editor/icons/2x/icon_main_stop.pngbin0 -> 197 bytes
-rw-r--r--editor/icons/2x/icon_margin_container.pngbin0 -> 365 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_cube.pngbin0 -> 562 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_cube_off.pngbin0 -> 598 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_light_1.pngbin0 -> 724 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_light_1_off.pngbin0 -> 596 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_light_2.pngbin0 -> 740 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_light_2_off.pngbin0 -> 843 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_sphere.pngbin0 -> 704 bytes
-rw-r--r--editor/icons/2x/icon_material_preview_sphere_off.pngbin0 -> 518 bytes
-rw-r--r--editor/icons/2x/icon_material_shader.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_material_shader_graph.pngbin0 -> 707 bytes
-rw-r--r--editor/icons/2x/icon_matrix.pngbin0 -> 185 bytes
-rw-r--r--editor/icons/2x/icon_menu_button.pngbin0 -> 296 bytes
-rw-r--r--editor/icons/2x/icon_mesh.pngbin0 -> 582 bytes
-rw-r--r--editor/icons/2x/icon_mesh_instance.pngbin0 -> 563 bytes
-rw-r--r--editor/icons/2x/icon_mesh_library.pngbin0 -> 631 bytes
-rw-r--r--editor/icons/2x/icon_mini_aabb.pngbin0 -> 695 bytes
-rw-r--r--editor/icons/2x/icon_mini_array.pngbin0 -> 326 bytes
-rw-r--r--editor/icons/2x/icon_mini_boolean.pngbin0 -> 434 bytes
-rw-r--r--editor/icons/2x/icon_mini_color.pngbin0 -> 411 bytes
-rw-r--r--editor/icons/2x/icon_mini_color_array.pngbin0 -> 445 bytes
-rw-r--r--editor/icons/2x/icon_mini_dictionary.pngbin0 -> 371 bytes
-rw-r--r--editor/icons/2x/icon_mini_float.pngbin0 -> 355 bytes
-rw-r--r--editor/icons/2x/icon_mini_float_array.pngbin0 -> 451 bytes
-rw-r--r--editor/icons/2x/icon_mini_image.pngbin0 -> 450 bytes
-rw-r--r--editor/icons/2x/icon_mini_input.pngbin0 -> 409 bytes
-rw-r--r--editor/icons/2x/icon_mini_int_array.pngbin0 -> 384 bytes
-rw-r--r--editor/icons/2x/icon_mini_integer.pngbin0 -> 367 bytes
-rw-r--r--editor/icons/2x/icon_mini_matrix3.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/2x/icon_mini_matrix32.pngbin0 -> 573 bytes
-rw-r--r--editor/icons/2x/icon_mini_object.pngbin0 -> 507 bytes
-rw-r--r--editor/icons/2x/icon_mini_path.pngbin0 -> 435 bytes
-rw-r--r--editor/icons/2x/icon_mini_plane.pngbin0 -> 424 bytes
-rw-r--r--editor/icons/2x/icon_mini_quat.pngbin0 -> 509 bytes
-rw-r--r--editor/icons/2x/icon_mini_raw_array.pngbin0 -> 382 bytes
-rw-r--r--editor/icons/2x/icon_mini_rect2.pngbin0 -> 431 bytes
-rw-r--r--editor/icons/2x/icon_mini_rid.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/2x/icon_mini_string.pngbin0 -> 437 bytes
-rw-r--r--editor/icons/2x/icon_mini_string_array.pngbin0 -> 479 bytes
-rw-r--r--editor/icons/2x/icon_mini_transform.pngbin0 -> 539 bytes
-rw-r--r--editor/icons/2x/icon_mini_variant.pngbin0 -> 405 bytes
-rw-r--r--editor/icons/2x/icon_mini_vector2.pngbin0 -> 541 bytes
-rw-r--r--editor/icons/2x/icon_mini_vector2_array.pngbin0 -> 485 bytes
-rw-r--r--editor/icons/2x/icon_mini_vector3.pngbin0 -> 509 bytes
-rw-r--r--editor/icons/2x/icon_mini_vector3_array.pngbin0 -> 416 bytes
-rw-r--r--editor/icons/2x/icon_mirror_x.pngbin0 -> 247 bytes
-rw-r--r--editor/icons/2x/icon_mirror_y.pngbin0 -> 240 bytes
-rw-r--r--editor/icons/2x/icon_mouse.pngbin0 -> 476 bytes
-rw-r--r--editor/icons/2x/icon_move_down.pngbin0 -> 357 bytes
-rw-r--r--editor/icons/2x/icon_move_point.pngbin0 -> 1205 bytes
-rw-r--r--editor/icons/2x/icon_move_up.pngbin0 -> 346 bytes
-rw-r--r--editor/icons/2x/icon_multi_edit.pngbin0 -> 558 bytes
-rw-r--r--editor/icons/2x/icon_multi_line.pngbin0 -> 166 bytes
-rw-r--r--editor/icons/2x/icon_multi_mesh.pngbin0 -> 591 bytes
-rw-r--r--editor/icons/2x/icon_multi_mesh_instance.pngbin0 -> 653 bytes
-rw-r--r--editor/icons/2x/icon_multi_node_edit.pngbin0 -> 558 bytes
-rw-r--r--editor/icons/2x/icon_navigation.pngbin0 -> 534 bytes
-rw-r--r--editor/icons/2x/icon_navigation_2d.pngbin0 -> 558 bytes
-rw-r--r--editor/icons/2x/icon_navigation_mesh.pngbin0 -> 806 bytes
-rw-r--r--editor/icons/2x/icon_navigation_mesh_instance.pngbin0 -> 867 bytes
-rw-r--r--editor/icons/2x/icon_navigation_polygon.pngbin0 -> 640 bytes
-rw-r--r--editor/icons/2x/icon_navigation_polygon_instance.pngbin0 -> 712 bytes
-rw-r--r--editor/icons/2x/icon_new.pngbin0 -> 196 bytes
-rw-r--r--editor/icons/2x/icon_nine_patch_rect.pngbin0 -> 162 bytes
-rw-r--r--editor/icons/2x/icon_node.pngbin0 -> 788 bytes
-rw-r--r--editor/icons/2x/icon_node_2d.pngbin0 -> 864 bytes
-rw-r--r--editor/icons/2x/icon_node_warning.pngbin0 -> 443 bytes
-rw-r--r--editor/icons/2x/icon_non_favorite.pngbin0 -> 946 bytes
-rw-r--r--editor/icons/2x/icon_object.pngbin0 -> 500 bytes
-rw-r--r--editor/icons/2x/icon_occluder_polygon_2d.pngbin0 -> 384 bytes
-rw-r--r--editor/icons/2x/icon_omni_light.pngbin0 -> 659 bytes
-rw-r--r--editor/icons/2x/icon_open.pngbin0 -> 228 bytes
-rw-r--r--editor/icons/2x/icon_option_button.pngbin0 -> 366 bytes
-rw-r--r--editor/icons/2x/icon_override.pngbin0 -> 488 bytes
-rw-r--r--editor/icons/2x/icon_p_hash_translation.pngbin0 -> 285 bytes
-rw-r--r--editor/icons/2x/icon_packed_data_container.pngbin0 -> 253 bytes
-rw-r--r--editor/icons/2x/icon_packed_scene.pngbin0 -> 569 bytes
-rw-r--r--editor/icons/2x/icon_panel.pngbin0 -> 277 bytes
-rw-r--r--editor/icons/2x/icon_panel_container.pngbin0 -> 309 bytes
-rw-r--r--editor/icons/2x/icon_panels_1.pngbin0 -> 117 bytes
-rw-r--r--editor/icons/2x/icon_panels_2.pngbin0 -> 127 bytes
-rw-r--r--editor/icons/2x/icon_panels_2_alt.pngbin0 -> 134 bytes
-rw-r--r--editor/icons/2x/icon_panels_3.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/2x/icon_panels_3_alt.pngbin0 -> 152 bytes
-rw-r--r--editor/icons/2x/icon_panels_4.pngbin0 -> 136 bytes
-rw-r--r--editor/icons/2x/icon_parallax_background.pngbin0 -> 335 bytes
-rw-r--r--editor/icons/2x/icon_parallax_layer.pngbin0 -> 469 bytes
-rw-r--r--editor/icons/2x/icon_particle_attractor_2d.pngbin0 -> 1578 bytes
-rw-r--r--editor/icons/2x/icon_particles.pngbin0 -> 686 bytes
-rw-r--r--editor/icons/2x/icon_particles_2d.pngbin0 -> 728 bytes
-rw-r--r--editor/icons/2x/icon_particles_shader.pngbin0 -> 657 bytes
-rw-r--r--editor/icons/2x/icon_patch_9_rect.pngbin0 -> 162 bytes
-rw-r--r--editor/icons/2x/icon_path.pngbin0 -> 666 bytes
-rw-r--r--editor/icons/2x/icon_path_2d.pngbin0 -> 687 bytes
-rw-r--r--editor/icons/2x/icon_path_follow.pngbin0 -> 725 bytes
-rw-r--r--editor/icons/2x/icon_path_follow_2d.pngbin0 -> 725 bytes
-rw-r--r--editor/icons/2x/icon_pause.pngbin0 -> 194 bytes
-rw-r--r--editor/icons/2x/icon_pin.pngbin0 -> 322 bytes
-rw-r--r--editor/icons/2x/icon_pin_joint.pngbin0 -> 686 bytes
-rw-r--r--editor/icons/2x/icon_pin_joint_2d.pngbin0 -> 719 bytes
-rw-r--r--editor/icons/2x/icon_pin_pressed.pngbin0 -> 322 bytes
-rw-r--r--editor/icons/2x/icon_plane.pngbin0 -> 306 bytes
-rw-r--r--editor/icons/2x/icon_plane_shape.pngbin0 -> 316 bytes
-rw-r--r--editor/icons/2x/icon_play.pngbin0 -> 395 bytes
-rw-r--r--editor/icons/2x/icon_play_backwards.pngbin0 -> 424 bytes
-rw-r--r--editor/icons/2x/icon_play_custom.pngbin0 -> 572 bytes
-rw-r--r--editor/icons/2x/icon_play_scene.pngbin0 -> 686 bytes
-rw-r--r--editor/icons/2x/icon_play_start.pngbin0 -> 463 bytes
-rw-r--r--editor/icons/2x/icon_play_start_backwards.pngbin0 -> 497 bytes
-rw-r--r--editor/icons/2x/icon_polygon_2d.pngbin0 -> 407 bytes
-rw-r--r--editor/icons/2x/icon_polygon_path_finder.pngbin0 -> 491 bytes
-rw-r--r--editor/icons/2x/icon_popup.pngbin0 -> 329 bytes
-rw-r--r--editor/icons/2x/icon_popup_dialog.pngbin0 -> 347 bytes
-rw-r--r--editor/icons/2x/icon_popup_menu.pngbin0 -> 301 bytes
-rw-r--r--editor/icons/2x/icon_popup_panel.pngbin0 -> 279 bytes
-rw-r--r--editor/icons/2x/icon_portal.pngbin0 -> 855 bytes
-rw-r--r--editor/icons/2x/icon_position_2d.pngbin0 -> 152 bytes
-rw-r--r--editor/icons/2x/icon_position_3d.pngbin0 -> 151 bytes
-rw-r--r--editor/icons/2x/icon_progress_1.pngbin0 -> 781 bytes
-rw-r--r--editor/icons/2x/icon_progress_2.pngbin0 -> 785 bytes
-rw-r--r--editor/icons/2x/icon_progress_3.pngbin0 -> 800 bytes
-rw-r--r--editor/icons/2x/icon_progress_4.pngbin0 -> 808 bytes
-rw-r--r--editor/icons/2x/icon_progress_5.pngbin0 -> 807 bytes
-rw-r--r--editor/icons/2x/icon_progress_6.pngbin0 -> 793 bytes
-rw-r--r--editor/icons/2x/icon_progress_7.pngbin0 -> 815 bytes
-rw-r--r--editor/icons/2x/icon_progress_8.pngbin0 -> 791 bytes
-rw-r--r--editor/icons/2x/icon_progress_bar.pngbin0 -> 328 bytes
-rw-r--r--editor/icons/2x/icon_proximity_group.pngbin0 -> 326 bytes
-rw-r--r--editor/icons/2x/icon_quad.pngbin0 -> 289 bytes
-rw-r--r--editor/icons/2x/icon_quat.pngbin0 -> 668 bytes
-rw-r--r--editor/icons/2x/icon_range.pngbin0 -> 177 bytes
-rw-r--r--editor/icons/2x/icon_rating_no_star.pngbin0 -> 1077 bytes
-rw-r--r--editor/icons/2x/icon_rating_star.pngbin0 -> 696 bytes
-rw-r--r--editor/icons/2x/icon_ray_cast.pngbin0 -> 308 bytes
-rw-r--r--editor/icons/2x/icon_ray_cast_2d.pngbin0 -> 337 bytes
-rw-r--r--editor/icons/2x/icon_ray_shape.pngbin0 -> 541 bytes
-rw-r--r--editor/icons/2x/icon_ray_shape_2d.pngbin0 -> 330 bytes
-rw-r--r--editor/icons/2x/icon_rayito.pngbin0 -> 449 bytes
-rw-r--r--editor/icons/2x/icon_real.pngbin0 -> 423 bytes
-rw-r--r--editor/icons/2x/icon_rectangle_shape_2d.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/2x/icon_reference_rect.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/2x/icon_reflection_probe.pngbin0 -> 533 bytes
-rw-r--r--editor/icons/2x/icon_region_edit.pngbin0 -> 158 bytes
-rw-r--r--editor/icons/2x/icon_reload.pngbin0 -> 786 bytes
-rw-r--r--editor/icons/2x/icon_reload_small.pngbin0 -> 756 bytes
-rw-r--r--editor/icons/2x/icon_remote.pngbin0 -> 824 bytes
-rw-r--r--editor/icons/2x/icon_remote_transform.pngbin0 -> 1140 bytes
-rw-r--r--editor/icons/2x/icon_remote_transform_2d.pngbin0 -> 1197 bytes
-rw-r--r--editor/icons/2x/icon_remove.pngbin0 -> 271 bytes
-rw-r--r--editor/icons/2x/icon_rename.pngbin0 -> 215 bytes
-rw-r--r--editor/icons/2x/icon_reparent.pngbin0 -> 741 bytes
-rw-r--r--editor/icons/2x/icon_resource_preloader.pngbin0 -> 609 bytes
-rw-r--r--editor/icons/2x/icon_rich_text_label.pngbin0 -> 313 bytes
-rw-r--r--editor/icons/2x/icon_rigid_body.pngbin0 -> 1139 bytes
-rw-r--r--editor/icons/2x/icon_rigid_body_2d.pngbin0 -> 1206 bytes
-rw-r--r--editor/icons/2x/icon_room.pngbin0 -> 567 bytes
-rw-r--r--editor/icons/2x/icon_room_bounds.pngbin0 -> 631 bytes
-rw-r--r--editor/icons/2x/icon_rotate_0.pngbin0 -> 878 bytes
-rw-r--r--editor/icons/2x/icon_rotate_180.pngbin0 -> 713 bytes
-rw-r--r--editor/icons/2x/icon_rotate_270.pngbin0 -> 666 bytes
-rw-r--r--editor/icons/2x/icon_rotate_90.pngbin0 -> 805 bytes
-rw-r--r--editor/icons/2x/icon_sample.pngbin0 -> 197 bytes
-rw-r--r--editor/icons/2x/icon_sample_library.pngbin0 -> 568 bytes
-rw-r--r--editor/icons/2x/icon_sample_player.pngbin0 -> 345 bytes
-rw-r--r--editor/icons/2x/icon_sample_player_2d.pngbin0 -> 376 bytes
-rw-r--r--editor/icons/2x/icon_save.pngbin0 -> 466 bytes
-rw-r--r--editor/icons/2x/icon_script.pngbin0 -> 465 bytes
-rw-r--r--editor/icons/2x/icon_script_create.pngbin0 -> 491 bytes
-rw-r--r--editor/icons/2x/icon_script_remove.pngbin0 -> 787 bytes
-rw-r--r--editor/icons/2x/icon_scroll_bar.pngbin0 -> 324 bytes
-rw-r--r--editor/icons/2x/icon_scroll_container.pngbin0 -> 483 bytes
-rw-r--r--editor/icons/2x/icon_segment_shape_2d.pngbin0 -> 320 bytes
-rw-r--r--editor/icons/2x/icon_shader.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_shader_material.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_short_cut.pngbin0 -> 473 bytes
-rw-r--r--editor/icons/2x/icon_signal.pngbin0 -> 327 bytes
-rw-r--r--editor/icons/2x/icon_skeleton.pngbin0 -> 649 bytes
-rw-r--r--editor/icons/2x/icon_slider_joint.pngbin0 -> 180 bytes
-rw-r--r--editor/icons/2x/icon_slot.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/2x/icon_snap.pngbin0 -> 424 bytes
-rw-r--r--editor/icons/2x/icon_sound_room_params.pngbin0 -> 375 bytes
-rw-r--r--editor/icons/2x/icon_spatial.pngbin0 -> 835 bytes
-rw-r--r--editor/icons/2x/icon_spatial_sample_player.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/2x/icon_spatial_shader.pngbin0 -> 704 bytes
-rw-r--r--editor/icons/2x/icon_spatial_stream_player.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/2x/icon_sphere_shape.pngbin0 -> 712 bytes
-rw-r--r--editor/icons/2x/icon_spin_box.pngbin0 -> 436 bytes
-rw-r--r--editor/icons/2x/icon_spot_light.pngbin0 -> 669 bytes
-rw-r--r--editor/icons/2x/icon_sprite.pngbin0 -> 841 bytes
-rw-r--r--editor/icons/2x/icon_sprite_3d.pngbin0 -> 838 bytes
-rw-r--r--editor/icons/2x/icon_sprite_frames.pngbin0 -> 691 bytes
-rw-r--r--editor/icons/2x/icon_static_body.pngbin0 -> 397 bytes
-rw-r--r--editor/icons/2x/icon_static_body_2d.pngbin0 -> 417 bytes
-rw-r--r--editor/icons/2x/icon_stream_player.pngbin0 -> 263 bytes
-rw-r--r--editor/icons/2x/icon_string.pngbin0 -> 217 bytes
-rw-r--r--editor/icons/2x/icon_style_box_empty.pngbin0 -> 555 bytes
-rw-r--r--editor/icons/2x/icon_style_box_flat.pngbin0 -> 695 bytes
-rw-r--r--editor/icons/2x/icon_style_box_texture.pngbin0 -> 693 bytes
-rw-r--r--editor/icons/2x/icon_tab_container.pngbin0 -> 334 bytes
-rw-r--r--editor/icons/2x/icon_tabs.pngbin0 -> 222 bytes
-rw-r--r--editor/icons/2x/icon_test_cube.pngbin0 -> 596 bytes
-rw-r--r--editor/icons/2x/icon_text_edit.pngbin0 -> 329 bytes
-rw-r--r--editor/icons/2x/icon_texture.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/2x/icon_texture_button.pngbin0 -> 190 bytes
-rw-r--r--editor/icons/2x/icon_texture_progress.pngbin0 -> 344 bytes
-rw-r--r--editor/icons/2x/icon_texture_rect.pngbin0 -> 201 bytes
-rw-r--r--editor/icons/2x/icon_theme.pngbin0 -> 809 bytes
-rw-r--r--editor/icons/2x/icon_tile_map.pngbin0 -> 139 bytes
-rw-r--r--editor/icons/2x/icon_tile_set.pngbin0 -> 242 bytes
-rw-r--r--editor/icons/2x/icon_timer.pngbin0 -> 909 bytes
-rw-r--r--editor/icons/2x/icon_tool_button.pngbin0 -> 425 bytes
-rw-r--r--editor/icons/2x/icon_tool_move.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/2x/icon_tool_pan.pngbin0 -> 479 bytes
-rw-r--r--editor/icons/2x/icon_tool_rotate.pngbin0 -> 786 bytes
-rw-r--r--editor/icons/2x/icon_tool_scale.pngbin0 -> 562 bytes
-rw-r--r--editor/icons/2x/icon_tool_select.pngbin0 -> 659 bytes
-rw-r--r--editor/icons/2x/icon_tools.pngbin0 -> 759 bytes
-rw-r--r--editor/icons/2x/icon_touch_screen_button.pngbin0 -> 511 bytes
-rw-r--r--editor/icons/2x/icon_track_add_key.pngbin0 -> 127 bytes
-rw-r--r--editor/icons/2x/icon_track_add_key_hl.pngbin0 -> 128 bytes
-rw-r--r--editor/icons/2x/icon_track_continuous.pngbin0 -> 434 bytes
-rw-r--r--editor/icons/2x/icon_track_discrete.pngbin0 -> 196 bytes
-rw-r--r--editor/icons/2x/icon_track_trigger.pngbin0 -> 214 bytes
-rw-r--r--editor/icons/2x/icon_translation.pngbin0 -> 285 bytes
-rw-r--r--editor/icons/2x/icon_transparent.pngbin0 -> 177 bytes
-rw-r--r--editor/icons/2x/icon_transpose.pngbin0 -> 210 bytes
-rw-r--r--editor/icons/2x/icon_tree.pngbin0 -> 417 bytes
-rw-r--r--editor/icons/2x/icon_tween.pngbin0 -> 315 bytes
-rw-r--r--editor/icons/2x/icon_unbone.pngbin0 -> 661 bytes
-rw-r--r--editor/icons/2x/icon_ungroup.pngbin0 -> 202 bytes
-rw-r--r--editor/icons/2x/icon_uninstance.pngbin0 -> 883 bytes
-rw-r--r--editor/icons/2x/icon_unlock.pngbin0 -> 388 bytes
-rw-r--r--editor/icons/2x/icon_uv.pngbin0 -> 502 bytes
-rw-r--r--editor/icons/2x/icon_v_box_container.pngbin0 -> 327 bytes
-rw-r--r--editor/icons/2x/icon_v_button_array.pngbin0 -> 231 bytes
-rw-r--r--editor/icons/2x/icon_v_scroll_bar.pngbin0 -> 328 bytes
-rw-r--r--editor/icons/2x/icon_v_separator.pngbin0 -> 154 bytes
-rw-r--r--editor/icons/2x/icon_v_slider.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/2x/icon_v_split_container.pngbin0 -> 425 bytes
-rw-r--r--editor/icons/2x/icon_vector.pngbin0 -> 270 bytes
-rw-r--r--editor/icons/2x/icon_vector2.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/2x/icon_vehicle_body.pngbin0 -> 410 bytes
-rw-r--r--editor/icons/2x/icon_vehicle_wheel.pngbin0 -> 1269 bytes
-rw-r--r--editor/icons/2x/icon_video_player.pngbin0 -> 501 bytes
-rw-r--r--editor/icons/2x/icon_viewport.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/2x/icon_viewport_container.pngbin0 -> 528 bytes
-rw-r--r--editor/icons/2x/icon_viewport_sprite.pngbin0 -> 403 bytes
-rw-r--r--editor/icons/2x/icon_viewport_texture.pngbin0 -> 404 bytes
-rw-r--r--editor/icons/2x/icon_visibility_enabler.pngbin0 -> 1106 bytes
-rw-r--r--editor/icons/2x/icon_visibility_enabler_2d.pngbin0 -> 1114 bytes
-rw-r--r--editor/icons/2x/icon_visibility_notifier.pngbin0 -> 832 bytes
-rw-r--r--editor/icons/2x/icon_visibility_notifier_2d.pngbin0 -> 844 bytes
-rw-r--r--editor/icons/2x/icon_visible.pngbin0 -> 994 bytes
-rw-r--r--editor/icons/2x/icon_visual_script.pngbin0 -> 707 bytes
-rw-r--r--editor/icons/2x/icon_visual_shader_port.pngbin0 -> 338 bytes
-rw-r--r--editor/icons/2x/icon_vu_empty.pngbin0 -> 452 bytes
-rw-r--r--editor/icons/2x/icon_vu_full.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/2x/icon_warning.pngbin0 -> 154 bytes
-rw-r--r--editor/icons/2x/icon_window_dialog.pngbin0 -> 311 bytes
-rw-r--r--editor/icons/2x/icon_world.pngbin0 -> 502 bytes
-rw-r--r--editor/icons/2x/icon_world_2d.pngbin0 -> 584 bytes
-rw-r--r--editor/icons/2x/icon_world_environment.pngbin0 -> 1371 bytes
-rw-r--r--editor/icons/2x/icon_y_sort.pngbin0 -> 293 bytes
-rw-r--r--editor/icons/2x/icon_zoom.pngbin0 -> 762 bytes
-rw-r--r--editor/icons/2x/icon_zoom_less.pngbin0 -> 162 bytes
-rw-r--r--editor/icons/2x/icon_zoom_more.pngbin0 -> 290 bytes
-rw-r--r--editor/icons/2x/icon_zoom_reset.pngbin0 -> 689 bytes
-rw-r--r--editor/icons/SCsub96
-rw-r--r--editor/icons/icon_accept_dialog.pngbin0 -> 338 bytes
-rw-r--r--editor/icons/icon_add.pngbin0 -> 129 bytes
-rw-r--r--editor/icons/icon_add_track.pngbin0 -> 129 bytes
-rw-r--r--editor/icons/icon_anchor.pngbin0 -> 451 bytes
-rw-r--r--editor/icons/icon_anim_export.pngbin0 -> 552 bytes
-rw-r--r--editor/icons/icon_anim_export_all.pngbin0 -> 566 bytes
-rw-r--r--editor/icons/icon_anim_get.pngbin0 -> 276 bytes
-rw-r--r--editor/icons/icon_anim_get_hl.pngbin0 -> 270 bytes
-rw-r--r--editor/icons/icon_anim_import.pngbin0 -> 572 bytes
-rw-r--r--editor/icons/icon_anim_import_all.pngbin0 -> 586 bytes
-rw-r--r--editor/icons/icon_anim_set.pngbin0 -> 287 bytes
-rw-r--r--editor/icons/icon_anim_set_hl.pngbin0 -> 268 bytes
-rw-r--r--editor/icons/icon_animated_sprite.pngbin0 -> 584 bytes
-rw-r--r--editor/icons/icon_animated_sprite_3d.pngbin0 -> 552 bytes
-rw-r--r--editor/icons/icon_animation.pngbin0 -> 399 bytes
-rw-r--r--editor/icons/icon_animation_node.pngbin0 -> 261 bytes
-rw-r--r--editor/icons/icon_animation_play.pngbin0 -> 593 bytes
-rw-r--r--editor/icons/icon_animation_player.pngbin0 -> 153 bytes
-rw-r--r--editor/icons/icon_animation_set.pngbin0 -> 529 bytes
-rw-r--r--editor/icons/icon_animation_tree.pngbin0 -> 279 bytes
-rw-r--r--editor/icons/icon_animation_tree_player.pngbin0 -> 279 bytes
-rw-r--r--editor/icons/icon_area.pngbin0 -> 176 bytes
-rw-r--r--editor/icons/icon_area_2d.pngbin0 -> 182 bytes
-rw-r--r--editor/icons/icon_array_data.pngbin0 -> 176 bytes
-rw-r--r--editor/icons/icon_array_float.pngbin0 -> 177 bytes
-rw-r--r--editor/icons/icon_array_int.pngbin0 -> 172 bytes
-rw-r--r--editor/icons/icon_array_string.pngbin0 -> 178 bytes
-rw-r--r--editor/icons/icon_array_variant.pngbin0 -> 172 bytes
-rw-r--r--editor/icons/icon_arrow_left.pngbin0 -> 211 bytes
-rw-r--r--editor/icons/icon_arrow_left_disabled.pngbin0 -> 244 bytes
-rw-r--r--editor/icons/icon_arrow_right.pngbin0 -> 215 bytes
-rw-r--r--editor/icons/icon_arrow_right_disabled.pngbin0 -> 252 bytes
-rw-r--r--editor/icons/icon_arrow_up.pngbin0 -> 223 bytes
-rw-r--r--editor/icons/icon_arrow_up_disabled.pngbin0 -> 275 bytes
-rw-r--r--editor/icons/icon_atlas_texture.pngbin0 -> 286 bytes
-rw-r--r--editor/icons/icon_audio_effect_amplify.pngbin0 -> 379 bytes
-rw-r--r--editor/icons/icon_audio_stream_gibberish.pngbin0 -> 250 bytes
-rw-r--r--editor/icons/icon_audio_stream_m_p_c.pngbin0 -> 832 bytes
-rw-r--r--editor/icons/icon_audio_stream_o_g_g_vorbis.pngbin0 -> 774 bytes
-rw-r--r--editor/icons/icon_audio_stream_opus.pngbin0 -> 559 bytes
-rw-r--r--editor/icons/icon_audio_stream_speex.pngbin0 -> 1080 bytes
-rw-r--r--editor/icons/icon_auto_play.pngbin0 -> 370 bytes
-rw-r--r--editor/icons/icon_b_c_s_f_x.pngbin0 -> 451 bytes
-rw-r--r--editor/icons/icon_b_g_color_f_x.pngbin0 -> 367 bytes
-rw-r--r--editor/icons/icon_b_g_image_f_x.pngbin0 -> 753 bytes
-rw-r--r--editor/icons/icon_back.pngbin0 -> 223 bytes
-rw-r--r--editor/icons/icon_back_buffer_copy.pngbin0 -> 158 bytes
-rw-r--r--editor/icons/icon_back_disabled.pngbin0 -> 175 bytes
-rw-r--r--editor/icons/icon_back_no.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_bake.pngbin0 -> 180 bytes
-rw-r--r--editor/icons/icon_baked_light.pngbin0 -> 180 bytes
-rw-r--r--editor/icons/icon_baked_light_instance.pngbin0 -> 179 bytes
-rw-r--r--editor/icons/icon_baked_light_sampler.pngbin0 -> 230 bytes
-rw-r--r--editor/icons/icon_bit_map.pngbin0 -> 113 bytes
-rw-r--r--editor/icons/icon_bitmap_font.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/icon_blend.pngbin0 -> 578 bytes
-rw-r--r--editor/icons/icon_bone.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/icon_bone_attachment.pngbin0 -> 333 bytes
-rw-r--r--editor/icons/icon_bone_track.pngbin0 -> 343 bytes
-rw-r--r--editor/icons/icon_bool.pngbin0 -> 154 bytes
-rw-r--r--editor/icons/icon_box_shape.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_bus_vu_db.pngbin0 -> 1136 bytes
-rw-r--r--editor/icons/icon_bus_vu_empty.pngbin0 -> 1631 bytes
-rw-r--r--editor/icons/icon_bus_vu_frozen.pngbin0 -> 267 bytes
-rw-r--r--editor/icons/icon_bus_vu_full.pngbin0 -> 2463 bytes
-rw-r--r--editor/icons/icon_button.pngbin0 -> 163 bytes
-rw-r--r--editor/icons/icon_button_group.pngbin0 -> 165 bytes
-rw-r--r--editor/icons/icon_camera.pngbin0 -> 225 bytes
-rw-r--r--editor/icons/icon_camera_2d.pngbin0 -> 229 bytes
-rw-r--r--editor/icons/icon_canvas_item.pngbin0 -> 411 bytes
-rw-r--r--editor/icons/icon_canvas_item_material.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/icon_canvas_item_shader.pngbin0 -> 416 bytes
-rw-r--r--editor/icons/icon_canvas_item_shader_graph.pngbin0 -> 440 bytes
-rw-r--r--editor/icons/icon_canvas_layer.pngbin0 -> 474 bytes
-rw-r--r--editor/icons/icon_canvas_modulate.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_capsule_shape.pngbin0 -> 225 bytes
-rw-r--r--editor/icons/icon_capsule_shape_2d.pngbin0 -> 309 bytes
-rw-r--r--editor/icons/icon_center_container.pngbin0 -> 294 bytes
-rw-r--r--editor/icons/icon_character_body.pngbin0 -> 559 bytes
-rw-r--r--editor/icons/icon_character_camera.pngbin0 -> 477 bytes
-rw-r--r--editor/icons/icon_check_box.pngbin0 -> 404 bytes
-rw-r--r--editor/icons/icon_check_button.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/icon_checkerboard.pngbin0 -> 253 bytes
-rw-r--r--editor/icons/icon_circle_shape_2d.pngbin0 -> 425 bytes
-rw-r--r--editor/icons/icon_class_list.pngbin0 -> 157 bytes
-rw-r--r--editor/icons/icon_click2edit.pngbin0 -> 294 bytes
-rw-r--r--editor/icons/icon_close.pngbin0 -> 325 bytes
-rw-r--r--editor/icons/icon_close_hover.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/icon_collapse.pngbin0 -> 230 bytes
-rw-r--r--editor/icons/icon_collapse_hl.pngbin0 -> 338 bytes
-rw-r--r--editor/icons/icon_collision.pngbin0 -> 320 bytes
-rw-r--r--editor/icons/icon_collision_2d.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_collision_polygon.pngbin0 -> 287 bytes
-rw-r--r--editor/icons/icon_collision_polygon_2d.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_collision_shape.pngbin0 -> 278 bytes
-rw-r--r--editor/icons/icon_collision_shape_2d.pngbin0 -> 164 bytes
-rw-r--r--editor/icons/icon_color.pngbin0 -> 582 bytes
-rw-r--r--editor/icons/icon_color_pick.pngbin0 -> 416 bytes
-rw-r--r--editor/icons/icon_color_picker.pngbin0 -> 432 bytes
-rw-r--r--editor/icons/icon_color_picker_button.pngbin0 -> 548 bytes
-rw-r--r--editor/icons/icon_color_ramp.pngbin0 -> 222 bytes
-rw-r--r--editor/icons/icon_color_rect.pngbin0 -> 214 bytes
-rw-r--r--editor/icons/icon_concave_polygon_shape.pngbin0 -> 449 bytes
-rw-r--r--editor/icons/icon_concave_polygon_shape_2d.pngbin0 -> 321 bytes
-rw-r--r--editor/icons/icon_cone_twist_joint.pngbin0 -> 497 bytes
-rw-r--r--editor/icons/icon_confirmation_dialog.pngbin0 -> 330 bytes
-rw-r--r--editor/icons/icon_connect.pngbin0 -> 170 bytes
-rw-r--r--editor/icons/icon_connection_and_groups.pngbin0 -> 228 bytes
-rw-r--r--editor/icons/icon_console.pngbin0 -> 640 bytes
-rw-r--r--editor/icons/icon_container.pngbin0 -> 188 bytes
-rw-r--r--editor/icons/icon_control.pngbin0 -> 414 bytes
-rw-r--r--editor/icons/icon_control_align_bottom_center.pngbin0 -> 134 bytes
-rw-r--r--editor/icons/icon_control_align_bottom_left.pngbin0 -> 134 bytes
-rw-r--r--editor/icons/icon_control_align_bottom_right.pngbin0 -> 134 bytes
-rw-r--r--editor/icons/icon_control_align_bottom_wide.pngbin0 -> 135 bytes
-rw-r--r--editor/icons/icon_control_align_center.pngbin0 -> 142 bytes
-rw-r--r--editor/icons/icon_control_align_center_left.pngbin0 -> 116 bytes
-rw-r--r--editor/icons/icon_control_align_center_right.pngbin0 -> 117 bytes
-rw-r--r--editor/icons/icon_control_align_left_center.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/icon_control_align_left_wide.pngbin0 -> 123 bytes
-rw-r--r--editor/icons/icon_control_align_right_center.pngbin0 -> 142 bytes
-rw-r--r--editor/icons/icon_control_align_right_wide.pngbin0 -> 124 bytes
-rw-r--r--editor/icons/icon_control_align_top_center.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/icon_control_align_top_left.pngbin0 -> 136 bytes
-rw-r--r--editor/icons/icon_control_align_top_right.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/icon_control_align_top_wide.pngbin0 -> 136 bytes
-rw-r--r--editor/icons/icon_control_align_wide.pngbin0 -> 123 bytes
-rw-r--r--editor/icons/icon_control_hcenter_wide.pngbin0 -> 142 bytes
-rw-r--r--editor/icons/icon_control_vcenter_wide.pngbin0 -> 128 bytes
-rw-r--r--editor/icons/icon_convex_polygon_shape.pngbin0 -> 404 bytes
-rw-r--r--editor/icons/icon_convex_polygon_shape_2d.pngbin0 -> 297 bytes
-rw-r--r--editor/icons/icon_copy_node_path.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_create_new_scene_from.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/icon_cube_grid_map.pngbin0 -> 607 bytes
-rw-r--r--editor/icons/icon_cube_map.pngbin0 -> 134 bytes
-rw-r--r--editor/icons/icon_curve.pngbin0 -> 315 bytes
-rw-r--r--editor/icons/icon_curve_2d.pngbin0 -> 342 bytes
-rw-r--r--editor/icons/icon_curve_3d.pngbin0 -> 336 bytes
-rw-r--r--editor/icons/icon_curve_close.pngbin0 -> 351 bytes
-rw-r--r--editor/icons/icon_curve_constant.pngbin0 -> 114 bytes
-rw-r--r--editor/icons/icon_curve_create.pngbin0 -> 375 bytes
-rw-r--r--editor/icons/icon_curve_curve.pngbin0 -> 412 bytes
-rw-r--r--editor/icons/icon_curve_delete.pngbin0 -> 457 bytes
-rw-r--r--editor/icons/icon_curve_edit.pngbin0 -> 488 bytes
-rw-r--r--editor/icons/icon_curve_in.pngbin0 -> 257 bytes
-rw-r--r--editor/icons/icon_curve_in_out.pngbin0 -> 282 bytes
-rw-r--r--editor/icons/icon_curve_linear.pngbin0 -> 219 bytes
-rw-r--r--editor/icons/icon_curve_out.pngbin0 -> 263 bytes
-rw-r--r--editor/icons/icon_curve_out_in.pngbin0 -> 288 bytes
-rw-r--r--editor/icons/icon_cylinder_shape.pngbin0 -> 673 bytes
-rw-r--r--editor/icons/icon_d_o_f_blur_f_x.pngbin0 -> 796 bytes
-rw-r--r--editor/icons/icon_damped_spring_joint_2d.pngbin0 -> 316 bytes
-rw-r--r--editor/icons/icon_debug.pngbin0 -> 659 bytes
-rw-r--r--editor/icons/icon_debug_continue.pngbin0 -> 302 bytes
-rw-r--r--editor/icons/icon_debug_next.pngbin0 -> 220 bytes
-rw-r--r--editor/icons/icon_debug_step.pngbin0 -> 219 bytes
-rw-r--r--editor/icons/icon_default_project_icon.pngbin0 -> 2713 bytes
-rw-r--r--editor/icons/icon_del.pngbin0 -> 398 bytes
-rw-r--r--editor/icons/icon_dependency_changed.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_dependency_changed_hl.pngbin0 -> 330 bytes
-rw-r--r--editor/icons/icon_dependency_local_changed.pngbin0 -> 571 bytes
-rw-r--r--editor/icons/icon_dependency_local_changed_hl.pngbin0 -> 460 bytes
-rw-r--r--editor/icons/icon_dependency_ok.pngbin0 -> 518 bytes
-rw-r--r--editor/icons/icon_dependency_ok_hl.pngbin0 -> 413 bytes
-rw-r--r--editor/icons/icon_directional_light.pngbin0 -> 426 bytes
-rw-r--r--editor/icons/icon_distraction_free.pngbin0 -> 397 bytes
-rw-r--r--editor/icons/icon_doc_code_font.pngbin0 -> 8123 bytes
-rw-r--r--editor/icons/icon_doc_font.pngbin0 -> 8213 bytes
-rw-r--r--editor/icons/icon_doc_title_font.pngbin0 -> 10222 bytes
-rw-r--r--editor/icons/icon_down.pngbin0 -> 186 bytes
-rw-r--r--editor/icons/icon_dummy.pngbin0 -> 217 bytes
-rw-r--r--editor/icons/icon_duplicate.pngbin0 -> 167 bytes
-rw-r--r--editor/icons/icon_dynamic_character_body.pngbin0 -> 559 bytes
-rw-r--r--editor/icons/icon_dynamic_custom_body.pngbin0 -> 556 bytes
-rw-r--r--editor/icons/icon_dynamic_font.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_dynamic_font_data.pngbin0 -> 246 bytes
-rw-r--r--editor/icons/icon_dynamic_rigid_body.pngbin0 -> 546 bytes
-rw-r--r--editor/icons/icon_edit.pngbin0 -> 346 bytes
-rw-r--r--editor/icons/icon_edit_key.pngbin0 -> 405 bytes
-rw-r--r--editor/icons/icon_edit_pivot.pngbin0 -> 327 bytes
-rw-r--r--editor/icons/icon_edit_resource.pngbin0 -> 232 bytes
-rw-r--r--editor/icons/icon_edit_small.pngbin0 -> 365 bytes
-rw-r--r--editor/icons/icon_editor_2d.pngbin0 -> 197 bytes
-rw-r--r--editor/icons/icon_editor_3d_handle.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/icon_editor_focus.pngbin0 -> 629 bytes
-rw-r--r--editor/icons/icon_editor_handle.pngbin0 -> 214 bytes
-rw-r--r--editor/icons/icon_editor_node.pngbin0 -> 311 bytes
-rw-r--r--editor/icons/icon_editor_pivot.pngbin0 -> 177 bytes
-rw-r--r--editor/icons/icon_editor_plugin.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_editor_rect_2d.pngbin0 -> 222 bytes
-rw-r--r--editor/icons/icon_empty_control.pngbin0 -> 233 bytes
-rw-r--r--editor/icons/icon_enum.pngbin0 -> 123 bytes
-rw-r--r--editor/icons/icon_environment.pngbin0 -> 588 bytes
-rw-r--r--editor/icons/icon_error.pngbin0 -> 121 bytes
-rw-r--r--editor/icons/icon_error_sign.pngbin0 -> 255 bytes
-rw-r--r--editor/icons/icon_event_player.pngbin0 -> 142 bytes
-rw-r--r--editor/icons/icon_expand.pngbin0 -> 322 bytes
-rw-r--r--editor/icons/icon_expand_hl.pngbin0 -> 320 bytes
-rw-r--r--editor/icons/icon_favorites.pngbin0 -> 385 bytes
-rw-r--r--editor/icons/icon_file.pngbin0 -> 157 bytes
-rw-r--r--editor/icons/icon_file_big.pngbin0 -> 317 bytes
-rw-r--r--editor/icons/icon_file_dialog.pngbin0 -> 220 bytes
-rw-r--r--editor/icons/icon_file_list.pngbin0 -> 123 bytes
-rw-r--r--editor/icons/icon_file_server.pngbin0 -> 145 bytes
-rw-r--r--editor/icons/icon_file_server_active.pngbin0 -> 145 bytes
-rw-r--r--editor/icons/icon_file_thumbnail.pngbin0 -> 116 bytes
-rw-r--r--editor/icons/icon_filesystem.pngbin0 -> 157 bytes
-rw-r--r--editor/icons/icon_fixed_material.pngbin0 -> 377 bytes
-rw-r--r--editor/icons/icon_fixed_spatial_material.pngbin0 -> 409 bytes
-rw-r--r--editor/icons/icon_fog_f_x.pngbin0 -> 540 bytes
-rw-r--r--editor/icons/icon_folder.pngbin0 -> 170 bytes
-rw-r--r--editor/icons/icon_folder_big.pngbin0 -> 482 bytes
-rw-r--r--editor/icons/icon_folder_scene.pngbin0 -> 644 bytes
-rw-r--r--editor/icons/icon_font.pngbin0 -> 215 bytes
-rw-r--r--editor/icons/icon_forward.pngbin0 -> 224 bytes
-rw-r--r--editor/icons/icon_forward_no.pngbin0 -> 217 bytes
-rw-r--r--editor/icons/icon_func.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/icon_g_d_script.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_g_i_probe.pngbin0 -> 341 bytes
-rw-r--r--editor/icons/icon_g_i_probe_data.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/icon_gamma_f_x.pngbin0 -> 461 bytes
-rw-r--r--editor/icons/icon_generic_6_d_o_f_joint.pngbin0 -> 390 bytes
-rw-r--r--editor/icons/icon_gizmo_directional_light.pngbin0 -> 3628 bytes
-rw-r--r--editor/icons/icon_gizmo_light.pngbin0 -> 3064 bytes
-rw-r--r--editor/icons/icon_gizmo_listener.pngbin0 -> 3613 bytes
-rw-r--r--editor/icons/icon_gizmo_spatial_sample_player.pngbin0 -> 1297 bytes
-rw-r--r--editor/icons/icon_gizmo_spatial_stream_player.pngbin0 -> 1720 bytes
-rw-r--r--editor/icons/icon_glow_f_x.pngbin0 -> 676 bytes
-rw-r--r--editor/icons/icon_godot.pngbin0 -> 769 bytes
-rw-r--r--editor/icons/icon_godot_asset_default.pngbin0 -> 4167 bytes
-rw-r--r--editor/icons/icon_graph_color_ramp.pngbin0 -> 222 bytes
-rw-r--r--editor/icons/icon_graph_comment.pngbin0 -> 125 bytes
-rw-r--r--editor/icons/icon_graph_cube_uniform.pngbin0 -> 445 bytes
-rw-r--r--editor/icons/icon_graph_curve_map.pngbin0 -> 330 bytes
-rw-r--r--editor/icons/icon_graph_default_texture.pngbin0 -> 196 bytes
-rw-r--r--editor/icons/icon_graph_edit.pngbin0 -> 467 bytes
-rw-r--r--editor/icons/icon_graph_input.pngbin0 -> 268 bytes
-rw-r--r--editor/icons/icon_graph_node.pngbin0 -> 397 bytes
-rw-r--r--editor/icons/icon_graph_rgb.pngbin0 -> 443 bytes
-rw-r--r--editor/icons/icon_graph_rgb_op.pngbin0 -> 165 bytes
-rw-r--r--editor/icons/icon_graph_rgb_uniform.pngbin0 -> 346 bytes
-rw-r--r--editor/icons/icon_graph_scalar.pngbin0 -> 269 bytes
-rw-r--r--editor/icons/icon_graph_scalar_interp.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_graph_scalar_op.pngbin0 -> 266 bytes
-rw-r--r--editor/icons/icon_graph_scalar_uniform.pngbin0 -> 307 bytes
-rw-r--r--editor/icons/icon_graph_scalars_to_vec.pngbin0 -> 172 bytes
-rw-r--r--editor/icons/icon_graph_texscreen.pngbin0 -> 151 bytes
-rw-r--r--editor/icons/icon_graph_texture_uniform.pngbin0 -> 237 bytes
-rw-r--r--editor/icons/icon_graph_time.pngbin0 -> 398 bytes
-rw-r--r--editor/icons/icon_graph_vec_dp.pngbin0 -> 258 bytes
-rw-r--r--editor/icons/icon_graph_vec_interp.pngbin0 -> 229 bytes
-rw-r--r--editor/icons/icon_graph_vec_length.pngbin0 -> 305 bytes
-rw-r--r--editor/icons/icon_graph_vec_op.pngbin0 -> 266 bytes
-rw-r--r--editor/icons/icon_graph_vec_scalar_op.pngbin0 -> 299 bytes
-rw-r--r--editor/icons/icon_graph_vec_to_scalars.pngbin0 -> 181 bytes
-rw-r--r--editor/icons/icon_graph_vecs_to_xform.pngbin0 -> 178 bytes
-rw-r--r--editor/icons/icon_graph_vector.pngbin0 -> 345 bytes
-rw-r--r--editor/icons/icon_graph_vector_uniform.pngbin0 -> 390 bytes
-rw-r--r--editor/icons/icon_graph_xform.pngbin0 -> 241 bytes
-rw-r--r--editor/icons/icon_graph_xform_mult.pngbin0 -> 223 bytes
-rw-r--r--editor/icons/icon_graph_xform_scalar_func.pngbin0 -> 275 bytes
-rw-r--r--editor/icons/icon_graph_xform_to_vecs.pngbin0 -> 195 bytes
-rw-r--r--editor/icons/icon_graph_xform_uniform.pngbin0 -> 310 bytes
-rw-r--r--editor/icons/icon_graph_xform_vec_func.pngbin0 -> 277 bytes
-rw-r--r--editor/icons/icon_graph_xform_vec_imult.pngbin0 -> 327 bytes
-rw-r--r--editor/icons/icon_graph_xform_vec_mult.pngbin0 -> 336 bytes
-rw-r--r--editor/icons/icon_grid.pngbin0 -> 165 bytes
-rw-r--r--editor/icons/icon_grid_container.pngbin0 -> 216 bytes
-rw-r--r--editor/icons/icon_grid_map.pngbin0 -> 122 bytes
-rw-r--r--editor/icons/icon_grid_map_floor.pngbin0 -> 169 bytes
-rw-r--r--editor/icons/icon_groove_joint_2d.pngbin0 -> 150 bytes
-rw-r--r--editor/icons/icon_group.pngbin0 -> 177 bytes
-rw-r--r--editor/icons/icon_groups.pngbin0 -> 194 bytes
-rw-r--r--editor/icons/icon_h_box_container.pngbin0 -> 201 bytes
-rw-r--r--editor/icons/icon_h_button_array.pngbin0 -> 163 bytes
-rw-r--r--editor/icons/icon_h_scroll_bar.pngbin0 -> 205 bytes
-rw-r--r--editor/icons/icon_h_separator.pngbin0 -> 131 bytes
-rw-r--r--editor/icons/icon_h_slider.pngbin0 -> 204 bytes
-rw-r--r--editor/icons/icon_h_split_container.pngbin0 -> 259 bytes
-rw-r--r--editor/icons/icon_h_t_t_p_request.pngbin0 -> 301 bytes
-rw-r--r--editor/icons/icon_headphones.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/icon_help.pngbin0 -> 578 bytes
-rw-r--r--editor/icons/icon_hidden.pngbin0 -> 345 bytes
-rw-r--r--editor/icons/icon_hinge_joint.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/icon_history.pngbin0 -> 437 bytes
-rw-r--r--editor/icons/icon_hsize.pngbin0 -> 166 bytes
-rw-r--r--editor/icons/icon_iapi.pngbin0 -> 277 bytes
-rw-r--r--editor/icons/icon_image.pngbin0 -> 263 bytes
-rw-r--r--editor/icons/icon_image_sky_box.pngbin0 -> 434 bytes
-rw-r--r--editor/icons/icon_image_texture.pngbin0 -> 200 bytes
-rw-r--r--editor/icons/icon_immediate_geometry.pngbin0 -> 411 bytes
-rw-r--r--editor/icons/icon_import_check.pngbin0 -> 266 bytes
-rw-r--r--editor/icons/icon_import_fail.pngbin0 -> 346 bytes
-rw-r--r--editor/icons/icon_influence_zone.pngbin0 -> 303 bytes
-rw-r--r--editor/icons/icon_instance.pngbin0 -> 442 bytes
-rw-r--r--editor/icons/icon_instance_options.pngbin0 -> 365 bytes
-rw-r--r--editor/icons/icon_integer.pngbin0 -> 126 bytes
-rw-r--r--editor/icons/icon_interp_cubic.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_interp_linear.pngbin0 -> 271 bytes
-rw-r--r--editor/icons/icon_interp_raw.pngbin0 -> 156 bytes
-rw-r--r--editor/icons/icon_interp_wrap_clamp.pngbin0 -> 233 bytes
-rw-r--r--editor/icons/icon_interp_wrap_loop.pngbin0 -> 309 bytes
-rw-r--r--editor/icons/icon_interpolated_camera.pngbin0 -> 279 bytes
-rw-r--r--editor/icons/icon_invalid_key.pngbin0 -> 205 bytes
-rw-r--r--editor/icons/icon_inverse_kinematics.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/icon_item_list.pngbin0 -> 216 bytes
-rw-r--r--editor/icons/icon_joy_axis.pngbin0 -> 260 bytes
-rw-r--r--editor/icons/icon_joy_button.pngbin0 -> 272 bytes
-rw-r--r--editor/icons/icon_joypad.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_key.pngbin0 -> 285 bytes
-rw-r--r--editor/icons/icon_key_call.pngbin0 -> 265 bytes
-rw-r--r--editor/icons/icon_key_hover.pngbin0 -> 206 bytes
-rw-r--r--editor/icons/icon_key_invalid.pngbin0 -> 205 bytes
-rw-r--r--editor/icons/icon_key_invalid_hover.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_key_next.pngbin0 -> 321 bytes
-rw-r--r--editor/icons/icon_key_selected.pngbin0 -> 203 bytes
-rw-r--r--editor/icons/icon_key_value.pngbin0 -> 210 bytes
-rw-r--r--editor/icons/icon_key_xform.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_keyboard.pngbin0 -> 299 bytes
-rw-r--r--editor/icons/icon_keying.pngbin0 -> 1603 bytes
-rw-r--r--editor/icons/icon_kinematic_body.pngbin0 -> 145 bytes
-rw-r--r--editor/icons/icon_kinematic_body_2d.pngbin0 -> 147 bytes
-rw-r--r--editor/icons/icon_label.pngbin0 -> 240 bytes
-rw-r--r--editor/icons/icon_large_texture.pngbin0 -> 156 bytes
-rw-r--r--editor/icons/icon_light_2d.pngbin0 -> 362 bytes
-rw-r--r--editor/icons/icon_light_map.pngbin0 -> 406 bytes
-rw-r--r--editor/icons/icon_light_occluder_2d.pngbin0 -> 146 bytes
-rw-r--r--editor/icons/icon_lightr.pngbin0 -> 272 bytes
-rw-r--r--editor/icons/icon_line_2d.pngbin0 -> 474 bytes
-rw-r--r--editor/icons/icon_line_edit.pngbin0 -> 201 bytes
-rw-r--r--editor/icons/icon_line_shape_2d.pngbin0 -> 379 bytes
-rw-r--r--editor/icons/icon_link_button.pngbin0 -> 409 bytes
-rw-r--r--editor/icons/icon_list_select.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/icon_listener.pngbin0 -> 448 bytes
-rw-r--r--editor/icons/icon_live_debug.pngbin0 -> 583 bytes
-rw-r--r--editor/icons/icon_load.pngbin0 -> 271 bytes
-rw-r--r--editor/icons/icon_lock.pngbin0 -> 271 bytes
-rw-r--r--editor/icons/icon_logo.pngbin0 -> 6211 bytes
-rw-r--r--editor/icons/icon_logo_small.pngbin0 -> 1825 bytes
-rw-r--r--editor/icons/icon_loop.pngbin0 -> 412 bytes
-rw-r--r--editor/icons/icon_loop_interpolation.pngbin0 -> 374 bytes
-rw-r--r--editor/icons/icon_main_play.pngbin0 -> 234 bytes
-rw-r--r--editor/icons/icon_main_stop.pngbin0 -> 144 bytes
-rw-r--r--editor/icons/icon_margin_container.pngbin0 -> 233 bytes
-rw-r--r--editor/icons/icon_material_preview_cube.pngbin0 -> 374 bytes
-rw-r--r--editor/icons/icon_material_preview_cube_off.pngbin0 -> 401 bytes
-rw-r--r--editor/icons/icon_material_preview_light_1.pngbin0 -> 359 bytes
-rw-r--r--editor/icons/icon_material_preview_light_1_off.pngbin0 -> 305 bytes
-rw-r--r--editor/icons/icon_material_preview_light_2.pngbin0 -> 354 bytes
-rw-r--r--editor/icons/icon_material_preview_light_2_off.pngbin0 -> 443 bytes
-rw-r--r--editor/icons/icon_material_preview_sphere.pngbin0 -> 359 bytes
-rw-r--r--editor/icons/icon_material_preview_sphere_off.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/icon_material_shader.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_material_shader_graph.pngbin0 -> 440 bytes
-rw-r--r--editor/icons/icon_matrix.pngbin0 -> 138 bytes
-rw-r--r--editor/icons/icon_menu_button.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_mesh.pngbin0 -> 343 bytes
-rw-r--r--editor/icons/icon_mesh_instance.pngbin0 -> 314 bytes
-rw-r--r--editor/icons/icon_mesh_library.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/icon_mesh_old.pngbin0 -> 615 bytes
-rw-r--r--editor/icons/icon_meshr.pngbin0 -> 744 bytes
-rw-r--r--editor/icons/icon_mini_aabb.pngbin0 -> 360 bytes
-rw-r--r--editor/icons/icon_mini_array.pngbin0 -> 210 bytes
-rw-r--r--editor/icons/icon_mini_boolean.pngbin0 -> 256 bytes
-rw-r--r--editor/icons/icon_mini_color.pngbin0 -> 253 bytes
-rw-r--r--editor/icons/icon_mini_color_array.pngbin0 -> 337 bytes
-rw-r--r--editor/icons/icon_mini_dictionary.pngbin0 -> 230 bytes
-rw-r--r--editor/icons/icon_mini_float.pngbin0 -> 233 bytes
-rw-r--r--editor/icons/icon_mini_float_array.pngbin0 -> 275 bytes
-rw-r--r--editor/icons/icon_mini_image.pngbin0 -> 257 bytes
-rw-r--r--editor/icons/icon_mini_input.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_mini_int_array.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/icon_mini_integer.pngbin0 -> 228 bytes
-rw-r--r--editor/icons/icon_mini_matrix3.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_mini_matrix32.pngbin0 -> 320 bytes
-rw-r--r--editor/icons/icon_mini_object.pngbin0 -> 289 bytes
-rw-r--r--editor/icons/icon_mini_path.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_mini_plane.pngbin0 -> 249 bytes
-rw-r--r--editor/icons/icon_mini_quat.pngbin0 -> 309 bytes
-rw-r--r--editor/icons/icon_mini_raw_array.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_mini_rect2.pngbin0 -> 267 bytes
-rw-r--r--editor/icons/icon_mini_rid.pngbin0 -> 222 bytes
-rw-r--r--editor/icons/icon_mini_string.pngbin0 -> 258 bytes
-rw-r--r--editor/icons/icon_mini_string_array.pngbin0 -> 296 bytes
-rw-r--r--editor/icons/icon_mini_transform.pngbin0 -> 321 bytes
-rw-r--r--editor/icons/icon_mini_variant.pngbin0 -> 240 bytes
-rw-r--r--editor/icons/icon_mini_vector2.pngbin0 -> 301 bytes
-rw-r--r--editor/icons/icon_mini_vector2_array.pngbin0 -> 284 bytes
-rw-r--r--editor/icons/icon_mini_vector3.pngbin0 -> 285 bytes
-rw-r--r--editor/icons/icon_mini_vector3_array.pngbin0 -> 264 bytes
-rw-r--r--editor/icons/icon_mirror_x.pngbin0 -> 166 bytes
-rw-r--r--editor/icons/icon_mirror_y.pngbin0 -> 168 bytes
-rw-r--r--editor/icons/icon_mouse.pngbin0 -> 256 bytes
-rw-r--r--editor/icons/icon_move_down.pngbin0 -> 268 bytes
-rw-r--r--editor/icons/icon_move_down_hl.pngbin0 -> 234 bytes
-rw-r--r--editor/icons/icon_move_point.pngbin0 -> 542 bytes
-rw-r--r--editor/icons/icon_move_up.pngbin0 -> 269 bytes
-rw-r--r--editor/icons/icon_move_up_hl.pngbin0 -> 224 bytes
-rw-r--r--editor/icons/icon_multi_edit.pngbin0 -> 358 bytes
-rw-r--r--editor/icons/icon_multi_line.pngbin0 -> 140 bytes
-rw-r--r--editor/icons/icon_multi_mesh.pngbin0 -> 347 bytes
-rw-r--r--editor/icons/icon_multi_mesh_instance.pngbin0 -> 376 bytes
-rw-r--r--editor/icons/icon_multi_node_edit.pngbin0 -> 358 bytes
-rw-r--r--editor/icons/icon_navigation.pngbin0 -> 344 bytes
-rw-r--r--editor/icons/icon_navigation_2d.pngbin0 -> 363 bytes
-rw-r--r--editor/icons/icon_navigation_mesh.pngbin0 -> 450 bytes
-rw-r--r--editor/icons/icon_navigation_mesh_instance.pngbin0 -> 480 bytes
-rw-r--r--editor/icons/icon_navigation_polygon.pngbin0 -> 384 bytes
-rw-r--r--editor/icons/icon_navigation_polygon_instance.pngbin0 -> 409 bytes
-rw-r--r--editor/icons/icon_new.pngbin0 -> 157 bytes
-rw-r--r--editor/icons/icon_nine_patch_rect.pngbin0 -> 128 bytes
-rw-r--r--editor/icons/icon_node.pngbin0 -> 403 bytes
-rw-r--r--editor/icons/icon_node_2d.pngbin0 -> 427 bytes
-rw-r--r--editor/icons/icon_node_real_slot.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_node_vec_slot.pngbin0 -> 240 bytes
-rw-r--r--editor/icons/icon_node_warning.pngbin0 -> 320 bytes
-rw-r--r--editor/icons/icon_non_favorite.pngbin0 -> 475 bytes
-rw-r--r--editor/icons/icon_object.pngbin0 -> 354 bytes
-rw-r--r--editor/icons/icon_occluder_polygon_2d.pngbin0 -> 274 bytes
-rw-r--r--editor/icons/icon_omni_light.pngbin0 -> 347 bytes
-rw-r--r--editor/icons/icon_open.pngbin0 -> 170 bytes
-rw-r--r--editor/icons/icon_option_button.pngbin0 -> 218 bytes
-rw-r--r--editor/icons/icon_override.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_p_hash_translation.pngbin0 -> 194 bytes
-rw-r--r--editor/icons/icon_packed_data_container.pngbin0 -> 176 bytes
-rw-r--r--editor/icons/icon_packed_scene.pngbin0 -> 289 bytes
-rw-r--r--editor/icons/icon_pane_drag.pngbin0 -> 620 bytes
-rw-r--r--editor/icons/icon_pane_drag_hover.pngbin0 -> 637 bytes
-rw-r--r--editor/icons/icon_panel.pngbin0 -> 175 bytes
-rw-r--r--editor/icons/icon_panel_container.pngbin0 -> 198 bytes
-rw-r--r--editor/icons/icon_panel_top.pngbin0 -> 195 bytes
-rw-r--r--editor/icons/icon_panels_1.pngbin0 -> 100 bytes
-rw-r--r--editor/icons/icon_panels_2.pngbin0 -> 108 bytes
-rw-r--r--editor/icons/icon_panels_2_alt.pngbin0 -> 116 bytes
-rw-r--r--editor/icons/icon_panels_3.pngbin0 -> 123 bytes
-rw-r--r--editor/icons/icon_panels_3_alt.pngbin0 -> 130 bytes
-rw-r--r--editor/icons/icon_panels_4.pngbin0 -> 120 bytes
-rw-r--r--editor/icons/icon_parallax_background.pngbin0 -> 218 bytes
-rw-r--r--editor/icons/icon_parallax_layer.pngbin0 -> 282 bytes
-rw-r--r--editor/icons/icon_particle_attractor_2d.pngbin0 -> 629 bytes
-rw-r--r--editor/icons/icon_particles.pngbin0 -> 370 bytes
-rw-r--r--editor/icons/icon_particles_2d.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/icon_particles_frame.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_particles_shader.pngbin0 -> 367 bytes
-rw-r--r--editor/icons/icon_patch_9_rect.pngbin0 -> 128 bytes
-rw-r--r--editor/icons/icon_path.pngbin0 -> 353 bytes
-rw-r--r--editor/icons/icon_path_2d.pngbin0 -> 359 bytes
-rw-r--r--editor/icons/icon_path_follow.pngbin0 -> 387 bytes
-rw-r--r--editor/icons/icon_path_follow_2d.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_pause.pngbin0 -> 147 bytes
-rw-r--r--editor/icons/icon_pe_edit.pngbin0 -> 403 bytes
-rw-r--r--editor/icons/icon_physics_joint_pin.pngbin0 -> 454 bytes
-rw-r--r--editor/icons/icon_pin.pngbin0 -> 227 bytes
-rw-r--r--editor/icons/icon_pin_joint.pngbin0 -> 418 bytes
-rw-r--r--editor/icons/icon_pin_joint_2d.pngbin0 -> 428 bytes
-rw-r--r--editor/icons/icon_pin_pressed.pngbin0 -> 227 bytes
-rw-r--r--editor/icons/icon_plane.pngbin0 -> 235 bytes
-rw-r--r--editor/icons/icon_plane_shape.pngbin0 -> 229 bytes
-rw-r--r--editor/icons/icon_play.pngbin0 -> 237 bytes
-rw-r--r--editor/icons/icon_play_backwards.pngbin0 -> 245 bytes
-rw-r--r--editor/icons/icon_play_custom.pngbin0 -> 282 bytes
-rw-r--r--editor/icons/icon_play_scene.pngbin0 -> 350 bytes
-rw-r--r--editor/icons/icon_play_start.pngbin0 -> 269 bytes
-rw-r--r--editor/icons/icon_play_start_backwards.pngbin0 -> 279 bytes
-rw-r--r--editor/icons/icon_polygon_2d.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_polygon_path_finder.pngbin0 -> 307 bytes
-rw-r--r--editor/icons/icon_popup.pngbin0 -> 210 bytes
-rw-r--r--editor/icons/icon_popup_dialog.pngbin0 -> 221 bytes
-rw-r--r--editor/icons/icon_popup_menu.pngbin0 -> 216 bytes
-rw-r--r--editor/icons/icon_popup_panel.pngbin0 -> 198 bytes
-rw-r--r--editor/icons/icon_portal.pngbin0 -> 452 bytes
-rw-r--r--editor/icons/icon_position_2d.pngbin0 -> 132 bytes
-rw-r--r--editor/icons/icon_position_3d.pngbin0 -> 131 bytes
-rw-r--r--editor/icons/icon_prev_scene.pngbin0 -> 229 bytes
-rw-r--r--editor/icons/icon_progress_1.pngbin0 -> 468 bytes
-rw-r--r--editor/icons/icon_progress_2.pngbin0 -> 455 bytes
-rw-r--r--editor/icons/icon_progress_3.pngbin0 -> 462 bytes
-rw-r--r--editor/icons/icon_progress_4.pngbin0 -> 475 bytes
-rw-r--r--editor/icons/icon_progress_5.pngbin0 -> 454 bytes
-rw-r--r--editor/icons/icon_progress_6.pngbin0 -> 465 bytes
-rw-r--r--editor/icons/icon_progress_7.pngbin0 -> 461 bytes
-rw-r--r--editor/icons/icon_progress_8.pngbin0 -> 463 bytes
-rw-r--r--editor/icons/icon_progress_bar.pngbin0 -> 208 bytes
-rw-r--r--editor/icons/icon_property_editor.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_proximity_group.pngbin0 -> 223 bytes
-rw-r--r--editor/icons/icon_quad.pngbin0 -> 251 bytes
-rw-r--r--editor/icons/icon_quat.pngbin0 -> 341 bytes
-rw-r--r--editor/icons/icon_range.pngbin0 -> 151 bytes
-rw-r--r--editor/icons/icon_rating_no_star.pngbin0 -> 515 bytes
-rw-r--r--editor/icons/icon_rating_star.pngbin0 -> 383 bytes
-rw-r--r--editor/icons/icon_ray_cast.pngbin0 -> 216 bytes
-rw-r--r--editor/icons/icon_ray_cast_2d.pngbin0 -> 214 bytes
-rw-r--r--editor/icons/icon_ray_shape.pngbin0 -> 363 bytes
-rw-r--r--editor/icons/icon_ray_shape_2d.pngbin0 -> 233 bytes
-rw-r--r--editor/icons/icon_rayito.pngbin0 -> 300 bytes
-rw-r--r--editor/icons/icon_real.pngbin0 -> 265 bytes
-rw-r--r--editor/icons/icon_rect2.pngbin0 -> 193 bytes
-rw-r--r--editor/icons/icon_rect3.pngbin0 -> 202 bytes
-rw-r--r--editor/icons/icon_rectangle_shape_2d.pngbin0 -> 159 bytes
-rw-r--r--editor/icons/icon_reference_rect.pngbin0 -> 128 bytes
-rw-r--r--editor/icons/icon_reflection_probe.pngbin0 -> 370 bytes
-rw-r--r--editor/icons/icon_region_edit.pngbin0 -> 141 bytes
-rw-r--r--editor/icons/icon_reload.pngbin0 -> 420 bytes
-rw-r--r--editor/icons/icon_reload_empty.pngbin0 -> 251 bytes
-rw-r--r--editor/icons/icon_reload_small.pngbin0 -> 409 bytes
-rw-r--r--editor/icons/icon_remote.pngbin0 -> 394 bytes
-rw-r--r--editor/icons/icon_remote_transform.pngbin0 -> 530 bytes
-rw-r--r--editor/icons/icon_remote_transform_2d.pngbin0 -> 552 bytes
-rw-r--r--editor/icons/icon_remove.pngbin0 -> 184 bytes
-rw-r--r--editor/icons/icon_remove_hl.pngbin0 -> 385 bytes
-rw-r--r--editor/icons/icon_remove_small.pngbin0 -> 297 bytes
-rw-r--r--editor/icons/icon_rename.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/icon_reparent.pngbin0 -> 390 bytes
-rw-r--r--editor/icons/icon_replace.pngbin0 -> 435 bytes
-rw-r--r--editor/icons/icon_resource_preloader.pngbin0 -> 391 bytes
-rw-r--r--editor/icons/icon_rich_text_label.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_rid.pngbin0 -> 468 bytes
-rw-r--r--editor/icons/icon_rigid_body.pngbin0 -> 531 bytes
-rw-r--r--editor/icons/icon_rigid_body_2_d.pngbin0 -> 501 bytes
-rw-r--r--editor/icons/icon_rigid_body_2d.pngbin0 -> 559 bytes
-rw-r--r--editor/icons/icon_room.pngbin0 -> 375 bytes
-rw-r--r--editor/icons/icon_room_bounds.pngbin0 -> 363 bytes
-rw-r--r--editor/icons/icon_room_instance.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_rotate_0.pngbin0 -> 436 bytes
-rw-r--r--editor/icons/icon_rotate_180.pngbin0 -> 376 bytes
-rw-r--r--editor/icons/icon_rotate_270.pngbin0 -> 357 bytes
-rw-r--r--editor/icons/icon_rotate_90.pngbin0 -> 412 bytes
-rw-r--r--editor/icons/icon_run.pngbin0 -> 800 bytes
-rw-r--r--editor/icons/icon_s_s_a_o_f_x.pngbin0 -> 564 bytes
-rw-r--r--editor/icons/icon_sample.pngbin0 -> 152 bytes
-rw-r--r--editor/icons/icon_sample_library.pngbin0 -> 333 bytes
-rw-r--r--editor/icons/icon_sample_player.pngbin0 -> 234 bytes
-rw-r--r--editor/icons/icon_sample_player_2d.pngbin0 -> 252 bytes
-rw-r--r--editor/icons/icon_save.pngbin0 -> 252 bytes
-rw-r--r--editor/icons/icon_scene.pngbin0 -> 476 bytes
-rw-r--r--editor/icons/icon_scene_instance.pngbin0 -> 488 bytes
-rw-r--r--editor/icons/icon_scene_tree_editor.pngbin0 -> 294 bytes
-rw-r--r--editor/icons/icon_script.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/icon_script_control.pngbin0 -> 452 bytes
-rw-r--r--editor/icons/icon_script_create.pngbin0 -> 288 bytes
-rw-r--r--editor/icons/icon_script_error.pngbin0 -> 220 bytes
-rw-r--r--editor/icons/icon_script_list.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_script_node.pngbin0 -> 455 bytes
-rw-r--r--editor/icons/icon_script_remove.pngbin0 -> 411 bytes
-rw-r--r--editor/icons/icon_scroll_bar.pngbin0 -> 205 bytes
-rw-r--r--editor/icons/icon_scroll_container.pngbin0 -> 304 bytes
-rw-r--r--editor/icons/icon_segment_shape_2d.pngbin0 -> 241 bytes
-rw-r--r--editor/icons/icon_shader.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_shader_material.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_short_cut.pngbin0 -> 272 bytes
-rw-r--r--editor/icons/icon_signal.pngbin0 -> 246 bytes
-rw-r--r--editor/icons/icon_skeleton.pngbin0 -> 346 bytes
-rw-r--r--editor/icons/icon_skeletonr.pngbin0 -> 362 bytes
-rw-r--r--editor/icons/icon_sky_box_f_x.pngbin0 -> 740 bytes
-rw-r--r--editor/icons/icon_slider_joint.pngbin0 -> 150 bytes
-rw-r--r--editor/icons/icon_slot.pngbin0 -> 246 bytes
-rw-r--r--editor/icons/icon_small_next.pngbin0 -> 191 bytes
-rw-r--r--editor/icons/icon_snap.pngbin0 -> 269 bytes
-rw-r--r--editor/icons/icon_sound_room_params.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_spatial.pngbin0 -> 419 bytes
-rw-r--r--editor/icons/icon_spatial_add.pngbin0 -> 429 bytes
-rw-r--r--editor/icons/icon_spatial_sample_player.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_spatial_shader.pngbin0 -> 483 bytes
-rw-r--r--editor/icons/icon_spatial_stream_player.pngbin0 -> 183 bytes
-rw-r--r--editor/icons/icon_sphere_shape.pngbin0 -> 362 bytes
-rw-r--r--editor/icons/icon_spin_box.pngbin0 -> 289 bytes
-rw-r--r--editor/icons/icon_spline.pngbin0 -> 244 bytes
-rw-r--r--editor/icons/icon_spot_light.pngbin0 -> 341 bytes
-rw-r--r--editor/icons/icon_sprite.pngbin0 -> 419 bytes
-rw-r--r--editor/icons/icon_sprite_3d.pngbin0 -> 408 bytes
-rw-r--r--editor/icons/icon_sprite_frames.pngbin0 -> 332 bytes
-rw-r--r--editor/icons/icon_squirrel_script.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/icon_static_body.pngbin0 -> 229 bytes
-rw-r--r--editor/icons/icon_static_body_2_d.pngbin0 -> 368 bytes
-rw-r--r--editor/icons/icon_static_body_2d.pngbin0 -> 237 bytes
-rw-r--r--editor/icons/icon_stop.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_stream_player.pngbin0 -> 183 bytes
-rw-r--r--editor/icons/icon_string.pngbin0 -> 160 bytes
-rw-r--r--editor/icons/icon_style_box_empty.pngbin0 -> 333 bytes
-rw-r--r--editor/icons/icon_style_box_flat.pngbin0 -> 398 bytes
-rw-r--r--editor/icons/icon_style_box_texture.pngbin0 -> 411 bytes
-rw-r--r--editor/icons/icon_surface.pngbin0 -> 212 bytes
-rw-r--r--editor/icons/icon_tab_container.pngbin0 -> 214 bytes
-rw-r--r--editor/icons/icon_tab_menu.pngbin0 -> 251 bytes
-rw-r--r--editor/icons/icon_tabs.pngbin0 -> 146 bytes
-rw-r--r--editor/icons/icon_test_cube.pngbin0 -> 435 bytes
-rw-r--r--editor/icons/icon_text_edit.pngbin0 -> 207 bytes
-rw-r--r--editor/icons/icon_texture.pngbin0 -> 200 bytes
-rw-r--r--editor/icons/icon_texture_button.pngbin0 -> 159 bytes
-rw-r--r--editor/icons/icon_texture_progress.pngbin0 -> 213 bytes
-rw-r--r--editor/icons/icon_texture_rect.pngbin0 -> 158 bytes
-rw-r--r--editor/icons/icon_theme.pngbin0 -> 451 bytes
-rw-r--r--editor/icons/icon_thumbnail_wait.pngbin0 -> 2616 bytes
-rw-r--r--editor/icons/icon_tile_map.pngbin0 -> 113 bytes
-rw-r--r--editor/icons/icon_tile_set.pngbin0 -> 174 bytes
-rw-r--r--editor/icons/icon_time.pngbin0 -> 557 bytes
-rw-r--r--editor/icons/icon_timer.pngbin0 -> 447 bytes
-rw-r--r--editor/icons/icon_tool_button.pngbin0 -> 263 bytes
-rw-r--r--editor/icons/icon_tool_move.pngbin0 -> 217 bytes
-rw-r--r--editor/icons/icon_tool_pan.pngbin0 -> 281 bytes
-rw-r--r--editor/icons/icon_tool_rotate.pngbin0 -> 420 bytes
-rw-r--r--editor/icons/icon_tool_scale.pngbin0 -> 349 bytes
-rw-r--r--editor/icons/icon_tool_select.pngbin0 -> 376 bytes
-rw-r--r--editor/icons/icon_tools.pngbin0 -> 392 bytes
-rw-r--r--editor/icons/icon_touch_screen_button.pngbin0 -> 313 bytes
-rw-r--r--editor/icons/icon_track_add_key.pngbin0 -> 113 bytes
-rw-r--r--editor/icons/icon_track_add_key_hl.pngbin0 -> 113 bytes
-rw-r--r--editor/icons/icon_track_continuous.pngbin0 -> 265 bytes
-rw-r--r--editor/icons/icon_track_discrete.pngbin0 -> 125 bytes
-rw-r--r--editor/icons/icon_track_method.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/icon_track_prop.pngbin0 -> 285 bytes
-rw-r--r--editor/icons/icon_track_trigger.pngbin0 -> 158 bytes
-rw-r--r--editor/icons/icon_track_value.pngbin0 -> 300 bytes
-rw-r--r--editor/icons/icon_translation.pngbin0 -> 194 bytes
-rw-r--r--editor/icons/icon_transparent.pngbin0 -> 158 bytes
-rw-r--r--editor/icons/icon_transpose.pngbin0 -> 165 bytes
-rw-r--r--editor/icons/icon_tree.pngbin0 -> 243 bytes
-rw-r--r--editor/icons/icon_tween.pngbin0 -> 248 bytes
-rw-r--r--editor/icons/icon_unbone.pngbin0 -> 383 bytes
-rw-r--r--editor/icons/icon_ungroup.pngbin0 -> 170 bytes
-rw-r--r--editor/icons/icon_uninstance.pngbin0 -> 525 bytes
-rw-r--r--editor/icons/icon_unlock.pngbin0 -> 262 bytes
-rw-r--r--editor/icons/icon_up.pngbin0 -> 185 bytes
-rw-r--r--editor/icons/icon_updown.pngbin0 -> 180 bytes
-rw-r--r--editor/icons/icon_uv.pngbin0 -> 282 bytes
-rw-r--r--editor/icons/icon_v_box_container.pngbin0 -> 207 bytes
-rw-r--r--editor/icons/icon_v_button_array.pngbin0 -> 147 bytes
-rw-r--r--editor/icons/icon_v_scroll_bar.pngbin0 -> 218 bytes
-rw-r--r--editor/icons/icon_v_separator.pngbin0 -> 130 bytes
-rw-r--r--editor/icons/icon_v_slider.pngbin0 -> 231 bytes
-rw-r--r--editor/icons/icon_v_split_container.pngbin0 -> 277 bytes
-rw-r--r--editor/icons/icon_variant.pngbin0 -> 240 bytes
-rw-r--r--editor/icons/icon_vector.pngbin0 -> 208 bytes
-rw-r--r--editor/icons/icon_vector2.pngbin0 -> 122 bytes
-rw-r--r--editor/icons/icon_vehicle_body.pngbin0 -> 236 bytes
-rw-r--r--editor/icons/icon_vehicle_wheel.pngbin0 -> 537 bytes
-rw-r--r--editor/icons/icon_video_player.pngbin0 -> 302 bytes
-rw-r--r--editor/icons/icon_video_stream_theora.pngbin0 -> 925 bytes
-rw-r--r--editor/icons/icon_view.pngbin0 -> 386 bytes
-rw-r--r--editor/icons/icon_viewport.pngbin0 -> 198 bytes
-rw-r--r--editor/icons/icon_viewport_container.pngbin0 -> 284 bytes
-rw-r--r--editor/icons/icon_viewport_sprite.pngbin0 -> 239 bytes
-rw-r--r--editor/icons/icon_viewport_texture.pngbin0 -> 227 bytes
-rw-r--r--editor/icons/icon_visibility_area.pngbin0 -> 422 bytes
-rw-r--r--editor/icons/icon_visibility_enabler.pngbin0 -> 549 bytes
-rw-r--r--editor/icons/icon_visibility_enabler_2d.pngbin0 -> 550 bytes
-rw-r--r--editor/icons/icon_visibility_notifier.pngbin0 -> 427 bytes
-rw-r--r--editor/icons/icon_visibility_notifier_2d.pngbin0 -> 431 bytes
-rw-r--r--editor/icons/icon_visible.pngbin0 -> 497 bytes
-rw-r--r--editor/icons/icon_visual_script.pngbin0 -> 388 bytes
-rw-r--r--editor/icons/icon_visual_shader_port.pngbin0 -> 255 bytes
-rw-r--r--editor/icons/icon_volume.pngbin0 -> 295 bytes
-rw-r--r--editor/icons/icon_vu_db.pngbin0 -> 1015 bytes
-rw-r--r--editor/icons/icon_vu_empty.pngbin0 -> 283 bytes
-rw-r--r--editor/icons/icon_vu_full.pngbin0 -> 224 bytes
-rw-r--r--editor/icons/icon_wait_no_preview.pngbin0 -> 1041 bytes
-rw-r--r--editor/icons/icon_wait_preview_1.pngbin0 -> 1208 bytes
-rw-r--r--editor/icons/icon_wait_preview_2.pngbin0 -> 1270 bytes
-rw-r--r--editor/icons/icon_wait_preview_3.pngbin0 -> 1190 bytes
-rw-r--r--editor/icons/icon_wait_preview_4.pngbin0 -> 1269 bytes
-rw-r--r--editor/icons/icon_wait_preview_5.pngbin0 -> 1191 bytes
-rw-r--r--editor/icons/icon_wait_preview_6.pngbin0 -> 1278 bytes
-rw-r--r--editor/icons/icon_wait_preview_7.pngbin0 -> 1192 bytes
-rw-r--r--editor/icons/icon_wait_preview_8.pngbin0 -> 1341 bytes
-rw-r--r--editor/icons/icon_warning.pngbin0 -> 120 bytes
-rw-r--r--editor/icons/icon_window_dialog.pngbin0 -> 200 bytes
-rw-r--r--editor/icons/icon_world.pngbin0 -> 254 bytes
-rw-r--r--editor/icons/icon_world_2d.pngbin0 -> 328 bytes
-rw-r--r--editor/icons/icon_world_environment.pngbin0 -> 578 bytes
-rw-r--r--editor/icons/icon_y_sort.pngbin0 -> 230 bytes
-rw-r--r--editor/icons/icon_zoom.pngbin0 -> 404 bytes
-rw-r--r--editor/icons/icon_zoom_less.pngbin0 -> 149 bytes
-rw-r--r--editor/icons/icon_zoom_more.pngbin0 -> 232 bytes
-rw-r--r--editor/icons/icon_zoom_reset.pngbin0 -> 430 bytes
-rw-r--r--editor/icons/source/icon_accept_dialog.svg79
-rw-r--r--editor/icons/source/icon_add_track.svg77
-rw-r--r--editor/icons/source/icon_anchor.svg77
-rw-r--r--editor/icons/source/icon_animated_sprite.svg87
-rw-r--r--editor/icons/source/icon_animated_sprite_3d.svg87
-rw-r--r--editor/icons/source/icon_animation.svg77
-rw-r--r--editor/icons/source/icon_animation_player.svg78
-rw-r--r--editor/icons/source/icon_animation_tree_player.svg77
-rw-r--r--editor/icons/source/icon_area.svg77
-rw-r--r--editor/icons/source/icon_area_2d.svg77
-rw-r--r--editor/icons/source/icon_arrow_left.svg77
-rw-r--r--editor/icons/source/icon_arrow_right.svg78
-rw-r--r--editor/icons/source/icon_arrow_up.svg77
-rw-r--r--editor/icons/source/icon_atlas_texture.svg82
-rw-r--r--editor/icons/source/icon_audio_stream_gibberish.svg83
-rw-r--r--editor/icons/source/icon_auto_play.svg78
-rw-r--r--editor/icons/source/icon_back.svg79
-rw-r--r--editor/icons/source/icon_back_buffer_copy.svg77
-rw-r--r--editor/icons/source/icon_bake.svg78
-rw-r--r--editor/icons/source/icon_baked_light.svg78
-rw-r--r--editor/icons/source/icon_baked_light_instance.svg78
-rw-r--r--editor/icons/source/icon_baked_light_sampler.svg78
-rw-r--r--editor/icons/source/icon_bit_map.svg82
-rw-r--r--editor/icons/source/icon_bitmap_font.svg78
-rw-r--r--editor/icons/source/icon_blend.svg81
-rw-r--r--editor/icons/source/icon_bone.svg78
-rw-r--r--editor/icons/source/icon_bone_attachment.svg78
-rw-r--r--editor/icons/source/icon_bone_track.svg78
-rw-r--r--editor/icons/source/icon_bool.svg77
-rw-r--r--editor/icons/source/icon_box_shape.svg99
-rw-r--r--editor/icons/source/icon_button.svg94
-rw-r--r--editor/icons/source/icon_button_group.svg178
-rw-r--r--editor/icons/source/icon_camera.svg119
-rw-r--r--editor/icons/source/icon_camera_2d.svg119
-rw-r--r--editor/icons/source/icon_canvas_item.svg83
-rw-r--r--editor/icons/source/icon_canvas_item_material.svg150
-rw-r--r--editor/icons/source/icon_canvas_item_shader.svg143
-rw-r--r--editor/icons/source/icon_canvas_item_shader_graph.svg143
-rw-r--r--editor/icons/source/icon_canvas_layer.svg82
-rw-r--r--editor/icons/source/icon_canvas_modulate.svg137
-rw-r--r--editor/icons/source/icon_capsule_shape.svg101
-rw-r--r--editor/icons/source/icon_capsule_shape_2d.svg81
-rw-r--r--editor/icons/source/icon_center_container.svg85
-rw-r--r--editor/icons/source/icon_check_box.svg84
-rw-r--r--editor/icons/source/icon_check_button.svg84
-rw-r--r--editor/icons/source/icon_circle_shape_2d.svg82
-rw-r--r--editor/icons/source/icon_class_list.svg121
-rw-r--r--editor/icons/source/icon_close.svg93
-rw-r--r--editor/icons/source/icon_collapse.svg77
-rw-r--r--editor/icons/source/icon_collision_2d.svg78
-rw-r--r--editor/icons/source/icon_collision_polygon.svg78
-rw-r--r--editor/icons/source/icon_collision_shape.svg89
-rw-r--r--editor/icons/source/icon_collision_shape_2d.svg77
-rw-r--r--editor/icons/source/icon_color.svg268
-rw-r--r--editor/icons/source/icon_color_pick.svg77
-rw-r--r--editor/icons/source/icon_color_picker.svg77
-rw-r--r--editor/icons/source/icon_color_picker_button.svg92
-rw-r--r--editor/icons/source/icon_color_ramp.svg102
-rw-r--r--editor/icons/source/icon_color_rect.svg156
-rw-r--r--editor/icons/source/icon_concave_polygon_shape.svg122
-rw-r--r--editor/icons/source/icon_concave_polygon_shape_2d.svg83
-rw-r--r--editor/icons/source/icon_cone_twist_joint.svg93
-rw-r--r--editor/icons/source/icon_confirmation_dialog.svg77
-rw-r--r--editor/icons/source/icon_connect.svg77
-rw-r--r--editor/icons/source/icon_connection_and_groups.svg77
-rw-r--r--editor/icons/source/icon_container.svg77
-rw-r--r--editor/icons/source/icon_control.svg78
-rw-r--r--editor/icons/source/icon_control_align_bottom_center.svg94
-rw-r--r--editor/icons/source/icon_control_align_bottom_left.svg94
-rw-r--r--editor/icons/source/icon_control_align_bottom_right.svg94
-rw-r--r--editor/icons/source/icon_control_align_bottom_wide.svg94
-rw-r--r--editor/icons/source/icon_control_align_center.svg94
-rw-r--r--editor/icons/source/icon_control_align_center_left.svg80
-rw-r--r--editor/icons/source/icon_control_align_center_right.svg80
-rw-r--r--editor/icons/source/icon_control_align_left_center.svg94
-rw-r--r--editor/icons/source/icon_control_align_left_wide.svg94
-rw-r--r--editor/icons/source/icon_control_align_right_center.svg94
-rw-r--r--editor/icons/source/icon_control_align_right_wide.svg94
-rw-r--r--editor/icons/source/icon_control_align_top_center.svg94
-rw-r--r--editor/icons/source/icon_control_align_top_left.svg94
-rw-r--r--editor/icons/source/icon_control_align_top_right.svg94
-rw-r--r--editor/icons/source/icon_control_align_top_wide.svg94
-rw-r--r--editor/icons/source/icon_control_align_wide.svg94
-rw-r--r--editor/icons/source/icon_control_hcenter_wide.svg94
-rw-r--r--editor/icons/source/icon_control_vcenter_wide.svg95
-rw-r--r--editor/icons/source/icon_convex_polygon_shape.svg98
-rw-r--r--editor/icons/source/icon_convex_polygon_shape_2d.svg83
-rw-r--r--editor/icons/source/icon_copy_node_path.svg98
-rw-r--r--editor/icons/source/icon_create_new_scene_from.svg101
-rw-r--r--editor/icons/source/icon_cube_map.svg120
-rw-r--r--editor/icons/source/icon_curve_2d.svg82
-rw-r--r--editor/icons/source/icon_curve_3d.svg82
-rw-r--r--editor/icons/source/icon_curve_close.svg123
-rw-r--r--editor/icons/source/icon_curve_constant.svg81
-rw-r--r--editor/icons/source/icon_curve_create.svg117
-rw-r--r--editor/icons/source/icon_curve_curve.svg107
-rw-r--r--editor/icons/source/icon_curve_delete.svg107
-rw-r--r--editor/icons/source/icon_curve_edit.svg108
-rw-r--r--editor/icons/source/icon_curve_in.svg79
-rw-r--r--editor/icons/source/icon_curve_in_out.svg79
-rw-r--r--editor/icons/source/icon_curve_linear.svg79
-rw-r--r--editor/icons/source/icon_curve_out.svg79
-rw-r--r--editor/icons/source/icon_curve_out_in.svg79
-rw-r--r--editor/icons/source/icon_damped_spring_joint_2d.svg86
-rw-r--r--editor/icons/source/icon_debug_continue.svg109
-rw-r--r--editor/icons/source/icon_debug_next.svg132
-rw-r--r--editor/icons/source/icon_debug_step.svg140
-rw-r--r--editor/icons/source/icon_dependency_changed.svg82
-rw-r--r--editor/icons/source/icon_dependency_changed_hl.svg92
-rw-r--r--editor/icons/source/icon_dependency_local_changed.svg82
-rw-r--r--editor/icons/source/icon_dependency_local_changed_hl.svg77
-rw-r--r--editor/icons/source/icon_dependency_ok.svg82
-rw-r--r--editor/icons/source/icon_dependency_ok_hl.svg77
-rw-r--r--editor/icons/source/icon_directional_light.svg157
-rw-r--r--editor/icons/source/icon_distraction_free.svg104
-rw-r--r--editor/icons/source/icon_duplicate.svg104
-rw-r--r--editor/icons/source/icon_dynamic_font.svg82
-rw-r--r--editor/icons/source/icon_dynamic_font_data.svg82
-rw-r--r--editor/icons/source/icon_edit.svg78
-rw-r--r--editor/icons/source/icon_edit_key.svg85
-rw-r--r--editor/icons/source/icon_edit_pivot.svg89
-rw-r--r--editor/icons/source/icon_edit_resource.svg81
-rw-r--r--editor/icons/source/icon_editor_3d_handle.svg84
-rw-r--r--editor/icons/source/icon_editor_handle.svg86
-rw-r--r--editor/icons/source/icon_editor_pivot.svg82
-rw-r--r--editor/icons/source/icon_editor_plugin.svg109
-rw-r--r--editor/icons/source/icon_environment.svg82
-rw-r--r--editor/icons/source/icon_error.svg81
-rw-r--r--editor/icons/source/icon_error_sign.svg92
-rw-r--r--editor/icons/source/icon_event_player.svg96
-rw-r--r--editor/icons/source/icon_favorites.svg82
-rw-r--r--editor/icons/source/icon_file_big.svg87
-rw-r--r--editor/icons/source/icon_file_dialog.svg77
-rw-r--r--editor/icons/source/icon_file_list.svg114
-rw-r--r--editor/icons/source/icon_file_server.svg91
-rw-r--r--editor/icons/source/icon_file_server_active.svg91
-rw-r--r--editor/icons/source/icon_file_thumbnail.svg100
-rw-r--r--editor/icons/source/icon_fixed_material.svg92
-rw-r--r--editor/icons/source/icon_fixed_spatial_material.svg169
-rw-r--r--editor/icons/source/icon_folder.svg114
-rw-r--r--editor/icons/source/icon_folder_big.svg147
-rw-r--r--editor/icons/source/icon_font.svg130
-rw-r--r--editor/icons/source/icon_forward.svg79
-rw-r--r--editor/icons/source/icon_g_d_script.svg77
-rw-r--r--editor/icons/source/icon_g_i_probe.svg110
-rw-r--r--editor/icons/source/icon_g_i_probe_data.svg108
-rw-r--r--editor/icons/source/icon_generic_6_d_o_f_joint.svg92
-rw-r--r--editor/icons/source/icon_gizmo_directional_light.svg132
-rw-r--r--editor/icons/source/icon_gizmo_light.svg90
-rw-r--r--editor/icons/source/icon_gizmo_listener.svg100
-rw-r--r--editor/icons/source/icon_gizmo_spatial_sample_player.svg120
-rw-r--r--editor/icons/source/icon_gizmo_spatial_stream_player.svg81
-rw-r--r--editor/icons/source/icon_godot.svg168
-rw-r--r--editor/icons/source/icon_graph_comment.svg100
-rw-r--r--editor/icons/source/icon_graph_cube_uniform.svg77
-rw-r--r--editor/icons/source/icon_graph_curve_map.svg86
-rw-r--r--editor/icons/source/icon_graph_default_texture.svg80
-rw-r--r--editor/icons/source/icon_graph_edit.svg95
-rw-r--r--editor/icons/source/icon_graph_input.svg81
-rw-r--r--editor/icons/source/icon_graph_node.svg89
-rw-r--r--editor/icons/source/icon_graph_rgb.svg118
-rw-r--r--editor/icons/source/icon_graph_rgb_op.svg119
-rw-r--r--editor/icons/source/icon_graph_rgb_uniform.svg119
-rw-r--r--editor/icons/source/icon_graph_scalar.svg78
-rw-r--r--editor/icons/source/icon_graph_scalar_interp.svg78
-rw-r--r--editor/icons/source/icon_graph_scalar_op.svg103
-rw-r--r--editor/icons/source/icon_graph_scalar_uniform.svg78
-rw-r--r--editor/icons/source/icon_graph_scalars_to_vec.svg94
-rw-r--r--editor/icons/source/icon_graph_texscreen.svg86
-rw-r--r--editor/icons/source/icon_graph_texture_uniform.svg80
-rw-r--r--editor/icons/source/icon_graph_time.svg96
-rw-r--r--editor/icons/source/icon_graph_vec_dp.svg94
-rw-r--r--editor/icons/source/icon_graph_vec_interp.svg78
-rw-r--r--editor/icons/source/icon_graph_vec_length.svg96
-rw-r--r--editor/icons/source/icon_graph_vec_op.svg80
-rw-r--r--editor/icons/source/icon_graph_vec_scalar_op.svg85
-rw-r--r--editor/icons/source/icon_graph_vec_to_scalars.svg94
-rw-r--r--editor/icons/source/icon_graph_vecs_to_xform.svg86
-rw-r--r--editor/icons/source/icon_graph_vector.svg82
-rw-r--r--editor/icons/source/icon_graph_vector_uniform.svg90
-rw-r--r--editor/icons/source/icon_graph_xform.svg123
-rw-r--r--editor/icons/source/icon_graph_xform_mult.svg93
-rw-r--r--editor/icons/source/icon_graph_xform_scalar_func.svg112
-rw-r--r--editor/icons/source/icon_graph_xform_to_vecs.svg86
-rw-r--r--editor/icons/source/icon_graph_xform_uniform.svg80
-rw-r--r--editor/icons/source/icon_graph_xform_vec_func.svg112
-rw-r--r--editor/icons/source/icon_graph_xform_vec_imult.svg94
-rw-r--r--editor/icons/source/icon_graph_xform_vec_mult.svg94
-rw-r--r--editor/icons/source/icon_grid.svg134
-rw-r--r--editor/icons/source/icon_grid_container.svg107
-rw-r--r--editor/icons/source/icon_grid_map.svg135
-rw-r--r--editor/icons/source/icon_groove_joint_2d.svg77
-rw-r--r--editor/icons/source/icon_group.svg118
-rw-r--r--editor/icons/source/icon_groups.svg93
-rw-r--r--editor/icons/source/icon_h_box_container.svg93
-rw-r--r--editor/icons/source/icon_h_button_array.svg97
-rw-r--r--editor/icons/source/icon_h_scroll_bar.svg97
-rw-r--r--editor/icons/source/icon_h_separator.svg94
-rw-r--r--editor/icons/source/icon_h_slider.svg99
-rw-r--r--editor/icons/source/icon_h_split_container.svg96
-rw-r--r--editor/icons/source/icon_h_t_t_p_request.svg173
-rw-r--r--editor/icons/source/icon_headphones.svg119
-rw-r--r--editor/icons/source/icon_help.svg110
-rw-r--r--editor/icons/source/icon_hidden.svg109
-rw-r--r--editor/icons/source/icon_hinge_joint.svg91
-rw-r--r--editor/icons/source/icon_history.svg109
-rw-r--r--editor/icons/source/icon_hsize.svg79
-rw-r--r--editor/icons/source/icon_image.svg86
-rw-r--r--editor/icons/source/icon_image_sky_box.svg116
-rw-r--r--editor/icons/source/icon_image_texture.svg137
-rw-r--r--editor/icons/source/icon_immediate_geometry.svg83
-rw-r--r--editor/icons/source/icon_import_check.svg82
-rw-r--r--editor/icons/source/icon_import_fail.svg81
-rw-r--r--editor/icons/source/icon_instance.svg84
-rw-r--r--editor/icons/source/icon_instance_options.svg84
-rw-r--r--editor/icons/source/icon_integer.svg94
-rw-r--r--editor/icons/source/icon_interp_cubic.svg83
-rw-r--r--editor/icons/source/icon_interp_linear.svg83
-rw-r--r--editor/icons/source/icon_interp_raw.svg83
-rw-r--r--editor/icons/source/icon_interp_wrap_clamp.svg110
-rw-r--r--editor/icons/source/icon_interp_wrap_loop.svg121
-rw-r--r--editor/icons/source/icon_interpolated_camera.svg259
-rw-r--r--editor/icons/source/icon_invalid_key.svg78
-rw-r--r--editor/icons/source/icon_inverse_kinematics.svg123
-rw-r--r--editor/icons/source/icon_item_list.svg142
-rw-r--r--editor/icons/source/icon_joy_axis.svg94
-rw-r--r--editor/icons/source/icon_joy_button.svg88
-rw-r--r--editor/icons/source/icon_joypad.svg81
-rw-r--r--editor/icons/source/icon_key.svg91
-rw-r--r--editor/icons/source/icon_key_hover.svg77
-rw-r--r--editor/icons/source/icon_key_invalid.svg78
-rw-r--r--editor/icons/source/icon_key_next.svg82
-rw-r--r--editor/icons/source/icon_key_selected.svg77
-rw-r--r--editor/icons/source/icon_key_value.svg77
-rw-r--r--editor/icons/source/icon_key_xform.svg77
-rw-r--r--editor/icons/source/icon_keyboard.svg93
-rw-r--r--editor/icons/source/icon_kinematic_body.svg77
-rw-r--r--editor/icons/source/icon_kinematic_body_2d.svg77
-rw-r--r--editor/icons/source/icon_label.svg81
-rw-r--r--editor/icons/source/icon_large_texture.svg80
-rw-r--r--editor/icons/source/icon_light_2d.svg78
-rw-r--r--editor/icons/source/icon_light_occluder_2d.svg122
-rw-r--r--editor/icons/source/icon_line_2d.svg82
-rw-r--r--editor/icons/source/icon_line_edit.svg90
-rw-r--r--editor/icons/source/icon_line_shape_2d.svg95
-rw-r--r--editor/icons/source/icon_link_button.svg86
-rw-r--r--editor/icons/source/icon_list_select.svg88
-rw-r--r--editor/icons/source/icon_listener.svg101
-rw-r--r--editor/icons/source/icon_load.svg147
-rw-r--r--editor/icons/source/icon_lock.svg102
-rw-r--r--editor/icons/source/icon_loop.svg81
-rw-r--r--editor/icons/source/icon_loop_interpolation.svg111
-rw-r--r--editor/icons/source/icon_main_play.svg81
-rw-r--r--editor/icons/source/icon_main_stop.svg81
-rw-r--r--editor/icons/source/icon_margin_container.svg85
-rw-r--r--editor/icons/source/icon_material_preview_cube.svg99
-rw-r--r--editor/icons/source/icon_material_preview_cube_off.svg104
-rw-r--r--editor/icons/source/icon_material_preview_light_1.svg82
-rw-r--r--editor/icons/source/icon_material_preview_light_1_off.svg82
-rw-r--r--editor/icons/source/icon_material_preview_light_2.svg82
-rw-r--r--editor/icons/source/icon_material_preview_light_2_off.svg87
-rw-r--r--editor/icons/source/icon_material_preview_sphere.svg82
-rw-r--r--editor/icons/source/icon_material_preview_sphere_off.svg82
-rw-r--r--editor/icons/source/icon_matrix.svg180
-rw-r--r--editor/icons/source/icon_menu_button.svg83
-rw-r--r--editor/icons/source/icon_mesh.svg78
-rw-r--r--editor/icons/source/icon_mesh_instance.svg132
-rw-r--r--editor/icons/source/icon_mesh_library.svg78
-rw-r--r--editor/icons/source/icon_mini_aabb.svg107
-rw-r--r--editor/icons/source/icon_mini_array.svg130
-rw-r--r--editor/icons/source/icon_mini_boolean.svg131
-rw-r--r--editor/icons/source/icon_mini_color.svg126
-rw-r--r--editor/icons/source/icon_mini_color_array.svg250
-rw-r--r--editor/icons/source/icon_mini_dictionary.svg150
-rw-r--r--editor/icons/source/icon_mini_float.svg147
-rw-r--r--editor/icons/source/icon_mini_float_array.svg133
-rw-r--r--editor/icons/source/icon_mini_image.svg156
-rw-r--r--editor/icons/source/icon_mini_input.svg146
-rw-r--r--editor/icons/source/icon_mini_int_array.svg94
-rw-r--r--editor/icons/source/icon_mini_integer.svg143
-rw-r--r--editor/icons/source/icon_mini_matrix3.svg140
-rw-r--r--editor/icons/source/icon_mini_matrix32.svg145
-rw-r--r--editor/icons/source/icon_mini_object.svg111
-rw-r--r--editor/icons/source/icon_mini_path.svg142
-rw-r--r--editor/icons/source/icon_mini_plane.svg124
-rw-r--r--editor/icons/source/icon_mini_quat.svg123
-rw-r--r--editor/icons/source/icon_mini_raw_array.svg103
-rw-r--r--editor/icons/source/icon_mini_rect2.svg170
-rw-r--r--editor/icons/source/icon_mini_rid.svg140
-rw-r--r--editor/icons/source/icon_mini_string.svg236
-rw-r--r--editor/icons/source/icon_mini_string_array.svg289
-rw-r--r--editor/icons/source/icon_mini_transform.svg90
-rw-r--r--editor/icons/source/icon_mini_variant.svg138
-rw-r--r--editor/icons/source/icon_mini_vector2.svg149
-rw-r--r--editor/icons/source/icon_mini_vector2_array.svg129
-rw-r--r--editor/icons/source/icon_mini_vector3.svg142
-rw-r--r--editor/icons/source/icon_mini_vector3_array.svg129
-rw-r--r--editor/icons/source/icon_mirror_x.svg79
-rw-r--r--editor/icons/source/icon_mirror_y.svg78
-rw-r--r--editor/icons/source/icon_mouse.svg77
-rw-r--r--editor/icons/source/icon_move_down.svg80
-rw-r--r--editor/icons/source/icon_move_point.svg94
-rw-r--r--editor/icons/source/icon_move_up.svg80
-rw-r--r--editor/icons/source/icon_multi_edit.svg99
-rw-r--r--editor/icons/source/icon_multi_line.svg115
-rw-r--r--editor/icons/source/icon_multi_mesh.svg78
-rw-r--r--editor/icons/source/icon_multi_mesh_instance.svg83
-rw-r--r--editor/icons/source/icon_navigation.svg78
-rw-r--r--editor/icons/source/icon_navigation_2d.svg78
-rw-r--r--editor/icons/source/icon_navigation_mesh.svg78
-rw-r--r--editor/icons/source/icon_navigation_mesh_instance.svg97
-rw-r--r--editor/icons/source/icon_navigation_polygon.svg88
-rw-r--r--editor/icons/source/icon_navigation_polygon_instance.svg82
-rw-r--r--editor/icons/source/icon_new.svg86
-rw-r--r--editor/icons/source/icon_nine_patch_rect.svg130
-rw-r--r--editor/icons/source/icon_node.svg78
-rw-r--r--editor/icons/source/icon_node_2d.svg78
-rw-r--r--editor/icons/source/icon_node_warning.svg86
-rw-r--r--editor/icons/source/icon_non_favorite.svg82
-rw-r--r--editor/icons/source/icon_object.svg87
-rw-r--r--editor/icons/source/icon_occluder_polygon_2d.svg87
-rw-r--r--editor/icons/source/icon_omni_light.svg78
-rw-r--r--editor/icons/source/icon_option_button.svg90
-rw-r--r--editor/icons/source/icon_override.svg91
-rw-r--r--editor/icons/source/icon_packed_data_container.svg138
-rw-r--r--editor/icons/source/icon_packed_scene.svg96
-rw-r--r--editor/icons/source/icon_panel.svg79
-rw-r--r--editor/icons/source/icon_panel_container.svg79
-rw-r--r--editor/icons/source/icon_panels_1.svg80
-rw-r--r--editor/icons/source/icon_panels_2.svg87
-rw-r--r--editor/icons/source/icon_panels_2_alt.svg87
-rw-r--r--editor/icons/source/icon_panels_3.svg94
-rw-r--r--editor/icons/source/icon_panels_3_alt.svg94
-rw-r--r--editor/icons/source/icon_panels_4.svg101
-rw-r--r--editor/icons/source/icon_parallax_background.svg167
-rw-r--r--editor/icons/source/icon_parallax_layer.svg99
-rw-r--r--editor/icons/source/icon_particle_attractor_2d.svg103
-rw-r--r--editor/icons/source/icon_particles.svg120
-rw-r--r--editor/icons/source/icon_particles_2d.svg120
-rw-r--r--editor/icons/source/icon_particles_shader.svg159
-rw-r--r--editor/icons/source/icon_patch_9_rect.svg130
-rw-r--r--editor/icons/source/icon_path.svg91
-rw-r--r--editor/icons/source/icon_path_2d.svg90
-rw-r--r--editor/icons/source/icon_path_follow.svg89
-rw-r--r--editor/icons/source/icon_path_follow_2d.svg89
-rw-r--r--editor/icons/source/icon_pause.svg104
-rw-r--r--editor/icons/source/icon_pin.svg99
-rw-r--r--editor/icons/source/icon_pin_joint.svg100
-rw-r--r--editor/icons/source/icon_pin_joint_2d.svg100
-rw-r--r--editor/icons/source/icon_pin_pressed.svg99
-rw-r--r--editor/icons/source/icon_plane.svg82
-rw-r--r--editor/icons/source/icon_plane_shape.svg82
-rw-r--r--editor/icons/source/icon_play.svg81
-rw-r--r--editor/icons/source/icon_play_backwards.svg81
-rw-r--r--editor/icons/source/icon_play_custom.svg87
-rw-r--r--editor/icons/source/icon_play_scene.svg99
-rw-r--r--editor/icons/source/icon_play_start.svg101
-rw-r--r--editor/icons/source/icon_play_start_backwards.svg99
-rw-r--r--editor/icons/source/icon_polygon_path_finder.svg77
-rw-r--r--editor/icons/source/icon_popup.svg77
-rw-r--r--editor/icons/source/icon_popup_dialog.svg77
-rw-r--r--editor/icons/source/icon_popup_menu.svg83
-rw-r--r--editor/icons/source/icon_popup_panel.svg85
-rw-r--r--editor/icons/source/icon_portal.svg78
-rw-r--r--editor/icons/source/icon_position_2d.svg101
-rw-r--r--editor/icons/source/icon_position_3d.svg78
-rw-r--r--editor/icons/source/icon_progress_1.svg104
-rw-r--r--editor/icons/source/icon_progress_2.svg104
-rw-r--r--editor/icons/source/icon_progress_3.svg104
-rw-r--r--editor/icons/source/icon_progress_4.svg104
-rw-r--r--editor/icons/source/icon_progress_5.svg104
-rw-r--r--editor/icons/source/icon_progress_6.svg104
-rw-r--r--editor/icons/source/icon_progress_7.svg104
-rw-r--r--editor/icons/source/icon_progress_8.svg104
-rw-r--r--editor/icons/source/icon_progress_bar.svg104
-rw-r--r--editor/icons/source/icon_proximity_group.svg121
-rw-r--r--editor/icons/source/icon_quad.svg78
-rw-r--r--editor/icons/source/icon_quat.svg82
-rw-r--r--editor/icons/source/icon_range.svg107
-rw-r--r--editor/icons/source/icon_rating_no_star.svg88
-rw-r--r--editor/icons/source/icon_rating_star.svg82
-rw-r--r--editor/icons/source/icon_ray_cast.svg85
-rw-r--r--editor/icons/source/icon_ray_cast_2d.svg85
-rw-r--r--editor/icons/source/icon_ray_shape.svg107
-rw-r--r--editor/icons/source/icon_ray_shape_2d.svg89
-rw-r--r--editor/icons/source/icon_rayito.svg90
-rw-r--r--editor/icons/source/icon_real.svg120
-rw-r--r--editor/icons/source/icon_rectangle_shape_2d.svg86
-rw-r--r--editor/icons/source/icon_reference_rect.svg100
-rw-r--r--editor/icons/source/icon_reflection_probe.svg82
-rw-r--r--editor/icons/source/icon_region_edit.svg135
-rw-r--r--editor/icons/source/icon_reload_small.svg95
-rw-r--r--editor/icons/source/icon_remote.svg93
-rw-r--r--editor/icons/source/icon_remote_transform.svg124
-rw-r--r--editor/icons/source/icon_remote_transform_2d.svg124
-rw-r--r--editor/icons/source/icon_remove.svg91
-rw-r--r--editor/icons/source/icon_rename.svg77
-rw-r--r--editor/icons/source/icon_reparent.svg85
-rw-r--r--editor/icons/source/icon_resource_preloader.svg89
-rw-r--r--editor/icons/source/icon_rich_text_label.svg120
-rw-r--r--editor/icons/source/icon_rigid_body.svg87
-rw-r--r--editor/icons/source/icon_rigid_body_2d.svg124
-rw-r--r--editor/icons/source/icon_room.svg78
-rw-r--r--editor/icons/source/icon_room_bounds.svg78
-rw-r--r--editor/icons/source/icon_rotate_0.svg84
-rw-r--r--editor/icons/source/icon_rotate_180.svg106
-rw-r--r--editor/icons/source/icon_rotate_270.svg113
-rw-r--r--editor/icons/source/icon_rotate_90.svg99
-rw-r--r--editor/icons/source/icon_sample.svg128
-rw-r--r--editor/icons/source/icon_sample_library.svg87
-rw-r--r--editor/icons/source/icon_sample_player.svg78
-rw-r--r--editor/icons/source/icon_sample_player_2d.svg78
-rw-r--r--editor/icons/source/icon_save.svg94
-rw-r--r--editor/icons/source/icon_script.svg90
-rw-r--r--editor/icons/source/icon_script_create.svg99
-rw-r--r--editor/icons/source/icon_script_remove.svg99
-rw-r--r--editor/icons/source/icon_scroll_bar.svg97
-rw-r--r--editor/icons/source/icon_scroll_container.svg103
-rw-r--r--editor/icons/source/icon_segment_shape_2d.svg82
-rw-r--r--editor/icons/source/icon_shader.svg152
-rw-r--r--editor/icons/source/icon_short_cut.svg89
-rw-r--r--editor/icons/source/icon_signal.svg118
-rw-r--r--editor/icons/source/icon_skeleton.svg105
-rw-r--r--editor/icons/source/icon_slider_joint.svg77
-rw-r--r--editor/icons/source/icon_slot.svg102
-rw-r--r--editor/icons/source/icon_snap.svg111
-rw-r--r--editor/icons/source/icon_sound_room_params.svg100
-rw-r--r--editor/icons/source/icon_spatial.svg78
-rw-r--r--editor/icons/source/icon_spatial_sample_player.svg78
-rw-r--r--editor/icons/source/icon_spatial_shader.svg165
-rw-r--r--editor/icons/source/icon_spatial_stream_player.svg83
-rw-r--r--editor/icons/source/icon_sphere_shape.svg89
-rw-r--r--editor/icons/source/icon_spin_box.svg100
-rw-r--r--editor/icons/source/icon_spot_light.svg78
-rw-r--r--editor/icons/source/icon_sprite.svg77
-rw-r--r--editor/icons/source/icon_sprite_3d.svg77
-rw-r--r--editor/icons/source/icon_sprite_frames.svg119
-rw-r--r--editor/icons/source/icon_static_body.svg80
-rw-r--r--editor/icons/source/icon_static_body_2d.svg87
-rw-r--r--editor/icons/source/icon_stream_player.svg83
-rw-r--r--editor/icons/source/icon_string.svg77
-rw-r--r--editor/icons/source/icon_style_box_empty.svg140
-rw-r--r--editor/icons/source/icon_style_box_flat.svg149
-rw-r--r--editor/icons/source/icon_style_box_texture.svg140
-rw-r--r--editor/icons/source/icon_tab_container.svg80
-rw-r--r--editor/icons/source/icon_tabs.svg143
-rw-r--r--editor/icons/source/icon_test_cube.svg88
-rw-r--r--editor/icons/source/icon_text_edit.svg87
-rw-r--r--editor/icons/source/icon_texture.svg137
-rw-r--r--editor/icons/source/icon_texture_button.svg94
-rw-r--r--editor/icons/source/icon_texture_progress.svg104
-rw-r--r--editor/icons/source/icon_texture_rect.svg105
-rw-r--r--editor/icons/source/icon_theme.svg144
-rw-r--r--editor/icons/source/icon_tile_map.svg250
-rw-r--r--editor/icons/source/icon_tile_set.svg80
-rw-r--r--editor/icons/source/icon_timer.svg108
-rw-r--r--editor/icons/source/icon_tool_button.svg94
-rw-r--r--editor/icons/source/icon_tool_move.svg77
-rw-r--r--editor/icons/source/icon_tool_pan.svg136
-rw-r--r--editor/icons/source/icon_tool_rotate.svg95
-rw-r--r--editor/icons/source/icon_tool_scale.svg77
-rw-r--r--editor/icons/source/icon_tool_select.svg88
-rw-r--r--editor/icons/source/icon_tools.svg77
-rw-r--r--editor/icons/source/icon_touch_screen_button.svg174
-rw-r--r--editor/icons/source/icon_track_add_key.svg77
-rw-r--r--editor/icons/source/icon_track_add_key_hl.svg82
-rw-r--r--editor/icons/source/icon_track_continuous.svg83
-rw-r--r--editor/icons/source/icon_track_discrete.svg95
-rw-r--r--editor/icons/source/icon_track_trigger.svg109
-rw-r--r--editor/icons/source/icon_translation.svg78
-rw-r--r--editor/icons/source/icon_transpose.svg127
-rw-r--r--editor/icons/source/icon_tree.svg129
-rw-r--r--editor/icons/source/icon_tween.svg98
-rw-r--r--editor/icons/source/icon_unbone.svg78
-rw-r--r--editor/icons/source/icon_ungroup.svg141
-rw-r--r--editor/icons/source/icon_unlock.svg97
-rw-r--r--editor/icons/source/icon_uv.svg80
-rw-r--r--editor/icons/source/icon_v_box_container.svg77
-rw-r--r--editor/icons/source/icon_v_button_array.svg100
-rw-r--r--editor/icons/source/icon_v_scroll_bar.svg98
-rw-r--r--editor/icons/source/icon_v_separator.svg77
-rw-r--r--editor/icons/source/icon_v_slider.svg87
-rw-r--r--editor/icons/source/icon_v_split_container.svg97
-rw-r--r--editor/icons/source/icon_vector.svg87
-rw-r--r--editor/icons/source/icon_vector2.svg81
-rw-r--r--editor/icons/source/icon_vehicle_body.svg90
-rw-r--r--editor/icons/source/icon_vehicle_wheel.svg83
-rw-r--r--editor/icons/source/icon_video_player.svg100
-rw-r--r--editor/icons/source/icon_viewport.svg82
-rw-r--r--editor/icons/source/icon_viewport_container.svg82
-rw-r--r--editor/icons/source/icon_viewport_sprite.svg117
-rw-r--r--editor/icons/source/icon_viewport_texture.svg80
-rw-r--r--editor/icons/source/icon_visibility_enabler.svg99
-rw-r--r--editor/icons/source/icon_visibility_enabler_2d.svg99
-rw-r--r--editor/icons/source/icon_visibility_notifier.svg96
-rw-r--r--editor/icons/source/icon_visibility_notifier_2d.svg96
-rw-r--r--editor/icons/source/icon_visible.svg87
-rw-r--r--editor/icons/source/icon_visual_script.svg91
-rw-r--r--editor/icons/source/icon_visual_shader_port.svg80
-rw-r--r--editor/icons/source/icon_vu_empty.svg115
-rw-r--r--editor/icons/source/icon_vu_full.svg110
-rw-r--r--editor/icons/source/icon_warning.svg81
-rw-r--r--editor/icons/source/icon_window_dialog.svg77
-rw-r--r--editor/icons/source/icon_world.svg89
-rw-r--r--editor/icons/source/icon_world_2d.svg82
-rw-r--r--editor/icons/source/icon_world_environment.svg108
-rw-r--r--editor/icons/source/icon_y_sort.svg99
-rw-r--r--editor/icons/source/icon_zoom.svg87
-rw-r--r--editor/icons/source/icon_zoom_less.svg79
-rw-r--r--editor/icons/source/icon_zoom_more.svg104
-rw-r--r--editor/icons/source/icon_zoom_reset.svg112
-rwxr-xr-xeditor/icons/xpmfix.sh2
-rw-r--r--editor/import/SCsub5
-rw-r--r--editor/import/editor_import_collada.cpp2508
-rw-r--r--editor/import/editor_import_collada.h51
-rw-r--r--editor/import/resource_importer_csv_translation.cpp126
-rw-r--r--editor/import/resource_importer_csv_translation.h27
-rw-r--r--editor/import/resource_importer_obj.cpp231
-rw-r--r--editor/import/resource_importer_obj.h28
-rw-r--r--editor/import/resource_importer_scene.cpp1328
-rw-r--r--editor/import/resource_importer_scene.h93
-rw-r--r--editor/import/resource_importer_texture.cpp393
-rw-r--r--editor/import/resource_importer_texture.h70
-rw-r--r--editor/import/resource_importer_wav.cpp619
-rw-r--r--editor/import/resource_importer_wav.h30
-rw-r--r--editor/import_dock.cpp331
-rw-r--r--editor/import_dock.h42
-rw-r--r--editor/inspector_dock.cpp50
-rw-r--r--editor/inspector_dock.h63
-rw-r--r--editor/io_plugins/SCsub5
-rw-r--r--editor/io_plugins/editor_atlas.cpp160
-rw-r--r--editor/io_plugins/editor_atlas.h43
-rw-r--r--editor/io_plugins/editor_bitmask_import_plugin.cpp387
-rw-r--r--editor/io_plugins/editor_bitmask_import_plugin.h70
-rw-r--r--editor/io_plugins/editor_export_scene.cpp142
-rw-r--r--editor/io_plugins/editor_export_scene.h44
-rw-r--r--editor/io_plugins/editor_font_import_plugin.cpp1704
-rw-r--r--editor/io_plugins/editor_font_import_plugin.h58
-rw-r--r--editor/io_plugins/editor_mesh_import_plugin.cpp593
-rw-r--r--editor/io_plugins/editor_mesh_import_plugin.h59
-rw-r--r--editor/io_plugins/editor_sample_import_plugin.cpp929
-rw-r--r--editor/io_plugins/editor_sample_import_plugin.h74
-rw-r--r--editor/io_plugins/editor_scene_import_plugin.cpp2992
-rw-r--r--editor/io_plugins/editor_scene_import_plugin.h200
-rw-r--r--editor/io_plugins/editor_scene_importer_fbxconv.cpp1136
-rw-r--r--editor/io_plugins/editor_scene_importer_fbxconv.h111
-rw-r--r--editor/io_plugins/editor_texture_import_plugin.cpp1893
-rw-r--r--editor/io_plugins/editor_texture_import_plugin.h179
-rw-r--r--editor/io_plugins/editor_translation_import_plugin.cpp479
-rw-r--r--editor/io_plugins/editor_translation_import_plugin.h56
-rw-r--r--editor/multi_node_edit.cpp191
-rw-r--r--editor/multi_node_edit.h65
-rw-r--r--editor/node_dock.cpp133
-rw-r--r--editor/node_dock.h66
-rw-r--r--editor/output_strings.cpp215
-rw-r--r--editor/output_strings.h89
-rw-r--r--editor/pane_drag.cpp75
-rw-r--r--editor/pane_drag.h51
-rw-r--r--editor/plugins/SCsub5
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp1604
-rw-r--r--editor/plugins/animation_player_editor_plugin.h219
-rw-r--r--editor/plugins/animation_tree_editor_plugin.cpp1536
-rw-r--r--editor/plugins/animation_tree_editor_plugin.h194
-rw-r--r--editor/plugins/baked_light_baker.cpp2731
-rw-r--r--editor/plugins/baked_light_baker.h381
-rw-r--r--editor/plugins/baked_light_baker_cmpxchg.cpp112
-rw-r--r--editor/plugins/baked_light_editor_plugin.cpp379
-rw-r--r--editor/plugins/baked_light_editor_plugin.h120
-rw-r--r--editor/plugins/camera_editor_plugin.cpp150
-rw-r--r--editor/plugins/camera_editor_plugin.h79
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp4063
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h503
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.cpp482
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.h111
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.cpp648
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.h123
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.cpp600
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.h101
-rw-r--r--editor/plugins/color_ramp_editor_plugin.cpp112
-rw-r--r--editor/plugins/color_ramp_editor_plugin.h62
-rw-r--r--editor/plugins/cube_grid_theme_editor_plugin.cpp357
-rw-r--r--editor/plugins/cube_grid_theme_editor_plugin.h96
-rw-r--r--editor/plugins/editor_preview_plugins.cpp907
-rw-r--r--editor/plugins/editor_preview_plugins.h128
-rw-r--r--editor/plugins/gi_probe_editor_plugin.cpp83
-rw-r--r--editor/plugins/gi_probe_editor_plugin.h65
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp381
-rw-r--r--editor/plugins/item_list_editor_plugin.h230
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.cpp518
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.h115
-rw-r--r--editor/plugins/line_2d_editor_plugin.cpp283
-rw-r--r--editor/plugins/line_2d_editor_plugin.h90
-rw-r--r--editor/plugins/material_editor_plugin.cpp413
-rw-r--r--editor/plugins/material_editor_plugin.h100
-rw-r--r--editor/plugins/mesh_editor_plugin.cpp245
-rw-r--r--editor/plugins/mesh_editor_plugin.h98
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.cpp334
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.h97
-rw-r--r--editor/plugins/multimesh_editor_plugin.cpp465
-rw-r--r--editor/plugins/multimesh_editor_plugin.h107
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.cpp566
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.h118
-rw-r--r--editor/plugins/particles_2d_editor_plugin.cpp199
-rw-r--r--editor/plugins/particles_2d_editor_plugin.h82
-rw-r--r--editor/plugins/particles_editor_plugin.cpp461
-rw-r--r--editor/plugins/particles_editor_plugin.h116
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp718
-rw-r--r--editor/plugins/path_2d_editor_plugin.h126
-rw-r--r--editor/plugins/path_editor_plugin.cpp604
-rw-r--r--editor/plugins/path_editor_plugin.h100
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp1028
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h167
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.cpp507
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.h108
-rw-r--r--editor/plugins/rich_text_editor_plugin.cpp164
-rw-r--r--editor/plugins/rich_text_editor_plugin.h91
-rw-r--r--editor/plugins/sample_editor_plugin.cpp451
-rw-r--r--editor/plugins/sample_editor_plugin.h92
-rw-r--r--editor/plugins/sample_library_editor_plugin.cpp546
-rw-r--r--editor/plugins/sample_library_editor_plugin.h108
-rw-r--r--editor/plugins/sample_player_editor_plugin.cpp203
-rw-r--r--editor/plugins/sample_player_editor_plugin.h90
-rw-r--r--editor/plugins/script_editor_plugin.cpp2491
-rw-r--r--editor/plugins/script_editor_plugin.h394
-rw-r--r--editor/plugins/script_text_editor.cpp1401
-rw-r--r--editor/plugins/script_text_editor.h159
-rw-r--r--editor/plugins/shader_editor_plugin.cpp584
-rw-r--r--editor/plugins/shader_editor_plugin.h156
-rw-r--r--editor/plugins/shader_graph_editor_plugin.cpp2948
-rw-r--r--editor/plugins/shader_graph_editor_plugin.h242
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp4131
-rw-r--r--editor/plugins/spatial_editor_plugin.h574
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp969
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.h138
-rw-r--r--editor/plugins/stream_editor_plugin.cpp149
-rw-r--r--editor/plugins/stream_editor_plugin.h84
-rw-r--r--editor/plugins/style_box_editor_plugin.cpp115
-rw-r--r--editor/plugins/style_box_editor_plugin.h83
-rw-r--r--editor/plugins/texture_editor_plugin.cpp169
-rw-r--r--editor/plugins/texture_editor_plugin.h77
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp1012
-rw-r--r--editor/plugins/texture_region_editor_plugin.h153
-rw-r--r--editor/plugins/theme_editor_plugin.cpp997
-rw-r--r--editor/plugins/theme_editor_plugin.h125
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp1593
-rw-r--r--editor/plugins/tile_map_editor_plugin.h207
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp297
-rw-r--r--editor/plugins/tile_set_editor_plugin.h101
-rw-r--r--editor/progress_dialog.cpp246
-rw-r--r--editor/progress_dialog.h105
-rw-r--r--editor/project_export.cpp828
-rw-r--r--editor/project_export.h142
-rw-r--r--editor/project_manager.cpp1516
-rw-r--r--editor/project_manager.h148
-rw-r--r--editor/project_settings.cpp1603
-rw-r--r--editor/project_settings.h164
-rw-r--r--editor/property_editor.cpp4960
-rw-r--r--editor/property_editor.h352
-rw-r--r--editor/property_selector.cpp626
-rw-r--r--editor/property_selector.h83
-rw-r--r--editor/pvrtc_compress.cpp134
-rw-r--r--editor/pvrtc_compress.h37
-rw-r--r--editor/quick_open.cpp285
-rw-r--r--editor/quick_open.h73
-rw-r--r--editor/register_exporters.h35
-rw-r--r--editor/reparent_dialog.cpp120
-rw-r--r--editor/reparent_dialog.h68
-rw-r--r--editor/resources_dock.cpp409
-rw-r--r--editor/resources_dock.h109
-rw-r--r--editor/run_settings_dialog.cpp98
-rw-r--r--editor/run_settings_dialog.h67
-rw-r--r--editor/scene_tree_dock.cpp2061
-rw-r--r--editor/scene_tree_dock.h188
-rw-r--r--editor/scene_tree_editor.cpp1316
-rw-r--r--editor/scene_tree_editor.h199
-rw-r--r--editor/script_create_dialog.cpp437
-rw-r--r--editor/script_create_dialog.h79
-rw-r--r--editor/script_editor_debugger.cpp1998
-rw-r--r--editor/script_editor_debugger.h226
-rw-r--r--editor/settings_config_dialog.cpp415
-rw-r--r--editor/settings_config_dialog.h94
-rw-r--r--editor/spatial_editor_gizmos.cpp3483
-rw-r--r--editor/spatial_editor_gizmos.h521
-rw-r--r--editor/translations/Makefile20
-rw-r--r--editor/translations/README.md20
-rw-r--r--editor/translations/ar.po6758
-rw-r--r--editor/translations/bg.po6811
-rw-r--r--editor/translations/bn.po6935
-rw-r--r--editor/translations/ca.po6942
-rw-r--r--editor/translations/cs.po6839
-rw-r--r--editor/translations/da.po6845
-rw-r--r--editor/translations/de.po7036
-rw-r--r--editor/translations/de_CH.po6823
-rw-r--r--editor/translations/editor.pot6742
-rw-r--r--editor/translations/es.po7161
-rw-r--r--editor/translations/es_AR.po7092
-rwxr-xr-xeditor/translations/extract.py121
-rw-r--r--editor/translations/fa.po6880
-rw-r--r--editor/translations/fr.po7163
-rw-r--r--editor/translations/hu.po6748
-rw-r--r--editor/translations/id.po6947
-rw-r--r--editor/translations/it.po7134
-rw-r--r--editor/translations/ja.po6870
-rw-r--r--editor/translations/ko.po7011
-rw-r--r--editor/translations/nb.po6748
-rw-r--r--editor/translations/pl.po6956
-rw-r--r--editor/translations/pr.po6773
-rw-r--r--editor/translations/pt_BR.po7116
-rw-r--r--editor/translations/pt_PT.po6763
-rw-r--r--editor/translations/ru.po7093
-rw-r--r--editor/translations/sk.po6775
-rw-r--r--editor/translations/sl.po6782
-rw-r--r--editor/translations/tr.po6953
-rw-r--r--editor/translations/ur_PK.po6769
-rw-r--r--editor/translations/zh_CN.po6953
-rw-r--r--editor/translations/zh_HK.po6812
-rw-r--r--editor/translations/zh_TW.po6774
2012 files changed, 399113 insertions, 0 deletions
diff --git a/editor/SCsub b/editor/SCsub
new file mode 100644
index 0000000000..d7392f8249
--- /dev/null
+++ b/editor/SCsub
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+
+Import('env')
+env.editor_sources = []
+
+import os
+
+
+def make_certs_header(target, source, env):
+
+ src = source[0].srcnode().abspath
+ dst = target[0].srcnode().abspath
+ f = open(src, "rb")
+ g = open(dst, "wb")
+ buf = f.read()
+ decomp_size = len(buf)
+ import zlib
+ buf = zlib.compress(buf)
+
+ g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
+ g.write("#ifndef _CERTS_RAW_H\n")
+ g.write("#define _CERTS_RAW_H\n")
+ g.write("static const int _certs_compressed_size=" + str(len(buf)) + ";\n")
+ g.write("static const int _certs_uncompressed_size=" + str(decomp_size) + ";\n")
+ g.write("static const unsigned char _certs_compressed[]={\n")
+ for i in range(len(buf)):
+ g.write(str(ord(buf[i])) + ",\n")
+ g.write("};\n")
+ g.write("#endif")
+
+
+def make_doc_header(target, source, env):
+
+ dst = target[0].srcnode().abspath
+ g = open(dst, "wb")
+ buf = ""
+ docbegin = ""
+ docend = ""
+ for s in source:
+ src = s.srcnode().abspath
+ f = open(src, "rb")
+ content = f.read()
+ buf += content[content.find("<class"): content.rfind("</doc>")]
+ if len(docbegin) == 0:
+ docbegin = content[0: content.find("<class")]
+ if len(docend) == 0:
+ docend = content[content.rfind("</doc>"): len(buf)]
+ buf = docbegin + buf + docend
+ decomp_size = len(buf)
+ import zlib
+ buf = zlib.compress(buf)
+
+ g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
+ g.write("#ifndef _DOC_DATA_RAW_H\n")
+ g.write("#define _DOC_DATA_RAW_H\n")
+ g.write("static const int _doc_data_compressed_size=" + str(len(buf)) + ";\n")
+ g.write("static const int _doc_data_uncompressed_size=" + str(decomp_size) + ";\n")
+ g.write("static const unsigned char _doc_data_compressed[]={\n")
+ for i in range(len(buf)):
+ g.write(str(ord(buf[i])) + ",\n")
+ g.write("};\n")
+ g.write("#endif")
+
+
+def make_fonts_header(target, source, env):
+
+ dst = target[0].srcnode().abspath
+
+ g = open(dst, "wb")
+
+ g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
+ g.write("#ifndef _EDITOR_FONTS_H\n")
+ g.write("#define _EDITOR_FONTS_H\n")
+
+ # saving uncompressed, since freetype will reference from memory pointer
+ xl_names = []
+ for i in range(len(source)):
+ print("Appending font: " + source[i].srcnode().abspath)
+ f = open(source[i].srcnode().abspath, "rb")
+ buf = f.read()
+ import os.path
+
+ name = os.path.splitext(os.path.basename(source[i].srcnode().abspath))[0]
+
+ g.write("static const int _font_" + name + "_size=" + str(len(buf)) + ";\n")
+ g.write("static const unsigned char _font_" + name + "[]={\n")
+ for i in range(len(buf)):
+ g.write(str(ord(buf[i])) + ",\n")
+
+ g.write("};\n")
+
+ g.write("#endif")
+
+
+def make_translations_header(target, source, env):
+
+ dst = target[0].srcnode().abspath
+
+ g = open(dst, "wb")
+
+ g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
+ g.write("#ifndef _EDITOR_TRANSLATIONS_H\n")
+ g.write("#define _EDITOR_TRANSLATIONS_H\n")
+
+ import zlib
+ import os.path
+
+ paths = [node.srcnode().abspath for node in source]
+ sorted_paths = sorted(paths, key=lambda path: os.path.splitext(os.path.basename(path))[0])
+
+ xl_names = []
+ for i in range(len(sorted_paths)):
+ print("Appending translation: " + sorted_paths[i])
+ f = open(sorted_paths[i], "rb")
+ buf = f.read()
+ decomp_size = len(buf)
+ buf = zlib.compress(buf)
+ name = os.path.splitext(os.path.basename(sorted_paths[i]))[0]
+
+ #g.write("static const int _translation_"+name+"_compressed_size="+str(len(buf))+";\n")
+ #g.write("static const int _translation_"+name+"_uncompressed_size="+str(decomp_size)+";\n")
+ g.write("static const unsigned char _translation_" + name + "_compressed[]={\n")
+ for i in range(len(buf)):
+ g.write(str(ord(buf[i])) + ",\n")
+
+ g.write("};\n")
+
+ xl_names.append([name, len(buf), str(decomp_size)])
+
+ g.write("struct EditorTranslationList {\n")
+ g.write("\tconst char* lang;\n")
+ g.write("\tint comp_size;\n")
+ g.write("\tint uncomp_size;\n")
+ g.write("\tconst unsigned char* data;\n")
+ g.write("};\n\n")
+ g.write("static EditorTranslationList _editor_translations[]={\n")
+ for x in xl_names:
+ g.write("\t{ \"" + x[0] + "\", " + str(x[1]) + ", " + str(x[2]) + ",_translation_" + x[0] + "_compressed},\n")
+ g.write("\t{NULL,0,0,NULL}\n")
+ g.write("};\n")
+
+ g.write("#endif")
+
+
+if (env["tools"] == "yes"):
+
+ # Register exporters
+ reg_exporters_inc = '#include "register_exporters.h"\n'
+ reg_exporters = 'void register_exporters() {\n'
+ for e in env.platform_exporters:
+ env.editor_sources.append("#platform/" + e + "/export/export.cpp")
+ reg_exporters += '\tregister_' + e + '_exporter();\n'
+ reg_exporters_inc += '#include "platform/' + e + '/export/export.h"\n'
+ reg_exporters += '}\n'
+ f = open("register_exporters.cpp", "wb")
+ f.write(reg_exporters_inc)
+ f.write(reg_exporters)
+ f.close()
+
+ # API documentation
+ docs = ["#doc/base/classes.xml"]
+ moduledir = os.path.join(os.getcwd(), "..", "modules")
+ for m in os.listdir(moduledir):
+ curmodle = os.path.join(moduledir, m)
+ docfile = os.path.join(curmodle, "classes.xml")
+ if os.path.isdir(curmodle) and os.path.isfile(docfile):
+ docs.append(docfile)
+ env.Depends("#editor/doc_data_compressed.h", docs)
+ env.Command("#editor/doc_data_compressed.h", docs, make_doc_header)
+
+ # Certificates
+ env.Depends("#editor/certs_compressed.h", "#thirdparty/certs/ca-certificates.crt")
+ env.Command("#editor/certs_compressed.h", "#thirdparty/certs/ca-certificates.crt", make_certs_header)
+
+ import glob
+ path = env.Dir('.').abspath
+
+ # Translations
+ tlist = glob.glob(path + "/translations/*.po")
+ print("translations: ", tlist)
+ env.Depends('#editor/translations.h', tlist)
+ env.Command('#editor/translations.h', tlist, make_translations_header)
+
+ # Fonts
+ flist = glob.glob(path + "/../thirdparty/fonts/*.ttf")
+ flist.append(glob.glob(path + "/../thirdparty/fonts/*.otf"))
+ print("fonts: ", flist)
+ env.Depends('#editor/builtin_fonts.h', flist)
+ env.Command('#editor/builtin_fonts.h', flist, make_fonts_header)
+
+
+ env.add_source_files(env.editor_sources, "*.cpp")
+
+ SConscript('collada/SCsub')
+ SConscript('doc/SCsub')
+ SConscript('fileserver/SCsub')
+ SConscript('icons/SCsub')
+ SConscript('import/SCsub')
+ SConscript('io_plugins/SCsub')
+ SConscript('plugins/SCsub')
+
+ lib = env.Library("editor", env.editor_sources)
+ env.Prepend(LIBS=[lib])
+
+ Export('env')
diff --git a/editor/animation_editor.cpp b/editor/animation_editor.cpp
new file mode 100644
index 0000000000..d65f229fca
--- /dev/null
+++ b/editor/animation_editor.cpp
@@ -0,0 +1,4331 @@
+/*************************************************************************/
+/* animation_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "animation_editor.h"
+
+#include "editor_settings.h"
+#include "os/keyboard.h"
+#include "os/os.h"
+#include "io/resource_saver.h"
+#include "pair.h"
+#include "scene/gui/separator.h"
+#include "editor_node.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "scene/main/viewport.h"
+/* Missing to fix:
+
+ *Set
+ *Find better source for hint for edited value keys
+ * + button on track to add a key
+ * when clicked for first time, erase selection of not selected at first
+ * automatically create discrete/continuous tracks!!
+ *when create track do undo/redo
+*/
+
+
+class AnimationCurveEdit : public Control {
+ GDCLASS( AnimationCurveEdit, Control );
+public:
+ enum Mode {
+ MODE_DISABLED,
+ MODE_SINGLE,
+ MODE_MULTIPLE
+ };
+private:
+
+ Set<float> multiples;
+ float transition;
+ Mode mode;
+
+ void _notification(int p_what) {
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+ RID ci = get_canvas_item();
+
+ Size2 s = get_size();
+ Rect2 r(Point2(),s);
+
+ //r=r.grow(3);
+ Ref<StyleBox> sb = get_stylebox("normal","LineEdit");
+ sb->draw(ci,r);
+ r.size-=sb->get_minimum_size();
+ r.pos+=sb->get_offset();
+ //VisualServer::get_singleton()->canvas_item_add
+
+ Ref<Font> f = get_font("font","Label");
+ r=r.grow(-2);
+ Color color = get_color("font_color","Label");
+
+ int points = 48;
+ if (mode==MODE_MULTIPLE) {
+
+ Color mcolor=color;
+ mcolor.a*=0.3;
+
+ Set<float>::Element *E=multiples.front();
+ for(int j=0;j<16;j++) {
+
+ if (!E)
+ break;
+
+ float prev=1.0;
+ float exp=E->get();
+ bool flip=false;//hint_text=="attenuation";
+
+
+ for(int i=1;i<=points;i++) {
+
+ float ifl = i/float(points);
+ float iflp = (i-1)/float(points);
+
+ float h = 1.0-Math::ease(ifl,exp);
+
+ if (flip) {
+ ifl=1.0-ifl;
+ iflp=1.0-iflp;
+ }
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,r.pos+Point2(iflp*r.size.width,prev*r.size.height),r.pos+Point2(ifl*r.size.width,h*r.size.height),mcolor);
+ prev=h;
+ }
+
+ E=E->next();
+ }
+ }
+
+ float exp=transition;
+ if (mode!=MODE_DISABLED) {
+
+
+ float prev=1.0;
+
+ bool flip=false;//hint_text=="attenuation";
+
+
+ for(int i=1;i<=points;i++) {
+
+ float ifl = i/float(points);
+ float iflp = (i-1)/float(points);
+
+ float h = 1.0-Math::ease(ifl,exp);
+
+ if (flip) {
+ ifl=1.0-ifl;
+ iflp=1.0-iflp;
+ }
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,r.pos+Point2(iflp*r.size.width,prev*r.size.height),r.pos+Point2(ifl*r.size.width,h*r.size.height),color);
+ prev=h;
+ }
+ }
+
+ String txt=String::num(exp,2);
+ if (mode==MODE_DISABLED) {
+ txt=TTR("Disabled");
+ } else if (mode==MODE_MULTIPLE) {
+ txt+=" - "+TTR("All Selection");
+ }
+
+ f->draw(ci,Point2(10,10+f->get_ascent()),txt,color);
+
+ }
+ }
+
+ void _gui_input(const InputEvent& p_ev) {
+ if (p_ev.type==InputEvent::MOUSE_MOTION && p_ev.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+
+ if (mode==MODE_DISABLED)
+ return;
+
+ float rel = p_ev.mouse_motion.relative_x;
+ if (rel==0)
+ return;
+
+ bool flip=false;
+
+ if (flip)
+ rel=-rel;
+
+ float val = transition;
+ if (val==0)
+ return;
+ bool sg = val < 0;
+ val = Math::absf(val);
+
+ val = Math::log(val)/Math::log((float)2.0);
+ //logspace
+ val+=rel*0.05;
+ //
+
+ val = Math::pow((float)2.0,val);
+ if (sg)
+ val=-val;
+
+ transition=val;
+ update();
+ //emit_signal("variant_changed");
+ emit_signal("transition_changed",transition);
+ }
+ }
+
+public:
+
+ static void _bind_methods() {
+
+ //ClassDB::bind_method("_update_obj",&AnimationKeyEdit::_update_obj);
+ ClassDB::bind_method("_gui_input",&AnimationCurveEdit::_gui_input);
+ ADD_SIGNAL(MethodInfo("transition_changed"));
+ }
+
+ void set_mode(Mode p_mode) {
+
+ mode=p_mode;
+ update();
+ }
+
+ void clear_multiples() { multiples.clear(); update();}
+ void set_multiple(float p_transition) {
+
+ multiples.insert(p_transition);
+ }
+
+ void set_transition(float p_transition) {
+ transition=p_transition;
+ update();
+ }
+
+ float get_transition() const {
+ return transition;
+ }
+
+ void force_transition(float p_value) {
+ if (mode==MODE_DISABLED)
+ return;
+ transition=p_value;
+ emit_signal("transition_changed",p_value);
+ update();
+ }
+
+ AnimationCurveEdit() {
+
+ transition=1.0;
+ set_default_cursor_shape(CURSOR_HSPLIT);
+ mode=MODE_DISABLED;
+ }
+
+};
+
+class AnimationKeyEdit : public Object {
+
+ GDCLASS(AnimationKeyEdit,Object);
+public:
+ bool setting;
+ bool hidden;
+
+ static void _bind_methods() {
+
+ ClassDB::bind_method("_update_obj",&AnimationKeyEdit::_update_obj);
+ ClassDB::bind_method("_key_ofs_changed",&AnimationKeyEdit::_key_ofs_changed);
+ }
+
+ //PopupDialog *ke_dialog;
+
+ void _fix_node_path(Variant &value) {
+
+
+ NodePath np=value;
+
+ if (np==NodePath())
+ return;
+
+ Node* root = EditorNode::get_singleton()->get_tree()->get_root();
+
+ Node* np_node = root->get_node(np);
+ ERR_FAIL_COND(!np_node);
+
+ Node* edited_node = root->get_node(base);
+ ERR_FAIL_COND(!edited_node);
+
+
+
+ value = edited_node->get_path_to(np_node);
+ }
+
+
+ void _update_obj(const Ref<Animation> &p_anim) {
+ if (setting)
+ return;
+ if (hidden)
+ return;
+ if (!(animation==p_anim))
+ return;
+ notify_change();
+ }
+
+ void _key_ofs_changed(const Ref<Animation> &p_anim,float from, float to) {
+ if (hidden)
+ return;
+ if (!(animation==p_anim))
+ return;
+ if (from!=key_ofs)
+ return;
+ key_ofs=to;
+ if (setting)
+ return;
+ notify_change();
+ }
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ int key = animation->track_find_key(track,key_ofs,true);
+ ERR_FAIL_COND_V(key==-1,false);
+
+ String name=p_name;
+ if (name=="time") {
+
+ float new_time = p_value;
+ if (new_time==key_ofs)
+ return true;
+
+ int existing = animation->track_find_key(track,new_time,true);
+
+ setting=true;
+ undo_redo->create_action(TTR("Move Add Key"),UndoRedo::MERGE_ENDS);
+
+ Variant val = animation->track_get_key_value(track,key);
+ float trans = animation->track_get_key_transition(track,key);
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key",track,key);
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",track,new_time,val,trans);
+ undo_redo->add_do_method(this,"_key_ofs_changed",animation,key_ofs,new_time);
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",track,new_time);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",track,key_ofs,val,trans);
+ undo_redo->add_undo_method(this,"_key_ofs_changed",animation,new_time,key_ofs);
+
+
+ if (existing!=-1) {
+ Variant v = animation->track_get_key_value(track,existing);
+ float trans = animation->track_get_key_transition(track,existing);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",track,new_time,v,trans);
+ }
+
+ undo_redo->commit_action();
+ setting=false;
+
+ return true;
+ } else if (name=="easing") {
+
+ float val = p_value;
+ float prev_val = animation->track_get_key_transition(track,key);
+ setting=true;
+ undo_redo->create_action(TTR("Anim Change Transition"),UndoRedo::MERGE_ENDS);
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_transition",track,key,val);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_transition",track,key,prev_val);
+ undo_redo->add_do_method(this,"_update_obj",animation);
+ undo_redo->add_undo_method(this,"_update_obj",animation);
+ undo_redo->commit_action();
+ setting=false;
+ return true;
+ }
+
+
+
+ switch(animation->track_get_type(track)) {
+
+
+ case Animation::TYPE_TRANSFORM: {
+
+ Dictionary d_old = animation->track_get_key_value(track,key);
+ Dictionary d_new = d_old;
+ d_new[p_name]=p_value;
+ setting=true;
+ undo_redo->create_action(TTR("Anim Change Transform"));
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_value",track,key,d_new);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_value",track,key,d_old);
+ undo_redo->add_do_method(this,"_update_obj",animation);
+ undo_redo->add_undo_method(this,"_update_obj",animation);
+ undo_redo->commit_action();
+ setting=false;
+ return true;
+
+ } break;
+ case Animation::TYPE_VALUE: {
+
+ if (name=="value") {
+
+ Variant value = p_value;
+
+ if (value.get_type()==Variant::NODE_PATH) {
+
+ _fix_node_path(value);
+ }
+
+ setting=true;
+ undo_redo->create_action(TTR("Anim Change Value"),UndoRedo::MERGE_ENDS);
+ Variant prev = animation->track_get_key_value(track,key);
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_value",track,key,value);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_value",track,key,prev);
+ undo_redo->add_do_method(this,"_update_obj",animation);
+ undo_redo->add_undo_method(this,"_update_obj",animation);
+ undo_redo->commit_action();
+ setting=false;
+ return true;
+ }
+
+
+
+ } break;
+ case Animation::TYPE_METHOD: {
+
+ Dictionary d_old = animation->track_get_key_value(track,key);
+ Dictionary d_new = d_old;
+
+ bool change_notify_deserved=false;
+ bool mergeable=false;
+
+ if (name=="name") {
+
+ d_new["method"]=p_value;
+
+ }
+
+ if (name=="arg_count") {
+
+ Vector<Variant> args = d_old["args"];
+ args.resize(p_value);
+ d_new["args"]=args;
+ change_notify_deserved=true;
+ }
+
+ if (name.begins_with("args/")) {
+
+
+ Vector<Variant> args = d_old["args"];
+ int idx = name.get_slice("/",1).to_int();
+ ERR_FAIL_INDEX_V(idx,args.size(),false);
+
+ String what = name.get_slice("/",2);
+ if (what=="type") {
+ Variant::Type t = Variant::Type(int(p_value));
+
+ if (t!=args[idx].get_type()) {
+ Variant::CallError err;
+ if (Variant::can_convert(args[idx].get_type(),t)) {
+ Variant old=args[idx];
+ Variant *ptrs[1]={&old};
+ args[idx]=Variant::construct(t,(const Variant**)ptrs,1,err);
+ } else {
+
+ args[idx]=Variant::construct(t,NULL,0,err);
+ }
+ change_notify_deserved=true;
+ d_new["args"]=args;
+ }
+
+ }
+ if (what=="value") {
+
+ Variant value=p_value;
+ if (value.get_type()==Variant::NODE_PATH) {
+
+ _fix_node_path(value);
+ }
+
+ args[idx]=value;
+ d_new["args"]=args;
+ mergeable=true;
+ }
+ }
+
+ if (mergeable)
+ undo_redo->create_action(TTR("Anim Change Call"),UndoRedo::MERGE_ENDS);
+ else
+ undo_redo->create_action(TTR("Anim Change Call"));
+
+ Variant prev = animation->track_get_key_value(track,key);
+ setting=true;
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_value",track,key,d_new);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_value",track,key,d_old);
+ undo_redo->add_do_method(this,"_update_obj",animation);
+ undo_redo->add_undo_method(this,"_update_obj",animation);
+ undo_redo->commit_action();
+ setting=false;
+ if (change_notify_deserved)
+ notify_change();
+ return true;
+ } break;
+ }
+
+
+
+ return false;
+
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ int key = animation->track_find_key(track,key_ofs,true);
+ ERR_FAIL_COND_V(key==-1,false);
+
+ String name=p_name;
+ if (name=="time") {
+ r_ret = key_ofs;
+ return true;
+ } else if (name=="easing") {
+ r_ret = animation->track_get_key_transition(track,key);
+ return true;
+ }
+
+
+
+ switch(animation->track_get_type(track)) {
+
+
+ case Animation::TYPE_TRANSFORM: {
+
+ Dictionary d = animation->track_get_key_value(track,key);
+ ERR_FAIL_COND_V(!d.has(name),false);
+ r_ret = d[p_name];
+ return true;
+
+ } break;
+ case Animation::TYPE_VALUE: {
+
+ if (name=="value") {
+ r_ret = animation->track_get_key_value(track,key);
+ return true;
+ }
+
+
+
+ } break;
+ case Animation::TYPE_METHOD: {
+
+ Dictionary d = animation->track_get_key_value(track,key);
+
+ if (name=="name") {
+
+ ERR_FAIL_COND_V(!d.has("method"),false);
+ r_ret=d["method"];
+ return true;
+ }
+
+ ERR_FAIL_COND_V(!d.has("args"),false);
+
+ Vector<Variant> args = d["args"];
+
+
+ if (name=="arg_count") {
+
+ r_ret=args.size();
+ return true;
+ }
+
+
+ if (name.begins_with("args/")) {
+
+ int idx = name.get_slice("/",1).to_int();
+ ERR_FAIL_INDEX_V(idx,args.size(),false);
+
+ String what = name.get_slice("/",2);
+ if (what=="type") {
+ r_ret=args[idx].get_type();
+ return true;
+ }
+ if (what=="value") {
+ r_ret=args[idx];
+ return true;
+ }
+ }
+
+ } break;
+ }
+
+ return false;
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ if (animation.is_null())
+ return;
+
+ ERR_FAIL_INDEX(track,animation->get_track_count());
+ int key = animation->track_find_key(track,key_ofs,true);
+ ERR_FAIL_COND(key==-1);
+
+ p_list->push_back( PropertyInfo( Variant::REAL, "time", PROPERTY_HINT_RANGE,"0,"+rtos(animation->get_length())+",0.01") );
+
+ switch(animation->track_get_type(track)) {
+
+
+ case Animation::TYPE_TRANSFORM: {
+
+ p_list->push_back( PropertyInfo( Variant::VECTOR3, "loc"));
+ p_list->push_back( PropertyInfo( Variant::QUAT, "rot"));
+ p_list->push_back( PropertyInfo( Variant::VECTOR3, "scale"));
+
+ } break;
+ case Animation::TYPE_VALUE: {
+
+ Variant v = animation->track_get_key_value(track,key);
+
+
+
+ if (hint.type!=Variant::NIL) {
+
+ PropertyInfo pi=hint;
+ pi.name="value";
+ p_list->push_back( pi );
+ } else {
+
+ PropertyHint hint= PROPERTY_HINT_NONE;
+ String hint_string;
+
+ if (v.get_type()==Variant::OBJECT) {
+ //could actually check the object property if exists..? yes i will!
+ Ref<Resource> res = v;
+ if (res.is_valid()) {
+
+ hint=PROPERTY_HINT_RESOURCE_TYPE;
+ hint_string=res->get_class();
+ }
+ }
+
+ if (v.get_type()!=Variant::NIL)
+ p_list->push_back( PropertyInfo( v.get_type(), "value", hint,hint_string));
+ }
+
+ } break;
+ case Animation::TYPE_METHOD: {
+
+ p_list->push_back( PropertyInfo( Variant::STRING, "name"));
+ p_list->push_back( PropertyInfo( Variant::INT, "arg_count",PROPERTY_HINT_RANGE,"0,5,1"));
+
+ Dictionary d = animation->track_get_key_value(track,key);
+ ERR_FAIL_COND(!d.has("args"));
+ Vector<Variant> args=d["args"];
+ String vtypes;
+ for(int i=0;i<Variant::VARIANT_MAX;i++) {
+
+ if (i>0)
+ vtypes+=",";
+ vtypes+=Variant::get_type_name( Variant::Type(i) );
+ }
+
+ for(int i=0;i<args.size();i++) {
+
+ p_list->push_back( PropertyInfo( Variant::INT, "args/"+itos(i)+"/type", PROPERTY_HINT_ENUM,vtypes));
+ if (args[i].get_type()!=Variant::NIL)
+ p_list->push_back( PropertyInfo( args[i].get_type(), "args/"+itos(i)+"/value"));
+ }
+
+ } break;
+ }
+
+ /*
+ if (animation->track_get_type(track)!=Animation::TYPE_METHOD)
+ p_list->push_back( PropertyInfo( Variant::REAL, "easing", PROPERTY_HINT_EXP_EASING));
+ */
+ }
+
+ UndoRedo *undo_redo;
+ Ref<Animation> animation;
+ int track;
+ float key_ofs;
+
+ PropertyInfo hint;
+ NodePath base;
+
+
+ void notify_change() {
+
+ _change_notify();
+ }
+
+ AnimationKeyEdit() { hidden=true; key_ofs=0; track=-1; setting=false; }
+
+};
+
+
+void AnimationKeyEditor::_menu_add_track(int p_type) {
+
+ ERR_FAIL_COND(!animation.is_valid());
+
+
+ switch(p_type) {
+
+ case ADD_TRACK_MENU_ADD_CALL_TRACK: {
+ if (root) {
+ call_select->popup_centered_ratio();
+ break;
+ }
+ } break;
+ case ADD_TRACK_MENU_ADD_VALUE_TRACK:
+ case ADD_TRACK_MENU_ADD_TRANSFORM_TRACK: {
+
+ undo_redo->create_action(TTR("Anim Add Track"));
+ undo_redo->add_do_method(animation.ptr(),"add_track",p_type);
+ undo_redo->add_do_method(animation.ptr(),"track_set_path",animation->get_track_count(),".");
+ undo_redo->add_undo_method(animation.ptr(),"remove_track",animation->get_track_count());
+ undo_redo->commit_action();
+
+
+ } break;
+ }
+}
+
+void AnimationKeyEditor::_anim_duplicate_keys(bool transpose) {
+ //duplicait!
+ if (selection.size() && animation.is_valid() && selected_track>=0 && selected_track<animation->get_track_count()) {
+
+ int top_track=0x7FFFFFFF;
+ float top_time = 1e10;
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ const SelectedKey &sk = E->key();
+
+ float t = animation->track_get_key_time(sk.track,sk.key);
+ if (t<top_time)
+ top_time=t;
+ if (sk.track<top_track)
+ top_track=sk.track;
+
+ }
+ ERR_FAIL_COND( top_track == 0x7FFFFFFF || top_time==1e10 );
+
+ //
+
+ int start_track = transpose ? selected_track : top_track;
+
+ undo_redo->create_action(TTR("Anim Duplicate Keys"));
+
+ List<Pair<int,float> > new_selection_values;
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ const SelectedKey &sk = E->key();
+
+ float t = animation->track_get_key_time(sk.track,sk.key);
+
+ float dst_time = t+(timeline_pos - top_time);
+ int dst_track = sk.track + (start_track - top_track);
+
+ if (dst_track < 0 || dst_track>= animation->get_track_count())
+ continue;
+
+ if (animation->track_get_type(dst_track) != animation->track_get_type(sk.track))
+ continue;
+
+ int existing_idx = animation->track_find_key(dst_track,dst_time,true);
+
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",dst_track,dst_time,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",dst_track,dst_time);
+
+ Pair<int,float> p;
+ p.first=dst_track;
+ p.second=dst_time;
+ new_selection_values.push_back( p );
+
+ if (existing_idx!=-1) {
+
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",dst_track,dst_time,animation->track_get_key_value(dst_track,existing_idx),animation->track_get_key_transition(dst_track,existing_idx));
+
+ }
+
+ }
+
+ undo_redo->commit_action();
+
+ //reselect duplicated
+
+ Map<SelectedKey,KeyInfo> new_selection;
+ for (List<Pair<int,float> >::Element *E=new_selection_values.front();E;E=E->next()) {
+
+ int track=E->get().first;
+ float time = E->get().second;
+
+ int existing_idx = animation->track_find_key(track,time,true);
+
+ if (existing_idx==-1)
+ continue;
+ SelectedKey sk2;
+ sk2.track=track;
+ sk2.key=existing_idx;
+
+ KeyInfo ki;
+ ki.pos=time;
+
+ new_selection[sk2]=ki;
+
+ }
+
+
+ selection=new_selection;
+ track_editor->update();
+ _edit_if_single_selection();
+
+ }
+}
+
+void AnimationKeyEditor::_menu_track(int p_type) {
+
+ ERR_FAIL_COND(!animation.is_valid());
+
+ last_menu_track_opt=p_type;
+ switch(p_type) {
+
+ case TRACK_MENU_SCALE:
+ case TRACK_MENU_SCALE_PIVOT: {
+
+ scale_dialog->popup_centered(Size2(200,100));
+ } break;
+ case TRACK_MENU_MOVE_UP: {
+
+ int idx=selected_track;
+ if (idx>0 && idx<animation->get_track_count()) {
+ undo_redo->create_action(TTR("Move Anim Track Up"));
+ undo_redo->add_do_method(animation.ptr(),"track_move_down",idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_move_up",idx-1);
+ undo_redo->commit_action();
+ selected_track=idx-1;
+ }
+
+ } break;
+ case TRACK_MENU_MOVE_DOWN: {
+
+
+ int idx=selected_track;
+ if (idx>=0 && idx<animation->get_track_count()-1) {
+ undo_redo->create_action(TTR("Move Anim Track Down"));
+ undo_redo->add_do_method(animation.ptr(),"track_move_up",idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_move_down",idx+1);
+ undo_redo->commit_action();
+ selected_track=idx+1;
+ }
+
+ } break;
+ case TRACK_MENU_REMOVE: {
+
+ int idx=selected_track;
+ if (idx>=0 && idx<animation->get_track_count()) {
+ undo_redo->create_action(TTR("Remove Anim Track"));
+ undo_redo->add_do_method(animation.ptr(),"remove_track",idx);
+ undo_redo->add_undo_method(animation.ptr(),"add_track",animation->track_get_type(idx),idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_path",idx,animation->track_get_path(idx));
+ //todo interpolation
+ for(int i=0;i<animation->track_get_key_count(idx);i++) {
+
+ Variant v = animation->track_get_key_value(idx,i);
+ float time = animation->track_get_key_time(idx,i);
+ float trans = animation->track_get_key_transition(idx,i);
+
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",idx,time,v);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_transition",idx,i,trans);
+
+ }
+
+ undo_redo->add_undo_method(animation.ptr(),"track_set_interpolation_type",idx,animation->track_get_interpolation_type(idx));
+ if (animation->track_get_type(idx)==Animation::TYPE_VALUE) {
+ undo_redo->add_undo_method(animation.ptr(),"value_track_set_update_mode",idx,animation->value_track_get_update_mode(idx));
+
+ }
+
+ undo_redo->commit_action();
+ }
+
+
+ } break;
+ case TRACK_MENU_DUPLICATE:
+ case TRACK_MENU_DUPLICATE_TRANSPOSE: {
+
+ _anim_duplicate_keys(p_type==TRACK_MENU_DUPLICATE_TRANSPOSE);
+ } break;
+ case TRACK_MENU_SET_ALL_TRANS_LINEAR:
+ case TRACK_MENU_SET_ALL_TRANS_CONSTANT:
+ case TRACK_MENU_SET_ALL_TRANS_OUT:
+ case TRACK_MENU_SET_ALL_TRANS_IN:
+ case TRACK_MENU_SET_ALL_TRANS_INOUT:
+ case TRACK_MENU_SET_ALL_TRANS_OUTIN: {
+
+ if (!selection.size() || !animation.is_valid())
+ break;
+
+ float t=0;
+ switch(p_type) {
+ case TRACK_MENU_SET_ALL_TRANS_LINEAR: t=1.0; break;
+ case TRACK_MENU_SET_ALL_TRANS_CONSTANT: t=0.0; break;
+ case TRACK_MENU_SET_ALL_TRANS_OUT: t=0.5; break;
+ case TRACK_MENU_SET_ALL_TRANS_IN: t=2.0; break;
+ case TRACK_MENU_SET_ALL_TRANS_INOUT: t=-0.5; break;
+ case TRACK_MENU_SET_ALL_TRANS_OUTIN: t=-2.0; break;
+ }
+
+ undo_redo->create_action(TTR("Set Transitions to:")+" "+rtos(t));
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ const SelectedKey &sk = E->key();
+
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_transition",sk.track,sk.key,t);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_transition",sk.track,sk.key,animation->track_get_key_transition(sk.track,sk.key));
+
+ }
+
+ undo_redo->commit_action();
+
+ } break;
+ case TRACK_MENU_NEXT_STEP: {
+
+ if (animation.is_null())
+ break;
+ float step = animation->get_step();
+ if (step==0)
+ step=1;
+
+ float pos=timeline_pos;
+
+ pos=Math::stepify(pos+step,step);
+ if (pos>animation->get_length())
+ pos=animation->get_length();
+ timeline_pos=pos;
+ track_pos->update();
+ emit_signal("timeline_changed",pos,true);
+
+ } break;
+ case TRACK_MENU_PREV_STEP: {
+ if (animation.is_null())
+ break;
+ float step = animation->get_step();
+ if (step==0)
+ step=1;
+
+ float pos=timeline_pos;
+ pos=Math::stepify(pos-step,step);
+ if (pos<0)
+ pos=0;
+ timeline_pos=pos;
+ track_pos->update();
+ emit_signal("timeline_changed",pos,true);
+
+
+ } break;
+
+ case TRACK_MENU_OPTIMIZE: {
+
+ optimize_dialog->popup_centered(Size2(250,180));
+ } break;
+ case TRACK_MENU_CLEAN_UP: {
+
+ cleanup_dialog->popup_centered_minsize(Size2(300,0));
+ } break;
+ case TRACK_MENU_CLEAN_UP_CONFIRM: {
+
+ if (cleanup_all->is_pressed()) {
+ List<StringName> names;
+ AnimationPlayerEditor::singleton->get_player()->get_animation_list(&names);
+ for (List<StringName>::Element *E=names.front();E;E=E->next()) {
+ _cleanup_animation(AnimationPlayerEditor::singleton->get_player()->get_animation(E->get()));
+ }
+ } else {
+ _cleanup_animation(animation);
+
+ }
+ } break;
+ case CURVE_SET_LINEAR: {
+ curve_edit->force_transition(1.0);
+
+ } break;
+ case CURVE_SET_IN: {
+
+ curve_edit->force_transition(4.0);
+
+ } break;
+ case CURVE_SET_OUT: {
+
+ curve_edit->force_transition(0.25);
+ } break;
+ case CURVE_SET_INOUT: {
+ curve_edit->force_transition(-4);
+
+ } break;
+ case CURVE_SET_OUTIN: {
+
+ curve_edit->force_transition(-0.25);
+ } break;
+ case CURVE_SET_CONSTANT: {
+
+ curve_edit->force_transition(0);
+ } break;
+
+ }
+
+}
+
+void AnimationKeyEditor::_cleanup_animation(Ref<Animation> p_animation) {
+
+
+ for(int i=0;i<p_animation->get_track_count();i++) {
+
+ bool prop_exists=false;
+ Variant::Type valid_type=Variant::NIL;
+ Object *obj=NULL;
+
+ RES res;
+ Node *node = root->get_node_and_resource(p_animation->track_get_path(i),res);
+
+ if (res.is_valid()) {
+ obj=res.ptr();
+ } else if (node) {
+ obj=node;
+ }
+
+ if (obj && p_animation->track_get_type(i)==Animation::TYPE_VALUE) {
+ valid_type=obj->get_static_property_type(p_animation->track_get_path(i).get_property(),&prop_exists);
+ }
+
+ if (!obj && cleanup_tracks->is_pressed()) {
+
+ p_animation->remove_track(i);
+ i--;
+ continue;
+ }
+
+ if (!prop_exists || p_animation->track_get_type(i)!=Animation::TYPE_VALUE || cleanup_keys->is_pressed()==false)
+ continue;
+
+ for(int j=0;j<p_animation->track_get_key_count(i);j++) {
+
+ Variant v = p_animation->track_get_key_value(i,j);
+
+ if (!Variant::can_convert(v.get_type(),valid_type)) {
+ p_animation->track_remove_key(i,j);
+ j--;
+ }
+ }
+
+ if (p_animation->track_get_key_count(i)==0 && cleanup_tracks->is_pressed()) {
+ p_animation->remove_track(i);
+ i--;
+ }
+ }
+
+ undo_redo->clear_history();
+ _update_paths();
+}
+
+void AnimationKeyEditor::_animation_optimize() {
+
+
+
+ animation->optimize(optimize_linear_error->get_value(),optimize_angular_error->get_value(),optimize_max_angle->get_value());
+ track_editor->update();
+ undo_redo->clear_history();
+
+}
+
+
+float AnimationKeyEditor::_get_zoom_scale() const {
+
+ float zv = zoom->get_value();
+ if (zv<1) {
+ zv = 1.0-zv;
+ return Math::pow(1.0f+zv,8.0f)*100;
+ } else {
+ return 1.0/Math::pow(zv,8.0f)*100;
+ }
+}
+
+void AnimationKeyEditor::_track_pos_draw() {
+
+ if (!animation.is_valid()) {
+ return;
+ }
+
+
+ Ref<StyleBox> style = get_stylebox("normal","TextEdit");
+ Size2 size= track_editor->get_size() - style->get_minimum_size();
+ Size2 ofs = style->get_offset();
+
+ int settings_limit = size.width - right_data_size_cache;
+ int name_limit = settings_limit * name_column_ratio;
+
+ float keys_from= h_scroll->get_value();
+ float zoom_scale = _get_zoom_scale();
+ float keys_to=keys_from+(settings_limit-name_limit) / zoom_scale;
+
+
+
+ //will move to separate control! (for speedup)
+ if (timeline_pos >= keys_from && timeline_pos<keys_to) {
+ //draw position
+ int pixel = (timeline_pos - h_scroll->get_value()) * zoom_scale;
+ pixel+=name_limit;
+ track_pos->draw_line(ofs+Point2(pixel,0),ofs+Point2(pixel,size.height),Color(1,0.3,0.3,0.8));
+
+ }
+}
+
+void AnimationKeyEditor::_track_editor_draw() {
+
+
+ if (animation.is_valid() && animation->get_track_count()) {
+ if (selected_track < 0)
+ selected_track=0;
+ else if (selected_track>=animation->get_track_count())
+ selected_track=animation->get_track_count()-1;
+ }
+
+ track_pos->update();
+ Control *te=track_editor;
+ Ref<StyleBox> style = get_stylebox("normal","TextEdit");
+ te->draw_style_box(style,Rect2(Point2(),track_editor->get_size()));
+
+ if (te->has_focus()) {
+ te->draw_style_box(get_stylebox("bg_focus","Tree"),Rect2(Point2(),track_editor->get_size()));
+ }
+
+ if (!animation.is_valid()) {
+ v_scroll->hide();
+ h_scroll->hide();
+ menu_add_track->set_disabled(true);
+ menu_track->set_disabled(true);
+ edit_button->set_disabled(true);
+ key_editor_tab->hide();
+ move_up_button->set_disabled(true);
+ move_down_button->set_disabled(true);
+ remove_button->set_disabled(true);
+
+ return;
+ }
+
+ menu_add_track->set_disabled(false);
+ menu_track->set_disabled(false);
+ edit_button->set_disabled(false);
+ move_up_button->set_disabled(false);
+ move_down_button->set_disabled(false);
+ remove_button->set_disabled(false);
+ if (edit_button->is_pressed())
+ key_editor_tab->show();
+
+ te_drawing=true;
+
+ Size2 size= te->get_size() - style->get_minimum_size();
+ Size2 ofs = style->get_offset();
+
+ Ref<Font> font = te->get_font("font","Tree");
+ int sep = get_constant("vseparation","Tree");
+ int hsep = get_constant("hseparation","Tree");
+ Color color = get_color("font_color","Tree");
+ Color sepcolor = get_color("guide_color","Tree");
+ Color timecolor = get_color("prop_subsection","Editor");
+ timecolor = Color::html("ff4a414f");
+ Color hover_color = Color(1,1,1,0.05);
+ Color select_color = Color(1,1,1,0.1);
+ Color invalid_path_color = Color(1,0.6,0.4,0.5);
+ Color track_select_color =Color::html("ffbd8e8e");
+
+ Ref<Texture> remove_icon = get_icon("Remove","EditorIcons");
+ Ref<Texture> move_up_icon = get_icon("MoveUp","EditorIcons");
+ Ref<Texture> move_down_icon = get_icon("MoveDown","EditorIcons");
+ Ref<Texture> remove_icon_hl = get_icon("RemoveHl","EditorIcons");
+ Ref<Texture> move_up_icon_hl = get_icon("MoveUpHl","EditorIcons");
+ Ref<Texture> move_down_icon_hl = get_icon("MoveDownHl","EditorIcons");
+ Ref<Texture> add_key_icon = get_icon("TrackAddKey","EditorIcons");
+ Ref<Texture> add_key_icon_hl = get_icon("TrackAddKeyHl","EditorIcons");
+ Ref<Texture> down_icon = get_icon("select_arrow","Tree");
+
+ Ref<Texture> wrap_icon[2]={
+ get_icon("InterpWrapClamp","EditorIcons"),
+ get_icon("InterpWrapLoop","EditorIcons"),
+ };
+
+ Ref<Texture> interp_icon[3]={
+ get_icon("InterpRaw","EditorIcons"),
+ get_icon("InterpLinear","EditorIcons"),
+ get_icon("InterpCubic","EditorIcons")
+ };
+ Ref<Texture> cont_icon[3]={
+ get_icon("TrackContinuous","EditorIcons"),
+ get_icon("TrackDiscrete","EditorIcons"),
+ get_icon("TrackTrigger","EditorIcons")
+ };
+ Ref<Texture> type_icon[3]={
+ get_icon("KeyValue","EditorIcons"),
+ get_icon("KeyXform","EditorIcons"),
+ get_icon("KeyCall","EditorIcons")
+ };
+
+ Ref<Texture> invalid_icon = get_icon("KeyInvalid","EditorIcons");
+ Ref<Texture> invalid_icon_hover = get_icon("KeyInvalidHover","EditorIcons");
+
+ Ref<Texture> hsize_icon = get_icon("Hsize","EditorIcons");
+
+ Ref<Texture> type_hover=get_icon("KeyHover","EditorIcons");
+ Ref<Texture> type_selected=get_icon("KeySelected","EditorIcons");
+
+ int right_separator_ofs = down_icon->get_width() *3 + add_key_icon->get_width() + interp_icon[0]->get_width() + wrap_icon[0]->get_width() + cont_icon[0]->get_width() + hsep*9;
+
+ int h = font->get_height()+sep;
+
+
+ int fit = (size.height / h)-1;
+ int total = animation->get_track_count();
+ if (total < fit) {
+ v_scroll->hide();
+ v_scroll->set_max( total );
+ v_scroll->set_page( fit );
+ } else {
+ v_scroll->show();
+ v_scroll->set_max( total );
+ v_scroll->set_page( fit );
+ }
+
+
+ int settings_limit = size.width - right_separator_ofs;
+ int name_limit = settings_limit * name_column_ratio;
+
+ te->draw_line(ofs+Point2(name_limit,0),ofs+Point2(name_limit,size.height),color);
+ te->draw_line(ofs+Point2(settings_limit,0),ofs+Point2(settings_limit,size.height),color);
+ te->draw_texture(hsize_icon,ofs+Point2(name_limit-hsize_icon->get_width()-hsep,(h-hsize_icon->get_height())/2));
+
+ te->draw_line(ofs+Point2(0,h),ofs+Point2(size.width,h),color);
+ // draw time
+
+ float keys_from;
+ float keys_to;
+ float zoom_scale;
+
+
+ {
+
+ int zoomw = settings_limit-name_limit;
+
+
+ float scale = _get_zoom_scale();
+ zoom_scale=scale;
+
+
+ float l = animation->get_length();
+ if (l<=0)
+ l=0.001; //avoid crashor
+
+ int end_px = (l - h_scroll->get_value()) * scale;
+ int begin_px = -h_scroll->get_value() * scale;
+ Color notimecol;
+ notimecol.r=timecolor.gray();
+ notimecol.g=notimecol.r;
+ notimecol.b=notimecol.r;
+ notimecol.a=timecolor.a;
+
+ {
+
+ te->draw_rect(Rect2( ofs + Point2(name_limit,0), Point2(zoomw-1,h)), notimecol);
+
+
+ if (begin_px < zoomw && end_px >0) {
+
+ if (begin_px<0)
+ begin_px=0;
+ if (end_px>zoomw)
+ end_px=zoomw;
+
+ te->draw_rect(Rect2( ofs + Point2(name_limit+begin_px,0), Point2(end_px-begin_px-1,h)), timecolor);
+ }
+
+ }
+
+
+
+ keys_from= h_scroll->get_value();
+ keys_to=keys_from+zoomw / scale;
+
+ {
+ float time_min=0;
+ float time_max=animation->get_length();
+ for(int i=0;i<animation->get_track_count();i++) {
+
+ if (animation->track_get_key_count(i)>0) {
+
+ float beg = animation->track_get_key_time(i,0);
+ if (beg<time_min)
+ time_min=beg;
+ float end = animation->track_get_key_time(i,animation->track_get_key_count(i)-1);
+ if (end>time_max)
+ time_max=end;
+ }
+ }
+
+
+
+
+
+ float extra = (zoomw / scale)*0.5;
+
+ if (time_min<-0.001)
+ time_min-=extra;
+ time_max+=extra;
+ h_scroll->set_min(time_min);
+ h_scroll->set_max(time_max);
+
+ if (zoomw / scale < (time_max-time_min)) {
+ h_scroll->show();
+
+ } else {
+
+ h_scroll->hide();
+ }
+
+
+ }
+
+ h_scroll->set_page(zoomw / scale);
+
+ Color color_time_sec = color;
+ Color color_time_dec = color;
+ color_time_dec.a*=0.5;
+#define SC_ADJ 100
+ int min=30;
+ int dec=1;
+ int step=1;
+ int decimals=2;
+ bool step_found=false;
+
+ while(!step_found) {
+
+ static const int _multp[3]={1,2,5};
+ for(int i=0;i<3;i++) {
+
+ step = (_multp[i] * dec);
+ if (step*scale/SC_ADJ> min) {
+ step_found=true;
+ break;
+ }
+
+ }
+ if (step_found)
+ break;
+ dec*=10;
+ decimals--;
+ if (decimals<0)
+ decimals=0;
+ }
+
+
+ for(int i=0;i<zoomw;i++) {
+
+ float pos = h_scroll->get_value() + double(i)/scale;
+ float prev = h_scroll->get_value() + (double(i)-1.0)/scale;
+
+
+ int sc = int(Math::floor(pos*SC_ADJ));
+ int prev_sc = int(Math::floor(prev*SC_ADJ));
+ bool sub = (sc % SC_ADJ);
+
+ if ((sc/step)!=(prev_sc/step) || (prev_sc<0 && sc>=0)) {
+
+ int scd = sc < 0 ? prev_sc : sc;
+ te->draw_line( ofs + Point2(name_limit+i,0), ofs+Point2(name_limit+i,h), color);
+ te->draw_string( font,ofs + Point2(name_limit+i+3,(h-font->get_height())/2+font->get_ascent()).floor(),String::num((scd-(scd%step))/double(SC_ADJ),decimals),sub?color_time_dec:color_time_sec,zoomw-i);
+ }
+
+
+ }
+ }
+
+ color.a*=0.5;
+
+ for(int i=0;i<fit;i++) {
+
+ //this code sucks, i always forget how it works
+
+ int idx = v_scroll->get_value() + i;
+ if (idx>=animation->get_track_count())
+ break;
+ int y = h+i*h+sep;
+
+ bool prop_exists=false;
+ Variant::Type valid_type=Variant::NIL;
+ Object *obj=NULL;
+
+ RES res;
+ Node *node = root->get_node_and_resource(animation->track_get_path(idx),res);
+
+ if (res.is_valid()) {
+ obj=res.ptr();
+ } else if (node) {
+ obj=node;
+ }
+
+ if (obj && animation->track_get_type(idx)==Animation::TYPE_VALUE) {
+ valid_type=obj->get_static_property_type(animation->track_get_path(idx).get_property(),&prop_exists);
+ }
+
+
+ if (/*mouse_over.over!=MouseOver::OVER_NONE &&*/ idx==mouse_over.track) {
+ Color sepc=hover_color;
+ te->draw_rect(Rect2(ofs+Point2(0,y),Size2(size.width,h-1)),sepc);
+ }
+
+ if (selected_track==idx) {
+ Color tc = select_color;
+ //tc.a*=0.7;
+ te->draw_rect(Rect2(ofs+Point2(0,y),Size2(size.width-1,h-1)),tc);
+ }
+
+ te->draw_texture(type_icon[animation->track_get_type(idx)],ofs+Point2(0,y+(h-type_icon[0]->get_height())/2).floor());
+ NodePath np = animation->track_get_path(idx);
+ Node *n = root->get_node(np);
+ Color ncol = color;
+ if (n && editor_selection->is_selected(n))
+ ncol=track_select_color;
+ te->draw_string(font,Point2(ofs+Point2(type_icon[0]->get_width()+sep,y+font->get_ascent()+(sep/2))).floor(),np,ncol,name_limit-(type_icon[0]->get_width()+sep)-5);
+
+ if (!obj)
+ te->draw_line(ofs+Point2(0,y+h/2),ofs+Point2(name_limit,y+h/2),invalid_path_color);
+
+ te->draw_line(ofs+Point2(0,y+h),ofs+Point2(size.width,y+h),sepcolor);
+
+ Point2 icon_ofs = ofs + Point2( size.width, y + (h - remove_icon->get_height() )/2).floor();
+ icon_ofs.y+=4;
+
+
+/* icon_ofs.x-=remove_icon->get_width();
+
+ te->draw_texture((mouse_over.over==MouseOver::OVER_REMOVE && mouse_over.track==idx)?remove_icon_hl:remove_icon,icon_ofs);
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=move_down_icon->get_width();
+ te->draw_texture((mouse_over.over==MouseOver::OVER_DOWN && mouse_over.track==idx)?move_down_icon_hl:move_down_icon,icon_ofs);
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=move_up_icon->get_width();
+ te->draw_texture((mouse_over.over==MouseOver::OVER_UP && mouse_over.track==idx)?move_up_icon_hl:move_up_icon,icon_ofs);
+ icon_ofs.x-=hsep;
+ te->draw_line(Point2(icon_ofs.x,ofs.y+y),Point2(icon_ofs.x,ofs.y+y+h),sepcolor);
+
+ icon_ofs.x-=hsep;
+ */
+ track_ofs[0]=size.width-icon_ofs.x;
+ icon_ofs.x-=down_icon->get_width();
+ te->draw_texture(down_icon,icon_ofs);
+
+ int wrap_type = animation->track_get_interpolation_loop_wrap(idx)?1:0;
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=wrap_icon[wrap_type]->get_width();
+ te->draw_texture(wrap_icon[wrap_type],icon_ofs);
+
+ icon_ofs.x-=hsep;
+ te->draw_line(Point2(icon_ofs.x,ofs.y+y),Point2(icon_ofs.x,ofs.y+y+h),sepcolor);
+
+ track_ofs[1]=size.width-icon_ofs.x;
+
+ icon_ofs.x-=down_icon->get_width();
+ te->draw_texture(down_icon,icon_ofs);
+
+ int interp_type = animation->track_get_interpolation_type(idx);
+ ERR_CONTINUE(interp_type<0 || interp_type>=3);
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=interp_icon[interp_type]->get_width();
+ te->draw_texture(interp_icon[interp_type],icon_ofs);
+
+ icon_ofs.x-=hsep;
+ te->draw_line(Point2(icon_ofs.x,ofs.y+y),Point2(icon_ofs.x,ofs.y+y+h),sepcolor);
+
+ track_ofs[2]=size.width-icon_ofs.x;
+
+ if (animation->track_get_type(idx)==Animation::TYPE_VALUE) {
+
+
+ int umode = animation->value_track_get_update_mode(idx);
+
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=down_icon->get_width();
+ te->draw_texture(down_icon,icon_ofs);
+
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=cont_icon[umode]->get_width();
+ te->draw_texture(cont_icon[umode],icon_ofs);
+ } else {
+
+ icon_ofs.x -= hsep*2 + cont_icon[0]->get_width() + down_icon->get_width();
+ }
+
+ icon_ofs.x-=hsep;
+ te->draw_line(Point2(icon_ofs.x,ofs.y+y),Point2(icon_ofs.x,ofs.y+y+h),sepcolor);
+
+ track_ofs[3]=size.width-icon_ofs.x;
+
+ icon_ofs.x-=hsep;
+ icon_ofs.x-=add_key_icon->get_width();
+ te->draw_texture((mouse_over.over==MouseOver::OVER_ADD_KEY && mouse_over.track==idx)?add_key_icon_hl:add_key_icon,icon_ofs);
+
+ track_ofs[4]=size.width-icon_ofs.x;
+
+ //draw the keys;
+ int tt = animation->track_get_type(idx);
+ float key_vofs = Math::floor((float)(h - type_icon[tt]->get_height())/2);
+ float key_hofs = -Math::floor((float)type_icon[tt]->get_height()/2);
+
+ int kc=animation->track_get_key_count(idx);
+ bool first=true;
+
+
+
+ for(int i=0;i<kc;i++) {
+
+
+ float time = animation->track_get_key_time(idx,i);
+ if (time<keys_from)
+ continue;
+ if (time>keys_to) {
+
+ if (first && i>0 && animation->track_get_key_value(idx,i)==animation->track_get_key_value(idx,i-1)) {
+ //draw whole line
+ te->draw_line(ofs+Vector2(name_limit,y+h/2),ofs+Point2(settings_limit,y+h/2),color);
+ }
+
+ break;
+ }
+
+ float x = key_hofs + name_limit + (time-keys_from)*zoom_scale;
+
+ Ref<Texture> tex = type_icon[tt];
+
+ SelectedKey sk;
+ sk.key=i;
+ sk.track=idx;
+ if (selection.has(sk)) {
+
+ if (click.click==ClickOver::CLICK_MOVE_KEYS)
+ continue;
+ tex=type_selected;
+ }
+
+ if (mouse_over.over==MouseOver::OVER_KEY && mouse_over.track==idx && mouse_over.over_key==i)
+ tex=type_hover;
+
+ Variant value = animation->track_get_key_value(idx,i);
+ if (first && i>0 && value==animation->track_get_key_value(idx,i-1)) {
+
+ te->draw_line(ofs+Vector2(name_limit,y+h/2),ofs+Point2(x,y+h/2),color);
+ }
+
+ if (i<kc-1 && value==animation->track_get_key_value(idx,i+1)) {
+ float x_n = key_hofs + name_limit + (animation->track_get_key_time(idx,i+1)-keys_from)*zoom_scale;
+
+ x_n = MIN( x_n, settings_limit);
+ te->draw_line(ofs+Point2(x_n,y+h/2),ofs+Point2(x,y+h/2),color);
+
+ }
+
+ if (prop_exists && !Variant::can_convert(value.get_type(),valid_type)) {
+ te->draw_texture(invalid_icon,ofs+Point2(x,y+key_vofs).floor());
+ }
+
+ if (prop_exists && !Variant::can_convert(value.get_type(),valid_type)) {
+ if (tex==type_hover)
+ te->draw_texture(invalid_icon_hover,ofs+Point2(x,y+key_vofs).floor());
+ else
+ te->draw_texture(invalid_icon,ofs+Point2(x,y+key_vofs).floor());
+ } else {
+
+ te->draw_texture(tex,ofs+Point2(x,y+key_vofs).floor());
+ }
+
+
+ first=false;
+ }
+
+ }
+
+ switch(click.click) {
+ case ClickOver::CLICK_SELECT_KEYS: {
+
+ te->draw_rect(Rect2(click.at,click.to-click.at),Color(0.7,0.7,1.0,0.5));
+
+ } break;
+ case ClickOver::CLICK_MOVE_KEYS: {
+
+ float from_t = 1e20;
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+ float t = animation->track_get_key_time(E->key().track,E->key().key);
+ if (t<from_t)
+ from_t=t;
+
+ }
+
+ float motion = from_t+(click.to.x - click.at.x)/zoom_scale;
+ if (step->get_value())
+ motion = Math::stepify(motion,step->get_value());
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+
+
+ int idx = E->key().track;
+ int i = idx-v_scroll->get_value();
+ if (i<0 || i>=fit)
+ continue;
+ int y = h+i*h+sep;
+
+ float key_vofs = Math::floor((float)(h - type_selected->get_height())/2);
+ float key_hofs = -Math::floor((float)type_selected->get_height()/2);
+
+ float time = animation->track_get_key_time(idx,E->key().key);
+ float diff = time-from_t;
+
+ float t = motion + diff;
+
+ float x = (t-keys_from)*zoom_scale;
+ //x+=click.to.x - click.at.x;
+ if (x<0 || x>=(settings_limit-name_limit))
+ continue;
+
+ x+=name_limit;
+
+ te->draw_texture(type_selected,ofs+Point2(x+key_hofs,y+key_vofs).floor());
+
+ }
+ } break;
+ default: {};
+ }
+
+
+ te_drawing=false;
+}
+
+void AnimationKeyEditor::_track_name_changed(const String& p_name) {
+
+ ERR_FAIL_COND(!animation.is_valid());
+ undo_redo->create_action(TTR("Anim Track Rename"));
+ undo_redo->add_do_method(animation.ptr(),"track_set_path",track_name_editing,p_name);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_path",track_name_editing,animation->track_get_path(track_name_editing));
+ undo_redo->commit_action();
+ track_name->hide();
+
+}
+
+void AnimationKeyEditor::_track_menu_selected(int p_idx) {
+
+
+ ERR_FAIL_COND(!animation.is_valid());
+
+ if (interp_editing!=-1) {
+
+ ERR_FAIL_INDEX(interp_editing,animation->get_track_count());
+ undo_redo->create_action(TTR("Anim Track Change Interpolation"));
+ undo_redo->add_do_method(animation.ptr(),"track_set_interpolation_type",interp_editing,p_idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_interpolation_type",interp_editing,animation->track_get_interpolation_type(interp_editing));
+ undo_redo->commit_action();
+ } else if (cont_editing!=-1) {
+
+ ERR_FAIL_INDEX(cont_editing,animation->get_track_count());
+
+ undo_redo->create_action(TTR("Anim Track Change Value Mode"));
+ undo_redo->add_do_method(animation.ptr(),"value_track_set_update_mode",cont_editing,p_idx);
+ undo_redo->add_undo_method(animation.ptr(),"value_track_set_update_mode",cont_editing,animation->value_track_get_update_mode(cont_editing));
+ undo_redo->commit_action();
+ } else if (wrap_editing!=-1) {
+
+ ERR_FAIL_INDEX(wrap_editing,animation->get_track_count());
+
+ undo_redo->create_action(TTR("Anim Track Change Wrap Mode"));
+ undo_redo->add_do_method(animation.ptr(),"track_set_interpolation_loop_wrap",wrap_editing,p_idx?true:false);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_interpolation_loop_wrap",wrap_editing,animation->track_get_interpolation_loop_wrap(wrap_editing));
+ undo_redo->commit_action();
+ } else {
+ switch (p_idx) {
+
+ case RIGHT_MENU_DUPLICATE:
+ _anim_duplicate_keys(); break;
+ case RIGHT_MENU_DUPLICATE_TRANSPOSE:
+ _anim_duplicate_keys(true); break;
+ case RIGHT_MENU_REMOVE:
+ _anim_delete_keys(); break;
+ }
+ }
+
+}
+
+struct _AnimMoveRestore {
+
+ int track;
+ float time;
+ Variant key;
+ float transition;
+};
+
+void AnimationKeyEditor::_clear_selection_for_anim(const Ref<Animation>& p_anim) {
+
+ if (!(animation==p_anim))
+ return;
+ //selection.clear();
+ _clear_selection();
+
+}
+
+void AnimationKeyEditor::_select_at_anim(const Ref<Animation>& p_anim,int p_track,float p_pos){
+
+ if (!(animation==p_anim))
+ return;
+
+ int idx = animation->track_find_key(p_track,p_pos,true);
+ ERR_FAIL_COND(idx<0);
+
+ SelectedKey sk;
+ sk.track=p_track;
+ sk.key=idx;
+ KeyInfo ki;
+ ki.pos=p_pos;
+
+ selection.insert(sk,ki);
+
+}
+
+
+PropertyInfo AnimationKeyEditor::_find_hint_for_track(int p_idx,NodePath& r_base_path) {
+
+ r_base_path=NodePath();
+ ERR_FAIL_COND_V(!animation.is_valid(),PropertyInfo());
+ ERR_FAIL_INDEX_V(p_idx,animation->get_track_count(),PropertyInfo());
+
+ if (!root)
+ return PropertyInfo();
+
+ NodePath path = animation->track_get_path(p_idx);
+
+
+ if (!root->has_node_and_resource(path))
+ return PropertyInfo();
+
+ RES res;
+ Node *node = root->get_node_and_resource(path,res);
+
+
+ if (node) {
+ r_base_path=node->get_path();
+ }
+
+ String property = path.get_property();
+ if (property=="")
+ return PropertyInfo();
+
+ List<PropertyInfo> pinfo;
+ if (res.is_valid())
+ res->get_property_list(&pinfo);
+ else
+ node->get_property_list(&pinfo);
+
+ for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ if (E->get().name==property)
+ return E->get();
+ }
+
+ return PropertyInfo();
+}
+
+
+void AnimationKeyEditor::_curve_transition_changed(float p_what) {
+
+ if (selection.size()==0)
+ return;
+ if (selection.size()==1)
+ undo_redo->create_action(TTR("Edit Node Curve"),UndoRedo::MERGE_ENDS);
+ else
+ undo_redo->create_action(TTR("Edit Selection Curve"),UndoRedo::MERGE_ENDS);
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+
+ int track = E->key().track;
+ int key = E->key().key;
+ float prev_val = animation->track_get_key_transition(track,key);
+ undo_redo->add_do_method(animation.ptr(),"track_set_key_transition",track,key,p_what);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_transition",track,key,prev_val);
+ }
+
+ undo_redo->commit_action();
+
+}
+
+void AnimationKeyEditor::_toggle_edit_curves() {
+
+ if (edit_button->is_pressed())
+ key_editor_tab->show();
+ else
+ key_editor_tab->hide();
+}
+
+
+bool AnimationKeyEditor::_edit_if_single_selection() {
+
+ if (selection.size()!=1) {
+
+ if (selection.size()==0) {
+ curve_edit->set_mode(AnimationCurveEdit::MODE_DISABLED);
+ //print_line("disable");
+ } else {
+
+ curve_edit->set_mode(AnimationCurveEdit::MODE_MULTIPLE);
+ curve_edit->set_transition(1.0);
+ curve_edit->clear_multiples();
+ //add all
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+
+ curve_edit->set_multiple(animation->track_get_key_transition(E->key().track,E->key().key));
+ }
+ //print_line("multiple");
+
+ }
+ return false;
+ }
+ curve_edit->set_mode(AnimationCurveEdit::MODE_SINGLE);
+ //print_line("regular");
+
+ int idx = selection.front()->key().track;
+ int key = selection.front()->key().key;
+ {
+
+ key_edit->animation=animation;
+ key_edit->track=idx;
+ key_edit->key_ofs=animation->track_get_key_time(idx,key);
+ key_edit->hint=_find_hint_for_track(idx,key_edit->base);
+ key_edit->notify_change();
+
+ curve_edit->set_transition(animation->track_get_key_transition(idx,key));
+
+ /*key_edit_dialog->set_size( Size2( 200,200) );
+ key_edit_dialog->set_pos( track_editor->get_global_pos() + ofs + mpos +Point2(-100,20));
+ key_edit_dialog->popup();*/
+
+ }
+
+ return true;
+
+}
+
+void AnimationKeyEditor::_anim_delete_keys() {
+ if (selection.size()) {
+ undo_redo->create_action(TTR("Anim Delete Keys"));
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key",E->key().track,E->key().key);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",E->key().track,E->get().pos,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+
+ }
+ undo_redo->add_do_method(this,"_clear_selection_for_anim",animation);
+ undo_redo->add_undo_method(this,"_clear_selection_for_anim",animation);
+ undo_redo->commit_action();
+ //selection.clear();
+ accept_event();
+ _edit_if_single_selection();
+ }
+}
+
+void AnimationKeyEditor::_track_editor_gui_input(const InputEvent& p_input) {
+
+ Control *te=track_editor;
+ Ref<StyleBox> style = get_stylebox("normal","TextEdit");
+
+ if (!animation.is_valid()) {
+ return;
+ }
+
+ Size2 size= te->get_size() - style->get_minimum_size();
+ Size2 ofs = style->get_offset();
+
+ Ref<Font> font = te->get_font("font","Tree");
+ int sep = get_constant("vseparation","Tree");
+ int hsep = get_constant("hseparation","Tree");
+ Ref<Texture> remove_icon = get_icon("Remove","EditorIcons");
+ Ref<Texture> move_up_icon = get_icon("MoveUp","EditorIcons");
+ Ref<Texture> move_down_icon = get_icon("MoveDown","EditorIcons");
+ Ref<Texture> down_icon = get_icon("select_arrow","Tree");
+ Ref<Texture> hsize_icon = get_icon("Hsize","EditorIcons");
+ Ref<Texture> add_key_icon = get_icon("TrackAddKey","EditorIcons");
+
+ Ref<Texture> wrap_icon[2]={
+ get_icon("InterpWrapClamp","EditorIcons"),
+ get_icon("InterpWrapLoop","EditorIcons"),
+ };
+ Ref<Texture> interp_icon[3]={
+ get_icon("InterpRaw","EditorIcons"),
+ get_icon("InterpLinear","EditorIcons"),
+ get_icon("InterpCubic","EditorIcons")
+ };
+ Ref<Texture> cont_icon[3]={
+ get_icon("TrackContinuous","EditorIcons"),
+ get_icon("TrackDiscrete","EditorIcons"),
+ get_icon("TrackTrigger","EditorIcons")
+ };
+ Ref<Texture> type_icon[3]={
+ get_icon("KeyValue","EditorIcons"),
+ get_icon("KeyXform","EditorIcons"),
+ get_icon("KeyCall","EditorIcons")
+ };
+ int right_separator_ofs = down_icon->get_width() *3 + add_key_icon->get_width() + interp_icon[0]->get_width() + wrap_icon[0]->get_width() + cont_icon[0]->get_width() + hsep*9;
+
+ int h = font->get_height()+sep;
+
+ int fit = (size.height / h)-1;
+ int total = animation->get_track_count();
+ if (total < fit) {
+ v_scroll->hide();
+ } else {
+ v_scroll->show();
+ v_scroll->set_max( total );
+ v_scroll->set_page( fit );
+ }
+
+ int settings_limit = size.width - right_separator_ofs;
+ int name_limit = settings_limit * name_column_ratio;
+
+
+ switch(p_input.type) {
+
+ case InputEvent::KEY: {
+
+ if (p_input.key.scancode==KEY_D && p_input.key.pressed && p_input.key.mod.command) {
+
+ if (p_input.key.mod.shift)
+ _menu_track(TRACK_MENU_DUPLICATE_TRANSPOSE);
+ else
+ _menu_track(TRACK_MENU_DUPLICATE);
+
+ accept_event();
+
+ } else if (p_input.key.scancode==KEY_DELETE && p_input.key.pressed && click.click==ClickOver::CLICK_NONE) {
+
+ _anim_delete_keys();
+ } else if (animation.is_valid() && animation->get_track_count()>0) {
+
+ if (p_input.is_pressed() && (p_input.is_action("ui_up") || p_input.is_action("ui_page_up"))) {
+
+ if (p_input.is_action("ui_up"))
+ selected_track--;
+ if (v_scroll->is_visible_in_tree() && p_input.is_action("ui_page_up"))
+ selected_track--;
+
+ if (selected_track<0)
+ selected_track=0;
+
+
+ if (v_scroll->is_visible_in_tree()) {
+ if (v_scroll->get_value() > selected_track)
+ v_scroll->set_value(selected_track);
+
+ }
+
+ track_editor->update();
+ accept_event();
+
+ }
+
+ if (p_input.is_pressed() && (p_input.is_action("ui_down") || p_input.is_action("ui_page_down"))) {
+
+ if (p_input.is_action("ui_down"))
+ selected_track++;
+ else if (v_scroll->is_visible_in_tree() && p_input.is_action("ui_page_down"))
+ selected_track+=v_scroll->get_page();
+
+ if (selected_track >= animation->get_track_count())
+ selected_track=animation->get_track_count()-1;
+
+ if (v_scroll->is_visible_in_tree() && v_scroll->get_page()+v_scroll->get_value() < selected_track+1) {
+ v_scroll->set_value(selected_track-v_scroll->get_page()+1);
+ }
+
+ track_editor->update();
+ accept_event();
+ }
+ }
+
+
+ } break;
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb = p_input.mouse_button;
+
+ if (mb.button_index==BUTTON_WHEEL_UP && mb.pressed) {
+
+ if (mb.mod.command) {
+ zoom->set_value(zoom->get_value() + zoom->get_step());
+ } else {
+ v_scroll->set_value( v_scroll->get_value() - v_scroll->get_page() / 8 );
+ }
+ }
+
+ if (mb.button_index==BUTTON_WHEEL_DOWN && mb.pressed) {
+
+ if (mb.mod.command) {
+ zoom->set_value(zoom->get_value() - zoom->get_step());
+ } else {
+ v_scroll->set_value( v_scroll->get_value() + v_scroll->get_page() / 8 );
+ }
+ }
+
+ if (mb.button_index==BUTTON_RIGHT && mb.pressed) {
+
+ Point2 mpos = Point2(mb.x,mb.y)-ofs;
+
+ if (selection.size() == 0) {
+ // Auto-select on right-click if nothing is selected
+ // Note: This code is pretty much duplicated from the left click code,
+ // both codes could be moved into a function to avoid the duplicated code.
+ Point2 mpos = Point2(mb.x,mb.y)-ofs;
+
+ if (mpos.y < h ) {
+ return;
+ }
+
+ mpos.y -= h;
+
+ int idx = mpos.y / h;
+ idx+=v_scroll->get_value();
+ if (idx <0 || idx>=animation->get_track_count())
+ break;
+
+ if (mpos.x < name_limit) {
+ } else if (mpos.x < settings_limit) {
+ float pos = mpos.x - name_limit;
+ pos/=_get_zoom_scale();
+ pos+=h_scroll->get_value();
+ float w_time = (type_icon[0]->get_width() / _get_zoom_scale())/2.0;
+
+ int kidx = animation->track_find_key(idx,pos);
+ int kidx_n = kidx+1;
+ int key=-1;
+
+ if (kidx>=0 && kidx<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx);
+ if (ABS(pos-kpos)<=w_time) {
+
+ key=kidx;
+ }
+ }
+
+ if (key==-1 && kidx_n>=0 && kidx_n<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx_n);
+ if (ABS(pos-kpos)<=w_time) {
+
+ key=kidx_n;
+ }
+ }
+
+ if (key==-1) {
+
+ click.click=ClickOver::CLICK_SELECT_KEYS;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ click.shift=mb.mod.shift;
+ selected_track=idx;
+ track_editor->update();
+ //drag select region
+ return;
+
+ }
+
+
+
+ SelectedKey sk;
+ sk.track=idx;
+ sk.key=key;
+ KeyInfo ki;
+ ki.pos= animation->track_get_key_time(idx,key);
+ click.shift=mb.mod.shift;
+ click.selk=sk;
+
+
+ if (!mb.mod.shift && !selection.has(sk))
+ _clear_selection();
+
+ selection.insert(sk,ki);
+
+ click.click=ClickOver::CLICK_MOVE_KEYS;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ update();
+ selected_track=idx;
+ track_editor->update();
+
+ if (_edit_if_single_selection() && mb.mod.command) {
+ edit_button->set_pressed(true);
+ key_editor_tab->show();
+ }
+ }
+ }
+
+ if (selection.size()) {
+ // User has right clicked and we have a selection, show a popup menu with options
+ track_menu->clear();
+ track_menu->set_size(Point2(1,1));
+ track_menu->add_item(TTR("Duplicate Selection"), RIGHT_MENU_DUPLICATE);
+ track_menu->add_item(TTR("Duplicate Transposed"), RIGHT_MENU_DUPLICATE_TRANSPOSE);
+ track_menu->add_item(TTR("Remove Selection"), RIGHT_MENU_REMOVE);
+
+ track_menu->set_pos(te->get_global_pos()+mpos);
+
+ interp_editing=-1;
+ cont_editing=-1;
+ wrap_editing=-1;
+
+ track_menu->popup();
+ }
+ }
+
+ if (mb.button_index==BUTTON_LEFT && !(mb.button_mask&~BUTTON_MASK_LEFT)) {
+
+
+ if (mb.pressed) {
+
+ Point2 mpos = Point2(mb.x,mb.y)-ofs;
+
+ if (mpos.y < h ) {
+
+
+ if (mpos.x<name_limit && mpos.x > (name_limit - hsep - hsize_icon->get_width())) {
+
+
+ click.click=ClickOver::CLICK_RESIZE_NAMES;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ click.at.y=name_limit;
+
+ }
+
+ if (mpos.x>=name_limit && mpos.x<settings_limit) {
+ //seek
+ //int zoomw = settings_limit-name_limit;
+ float scale = _get_zoom_scale();
+ float pos = h_scroll->get_value() + (mpos.x-name_limit) / scale;
+ if (animation->get_step())
+ pos=Math::stepify(pos,animation->get_step());
+
+ if (pos<0 )
+ pos=0;
+ if (pos>=animation->get_length())
+ pos=animation->get_length();
+ timeline_pos=pos;
+ click.click=ClickOver::CLICK_DRAG_TIMELINE;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ emit_signal("timeline_changed",pos,false);
+
+ }
+
+ return;
+ }
+
+ mpos.y -= h;
+
+ int idx = mpos.y / h;
+ idx+=v_scroll->get_value();
+ if (idx <0)
+ break;
+
+ if (idx>=animation->get_track_count()) {
+
+ if (mpos.x >= name_limit && mpos.x<settings_limit) {
+
+ click.click=ClickOver::CLICK_SELECT_KEYS;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ //drag select region
+ }
+
+ break;
+ }
+
+ if (mpos.x < name_limit) {
+ //name column
+
+ // area
+ if (idx!=selected_track) {
+
+ selected_track=idx;
+ track_editor->update();
+ break;
+ }
+
+ Rect2 area(ofs.x,ofs.y+((int(mpos.y)/h)+1)*h,name_limit, h );
+ track_name->set_text(animation->track_get_path(idx));
+ track_name->set_pos( te->get_global_pos() + area.pos);
+ track_name->set_size(area.size);
+ track_name->show_modal();
+ track_name->grab_focus();
+ track_name->select_all();
+ track_name_editing=idx;
+
+ } else if (mpos.x < settings_limit) {
+
+ float pos = mpos.x - name_limit;
+ pos/=_get_zoom_scale();
+ pos+=h_scroll->get_value();
+ float w_time = (type_icon[0]->get_width() / _get_zoom_scale())/2.0;
+
+ int kidx = animation->track_find_key(idx,pos);
+ int kidx_n = kidx+1;
+ int key=-1;
+
+ if (kidx>=0 && kidx<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx);
+ if (ABS(pos-kpos)<=w_time) {
+
+ key=kidx;
+ }
+ }
+
+ if (key==-1 && kidx_n>=0 && kidx_n<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx_n);
+ if (ABS(pos-kpos)<=w_time) {
+
+ key=kidx_n;
+ }
+ }
+
+ if (key==-1) {
+
+ click.click=ClickOver::CLICK_SELECT_KEYS;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ click.shift=mb.mod.shift;
+ selected_track=idx;
+ track_editor->update();
+ //drag select region
+ return;
+
+ }
+
+
+
+ SelectedKey sk;
+ sk.track=idx;
+ sk.key=key;
+ KeyInfo ki;
+ ki.pos= animation->track_get_key_time(idx,key);
+ click.shift=mb.mod.shift;
+ click.selk=sk;
+
+
+ if (!mb.mod.shift && !selection.has(sk))
+ _clear_selection();
+
+ selection.insert(sk,ki);
+
+ click.click=ClickOver::CLICK_MOVE_KEYS;
+ click.at=Point2(mb.x,mb.y);
+ click.to=click.at;
+ update();
+ selected_track=idx;
+ track_editor->update();
+
+ if (_edit_if_single_selection() && mb.mod.command) {
+ edit_button->set_pressed(true);
+ key_editor_tab->show();
+ }
+ } else {
+ //button column
+ int ofsx = size.width - mpos.x;
+ if (ofsx < 0)
+ break;
+/*
+ if (ofsx < remove_icon->get_width()) {
+
+ undo_redo->create_action("Remove Anim Track");
+ undo_redo->add_do_method(animation.ptr(),"remove_track",idx);
+ undo_redo->add_undo_method(animation.ptr(),"add_track",animation->track_get_type(idx),idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_path",idx,animation->track_get_path(idx));
+ //todo interpolation
+ for(int i=0;i<animation->track_get_key_count(idx);i++) {
+
+ Variant v = animation->track_get_key_value(idx,i);
+ float time = animation->track_get_key_time(idx,i);
+ float trans = animation->track_get_key_transition(idx,i);
+
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",idx,time,v);
+ undo_redo->add_undo_method(animation.ptr(),"track_set_key_transition",idx,i,trans);
+
+ }
+
+ undo_redo->add_undo_method(animation.ptr(),"track_set_interpolation_type",idx,animation->track_get_interpolation_type(idx));
+ if (animation->track_get_type(idx)==Animation::TYPE_VALUE) {
+ undo_redo->add_undo_method(animation.ptr(),"value_track_set_continuous",idx,animation->value_track_is_continuous(idx));
+
+ }
+
+ undo_redo->commit_action();
+
+
+ return;
+ }
+
+ ofsx-=hsep+remove_icon->get_width();
+
+ if (ofsx < move_down_icon->get_width()) {
+
+ if (idx < animation->get_track_count() -1) {
+ undo_redo->create_action("Move Anim Track Down");
+ undo_redo->add_do_method(animation.ptr(),"track_move_up",idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_move_down",idx+1);
+ undo_redo->commit_action();
+ }
+ return;
+ }
+
+ ofsx-=hsep+move_down_icon->get_width();
+
+ if (ofsx < move_up_icon->get_width()) {
+
+ if (idx >0) {
+ undo_redo->create_action("Move Anim Track Up");
+ undo_redo->add_do_method(animation.ptr(),"track_move_down",idx);
+ undo_redo->add_undo_method(animation.ptr(),"track_move_up",idx-1);
+ undo_redo->commit_action();
+ }
+ return;
+ }
+
+
+ ofsx-=hsep*3+move_up_icon->get_width();
+ */
+
+
+ if (ofsx < track_ofs[1]) {
+
+ track_menu->clear();
+ track_menu->set_size(Point2(1,1));
+ static const char *interp_name[2]={"Clamp Loop Interp","Wrap Loop Interp"};
+ for(int i=0;i<2;i++) {
+ track_menu->add_icon_item(wrap_icon[i],interp_name[i]);
+ }
+
+ int popup_y = ofs.y+((int(mpos.y)/h)+2)*h;
+ int popup_x = size.width-track_ofs[1];
+
+ track_menu->set_pos(te->get_global_pos()+Point2(popup_x,popup_y));
+
+
+ wrap_editing=idx;
+ interp_editing=-1;
+ cont_editing=-1;
+
+ track_menu->popup();
+
+ return;
+ }
+
+
+ if (ofsx < track_ofs[2]) {
+
+ track_menu->clear();
+ track_menu->set_size(Point2(1,1));
+ static const char *interp_name[3]={"Nearest","Linear","Cubic"};
+ for(int i=0;i<3;i++) {
+ track_menu->add_icon_item(interp_icon[i],interp_name[i]);
+ }
+
+ int popup_y = ofs.y+((int(mpos.y)/h)+2)*h;
+ int popup_x = size.width-track_ofs[2];
+
+ track_menu->set_pos(te->get_global_pos()+Point2(popup_x,popup_y));
+
+
+ interp_editing=idx;
+ cont_editing=-1;
+ wrap_editing=-1;
+
+ track_menu->popup();
+
+ return;
+ }
+
+ if (ofsx < track_ofs[3]) {
+
+ track_menu->clear();
+ track_menu->set_size(Point2(1,1));
+ String cont_name[3]={TTR("Continuous"),TTR("Discrete"),TTR("Trigger")};
+ for(int i=0;i<3;i++) {
+ track_menu->add_icon_item(cont_icon[i],cont_name[i]);
+ }
+
+
+ int popup_y = ofs.y+((int(mpos.y)/h)+2)*h;
+ int popup_x = size.width-track_ofs[3];
+
+ track_menu->set_pos(te->get_global_pos()+Point2(popup_x,popup_y));
+
+ interp_editing=-1;
+ wrap_editing=-1;
+ cont_editing=idx;
+
+ track_menu->popup();
+
+ return;
+ }
+
+ if (ofsx < track_ofs[4]) {
+
+ Animation::TrackType tt = animation->track_get_type(idx);
+
+ float pos = timeline_pos;
+ int existing = animation->track_find_key(idx,pos,true);
+
+
+
+ Variant newval;
+
+ if (tt==Animation::TYPE_TRANSFORM) {
+ Dictionary d;
+ d["loc"]=Vector3();
+ d["rot"]=Quat();
+ d["scale"]=Vector3();
+ newval=d;
+
+ } else if (tt==Animation::TYPE_METHOD) {
+
+ Dictionary d;
+ d["method"]="";
+ d["args"]=Vector<Variant>();
+
+
+ newval=d;
+ } else if (tt==Animation::TYPE_VALUE) {
+
+ NodePath np;
+ PropertyInfo inf = _find_hint_for_track(idx,np);
+ if (inf.type!=Variant::NIL) {
+
+ Variant::CallError err;
+ newval=Variant::construct(inf.type,NULL,0,err);
+
+ }
+
+ if (newval.get_type()==Variant::NIL) {
+ //popup a new type
+ cvi_track=idx;
+ cvi_pos=pos;
+
+ type_menu->set_pos( get_global_pos() + mpos +ofs );
+ type_menu->popup();
+ return;
+ }
+
+ }
+
+ undo_redo->create_action(TTR("Anim Add Key"));
+
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",idx,pos,newval,1);
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",idx,pos);
+
+ if (existing!=-1) {
+ Variant v = animation->track_get_key_value(idx,existing);
+ float trans = animation->track_get_key_transition(idx,existing);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",idx,pos,v,trans);
+ }
+
+ undo_redo->commit_action();
+
+
+ return;
+ }
+
+ }
+
+ } else {
+
+ switch(click.click) {
+ case ClickOver::CLICK_SELECT_KEYS: {
+
+
+ float zoom_scale=_get_zoom_scale();
+ float keys_from = h_scroll->get_value();
+ float keys_to = keys_from + (settings_limit-name_limit) / zoom_scale;
+
+ float from_time = keys_from + ( click.at.x - (name_limit+ofs.x)) / zoom_scale;
+ float to_time = keys_from + (click.to.x - (name_limit+ofs.x)) / zoom_scale;
+
+
+ if (to_time < from_time)
+ SWAP(from_time,to_time);
+
+ if (from_time > keys_to || to_time < keys_from)
+ break;
+
+ if (from_time < keys_from)
+ from_time = keys_from;
+
+ if (to_time >= keys_to)
+ to_time = keys_to;
+
+
+ int from_track = int(click.at.y-ofs.y-h-sep) / h + v_scroll->get_value();
+ int to_track = int(click.to.y-ofs.y-h-sep) / h + v_scroll->get_value();
+ int from_mod = int(click.at.y-ofs.y-sep) % h;
+ int to_mod = int(click.to.y-ofs.y-sep) % h;
+
+ if (to_track < from_track) {
+
+ SWAP(from_track,to_track);
+ SWAP(from_mod,to_mod);
+ }
+
+
+
+
+ if ((from_mod > (h/2)) && ((click.at.y-ofs.y)>=(h+sep))) {
+ from_track++;
+ }
+
+ if (to_mod < h/2) {
+ to_track--;
+ }
+
+ if (from_track>to_track) {
+ if (!click.shift)
+ _clear_selection();
+ _edit_if_single_selection();
+ break;
+ }
+
+ int tracks_from = v_scroll->get_value();
+ int tracks_to = v_scroll->get_value()+fit-1;
+ if (tracks_to>=animation->get_track_count())
+ tracks_to=animation->get_track_count()-1;
+
+ tracks_from=0;
+ tracks_to=animation->get_track_count()-1;
+ if (to_track >tracks_to)
+ to_track = tracks_to;
+ if (from_track<tracks_from)
+ from_track=tracks_from;
+
+ if (from_track > tracks_to || to_track < tracks_from) {
+ if (!click.shift)
+ _clear_selection();
+ _edit_if_single_selection();
+ break;
+ }
+
+ if (!click.shift)
+ _clear_selection();
+
+
+ int higher_track=0x7FFFFFFF;
+ for(int i=from_track;i<=to_track;i++) {
+
+ int kc=animation->track_get_key_count(i);
+ for(int j=0;j<kc;j++) {
+
+ float t = animation->track_get_key_time(i,j);
+ if (t<from_time)
+ continue;
+ if (t>to_time)
+ break;
+
+ if (i<higher_track)
+ higher_track=i;
+
+ SelectedKey sk;
+ sk.track=i;
+ sk.key=j;
+ KeyInfo ki;
+ ki.pos=t;
+ selection[sk]=ki;
+ }
+ }
+
+ if (higher_track!=0x7FFFFFFF) {
+ selected_track=higher_track;
+ track_editor->update();
+ }
+
+
+ _edit_if_single_selection();
+
+
+ } break;
+ case ClickOver::CLICK_MOVE_KEYS: {
+
+ if (selection.empty())
+ break;
+ if (click.at==click.to) {
+
+ if (!click.shift) {
+
+ KeyInfo ki=selection[click.selk];
+ _clear_selection();
+ selection[click.selk]=ki;
+ _edit_if_single_selection();
+ }
+
+ break;
+ }
+
+ float from_t = 1e20;
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+ float t = animation->track_get_key_time(E->key().track,E->key().key);
+ if (t<from_t)
+ from_t=t;
+
+ }
+
+ float motion = from_t+(click.to.x - click.at.x)/_get_zoom_scale();
+ if (step->get_value())
+ motion = Math::stepify(motion,step->get_value());
+
+
+
+
+ undo_redo->create_action(TTR("Anim Move Keys"));
+
+ List<_AnimMoveRestore> to_restore;
+
+ // 1-remove the keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key",E->key().track,E->key().key);
+ }
+ // 2- remove overlapped keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newtime = E->get().pos-from_t+motion;
+ int idx = animation->track_find_key(E->key().track,newtime,true);
+ if (idx==-1)
+ continue;
+ SelectedKey sk;
+ sk.key=idx;
+ sk.track=E->key().track;
+ if (selection.has(sk))
+ continue; //already in selection, don't save
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key_at_pos",E->key().track,newtime);
+ _AnimMoveRestore amr;
+
+ amr.key=animation->track_get_key_value(E->key().track,idx);
+ amr.track=E->key().track;
+ amr.time=newtime;
+ amr.transition=animation->track_get_key_transition(E->key().track,idx);
+
+ to_restore.push_back(amr);
+
+ }
+
+ // 3-move the keys (re insert them)
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newpos=E->get().pos-from_t+motion;
+ /*
+ if (newpos<0)
+ continue; //no add at the begining
+ */
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",E->key().track,newpos,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+
+ }
+
+ // 4-(undo) remove inserted keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newpos=E->get().pos+-from_t+motion;
+ /*
+ if (newpos<0)
+ continue; //no remove what no inserted
+ */
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",E->key().track,newpos);
+
+ }
+
+ // 5-(undo) reinsert keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",E->key().track,E->get().pos,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+
+ }
+
+ // 6-(undo) reinsert overlapped keys
+ for(List<_AnimMoveRestore>::Element *E=to_restore.front();E;E=E->next()) {
+
+ _AnimMoveRestore &amr = E->get();
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",amr.track,amr.time,amr.key,amr.transition);
+
+ }
+
+ // 6-(undo) reinsert overlapped keys
+ for(List<_AnimMoveRestore>::Element *E=to_restore.front();E;E=E->next()) {
+
+ _AnimMoveRestore &amr = E->get();
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",amr.track,amr.time,amr.key,amr.transition);
+
+ }
+
+ undo_redo->add_do_method(this,"_clear_selection_for_anim",animation);
+ undo_redo->add_undo_method(this,"_clear_selection_for_anim",animation);
+
+ // 7-reselect
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float oldpos=E->get().pos;
+ float newpos=oldpos-from_t+motion;
+ //if (newpos>=0)
+ undo_redo->add_do_method(this,"_select_at_anim",animation,E->key().track,newpos);
+ undo_redo->add_undo_method(this,"_select_at_anim",animation,E->key().track,oldpos);
+
+ }
+
+ undo_redo->commit_action();
+ _edit_if_single_selection();
+
+ } break;
+ default: {}
+ }
+
+ //button released
+ click.click=ClickOver::CLICK_NONE;
+ track_editor->update();
+
+
+ }
+ }
+
+ } break;
+
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mb = p_input.mouse_motion;
+
+ mouse_over.over=MouseOver::OVER_NONE;
+ mouse_over.track=-1;
+ te->update();
+ track_editor->set_tooltip("");
+
+ if (!track_editor->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
+ track_editor->call_deferred("grab_focus");
+
+
+ if (click.click!=ClickOver::CLICK_NONE) {
+
+ switch(click.click) {
+ case ClickOver::CLICK_RESIZE_NAMES: {
+
+
+ float base = click.at.y;
+ float clickp = click.at.x-ofs.x;
+ float dif = base - clickp;
+
+ float target = mb.x+dif-ofs.x;
+
+ float ratio = target / settings_limit;
+
+ if (ratio>0.9)
+ ratio=0.9;
+ else if (ratio<0.2)
+ ratio=0.2;
+
+ name_column_ratio=ratio;
+
+
+ } break;
+ case ClickOver::CLICK_DRAG_TIMELINE: {
+
+ Point2 mpos = Point2(mb.x,mb.y)-ofs;
+ /*
+ if (mpos.x<name_limit)
+ mpos.x=name_limit;
+ if (mpos.x>settings_limit)
+ mpos.x=settings_limit;
+ */
+
+
+ //int zoomw = settings_limit-name_limit;
+ float scale = _get_zoom_scale();
+ float pos = h_scroll->get_value() + (mpos.x-name_limit) / scale;
+ if (animation->get_step()) {
+ pos=Math::stepify(pos,animation->get_step());
+
+ }
+ if (pos<0)
+ pos=0;
+ if (pos>=animation->get_length())
+ pos=animation->get_length();
+
+ if (pos < h_scroll->get_value()) {
+ h_scroll->set_value(pos);
+ } else if (pos > h_scroll->get_value() + (settings_limit - name_limit) / scale) {
+ h_scroll->set_value( pos - (settings_limit - name_limit) / scale );
+ }
+
+ timeline_pos=pos;
+ emit_signal("timeline_changed",pos,true);
+
+
+
+ } break;
+ case ClickOver::CLICK_SELECT_KEYS: {
+
+ click.to=Point2(mb.x,mb.y);
+ if (click.to.y<h && click.at.y>h && mb.relative_y<0) {
+
+ float prev = v_scroll->get_value();
+ v_scroll->set_value( v_scroll->get_value() -1 );
+ if (prev!=v_scroll->get_value())
+ click.at.y+=h;
+
+
+ }
+ if (click.to.y>size.height && click.at.y<size.height && mb.relative_y>0) {
+
+ float prev = v_scroll->get_value();
+ v_scroll->set_value( v_scroll->get_value() +1 );
+ if (prev!=v_scroll->get_value())
+ click.at.y-=h;
+ }
+
+ } break;
+ case ClickOver::CLICK_MOVE_KEYS: {
+
+ click.to=Point2(mb.x,mb.y);
+ } break;
+ default: {}
+ }
+
+ return;
+ } else if (mb.button_mask&BUTTON_MASK_MIDDLE) {
+
+ int rel = mb.relative_x;
+ float relf = rel / _get_zoom_scale();
+ h_scroll->set_value( h_scroll->get_value() - relf );
+ }
+
+ if (mb.button_mask==0) {
+
+
+ Point2 mpos = Point2(mb.x,mb.y)-ofs;
+
+ if (mpos.y < h ) {
+#if 0
+ //seek
+ //int zoomw = settings_limit-name_limit;
+ float scale = _get_zoom_scale();
+ float pos = h_scroll->get_val() + (mpos.y-name_limit) / scale;
+ if (pos<0 )
+ pos=0;
+ if (pos>=animation->get_length())
+ pos=animation->get_length();
+ timeline->set_val(pos);
+#endif
+ return;
+ }
+
+ mpos.y -= h;
+
+ int idx = mpos.y / h;
+ idx+=v_scroll->get_value();
+ if (idx <0 || idx>=animation->get_track_count())
+ break;
+
+ mouse_over.track=idx;
+
+ if (mpos.x < name_limit) {
+ //name column
+
+
+ mouse_over.over=MouseOver::OVER_NAME;
+
+ } else if (mpos.x < settings_limit) {
+
+ float pos = mpos.x - name_limit;
+ pos/=_get_zoom_scale();
+ pos+=h_scroll->get_value();
+ float w_time = (type_icon[0]->get_width() / _get_zoom_scale())/2.0;
+
+ int kidx = animation->track_find_key(idx,pos);
+ int kidx_n = kidx+1;
+
+ bool found = false;
+
+ if (kidx>=0 && kidx<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx);
+ if (ABS(pos-kpos)<=w_time) {
+
+ mouse_over.over=MouseOver::OVER_KEY;
+ mouse_over.track=idx;
+ mouse_over.over_key=kidx;
+ found=true;
+ }
+ }
+
+ if (!found && kidx_n>=0 && kidx_n<animation->track_get_key_count(idx)) {
+
+ float kpos = animation->track_get_key_time(idx,kidx_n);
+ if (ABS(pos-kpos)<=w_time) {
+
+ mouse_over.over=MouseOver::OVER_KEY;
+ mouse_over.track=idx;
+ mouse_over.over_key=kidx_n;
+ found=true;
+ }
+ }
+
+
+ if (found) {
+
+ String text;
+ text="time: "+rtos(animation->track_get_key_time(idx,mouse_over.over_key))+"\n";
+
+
+ switch(animation->track_get_type(idx)) {
+
+ case Animation::TYPE_TRANSFORM: {
+
+ Dictionary d = animation->track_get_key_value(idx,mouse_over.over_key);
+ if (d.has("loc"))
+ text+="loc: "+String(d["loc"])+"\n";
+ if (d.has("rot"))
+ text+="rot: "+String(d["rot"])+"\n";
+ if (d.has("scale"))
+ text+="scale: "+String(d["scale"])+"\n";
+ } break;
+ case Animation::TYPE_VALUE: {
+
+ Variant v = animation->track_get_key_value(idx,mouse_over.over_key);
+ //text+="value: "+String(v)+"\n";
+
+ bool prop_exists=false;
+ Variant::Type valid_type=Variant::NIL;
+ Object *obj=NULL;
+
+ RES res;
+ Node *node = root->get_node_and_resource(animation->track_get_path(idx),res);
+
+ if (res.is_valid()) {
+ obj=res.ptr();
+ } else if (node) {
+ obj=node;
+ }
+
+ if (obj) {
+ valid_type=obj->get_static_property_type(animation->track_get_path(idx).get_property(),&prop_exists);
+ }
+
+ text+="type: "+Variant::get_type_name(v.get_type())+"\n";
+ if (prop_exists && !Variant::can_convert(v.get_type(),valid_type)) {
+ text+="value: "+String(v)+" (Invalid, expected type: "+Variant::get_type_name(valid_type)+")\n";
+ } else {
+ text+="value: "+String(v)+"\n";
+ }
+
+ } break;
+ case Animation::TYPE_METHOD: {
+
+
+ Dictionary d = animation->track_get_key_value(idx,mouse_over.over_key);
+ if (d.has("method"))
+ text+=String(d["method"]);
+ text+="(";
+ Vector<Variant> args;
+ if (d.has("args"))
+ args=d["args"];
+ for(int i=0;i<args.size();i++) {
+
+ if (i>0)
+ text+=", ";
+ text+=String(args[i]);
+ }
+ text+=")\n";
+
+ } break;
+ }
+ text+="easing: "+rtos(animation->track_get_key_transition(idx,mouse_over.over_key));
+
+
+
+ track_editor->set_tooltip(text);
+ return;
+
+ }
+
+ } else {
+ //button column
+ int ofsx = size.width - mpos.x;
+ if (ofsx < 0)
+ break;
+/*
+ if (ofsx < remove_icon->get_width()) {
+
+ mouse_over.over=MouseOver::OVER_REMOVE;
+
+ return;
+ }
+
+ ofsx-=hsep+remove_icon->get_width();
+
+ if (ofsx < move_down_icon->get_width()) {
+
+ mouse_over.over=MouseOver::OVER_DOWN;
+ return;
+ }
+
+ ofsx-=hsep+move_down_icon->get_width();
+
+ if (ofsx < move_up_icon->get_width()) {
+
+ mouse_over.over=MouseOver::OVER_UP;
+ return;
+ }
+
+ ofsx-=hsep*3+move_up_icon->get_width();
+
+ */
+
+ if (ofsx < down_icon->get_width() + wrap_icon[0]->get_width() + hsep*3) {
+
+ mouse_over.over=MouseOver::OVER_WRAP;
+ return;
+ }
+
+ ofsx-=hsep*3+wrap_icon[0]->get_width() + down_icon->get_width();
+
+ if (ofsx < down_icon->get_width() + interp_icon[0]->get_width() + hsep*3) {
+
+ mouse_over.over=MouseOver::OVER_INTERP;
+ return;
+ }
+
+
+ ofsx-=hsep*2+interp_icon[0]->get_width() + down_icon->get_width();
+
+ if (ofsx < down_icon->get_width() + cont_icon[0]->get_width() +hsep*3) {
+
+ mouse_over.over=MouseOver::OVER_VALUE;
+ return;
+ }
+
+ ofsx-=hsep*3+cont_icon[0]->get_width() + down_icon->get_width();
+
+ if (ofsx < add_key_icon->get_width()) {
+
+ mouse_over.over=MouseOver::OVER_ADD_KEY;
+ return;
+ }
+
+
+ }
+
+ }
+
+ } break;
+
+ }
+}
+
+void AnimationKeyEditor::_notification(int p_what) {
+
+
+ switch(p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+
+ EditorNode::get_singleton()->update_keying();
+ emit_signal("keying_changed");
+ } break;
+
+ case NOTIFICATION_ENTER_TREE: {
+
+ key_editor->edit(key_edit);
+
+ zoomicon->set_texture( get_icon("Zoom","EditorIcons") );
+
+ menu_add_track->set_icon(get_icon("AddTrack","EditorIcons"));
+ menu_add_track->get_popup()->add_icon_item(get_icon("KeyValue","EditorIcons"),"Add Normal Track",ADD_TRACK_MENU_ADD_VALUE_TRACK);
+ menu_add_track->get_popup()->add_icon_item(get_icon("KeyXform","EditorIcons"),"Add Transform Track",ADD_TRACK_MENU_ADD_TRANSFORM_TRACK);
+ menu_add_track->get_popup()->add_icon_item(get_icon("KeyCall","EditorIcons"),"Add Call Func Track",ADD_TRACK_MENU_ADD_CALL_TRACK);
+
+ menu_track->set_icon(get_icon("Tools","EditorIcons"));
+ menu_track->get_popup()->add_item(TTR("Scale Selection"),TRACK_MENU_SCALE);
+ menu_track->get_popup()->add_item(TTR("Scale From Cursor"),TRACK_MENU_SCALE_PIVOT);
+ menu_track->get_popup()->add_separator();
+ menu_track->get_popup()->add_item(TTR("Duplicate Selection"),TRACK_MENU_DUPLICATE);
+ menu_track->get_popup()->add_item(TTR("Duplicate Transposed"),TRACK_MENU_DUPLICATE_TRANSPOSE);
+ menu_track->get_popup()->add_separator();
+ menu_track->get_popup()->add_item(TTR("Goto Next Step"),TRACK_MENU_NEXT_STEP,KEY_MASK_CMD|KEY_RIGHT);
+ menu_track->get_popup()->add_item(TTR("Goto Prev Step"),TRACK_MENU_PREV_STEP,KEY_MASK_CMD|KEY_LEFT);
+ menu_track->get_popup()->add_separator();
+ PopupMenu *tpp = memnew( PopupMenu );
+ tpp->add_item(TTR("Linear"),TRACK_MENU_SET_ALL_TRANS_LINEAR);
+ tpp->add_item(TTR("Constant"),TRACK_MENU_SET_ALL_TRANS_CONSTANT);
+ tpp->add_item(TTR("In"),TRACK_MENU_SET_ALL_TRANS_IN);
+ tpp->add_item(TTR("Out"),TRACK_MENU_SET_ALL_TRANS_OUT);
+ tpp->add_item(TTR("In-Out"),TRACK_MENU_SET_ALL_TRANS_INOUT);
+ tpp->add_item(TTR("Out-In"),TRACK_MENU_SET_ALL_TRANS_OUTIN);
+ tpp->set_name(TTR("Transitions"));
+ tpp->connect("id_pressed",this,"_menu_track");
+ optimize_dialog->connect("confirmed",this,"_animation_optimize");
+
+ menu_track->get_popup()->add_child(tpp);
+ //menu_track->get_popup()->add_submenu_item("Set Transitions..","Transitions");
+ //menu_track->get_popup()->add_separator();
+ menu_track->get_popup()->add_item(TTR("Optimize Animation"),TRACK_MENU_OPTIMIZE);
+ menu_track->get_popup()->add_item(TTR("Clean-Up Animation"),TRACK_MENU_CLEAN_UP);
+
+ curve_linear->set_icon(get_icon("CurveLinear","EditorIcons"));
+ curve_in->set_icon(get_icon("CurveIn","EditorIcons"));
+ curve_out->set_icon(get_icon("CurveOut","EditorIcons"));
+ curve_inout->set_icon(get_icon("CurveInOut","EditorIcons"));
+ curve_outin->set_icon(get_icon("CurveOutIn","EditorIcons"));
+ curve_constant->set_icon(get_icon("CurveConstant","EditorIcons"));
+
+ curve_linear->connect("pressed",this,"_menu_track",varray(CURVE_SET_LINEAR));
+ curve_in->connect("pressed",this,"_menu_track",varray(CURVE_SET_IN));
+ curve_out->connect("pressed",this,"_menu_track",varray(CURVE_SET_OUT));
+ curve_inout->connect("pressed",this,"_menu_track",varray(CURVE_SET_INOUT));
+ curve_outin->connect("pressed",this,"_menu_track",varray(CURVE_SET_OUTIN));
+ curve_constant->connect("pressed",this,"_menu_track",varray(CURVE_SET_CONSTANT));
+
+
+ move_up_button->set_icon(get_icon("MoveUp","EditorIcons"));
+ move_down_button->set_icon(get_icon("MoveDown","EditorIcons"));
+ remove_button->set_icon(get_icon("Remove","EditorIcons"));
+ edit_button->set_icon(get_icon("EditKey","EditorIcons"));
+ edit_button->connect("pressed",this,"_toggle_edit_curves");
+
+ loop->set_icon(get_icon("Loop","EditorIcons"));
+ curve_edit->connect("transition_changed",this,"_curve_transition_changed");
+
+ //edit_button->add_color_override("font_color",get_color("font_color","Tree"));
+ //edit_button->add_color_override("font_color_hover",get_color("font_color","Tree"));
+
+ {
+
+ right_data_size_cache=0;
+ int hsep = get_constant("hseparation","Tree");
+ Ref<Texture> remove_icon = get_icon("Remove","EditorIcons");
+ Ref<Texture> move_up_icon = get_icon("MoveUp","EditorIcons");
+ Ref<Texture> move_down_icon = get_icon("MoveDown","EditorIcons");
+ Ref<Texture> down_icon = get_icon("select_arrow","Tree");
+ Ref<Texture> add_key_icon = get_icon("TrackAddKey","EditorIcons");
+ Ref<Texture> interp_icon[3]={
+ get_icon("InterpRaw","EditorIcons"),
+ get_icon("InterpLinear","EditorIcons"),
+ get_icon("InterpCubic","EditorIcons")
+ };
+ Ref<Texture> cont_icon[3]={
+ get_icon("TrackContinuous","EditorIcons"),
+ get_icon("TrackDiscrete","EditorIcons"),
+ get_icon("TrackTrigger","EditorIcons")
+ };
+
+ Ref<Texture> wrap_icon[2]={
+ get_icon("InterpWrapClamp","EditorIcons"),
+ get_icon("InterpWrapLoop","EditorIcons"),
+ };
+
+ //right_data_size_cache = remove_icon->get_width() + move_up_icon->get_width() + move_down_icon->get_width() + down_icon->get_width() *2 + interp_icon[0]->get_width() + cont_icon[0]->get_width() + add_key_icon->get_width() + hsep*11;
+ right_data_size_cache = down_icon->get_width() *3 + add_key_icon->get_width() + interp_icon[0]->get_width() + cont_icon[0]->get_width() + wrap_icon[0]->get_width() + hsep*8;
+
+
+ }
+ call_select->connect("selected",this,"_add_call_track");
+ //rename_anim->set_icon( get_icon("Rename","EditorIcons") );
+/*
+ edit_anim->set_icon( get_icon("Edit","EditorIcons") );
+ blend_anim->set_icon( get_icon("Blend","EditorIcons") );
+ play->set_icon( get_icon("Play","EditorIcons") );
+ stop->set_icon( get_icon("Stop","EditorIcons") );
+ pause->set_icon( get_icon("Pause","EditorIcons") );
+*/
+ //menu->set_icon(get_icon("Animation","EditorIcons"));
+ //play->set_icon(get_icon("AnimationPlay","EditorIcons"));
+ //menu->set_icon(get_icon("Animation","EditorIcons"));
+ _update_menu();
+
+ } break;
+
+
+ }
+
+}
+
+
+
+void AnimationKeyEditor::_scroll_changed(double) {
+
+ if (te_drawing)
+ return;
+
+ track_editor->update();
+}
+
+
+
+void AnimationKeyEditor::_update_paths() {
+
+ if (animation.is_valid()) {
+ //timeline->set_max(animation->get_length());
+ //timeline->set_step(0.01);
+ track_editor->update();
+ length->set_value(animation->get_length());
+ step->set_value(animation->get_step());
+ }
+}
+
+
+void AnimationKeyEditor::_root_removed() {
+
+ root=NULL;
+}
+
+void AnimationKeyEditor::_update_menu() {
+
+
+ updating=true;
+
+ if (animation.is_valid()) {
+
+ length->set_value(animation->get_length());
+ loop->set_pressed(animation->has_loop());
+ step->set_value(animation->get_step());
+ }
+
+ track_editor->update();
+ updating=false;
+
+}
+void AnimationKeyEditor::_clear_selection() {
+
+ selection.clear();
+ key_edit->animation=Ref<Animation>();
+ key_edit->track=0;
+ key_edit->key_ofs=0;
+ key_edit->hint=PropertyInfo();
+ key_edit->base=NodePath();
+ key_edit->notify_change();
+
+}
+
+
+void AnimationKeyEditor::set_animation(const Ref<Animation>& p_anim) {
+
+ if (animation.is_valid())
+ animation->disconnect("changed",this,"_update_paths");
+ animation=p_anim;
+ if (animation.is_valid())
+ animation->connect("changed",this,"_update_paths");
+
+ timeline_pos=0;
+ _clear_selection();
+ _update_paths();
+
+ _update_menu();
+ selected_track=-1;
+ _edit_if_single_selection();
+
+ EditorNode::get_singleton()->update_keying();
+}
+
+void AnimationKeyEditor::set_root(Node *p_root) {
+
+ if (root)
+ root->disconnect("tree_exited",this,"_root_removed");
+
+ root=p_root;
+
+ if (root)
+ root->connect("tree_exited",this,"_root_removed",make_binds(),CONNECT_ONESHOT);
+
+
+}
+
+Node *AnimationKeyEditor::get_root() const {
+
+ return root;
+}
+
+
+
+
+
+
+void AnimationKeyEditor::update_keying() {
+
+ bool keying_enabled=is_visible_in_tree() && animation.is_valid();
+
+ if (keying_enabled==keying)
+ return;
+
+ keying=keying_enabled;
+ _update_menu();
+ emit_signal("keying_changed");
+
+}
+
+bool AnimationKeyEditor::has_keying() const {
+
+ return keying;
+}
+
+void AnimationKeyEditor::_query_insert(const InsertData& p_id) {
+
+
+ if (insert_frame!=Engine::get_singleton()->get_frames_drawn()) {
+ //clear insert list for the frame if frame changed
+ if (insert_confirm->is_visible_in_tree())
+ return; //do nothing
+ insert_data.clear();
+ insert_query=false;
+ }
+ insert_frame=Engine::get_singleton()->get_frames_drawn();
+
+ for (List<InsertData>::Element *E=insert_data.front();E;E=E->next()) {
+ //prevent insertion of multiple tracks
+ if (E->get().path==p_id.path)
+ return; //already inserted a track for this on this frame
+ }
+
+ insert_data.push_back(p_id);
+
+ if (p_id.track_idx==-1) {
+ if (bool(EDITOR_DEF("editors/animation/confirm_insert_track",true))) {
+ //potential new key, does not exist
+ if (insert_data.size()==1)
+ insert_confirm->set_text(vformat(TTR("Create NEW track for %s and insert key?"),p_id.query));
+ else
+ insert_confirm->set_text(vformat(TTR("Create %d NEW tracks and insert keys?"),insert_data.size()));
+
+ insert_confirm->get_ok()->set_text(TTR("Create"));
+ insert_confirm->popup_centered_minsize();
+ insert_query=true;
+ } else {
+ call_deferred("_insert_delay");
+ insert_queue=true;
+ }
+
+ } else {
+ if (!insert_query && !insert_queue) {
+ call_deferred("_insert_delay");
+ insert_queue=true;
+ }
+ }
+
+}
+
+void AnimationKeyEditor::insert_transform_key(Spatial *p_node,const String& p_sub,const Transform& p_xform) {
+
+ if (!keying)
+ return;
+ if (!animation.is_valid())
+ return;
+
+
+ ERR_FAIL_COND(!root);
+ //let's build a node path
+ String path = root->get_path_to(p_node);
+ if (p_sub!="")
+ path+=":"+p_sub;
+
+ NodePath np=path;
+
+ int track_idx=-1;
+
+ for(int i=0;i<animation->get_track_count();i++) {
+
+ if (animation->track_get_type(i)!=Animation::TYPE_TRANSFORM)
+ continue;
+ if (animation->track_get_path(i)!=np)
+ continue;
+
+ track_idx=i;
+ break;
+ }
+
+ InsertData id;
+ Dictionary val;
+
+ id.path=np;
+ id.track_idx=track_idx;
+ id.value=p_xform;
+ id.type=Animation::TYPE_TRANSFORM;
+ id.query="node '"+p_node->get_name()+"'";
+ id.advance=false;
+
+ //dialog insert
+
+ _query_insert(id);
+
+}
+
+
+void AnimationKeyEditor::insert_node_value_key(Node* p_node, const String& p_property,const Variant& p_value,bool p_only_if_exists) {
+
+ ERR_FAIL_COND(!root);
+ //let's build a node path
+
+ Node *node = p_node;
+
+ String path = root->get_path_to(node);
+
+ for(int i=1;i<history->get_path_size();i++) {
+
+ String prop = history->get_path_property(i);
+ ERR_FAIL_COND(prop=="");
+ path+=":"+prop;
+ }
+
+
+ path+=":"+p_property;
+
+ NodePath np = path;
+
+ //locate track
+
+ int track_idx=-1;
+
+ for(int i=0;i<animation->get_track_count();i++) {
+
+ if (animation->track_get_type(i)!=Animation::TYPE_VALUE)
+ continue;
+ if (animation->track_get_path(i)!=np)
+ continue;
+
+ track_idx=i;
+ break;
+ }
+
+ if (p_only_if_exists && track_idx==-1)
+ return;
+ InsertData id;
+ id.path=np;
+ id.track_idx=track_idx;
+ id.value=p_value;
+ id.type=Animation::TYPE_VALUE;
+ id.query="property '"+p_property+"'";
+ id.advance=false;
+ //dialog insert
+ _query_insert(id);
+
+
+
+}
+
+void AnimationKeyEditor::insert_value_key(const String& p_property,const Variant& p_value,bool p_advance) {
+
+ ERR_FAIL_COND(!root);
+ //let's build a node path
+ ERR_FAIL_COND(history->get_path_size()==0);
+ Object *obj = ObjectDB::get_instance(history->get_path_object(0));
+ ERR_FAIL_COND(!obj || !obj->cast_to<Node>());
+
+ Node *node = obj->cast_to<Node>();
+
+ String path = root->get_path_to(node);
+
+ for(int i=1;i<history->get_path_size();i++) {
+
+ String prop = history->get_path_property(i);
+ ERR_FAIL_COND(prop=="");
+ path+=":"+prop;
+ }
+
+
+
+ path+=":"+p_property;
+
+ NodePath np = path;
+
+ //locate track
+
+ int track_idx=-1;
+
+ for(int i=0;i<animation->get_track_count();i++) {
+
+ if (animation->track_get_type(i)!=Animation::TYPE_VALUE)
+ continue;
+ if (animation->track_get_path(i)!=np)
+ continue;
+
+ track_idx=i;
+ break;
+ }
+
+ InsertData id;
+ id.path=np;
+ id.track_idx=track_idx;
+ id.value=p_value;
+ id.type=Animation::TYPE_VALUE;
+ id.query="property '"+p_property+"'";
+ id.advance=p_advance;
+ //dialog insert
+ _query_insert(id);
+
+
+
+}
+
+void AnimationKeyEditor::_confirm_insert_list() {
+
+
+ undo_redo->create_action(TTR("Anim Create & Insert"));
+
+ int last_track = animation->get_track_count();
+ while(insert_data.size()) {
+
+ last_track=_confirm_insert(insert_data.front()->get(),last_track);
+ insert_data.pop_front();
+ }
+
+ undo_redo->commit_action();
+}
+
+int AnimationKeyEditor::_confirm_insert(InsertData p_id,int p_last_track) {
+
+ if (p_last_track==-1)
+ p_last_track=animation->get_track_count();
+
+ bool created=false;
+ if (p_id.track_idx<0) {
+
+ created=true;
+ undo_redo->create_action(TTR("Anim Insert Track & Key"));
+ Animation::UpdateMode update_mode=Animation::UPDATE_DISCRETE;
+
+ if (p_id.type==Animation::TYPE_VALUE) {
+ //wants a new tack
+
+ {
+ //shitty hack
+ NodePath np;
+ animation->add_track(p_id.type);
+ animation->track_set_path(animation->get_track_count()-1,p_id.path);
+ PropertyInfo h = _find_hint_for_track(animation->get_track_count()-1,np);
+ animation->remove_track(animation->get_track_count()-1); //hack
+
+ if ( h.type==Variant::REAL ||
+ h.type==Variant::VECTOR2 ||
+ h.type==Variant::RECT2 ||
+ h.type==Variant::VECTOR3 ||
+ h.type==Variant::RECT3 ||
+ h.type==Variant::QUAT ||
+ h.type==Variant::COLOR ||
+ h.type==Variant::TRANSFORM ) {
+
+ update_mode=Animation::UPDATE_CONTINUOUS;
+ }
+
+ if (h.usage&PROPERTY_USAGE_ANIMATE_AS_TRIGGER) {
+ update_mode=Animation::UPDATE_TRIGGER;
+ }
+ }
+ }
+
+ p_id.track_idx=p_last_track;
+
+ undo_redo->add_do_method(animation.ptr(),"add_track",p_id.type);
+ undo_redo->add_do_method(animation.ptr(),"track_set_path",p_id.track_idx,p_id.path);
+ if (p_id.type==Animation::TYPE_VALUE)
+ undo_redo->add_do_method(animation.ptr(),"value_track_set_update_mode",p_id.track_idx,update_mode);
+
+ } else {
+ undo_redo->create_action(TTR("Anim Insert Key"));
+ }
+
+ float time = timeline_pos;
+ Variant value;
+
+
+ switch(p_id.type) {
+
+ case Animation::TYPE_VALUE: {
+
+ value = p_id.value;
+
+
+ } break;
+ case Animation::TYPE_TRANSFORM: {
+
+
+ Transform tr = p_id.value;
+ Dictionary d;
+ d["loc"]=tr.origin;
+ d["scale"]=tr.basis.get_scale();
+ d["rot"]=Quat(tr.basis);//.orthonormalized();
+ value=d;
+ } break;
+ default:{}
+ }
+
+
+
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",p_id.track_idx,time,value);
+
+ if (created) {
+
+ //just remove the track
+ undo_redo->add_undo_method(animation.ptr(),"remove_track",p_last_track);
+ p_last_track++;
+ } else {
+
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",p_id.track_idx,time);
+ int existing = animation->track_find_key(p_id.track_idx,time,true);
+ if (existing!=-1) {
+ Variant v = animation->track_get_key_value(p_id.track_idx,existing);
+ float trans = animation->track_get_key_transition(p_id.track_idx,existing);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",p_id.track_idx,time,v,trans);
+ }
+ }
+
+ undo_redo->add_do_method(this,"update");
+ undo_redo->add_undo_method(this,"update");
+ undo_redo->add_do_method(track_editor,"update");
+ undo_redo->add_undo_method(track_editor,"update");
+ undo_redo->add_do_method(track_pos,"update");
+ undo_redo->add_undo_method(track_pos,"update");
+
+ undo_redo->commit_action();
+
+ return p_last_track;
+
+}
+
+
+
+
+Ref<Animation> AnimationKeyEditor::get_current_animation() const {
+
+ return animation;
+}
+
+void AnimationKeyEditor::_animation_len_changed(float p_len) {
+
+
+ if (updating)
+ return;
+
+ if (!animation.is_null()) {
+
+ undo_redo->create_action(TTR("Change Anim Len"));
+ undo_redo->add_do_method(animation.ptr(),"set_length",p_len);
+ undo_redo->add_undo_method(animation.ptr(),"set_length",animation->get_length());
+ undo_redo->add_do_method(this,"_animation_len_update");
+ undo_redo->add_undo_method(this,"_animation_len_update");
+ undo_redo->commit_action();
+ }
+}
+
+void AnimationKeyEditor::_animation_len_update() {
+
+ if (!animation.is_null())
+ emit_signal(alc,animation->get_length());
+}
+
+void AnimationKeyEditor::_animation_changed() {
+ if (updating)
+ return;
+ _update_menu();
+
+}
+
+void AnimationKeyEditor::_animation_loop_changed() {
+
+ if (updating)
+ return;
+
+ if (!animation.is_null()) {
+
+ undo_redo->create_action(TTR("Change Anim Loop"));
+ undo_redo->add_do_method(animation.ptr(),"set_loop",loop->is_pressed());
+ undo_redo->add_undo_method(animation.ptr(),"set_loop",!loop->is_pressed());
+ undo_redo->commit_action();
+ }
+
+}
+
+
+void AnimationKeyEditor::_create_value_item(int p_type) {
+
+ undo_redo->create_action(TTR("Anim Create Typed Value Key"));
+
+ Variant::CallError ce;
+ Variant v = Variant::construct(Variant::Type(p_type),NULL,0,ce);
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",cvi_track,cvi_pos,v);
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",cvi_track,cvi_pos);
+
+ int existing = animation->track_find_key(cvi_track,cvi_pos,true);
+
+ if (existing!=-1) {
+ Variant v = animation->track_get_key_value(cvi_track,existing);
+ float trans = animation->track_get_key_transition(cvi_track,existing);
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",cvi_track,cvi_pos,v,trans);
+ }
+
+ undo_redo->commit_action();
+
+}
+
+
+void AnimationKeyEditor::set_anim_pos(float p_pos) {
+
+ if (animation.is_null())
+ return;
+ timeline_pos=p_pos;
+ update();
+ track_pos->update();
+ track_editor->update();
+}
+
+void AnimationKeyEditor::_pane_drag(const Point2& p_delta) {
+
+ Size2 ecs = ec->get_custom_minimum_size();
+ ecs.y-=p_delta.y;
+ if (ecs.y<100)
+ ecs.y=100;
+ ec->set_custom_minimum_size(ecs);
+
+}
+
+void AnimationKeyEditor::_insert_delay() {
+
+ if (insert_query) {
+ //discard since it's entered into query mode
+ insert_queue=false;
+ return;
+ }
+
+ undo_redo->create_action(TTR("Anim Insert"));
+
+ int last_track = animation->get_track_count();
+ bool advance=false;
+ while(insert_data.size()) {
+
+ if (insert_data.front()->get().advance)
+ advance=true;
+ last_track=_confirm_insert(insert_data.front()->get(),last_track);
+ insert_data.pop_front();
+ }
+
+ undo_redo->commit_action();
+
+ if (advance) {
+ float step = animation->get_step();
+ if (step==0)
+ step=1;
+
+ float pos=timeline_pos;
+
+ pos=Math::stepify(pos+step,step);
+ if (pos>animation->get_length())
+ pos=animation->get_length();
+ timeline_pos=pos;
+ track_pos->update();
+ emit_signal("timeline_changed",pos,true);
+ }
+ insert_queue=false;
+}
+
+void AnimationKeyEditor::_step_changed(float p_len) {
+
+ updating=true;
+ if (!animation.is_null()) {
+ animation->set_step(p_len);
+ emit_signal("animation_step_changed",animation->get_step());
+ }
+ updating=false;
+}
+
+void AnimationKeyEditor::_scale() {
+
+
+ if (selection.empty())
+ return;
+
+
+ float from_t = 1e20;
+ float to_t = -1e20;
+ float len = -1e20;
+ float pivot=0;
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.front();E;E=E->next()) {
+ float t = animation->track_get_key_time(E->key().track,E->key().key);
+ if (t<from_t)
+ from_t=t;
+ if (t>to_t)
+ to_t=t;
+
+ }
+
+ len=to_t-from_t;
+ if (last_menu_track_opt==TRACK_MENU_SCALE_PIVOT) {
+ pivot = timeline_pos;
+
+ } else {
+
+ pivot=from_t;
+
+ }
+
+ float s = scale->get_value();
+ if (s==0) {
+ ERR_PRINT("Can't scale to 0");
+ }
+
+
+
+ undo_redo->create_action(TTR("Anim Scale Keys"));
+
+ List<_AnimMoveRestore> to_restore;
+
+ // 1-remove the keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key",E->key().track,E->key().key);
+ }
+ // 2- remove overlapped keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newtime = (E->get().pos-from_t)*s+from_t;
+ int idx = animation->track_find_key(E->key().track,newtime,true);
+ if (idx==-1)
+ continue;
+ SelectedKey sk;
+ sk.key=idx;
+ sk.track=E->key().track;
+ if (selection.has(sk))
+ continue; //already in selection, don't save
+
+ undo_redo->add_do_method(animation.ptr(),"track_remove_key_at_pos",E->key().track,newtime);
+ _AnimMoveRestore amr;
+
+ amr.key=animation->track_get_key_value(E->key().track,idx);
+ amr.track=E->key().track;
+ amr.time=newtime;
+ amr.transition=animation->track_get_key_transition(E->key().track,idx);
+
+ to_restore.push_back(amr);
+
+ }
+
+#define _NEW_POS(m_ofs) (((s>0)?m_ofs:from_t+(len-(m_ofs-from_t)))-pivot)*ABS(s)+from_t
+ // 3-move the keys (re insert them)
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newpos=_NEW_POS(E->get().pos);
+ undo_redo->add_do_method(animation.ptr(),"track_insert_key",E->key().track,newpos,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+
+ }
+
+ // 4-(undo) remove inserted keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float newpos=_NEW_POS(E->get().pos);
+ undo_redo->add_undo_method(animation.ptr(),"track_remove_key_at_pos",E->key().track,newpos);
+
+ }
+
+ // 5-(undo) reinsert keys
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",E->key().track,E->get().pos,animation->track_get_key_value(E->key().track,E->key().key),animation->track_get_key_transition(E->key().track,E->key().key));
+
+ }
+
+ // 6-(undo) reinsert overlapped keys
+ for(List<_AnimMoveRestore>::Element *E=to_restore.front();E;E=E->next()) {
+
+ _AnimMoveRestore &amr = E->get();
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",amr.track,amr.time,amr.key,amr.transition);
+
+ }
+
+ // 6-(undo) reinsert overlapped keys
+ for(List<_AnimMoveRestore>::Element *E=to_restore.front();E;E=E->next()) {
+
+ _AnimMoveRestore &amr = E->get();
+ undo_redo->add_undo_method(animation.ptr(),"track_insert_key",amr.track,amr.time,amr.key,amr.transition);
+
+ }
+
+ undo_redo->add_do_method(this,"_clear_selection_for_anim",animation);
+ undo_redo->add_undo_method(this,"_clear_selection_for_anim",animation);
+
+ // 7-reselect
+
+ for(Map<SelectedKey,KeyInfo>::Element *E=selection.back();E;E=E->prev()) {
+
+ float oldpos=E->get().pos;
+ float newpos=_NEW_POS(oldpos);
+ if (newpos>=0)
+ undo_redo->add_do_method(this,"_select_at_anim",animation,E->key().track,newpos);
+ undo_redo->add_undo_method(this,"_select_at_anim",animation,E->key().track,oldpos);
+
+ }
+#undef _NEW_POS
+ undo_redo->commit_action();
+
+}
+
+
+void AnimationKeyEditor::_add_call_track(const NodePath& p_base) {
+
+
+ Node* base = EditorNode::get_singleton()->get_edited_scene();
+ if (!base)
+ return;
+ Node* from=base->get_node(p_base);
+ if (!from || !root)
+ return;
+
+ NodePath path = root->get_path_to(from);
+
+ //print_line("root: "+String(root->get_path()));
+ //print_line("path: "+String(path));
+
+ undo_redo->create_action(TTR("Anim Add Call Track"));
+ undo_redo->add_do_method(animation.ptr(),"add_track",Animation::TYPE_METHOD);
+ undo_redo->add_do_method(animation.ptr(),"track_set_path",animation->get_track_count(),path);
+ undo_redo->add_undo_method(animation.ptr(),"remove_track",animation->get_track_count());
+ undo_redo->commit_action();
+
+}
+
+void AnimationKeyEditor::cleanup() {
+
+ set_animation(Ref<Animation>());
+}
+
+void AnimationKeyEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_root_removed"),&AnimationKeyEditor::_root_removed);
+ ClassDB::bind_method(D_METHOD("_scale"),&AnimationKeyEditor::_scale);
+ ClassDB::bind_method(D_METHOD("set_root"),&AnimationKeyEditor::set_root);
+
+
+ //ClassDB::bind_method(D_METHOD("_confirm_insert"),&AnimationKeyEditor::_confirm_insert);
+ ClassDB::bind_method(D_METHOD("_confirm_insert_list"),&AnimationKeyEditor::_confirm_insert_list);
+
+
+
+ ClassDB::bind_method(D_METHOD("_update_paths"),&AnimationKeyEditor::_update_paths);
+ ClassDB::bind_method(D_METHOD("_track_editor_draw"),&AnimationKeyEditor::_track_editor_draw);
+
+
+
+
+ ClassDB::bind_method(D_METHOD("_animation_changed"),&AnimationKeyEditor::_animation_changed);
+ ClassDB::bind_method(D_METHOD("_scroll_changed"),&AnimationKeyEditor::_scroll_changed);
+ ClassDB::bind_method(D_METHOD("_track_editor_gui_input"),&AnimationKeyEditor::_track_editor_gui_input);
+ ClassDB::bind_method(D_METHOD("_track_name_changed"),&AnimationKeyEditor::_track_name_changed);
+ ClassDB::bind_method(D_METHOD("_track_menu_selected"),&AnimationKeyEditor::_track_menu_selected);
+ ClassDB::bind_method(D_METHOD("_menu_add_track"),&AnimationKeyEditor::_menu_add_track);
+ ClassDB::bind_method(D_METHOD("_menu_track"),&AnimationKeyEditor::_menu_track);
+ ClassDB::bind_method(D_METHOD("_clear_selection_for_anim"),&AnimationKeyEditor::_clear_selection_for_anim);
+ ClassDB::bind_method(D_METHOD("_select_at_anim"),&AnimationKeyEditor::_select_at_anim);
+ ClassDB::bind_method(D_METHOD("_track_pos_draw"),&AnimationKeyEditor::_track_pos_draw);
+ ClassDB::bind_method(D_METHOD("_insert_delay"),&AnimationKeyEditor::_insert_delay);
+ ClassDB::bind_method(D_METHOD("_step_changed"),&AnimationKeyEditor::_step_changed);
+
+
+ ClassDB::bind_method(D_METHOD("_animation_loop_changed"),&AnimationKeyEditor::_animation_loop_changed);
+ ClassDB::bind_method(D_METHOD("_animation_len_changed"),&AnimationKeyEditor::_animation_len_changed);
+ ClassDB::bind_method(D_METHOD("_create_value_item"),&AnimationKeyEditor::_create_value_item);
+ ClassDB::bind_method(D_METHOD("_pane_drag"),&AnimationKeyEditor::_pane_drag);
+
+ ClassDB::bind_method(D_METHOD("_animation_len_update"),&AnimationKeyEditor::_animation_len_update);
+
+ ClassDB::bind_method(D_METHOD("set_animation"),&AnimationKeyEditor::set_animation);
+ ClassDB::bind_method(D_METHOD("_animation_optimize"),&AnimationKeyEditor::_animation_optimize);
+ ClassDB::bind_method(D_METHOD("_curve_transition_changed"),&AnimationKeyEditor::_curve_transition_changed);
+ ClassDB::bind_method(D_METHOD("_toggle_edit_curves"),&AnimationKeyEditor::_toggle_edit_curves);
+ ClassDB::bind_method(D_METHOD("_add_call_track"),&AnimationKeyEditor::_add_call_track);
+
+
+ ADD_SIGNAL( MethodInfo("resource_selected", PropertyInfo( Variant::OBJECT, "res"),PropertyInfo( Variant::STRING, "prop") ) );
+ ADD_SIGNAL( MethodInfo("keying_changed" ) );
+ ADD_SIGNAL( MethodInfo("timeline_changed", PropertyInfo(Variant::REAL,"pos"), PropertyInfo(Variant::BOOL,"drag") ) );
+ ADD_SIGNAL( MethodInfo("animation_len_changed", PropertyInfo(Variant::REAL,"len") ) );
+ ADD_SIGNAL( MethodInfo("animation_step_changed", PropertyInfo(Variant::REAL,"step") ) );
+ ADD_SIGNAL( MethodInfo("key_edited", PropertyInfo(Variant::INT,"track"), PropertyInfo(Variant::INT,"key") ) );
+
+}
+
+
+AnimationKeyEditor::AnimationKeyEditor() {
+
+ alc="animation_len_changed";
+ editor_selection=EditorNode::get_singleton()->get_editor_selection();
+
+ selected_track=-1;
+ updating=false;
+ te_drawing=false;
+ undo_redo=EditorNode::get_singleton()->get_undo_redo();
+ history=EditorNode::get_singleton()->get_editor_history();
+
+ ec = memnew (Control);
+ ec->set_custom_minimum_size(Size2(0,150));
+ add_child(ec);
+ ec->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ h_scroll = memnew( HScrollBar );
+ h_scroll->connect("value_changed",this,"_scroll_changed");
+ add_child(h_scroll);
+ h_scroll->set_value(0);
+
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+
+
+ root=NULL;
+ //menu = memnew( MenuButton );
+ //menu->set_flat(true);
+ //menu->set_pos(Point2());
+ //add_child(menu);
+
+ zoomicon = memnew( TextureRect );
+ hb->add_child(zoomicon);
+ zoomicon->set_tooltip(TTR("Animation zoom."));
+
+ zoom = memnew( HSlider );
+ //hb->add_child(zoom);
+ zoom->set_step(0.01);
+ zoom->set_min(0.0);
+ zoom->set_max(2.0);
+ zoom->set_value(1.0);
+ zoom->set_h_size_flags(SIZE_EXPAND_FILL);
+ zoom->set_stretch_ratio(2);
+ hb->add_child(zoom);
+ zoom->connect("value_changed",this,"_scroll_changed");
+ zoom->set_tooltip(TTR("Animation zoom."));
+
+ hb->add_child( memnew( VSeparator ) );
+
+ Label *l = memnew( Label );
+ l->set_text(TTR("Length (s):"));
+ hb->add_child(l);
+
+ length = memnew( SpinBox );
+ length->set_min(0.01);
+ length->set_max(10000);
+ length->set_step(0.01);
+ length->set_h_size_flags(SIZE_EXPAND_FILL);
+ length->set_stretch_ratio(1);
+ length->set_tooltip(TTR("Animation length (in seconds)."));
+
+ hb->add_child(length);
+ length->connect("value_changed",this,"_animation_len_changed");
+
+ l = memnew( Label );
+ l->set_text(TTR("Step (s):"));
+ hb->add_child(l);
+
+ step = memnew( SpinBox );
+ step->set_min(0.00);
+ step->set_max(128);
+ step->set_step(0.01);
+ step->set_value(0.0);
+ step->set_h_size_flags(SIZE_EXPAND_FILL);
+ step->set_stretch_ratio(1);
+ step->set_tooltip(TTR("Cursor step snap (in seconds)."));
+
+ hb->add_child(step);
+ step->connect("value_changed",this,"_step_changed");
+
+ loop = memnew( ToolButton );
+ loop->set_toggle_mode(true);
+ loop->connect("pressed",this,"_animation_loop_changed");
+ hb->add_child(loop);
+ loop->set_tooltip(TTR("Enable/Disable looping in animation."));
+
+ hb->add_child( memnew( VSeparator ) );
+
+ menu_add_track = memnew( MenuButton );
+ hb->add_child(menu_add_track);
+ menu_add_track->get_popup()->connect("id_pressed",this,"_menu_add_track");
+ menu_add_track->set_tooltip(TTR("Add new tracks."));
+
+ move_up_button = memnew( ToolButton );
+ hb->add_child(move_up_button);
+ move_up_button->connect("pressed",this,"_menu_track",make_binds(TRACK_MENU_MOVE_UP));
+ move_up_button->set_focus_mode(FOCUS_NONE);
+ move_up_button->set_disabled(true);
+ move_up_button->set_tooltip(TTR("Move current track up."));
+
+ move_down_button = memnew( ToolButton );
+ hb->add_child(move_down_button);
+ move_down_button->connect("pressed",this,"_menu_track",make_binds(TRACK_MENU_MOVE_DOWN));
+ move_down_button->set_focus_mode(FOCUS_NONE);
+ move_down_button->set_disabled(true);
+ move_down_button->set_tooltip(TTR("Move current track down."));
+
+ remove_button = memnew( ToolButton );
+ hb->add_child(remove_button);
+ remove_button->connect("pressed",this,"_menu_track",make_binds(TRACK_MENU_REMOVE));
+ remove_button->set_focus_mode(FOCUS_NONE);
+ remove_button->set_disabled(true);
+ remove_button->set_tooltip(TTR("Remove selected track."));
+
+ hb->add_child(memnew( VSeparator ));
+
+ menu_track = memnew( MenuButton );
+ hb->add_child(menu_track);
+ menu_track->get_popup()->connect("id_pressed",this,"_menu_track");
+ menu_track->set_tooltip(TTR("Track tools"));
+
+ edit_button = memnew( ToolButton );
+ edit_button->set_toggle_mode(true);
+ edit_button->set_focus_mode(FOCUS_NONE);
+ edit_button->set_disabled(true);
+
+ hb->add_child(edit_button);
+ edit_button->set_tooltip(TTR("Enable editing of individual keys by clicking them."));
+
+ optimize_dialog = memnew( ConfirmationDialog );
+ add_child(optimize_dialog);
+ optimize_dialog->set_title(TTR("Anim. Optimizer"));
+ VBoxContainer *optimize_vb = memnew( VBoxContainer );
+ optimize_dialog->add_child(optimize_vb);
+
+ optimize_linear_error = memnew( SpinBox );
+ optimize_linear_error->set_max(1.0);
+ optimize_linear_error->set_min(0.001);
+ optimize_linear_error->set_step(0.001);
+ optimize_linear_error->set_value(0.05);
+ optimize_vb->add_margin_child(TTR("Max. Linear Error:"),optimize_linear_error);
+ optimize_angular_error = memnew( SpinBox );
+ optimize_angular_error->set_max(1.0);
+ optimize_angular_error->set_min(0.001);
+ optimize_angular_error->set_step(0.001);
+ optimize_angular_error->set_value(0.01);
+
+ optimize_vb->add_margin_child(TTR("Max. Angular Error:"),optimize_angular_error);
+ optimize_max_angle = memnew( SpinBox );
+ optimize_vb->add_margin_child(TTR("Max Optimizable Angle:"),optimize_max_angle);
+ optimize_max_angle->set_max(360.0);
+ optimize_max_angle->set_min(0.0);
+ optimize_max_angle->set_step(0.1);
+ optimize_max_angle->set_value(22);
+
+ optimize_dialog->get_ok()->set_text(TTR("Optimize"));
+
+
+
+ /*keying = memnew( Button );
+ keying->set_toggle_mode(true);
+ //keying->set_text("Keys");
+ keying->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,60);
+ keying->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,10);
+ keying->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,55);
+ keying->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,10);
+ //add_child(keying);
+ keying->connect("pressed",this,"_keying_toggled");
+ */
+
+/* l = memnew( Label );
+ l->set_text("Base: ");
+ l->set_pos(Point2(0,3));
+ //dr_panel->add_child(l);*/
+
+ //menu->get_popup()->connect("id_pressed",this,"_menu_callback");
+
+
+ hb = memnew( HBoxContainer);
+ hb->set_area_as_parent_rect();
+ ec->add_child(hb);
+ hb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ track_editor = memnew( Control );
+ track_editor->connect("draw",this,"_track_editor_draw");
+ hb->add_child(track_editor);
+ track_editor->connect("gui_input",this,"_track_editor_gui_input");
+ track_editor->set_focus_mode(Control::FOCUS_ALL);
+ track_editor->set_h_size_flags(SIZE_EXPAND_FILL);
+
+
+
+ track_pos = memnew( Control );
+ track_pos->set_area_as_parent_rect();
+ track_pos->set_mouse_filter(MOUSE_FILTER_IGNORE);
+ track_editor->add_child(track_pos);
+ track_pos->connect("draw",this,"_track_pos_draw");
+
+ select_anim_warning = memnew( Label );
+ track_editor->add_child(select_anim_warning);
+ select_anim_warning->set_area_as_parent_rect();
+ select_anim_warning->set_text(TTR("Select an AnimationPlayer from the Scene Tree to edit animations."));
+ select_anim_warning->set_autowrap(true);
+ select_anim_warning->set_align(Label::ALIGN_CENTER);
+ select_anim_warning->set_valign(Label::VALIGN_CENTER);
+
+
+
+ v_scroll = memnew( VScrollBar );
+ hb->add_child(v_scroll);
+ v_scroll->connect("value_changed",this,"_scroll_changed");
+ v_scroll->set_value(0);
+
+ key_editor_tab = memnew(TabContainer);
+ hb->add_child(key_editor_tab);
+ key_editor_tab->set_custom_minimum_size(Size2(200,0));
+
+ key_editor = memnew( PropertyEditor );
+ key_editor->set_area_as_parent_rect();
+ key_editor->hide_top_label();
+ key_editor->set_name(TTR("Key"));
+ key_editor_tab->add_child(key_editor);
+
+ key_edit = memnew( AnimationKeyEdit );
+ key_edit->undo_redo=undo_redo;
+ //key_edit->ke_dialog=key_edit_dialog;
+
+ type_menu = memnew( PopupMenu );
+ add_child(type_menu);
+ for(int i=0;i<Variant::VARIANT_MAX;i++)
+ type_menu->add_item(Variant::get_type_name(Variant::Type(i)),i);
+ type_menu->connect("id_pressed",this,"_create_value_item");
+
+ VBoxContainer *curve_vb = memnew( VBoxContainer );
+ curve_vb->set_name(TTR("Transition"));
+ HBoxContainer *curve_hb = memnew( HBoxContainer );
+ curve_vb->add_child(curve_hb);
+
+ curve_linear = memnew( ToolButton );
+ curve_linear->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_linear);
+ curve_in = memnew( ToolButton );
+ curve_in->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_in);
+ curve_out = memnew( ToolButton );
+ curve_out->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_out);
+ curve_inout = memnew( ToolButton );
+ curve_inout->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_inout);
+ curve_outin = memnew( ToolButton );
+ curve_outin->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_outin);
+ curve_constant = memnew( ToolButton );
+ curve_constant->set_focus_mode(FOCUS_NONE);
+ curve_hb->add_child(curve_constant);
+
+
+ curve_edit = memnew( AnimationCurveEdit );
+ curve_vb->add_child(curve_edit);
+ curve_edit->set_v_size_flags(SIZE_EXPAND_FILL);
+ key_editor_tab->add_child(curve_vb);
+
+ track_name = memnew( LineEdit );
+ track_name->set_as_toplevel(true);
+ track_name->hide();
+ add_child(track_name);
+ track_name->connect("text_entered",this,"_track_name_changed");
+ track_menu = memnew( PopupMenu );
+ add_child(track_menu);
+ track_menu->connect("id_pressed",this,"_track_menu_selected");
+
+ key_editor_tab->hide();
+
+ last_idx =1;
+
+ _update_menu();
+
+
+
+ insert_confirm = memnew( ConfirmationDialog );
+ add_child(insert_confirm);
+ insert_confirm->connect("confirmed",this,"_confirm_insert_list");
+
+ click.click=ClickOver::CLICK_NONE;
+
+
+ name_column_ratio=0.3;
+ timeline_pos=0;
+
+
+ keying=false;
+ insert_frame=0;
+ insert_query=false;
+ insert_queue=false;
+
+ editor_selection->connect("selection_changed",track_editor,"update");
+
+
+ scale_dialog = memnew( ConfirmationDialog );
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ scale_dialog->add_child(vbc);
+
+ scale = memnew( SpinBox );
+ scale->set_min(-99999);
+ scale->set_max(99999);
+ scale->set_step(0.001);
+ vbc->add_margin_child(TTR("Scale Ratio:"),scale);
+ scale_dialog->connect("confirmed",this,"_scale");
+ add_child(scale_dialog);
+
+ call_select = memnew( SceneTreeDialog );
+ add_child(call_select);
+ call_select->set_title(TTR("Call Functions in Which Node?"));
+
+ cleanup_dialog = memnew( ConfirmationDialog );
+ add_child(cleanup_dialog);
+ VBoxContainer *cleanup_vb = memnew( VBoxContainer );
+ cleanup_dialog->add_child(cleanup_vb);
+
+ cleanup_keys = memnew( CheckButton );
+ cleanup_keys->set_text(TTR("Remove invalid keys"));
+ cleanup_keys->set_pressed(true);
+ cleanup_vb->add_child(cleanup_keys);
+
+ cleanup_tracks = memnew( CheckButton );
+ cleanup_tracks->set_text(TTR("Remove unresolved and empty tracks"));
+ cleanup_tracks->set_pressed(true);
+ cleanup_vb->add_child(cleanup_tracks);
+
+ cleanup_all = memnew( CheckButton );
+ cleanup_all->set_text(TTR("Clean-up all animations"));
+ cleanup_vb->add_child(cleanup_all);
+
+ cleanup_dialog->set_title(TTR("Clean-Up Animation(s) (NO UNDO!)"));
+ cleanup_dialog->get_ok()->set_text(TTR("Clean-Up"));
+
+ cleanup_dialog->connect("confirmed",this,"_menu_track",varray(TRACK_MENU_CLEAN_UP_CONFIRM));
+
+ add_constant_override("separation",get_constant("separation","VBoxContainer"));
+
+ track_editor->set_clip_contents(true);
+
+}
+
+AnimationKeyEditor::~AnimationKeyEditor() {
+
+
+
+ memdelete( key_edit );
+
+}
diff --git a/editor/animation_editor.h b/editor/animation_editor.h
new file mode 100644
index 0000000000..c4539cd763
--- /dev/null
+++ b/editor/animation_editor.h
@@ -0,0 +1,355 @@
+/*************************************************************************/
+/* animation_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ANIMATION_EDITOR_H
+#define ANIMATION_EDITOR_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/slider.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/spin_box.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/scroll_bar.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/tab_container.h"
+
+#include "scene/resources/animation.h"
+#include "scene/animation/animation_cache.h"
+#include "scene_tree_editor.h"
+#include "editor_data.h"
+#include "property_editor.h"
+#include "scene_tree_editor.h"
+
+class AnimationKeyEdit;
+class AnimationCurveEdit;
+
+class AnimationKeyEditor : public VBoxContainer {
+
+ GDCLASS( AnimationKeyEditor, VBoxContainer );
+
+/*
+ enum {
+
+ MENU_NEW_ANIMATION,
+ MENU_OPEN_ANIMATION,
+ MENU_EDIT_ANIMATION,
+ MENU_CLOSE_ANIMATION,
+ MENU_KEYING_ACTIVE,
+ MENU_SET_ROOT_NODE,
+ MENU_SYNC_TO_PLAYER,
+ MENU_ANIM_BASE=100,
+ };
+
+*/
+
+ enum {
+
+ ADD_TRACK_MENU_ADD_VALUE_TRACK,
+ ADD_TRACK_MENU_ADD_TRANSFORM_TRACK,
+ ADD_TRACK_MENU_ADD_CALL_TRACK,
+ TRACK_MENU_SCALE,
+ TRACK_MENU_SCALE_PIVOT,
+ TRACK_MENU_MOVE_UP,
+ TRACK_MENU_MOVE_DOWN,
+ TRACK_MENU_REMOVE,
+ TRACK_MENU_DUPLICATE,
+ TRACK_MENU_DUPLICATE_TRANSPOSE,
+ TRACK_MENU_SET_ALL_TRANS_LINEAR,
+ TRACK_MENU_SET_ALL_TRANS_CONSTANT,
+ TRACK_MENU_SET_ALL_TRANS_OUT,
+ TRACK_MENU_SET_ALL_TRANS_IN,
+ TRACK_MENU_SET_ALL_TRANS_INOUT,
+ TRACK_MENU_SET_ALL_TRANS_OUTIN,
+ TRACK_MENU_NEXT_STEP,
+ TRACK_MENU_PREV_STEP,
+ TRACK_MENU_OPTIMIZE,
+ TRACK_MENU_CLEAN_UP,
+ TRACK_MENU_CLEAN_UP_CONFIRM,
+ CURVE_SET_LINEAR,
+ CURVE_SET_IN,
+ CURVE_SET_OUT,
+ CURVE_SET_INOUT,
+ CURVE_SET_OUTIN,
+ CURVE_SET_CONSTANT
+ };
+
+ enum {
+ RIGHT_MENU_DUPLICATE,
+ RIGHT_MENU_DUPLICATE_TRANSPOSE,
+ RIGHT_MENU_REMOVE
+ };
+
+ struct MouseOver {
+
+ enum Over {
+ OVER_NONE,
+ OVER_NAME,
+ OVER_KEY,
+ OVER_VALUE,
+ OVER_INTERP,
+ OVER_WRAP,
+ OVER_UP,
+ OVER_DOWN,
+ OVER_REMOVE,
+ OVER_ADD_KEY,
+ };
+
+ Over over;
+ int track;
+ int over_key;
+
+ } mouse_over;
+
+ struct SelectedKey {
+
+ int track;
+ int key;
+ bool operator<(const SelectedKey& p_key) const { return track==p_key.track ? key < p_key.key : track < p_key.track; };
+ };
+
+ struct KeyInfo {
+
+ float pos;
+ };
+
+ Map<SelectedKey,KeyInfo> selection;
+
+ struct ClickOver {
+
+ enum Click {
+
+ CLICK_NONE,
+ CLICK_RESIZE_NAMES,
+ CLICK_DRAG_TIMELINE,
+ CLICK_MOVE_KEYS,
+ CLICK_SELECT_KEYS
+
+ };
+
+ SelectedKey selk;
+ bool shift;
+ Click click;
+ Point2 at;
+ Point2 to;
+ } click;
+
+
+ float timeline_pos;
+
+ float name_column_ratio;
+
+ int track_name_editing;
+ int interp_editing;
+ int cont_editing;
+ int wrap_editing;
+ int selected_track;
+ int track_ofs[5];
+
+ int last_menu_track_opt;
+ LineEdit *track_name;
+ PopupMenu *track_menu;
+ PopupMenu *type_menu;
+
+ Control *ec;
+ TextureRect *zoomicon;
+ HSlider *zoom;
+ //MenuButton *menu;
+ SpinBox *length;
+ Button *loop;
+ bool keying;
+ ToolButton *edit_button;
+ ToolButton *move_up_button;
+ ToolButton *move_down_button;
+ ToolButton *remove_button;
+
+ ToolButton *curve_linear;
+ ToolButton *curve_in;
+ ToolButton *curve_out;
+ ToolButton *curve_inout;
+ ToolButton *curve_outin;
+ ToolButton *curve_constant;
+
+
+ ConfirmationDialog *optimize_dialog;
+ SpinBox *optimize_linear_error;
+ SpinBox *optimize_angular_error;
+ SpinBox *optimize_max_angle;
+
+ ConfirmationDialog *cleanup_dialog;
+ CheckButton *cleanup_keys;
+ CheckButton *cleanup_tracks;
+ CheckButton *cleanup_all;
+
+ SpinBox *step;
+
+ MenuButton *menu_add_track;
+ MenuButton *menu_track;
+
+ HScrollBar *h_scroll;
+ VScrollBar *v_scroll;
+
+ Control *track_editor;
+ Control *track_pos;
+ TabContainer *key_editor_tab;
+
+ ConfirmationDialog *scale_dialog;
+ SpinBox *scale;
+
+ PropertyEditor *key_editor;
+
+ SceneTreeDialog *call_select;
+
+ Ref<Animation> animation;
+ void _update_paths();
+
+ int last_idx;
+
+ Node *root;
+
+ UndoRedo *undo_redo;
+ EditorHistory* history;
+ ConfirmationDialog *insert_confirm;
+
+
+ AnimationKeyEdit *key_edit;
+ AnimationCurveEdit *curve_edit;
+
+ bool inserting;
+
+ bool updating;
+ bool te_drawing;
+
+ void _animation_len_changed(float p_len);
+ void _animation_loop_changed();
+ void _step_changed(float p_len);
+
+ struct InsertData {
+
+ Animation::TrackType type;
+ NodePath path;
+ int track_idx;
+ Variant value;
+ String query;
+ bool advance;
+ };/* insert_data;*/
+
+ bool insert_query;
+ List<InsertData> insert_data;
+ uint64_t insert_frame;
+
+ int cvi_track;
+ float cvi_pos;
+
+
+ int right_data_size_cache;
+
+ EditorSelection *editor_selection;
+
+ Label *select_anim_warning;
+
+
+ float _get_zoom_scale() const;
+
+ void _track_editor_draw();
+ void _track_editor_gui_input(const InputEvent& p_input);
+ void _track_pos_draw();
+
+
+ void _track_name_changed(const String& p_name);
+ void _track_menu_selected(int p_idx);
+ void _confirm_insert_list();
+ int _confirm_insert(InsertData p_id,int p_at_track=-1);
+ void _query_insert(const InsertData& p_id);
+ void _update_menu();
+ bool insert_queue;
+ void _insert_delay();
+ void _scale();
+
+
+ void _clear_selection();
+
+ //void _browse_path();
+
+
+ StringName alc;
+
+ void _animation_changed();
+ void _animation_optimize();
+ void _cleanup_animation(Ref<Animation> p_animation);
+
+ void _scroll_changed(double);
+
+ void _menu_add_track(int p_type);
+ void _menu_track(int p_type);
+
+ void _clear_selection_for_anim(const Ref<Animation>& p_anim);
+ void _select_at_anim(const Ref<Animation>& p_anim,int p_track,float p_pos);
+ void _curve_transition_changed(float p_what);
+
+ PropertyInfo _find_hint_for_track(int p_idx, NodePath &r_base_path);
+
+ void _create_value_item(int p_type);
+ void _pane_drag(const Point2& p_delta);
+ bool _edit_if_single_selection();
+
+ void _toggle_edit_curves();
+ void _animation_len_update();
+
+ void _add_call_track(const NodePath& p_base);
+
+ void _anim_duplicate_keys(bool transpose = false);
+ void _anim_delete_keys();
+
+ void _root_removed();
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_animation(const Ref<Animation>& p_anim);
+ Ref<Animation> get_current_animation() const;
+ void set_root(Node *p_root);
+ Node *get_root() const;
+ void update_keying();
+ bool has_keying() const;
+
+ void cleanup();
+
+ void set_anim_pos(float p_pos);
+ void insert_node_value_key(Node* p_node, const String& p_property,const Variant& p_value,bool p_only_if_exists=false);
+ void insert_value_key(const String& p_property, const Variant& p_value, bool p_advance);
+ void insert_transform_key(Spatial *p_node,const String& p_sub,const Transform& p_xform);
+
+ void show_select_node_warning(bool p_show) { select_anim_warning->set_visible(p_show); }
+ AnimationKeyEditor();
+ ~AnimationKeyEditor();
+};
+
+#endif // ANIMATION_EDITOR_H
diff --git a/editor/array_property_edit.cpp b/editor/array_property_edit.cpp
new file mode 100644
index 0000000000..7304d8dddf
--- /dev/null
+++ b/editor/array_property_edit.cpp
@@ -0,0 +1,310 @@
+/*************************************************************************/
+/* array_property_edit.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "array_property_edit.h"
+
+#include "editor_node.h"
+
+#define ITEMS_PER_PAGE 100
+
+Variant ArrayPropertyEdit::get_array() const{
+
+ Object*o = ObjectDB::get_instance(obj);
+ if (!o)
+ return Array();
+ Variant arr=o->get(property);
+ if (!arr.is_array()) {
+ Variant::CallError ce;
+ arr=Variant::construct(default_type,NULL,0,ce);
+ }
+ return arr;
+}
+
+void ArrayPropertyEdit::_notif_change() {
+ _change_notify();
+}
+void ArrayPropertyEdit::_notif_changev(const String& p_v) {
+
+ _change_notify(p_v.utf8().get_data());
+}
+
+void ArrayPropertyEdit::_set_size(int p_size) {
+
+ Variant arr = get_array();
+ arr.call("resize",p_size);
+ Object*o = ObjectDB::get_instance(obj);
+ if (!o)
+ return;
+
+ o->set(property,arr);
+
+}
+
+void ArrayPropertyEdit::_set_value(int p_idx,const Variant& p_value) {
+
+ Variant arr = get_array();
+ arr.set(p_idx,p_value);
+ Object*o = ObjectDB::get_instance(obj);
+ if (!o)
+ return;
+
+ o->set(property,arr);
+}
+
+bool ArrayPropertyEdit::_set(const StringName& p_name, const Variant& p_value){
+
+ String pn=p_name;
+
+ if (pn.begins_with("array/")) {
+
+ if (pn=="array/size") {
+
+ Variant arr = get_array();
+ int size = arr.call("size");
+
+ int newsize=p_value;
+ if (newsize==size)
+ return true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Resize Array"));
+ ur->add_do_method(this,"_set_size",newsize);
+ ur->add_undo_method(this,"_set_size",size);
+ if (newsize<size) {
+ for(int i=newsize;i<size;i++) {
+ ur->add_undo_method(this,"_set_value",i,arr.get(i));
+
+ }
+ } else if (newsize>size) {
+
+ Variant init;
+ Variant::CallError ce;
+ Variant::Type new_type = subtype;
+ if(new_type==Variant::NIL && size) {
+ new_type = arr.get(size-1).get_type();
+ }
+ if(new_type!=Variant::NIL) {
+ init = Variant::construct(new_type,NULL,0,ce);
+ for(int i=size;i<newsize;i++) {
+ ur->add_do_method(this,"_set_value",i,init);
+ }
+ }
+
+ }
+ ur->add_do_method(this,"_notif_change");
+ ur->add_undo_method(this,"_notif_change");
+ ur->commit_action();
+ return true;
+ }
+ if (pn=="array/page") {
+ page=p_value;
+ _change_notify();
+ return true;
+ }
+
+ } else if (pn.begins_with("indices")) {
+
+ if (pn.find("_")!=-1) {
+ //type
+ int idx=pn.get_slicec('/',1).get_slicec('_',0).to_int();
+
+ int type = p_value;
+
+ Variant arr = get_array();
+
+ Variant value = arr.get(idx);
+ if (value.get_type()!=type && type>=0 && type<Variant::VARIANT_MAX) {
+ Variant::CallError ce;
+ Variant new_value=Variant::construct(Variant::Type(type),NULL,0,ce);
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Change Array Value Type"));
+ ur->add_do_method(this,"_set_value",idx,new_value);
+ ur->add_undo_method(this,"_set_value",idx,value);
+ ur->add_do_method(this,"_notif_change");
+ ur->add_undo_method(this,"_notif_change");
+ ur->commit_action();
+
+ }
+ return true;
+
+ } else {
+ int idx=pn.get_slicec('/',1).to_int();
+ Variant arr = get_array();
+
+ Variant value = arr.get(idx);
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Change Array Value"));
+ ur->add_do_method(this,"_set_value",idx,p_value);
+ ur->add_undo_method(this,"_set_value",idx,value);
+ ur->add_do_method(this,"_notif_changev",p_name);
+ ur->add_undo_method(this,"_notif_changev",p_name);
+ ur->commit_action();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool ArrayPropertyEdit::_get(const StringName& p_name,Variant &r_ret) const {
+
+ Variant arr = get_array();
+ //int size = arr.call("size");
+
+ String pn=p_name;
+ if (pn.begins_with("array/")) {
+
+ if (pn=="array/size") {
+ r_ret=arr.call("size");
+ return true;
+ }
+ if (pn=="array/page") {
+ r_ret=page;
+ return true;
+ }
+ } else if (pn.begins_with("indices")) {
+
+ if (pn.find("_")!=-1) {
+ //type
+ int idx=pn.get_slicec('/',1).get_slicec('_',0).to_int();
+ bool valid;
+ r_ret=arr.get(idx,&valid);
+ if (valid)
+ r_ret=r_ret.get_type();
+ return valid;
+
+ } else {
+ int idx=pn.get_slicec('/',1).to_int();
+ bool valid;
+ r_ret=arr.get(idx,&valid);
+ return valid;
+ }
+ }
+
+ return false;
+}
+
+void ArrayPropertyEdit::_get_property_list( List<PropertyInfo> *p_list) const{
+
+ Variant arr = get_array();
+ int size = arr.call("size");
+
+ p_list->push_back( PropertyInfo(Variant::INT,"array/size",PROPERTY_HINT_RANGE,"0,100000,1") );
+ int pages = size/ITEMS_PER_PAGE;
+ if (pages>0)
+ p_list->push_back( PropertyInfo(Variant::INT,"array/page",PROPERTY_HINT_RANGE,"0,"+itos(pages)+",1") );
+
+ int offset=page*ITEMS_PER_PAGE;
+
+ int items=MIN(size-offset,ITEMS_PER_PAGE);
+
+
+ for(int i=0;i<items;i++) {
+
+ Variant v=arr.get(i+offset);
+ bool is_typed = arr.get_type()!=Variant::ARRAY || subtype!=Variant::NIL;
+
+ if (!is_typed) {
+ p_list->push_back(PropertyInfo(Variant::INT,"indices/"+itos(i+offset)+"_type",PROPERTY_HINT_ENUM,vtypes));
+ }
+
+ if (is_typed || v.get_type()!=Variant::NIL ) {
+ PropertyInfo pi(v.get_type(),"indices/"+itos(i+offset));
+ if(subtype!=Variant::NIL) {
+ pi.type = Variant::Type(subtype);
+ pi.hint = PropertyHint(subtype_hint);
+ pi.hint_string = subtype_hint_string;
+ } else if (v.get_type()==Variant::OBJECT) {
+ pi.hint=PROPERTY_HINT_RESOURCE_TYPE;
+ pi.hint_string="Resource";
+ }
+
+ p_list->push_back(pi);
+ }
+ }
+
+}
+
+void ArrayPropertyEdit::edit(Object* p_obj,const StringName& p_prop,const String& p_hint_string,Variant::Type p_deftype) {
+
+ page=0;
+ property=p_prop;
+ obj=p_obj->get_instance_ID();
+ default_type=p_deftype;
+
+ if(!p_hint_string.empty()) {
+ int hint_subtype_seperator = p_hint_string.find(":");
+ if(hint_subtype_seperator >= 0) {
+ String subtype_string = p_hint_string.substr(0,hint_subtype_seperator);
+
+ int slash_pos = subtype_string.find("/");
+ if(slash_pos >= 0) {
+ subtype_hint = PropertyHint(subtype_string.substr(slash_pos+1, subtype_string.size()-slash_pos-1).to_int());
+ subtype_string = subtype_string.substr(0,slash_pos);
+ }
+
+ subtype_hint_string = p_hint_string.substr(hint_subtype_seperator+1, p_hint_string.size() - hint_subtype_seperator-1);
+ subtype=Variant::Type(subtype_string.to_int());
+ }
+ }
+
+}
+
+Node *ArrayPropertyEdit::get_node() {
+
+ Object *o = ObjectDB::get_instance(obj);
+ if (!o)
+ return NULL;
+
+ return o->cast_to<Node>();
+}
+
+void ArrayPropertyEdit::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_set_size"),&ArrayPropertyEdit::_set_size);
+ ClassDB::bind_method(D_METHOD("_set_value"),&ArrayPropertyEdit::_set_value);
+ ClassDB::bind_method(D_METHOD("_notif_change"),&ArrayPropertyEdit::_notif_change);
+ ClassDB::bind_method(D_METHOD("_notif_changev"),&ArrayPropertyEdit::_notif_changev);
+}
+
+ArrayPropertyEdit::ArrayPropertyEdit()
+{
+ page=0;
+ for(int i=0;i<Variant::VARIANT_MAX;i++) {
+
+ if (i>0)
+ vtypes+=",";
+ vtypes+=Variant::get_type_name( Variant::Type(i) );
+ }
+ default_type=Variant::NIL;
+ subtype=Variant::NIL;
+ subtype_hint=PROPERTY_HINT_NONE;
+ subtype_hint_string="";
+}
diff --git a/editor/array_property_edit.h b/editor/array_property_edit.h
new file mode 100644
index 0000000000..6ca700bf80
--- /dev/null
+++ b/editor/array_property_edit.h
@@ -0,0 +1,69 @@
+/*************************************************************************/
+/* array_property_edit.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ARRAY_PROPERTY_EDIT_H
+#define ARRAY_PROPERTY_EDIT_H
+
+#include "scene/main/node.h"
+
+class ArrayPropertyEdit : public Reference {
+
+ GDCLASS(ArrayPropertyEdit,Reference);
+
+ int page;
+ ObjectID obj;
+ StringName property;
+ String vtypes;
+ String subtype_hint_string;
+ PropertyHint subtype_hint;
+ Variant::Type subtype;
+ Variant get_array() const;
+ Variant::Type default_type;
+
+ void _notif_change();
+ void _notif_changev(const String& p_v);
+ void _set_size(int p_size);
+ void _set_value(int p_idx,const Variant& p_value);
+
+protected:
+
+ static void _bind_methods();
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list( List<PropertyInfo> *p_list) const;
+
+public:
+
+ void edit(Object* p_obj, const StringName& p_prop, const String& p_hint_string, Variant::Type p_deftype);
+
+ Node *get_node();
+
+ ArrayPropertyEdit();
+};
+
+#endif // ARRAY_PROPERTY_EDIT_H
diff --git a/editor/asset_library_editor_plugin.cpp b/editor/asset_library_editor_plugin.cpp
new file mode 100644
index 0000000000..1c1b6c91e3
--- /dev/null
+++ b/editor/asset_library_editor_plugin.cpp
@@ -0,0 +1,1553 @@
+/*************************************************************************/
+/* asset_library_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "asset_library_editor_plugin.h"
+
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "io/json.h"
+
+
+void EditorAssetLibraryItem::configure(const String& p_title,int p_asset_id,const String& p_category,int p_category_id,const String& p_author,int p_author_id,int p_rating,const String& p_cost) {
+
+ title->set_text(p_title);
+ asset_id=p_asset_id;
+ category->set_text(p_category);
+ category_id=p_category_id;
+ author->set_text(p_author);
+ author_id=p_author_id;
+ price->set_text(p_cost);
+
+ for(int i=0;i<5;i++) {
+ if (i<p_rating)
+ stars[i]->set_texture(get_icon("RatingStar","EditorIcons"));
+ else
+ stars[i]->set_texture(get_icon("RatingNoStar","EditorIcons"));
+ }
+
+
+}
+
+void EditorAssetLibraryItem::set_image(int p_type,int p_index,const Ref<Texture>& p_image) {
+
+ ERR_FAIL_COND(p_type!=EditorAssetLibrary::IMAGE_QUEUE_ICON);
+ ERR_FAIL_COND(p_index!=0);
+
+ icon->set_normal_texture(p_image);
+}
+
+void EditorAssetLibraryItem::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ icon->set_normal_texture(get_icon("GodotAssetDefault","EditorIcons"));
+ category->add_color_override("font_color", Color(0.5,0.5,0.5) );
+ author->add_color_override("font_color", Color(0.5,0.5,0.5) );
+
+ }
+}
+
+void EditorAssetLibraryItem::_asset_clicked() {
+
+ emit_signal("asset_selected",asset_id);
+}
+
+void EditorAssetLibraryItem::_category_clicked(){
+
+ emit_signal("category_selected",category_id);
+}
+void EditorAssetLibraryItem::_author_clicked(){
+
+ emit_signal("author_selected",author_id);
+
+}
+
+void EditorAssetLibraryItem::_bind_methods() {
+
+ ClassDB::bind_method("set_image",&EditorAssetLibraryItem::set_image);
+ ClassDB::bind_method("_asset_clicked",&EditorAssetLibraryItem::_asset_clicked);
+ ClassDB::bind_method("_category_clicked",&EditorAssetLibraryItem::_category_clicked);
+ ClassDB::bind_method("_author_clicked",&EditorAssetLibraryItem::_author_clicked);
+ ADD_SIGNAL( MethodInfo("asset_selected"));
+ ADD_SIGNAL( MethodInfo("category_selected"));
+ ADD_SIGNAL( MethodInfo("author_selected"));
+
+
+}
+
+EditorAssetLibraryItem::EditorAssetLibraryItem() {
+
+ Ref<StyleBoxEmpty> border;
+ border.instance();
+ /*border->set_default_margin(MARGIN_LEFT,5);
+ border->set_default_margin(MARGIN_RIGHT,5);
+ border->set_default_margin(MARGIN_BOTTOM,5);
+ border->set_default_margin(MARGIN_TOP,5);*/
+ add_style_override("panel",border);
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+
+ icon = memnew( TextureButton );
+ icon->set_default_cursor_shape(CURSOR_POINTING_HAND);
+ icon->connect("pressed",this,"_asset_clicked");
+
+ hb->add_child(icon);
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+
+ hb->add_child(vb);
+ vb->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ title = memnew( LinkButton );
+ title->set_text("My Awesome Addon");
+ title->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ title->connect("pressed",this,"_asset_clicked");
+ vb->add_child(title);
+
+
+ category = memnew( LinkButton );
+ category->set_text("Editor Tools");
+ category->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ category->connect("pressed",this,"_category_clicked");
+ vb->add_child(category);
+
+ author = memnew( LinkButton );
+ author->set_text("Johny Tolengo");
+ author->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ author->connect("pressed",this,"_author_clicked");
+ vb->add_child(author);
+
+ HBoxContainer *rating_hb = memnew( HBoxContainer );
+ vb->add_child(rating_hb);
+
+ for(int i=0;i<5;i++) {
+ stars[i]=memnew(TextureRect);
+ rating_hb->add_child(stars[i]);
+ }
+ price = memnew( Label );
+ price->set_text("Free");
+ vb->add_child(price);
+
+ set_custom_minimum_size(Size2(250,100));
+ set_h_size_flags(SIZE_EXPAND_FILL);
+
+ set_mouse_filter(MOUSE_FILTER_PASS);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+
+void EditorAssetLibraryItemDescription::set_image(int p_type,int p_index,const Ref<Texture>& p_image) {
+
+ switch(p_type) {
+
+ case EditorAssetLibrary::IMAGE_QUEUE_ICON: {
+
+ item->call("set_image",p_type,p_index,p_image);
+ icon=p_image;
+ } break;
+ case EditorAssetLibrary::IMAGE_QUEUE_THUMBNAIL: {
+
+ for(int i=0;i<preview_images.size();i++) {
+ if (preview_images[i].id==p_index) {
+ preview_images[i].button->set_icon(p_image);
+ break;
+ }
+ }
+ //item->call("set_image",p_type,p_index,p_image);
+ } break;
+ case EditorAssetLibrary::IMAGE_QUEUE_SCREENSHOT: {
+
+ for(int i=0;i<preview_images.size();i++) {
+ if (preview_images[i].id==p_index) {
+ preview_images[i].image = p_image;
+ if(preview_images[i].button->is_pressed()) {
+ _preview_click(p_index);
+ }
+ break;
+ }
+ }
+ //item->call("set_image",p_type,p_index,p_image);
+ } break;
+ }
+}
+
+void EditorAssetLibraryItemDescription::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_image"),&EditorAssetLibraryItemDescription::set_image);
+ ClassDB::bind_method(D_METHOD("_link_click"),&EditorAssetLibraryItemDescription::_link_click);
+ ClassDB::bind_method(D_METHOD("_preview_click"),&EditorAssetLibraryItemDescription::_preview_click);
+
+}
+
+void EditorAssetLibraryItemDescription::_link_click(const String& p_url) {
+ ERR_FAIL_COND(!p_url.begins_with("http"));
+ OS::get_singleton()->shell_open(p_url);
+}
+
+void EditorAssetLibraryItemDescription::_preview_click(int p_id) {
+ for(int i=0;i<preview_images.size();i++) {
+ if(preview_images[i].id==p_id) {
+ preview_images[i].button->set_pressed(true);
+ if(!preview_images[i].is_video) {
+ if(preview_images[i].image.is_valid()) {
+ preview->set_texture(preview_images[i].image);
+ }
+ } else {
+ _link_click(preview_images[i].video_link);
+ }
+ } else {
+ preview_images[i].button->set_pressed(false);
+ }
+ }
+}
+
+void EditorAssetLibraryItemDescription::configure(const String& p_title,int p_asset_id,const String& p_category,int p_category_id,const String& p_author,int p_author_id,int p_rating,const String& p_cost,int p_version,const String& p_version_string,const String& p_description,const String& p_download_url,const String& p_browse_url,const String& p_sha256_hash) {
+
+ asset_id=p_asset_id;
+ title=p_title;
+ download_url=p_download_url;
+ sha256=p_sha256_hash;
+ item->configure(p_title,p_asset_id,p_category,p_category_id,p_author,p_author_id,p_rating,p_cost);
+ description->clear();
+ description->add_text("Version: "+p_version_string+"\n");
+ description->add_text("Contents: ");
+ description->push_meta(p_browse_url);
+ description->add_text("View Files");
+ description->pop();
+ description->add_text("\nDescription:\n\n");
+ description->append_bbcode(p_description);
+ set_title(p_title);
+}
+
+void EditorAssetLibraryItemDescription::add_preview(int p_id, bool p_video,const String& p_url){
+
+ Preview preview;
+ preview.id=p_id;
+ preview.video_link=p_url;
+ preview.is_video=p_video;
+ preview.button = memnew( Button );
+ preview.button->set_flat(true);
+ preview.button->set_icon(get_icon("ThumbnailWait","EditorIcons"));
+ preview.button->set_toggle_mode(true);
+ preview.button->connect("pressed", this, "_preview_click", varray(p_id));
+ preview_hb->add_child(preview.button);
+ if(!p_video) {
+ preview.image=get_icon("ThumbnailWait","EditorIcons");
+ }
+ if(preview_images.size()==0 && !p_video) {
+ _preview_click(p_id);
+ }
+ preview_images.push_back(preview);
+}
+
+EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
+
+ VBoxContainer *vbox = memnew( VBoxContainer );
+ add_child(vbox);
+
+
+
+ HBoxContainer *hbox = memnew( HBoxContainer);
+ vbox->add_child(hbox);
+ vbox->add_constant_override("separation",15);
+ VBoxContainer *desc_vbox = memnew( VBoxContainer );
+ hbox->add_child(desc_vbox);
+ hbox->add_constant_override("separation",15);
+
+ item = memnew( EditorAssetLibraryItem );
+
+ desc_vbox->add_child(item);
+ desc_vbox->set_custom_minimum_size(Size2(300,0));
+
+
+ PanelContainer * desc_bg = memnew( PanelContainer );
+ desc_vbox->add_child(desc_bg);
+ desc_bg->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ description = memnew( RichTextLabel );
+ description->connect("meta_clicked",this,"_link_click");
+ //desc_vbox->add_child(description);
+ desc_bg->add_child(description);
+ desc_bg->add_style_override("panel",get_stylebox("normal","TextEdit"));
+
+ preview = memnew( TextureRect );
+ preview->set_custom_minimum_size(Size2(640,345));
+ hbox->add_child(preview);
+
+ PanelContainer * previews_bg = memnew( PanelContainer );
+ vbox->add_child(previews_bg);
+ previews_bg->set_custom_minimum_size(Size2(0,85));
+ previews_bg->add_style_override("panel",get_stylebox("normal","TextEdit"));
+
+ previews = memnew( ScrollContainer );
+ previews_bg->add_child(previews);
+ previews->set_enable_v_scroll(false);
+ previews->set_enable_h_scroll(true);
+ preview_hb = memnew( HBoxContainer );
+ preview_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ previews->add_child(preview_hb);
+ get_ok()->set_text("Install");
+ get_cancel()->set_text("Close");
+
+
+
+}
+///////////////////////////////////////////////////////////////////////////////////
+
+void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data) {
+
+
+ String error_text;
+ print_line("COMPLETED: "+itos(p_status)+" code: "+itos(p_code)+" data size: "+itos(p_data.size()));
+
+ switch(p_status) {
+
+ case HTTPRequest::RESULT_CANT_RESOLVE: {
+ error_text=("Can't resolve hostname: "+host);
+ status->set_text("Can't resolve.");
+ } break;
+ case HTTPRequest::RESULT_BODY_SIZE_LIMIT_EXCEEDED:
+ case HTTPRequest::RESULT_CONNECTION_ERROR:
+ case HTTPRequest::RESULT_CHUNKED_BODY_SIZE_MISMATCH: {
+ error_text=("Connection error, please try again.");
+ status->set_text("Can't connect.");
+ } break;
+ case HTTPRequest::RESULT_SSL_HANDSHAKE_ERROR:
+ case HTTPRequest::RESULT_CANT_CONNECT: {
+ error_text=("Can't connect to host: "+host);
+ status->set_text("Can't connect.");
+ } break;
+ case HTTPRequest::RESULT_NO_RESPONSE: {
+ error_text=("No response from host: "+host);
+ status->set_text("No response.");
+ } break;
+ case HTTPRequest::RESULT_REQUEST_FAILED: {
+ error_text=("Request failed, return code: "+itos(p_code));
+ status->set_text("Req. Failed.");
+ } break;
+ case HTTPRequest::RESULT_REDIRECT_LIMIT_REACHED: {
+ error_text=("Request failed, too many redirects");
+ status->set_text("Redirect Loop.");
+ } break;
+ default: {
+ if (p_code!=200) {
+ error_text=("Request failed, return code: "+itos(p_code));
+ status->set_text("Failed: "+itos(p_code));
+ } else if(sha256 != "") {
+ String download_sha256 = FileAccess::get_sha256(download->get_download_file());
+ if(sha256 != download_sha256) {
+ error_text="Bad download hash, assuming file has been tampered with.\nExpected: " + sha256 + "\nGot: " + download_sha256;
+ status->set_text("Failed sha256 hash check");
+ }
+ }
+ } break;
+
+ }
+
+ if (error_text!=String()) {
+ download_error->set_text("Asset Download Error:\n"+error_text);
+ download_error->popup_centered_minsize();
+ return;
+
+ }
+
+ progress->set_max( download->get_body_size() );
+ progress->set_value(download->get_downloaded_bytes());
+
+ print_line("max: "+itos(download->get_body_size())+" bytes: "+itos(download->get_downloaded_bytes()));
+ install->set_disabled(false);
+
+ progress->set_value(download->get_downloaded_bytes());
+
+ status->set_text("Success! ("+String::humanize_size(download->get_downloaded_bytes())+")");
+ set_process(false);
+}
+
+
+void EditorAssetLibraryItemDownload::configure(const String& p_title,int p_asset_id,const Ref<Texture>& p_preview, const String& p_download_url, const String& p_sha256_hash) {
+
+ title->set_text(p_title);
+ icon->set_texture(p_preview);
+ asset_id=p_asset_id;
+ if (!p_preview.is_valid())
+ icon->set_texture(get_icon("GodotAssetDefault","EditorIcons"));
+ host=p_download_url;
+ sha256=p_sha256_hash;
+ asset_installer->connect("confirmed",this,"_close");
+ dismiss->set_normal_texture( get_icon("Close","EditorIcons"));
+ _make_request();
+}
+
+
+void EditorAssetLibraryItemDownload::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ progress->set_max( download->get_body_size() );
+ progress->set_value(download->get_downloaded_bytes());
+
+ int cstatus = download->get_http_client_status();
+
+ if (cstatus==HTTPClient::STATUS_BODY)
+ status->set_text("Fetching: "+String::humanize_size(download->get_downloaded_bytes()));
+
+ if (cstatus!=prev_status) {
+ switch(cstatus) {
+
+ case HTTPClient::STATUS_RESOLVING: {
+ status->set_text("Resolving..");
+ } break;
+ case HTTPClient::STATUS_CONNECTING: {
+ status->set_text("Connecting..");
+ } break;
+ case HTTPClient::STATUS_REQUESTING: {
+ status->set_text("Requesting..");
+ } break;
+ default: {}
+ }
+ prev_status=cstatus;
+ }
+
+ }
+}
+void EditorAssetLibraryItemDownload::_close() {
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ da->remove(download->get_download_file()); //clean up removed file
+ memdelete(da);
+ queue_delete();
+}
+
+void EditorAssetLibraryItemDownload::_install() {
+
+ String file = download->get_download_file();
+
+ if (external_install) {
+ emit_signal("install_asset",file,title->get_text());
+ return;
+ }
+
+
+ asset_installer->open(file,1);
+}
+
+void EditorAssetLibraryItemDownload::_make_request() {
+ download->cancel_request();
+ download->set_download_file(EditorSettings::get_singleton()->get_settings_path().plus_file("tmp").plus_file("tmp_asset_"+itos(asset_id))+".zip");
+
+ Error err = download->request(host);
+ if(err!=OK) {
+ status->set_text("Error making request");
+ } else {
+ set_process(true);
+ }
+}
+
+void EditorAssetLibraryItemDownload::_bind_methods() {
+
+ ClassDB::bind_method("_http_download_completed",&EditorAssetLibraryItemDownload::_http_download_completed);
+ ClassDB::bind_method("_install",&EditorAssetLibraryItemDownload::_install);
+ ClassDB::bind_method("_close",&EditorAssetLibraryItemDownload::_close);
+ ClassDB::bind_method("_make_request",&EditorAssetLibraryItemDownload::_make_request);
+
+ ADD_SIGNAL(MethodInfo("install_asset",PropertyInfo(Variant::STRING,"zip_path"),PropertyInfo(Variant::STRING,"name")));
+
+}
+
+EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
+
+ HBoxContainer *hb = memnew( HBoxContainer);
+ add_child(hb);
+ icon = memnew( TextureRect );
+ hb->add_child(icon);
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ hb->add_child(vb);
+ vb->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *title_hb = memnew( HBoxContainer);
+ vb->add_child(title_hb);
+ title = memnew( Label );
+ title_hb->add_child(title);
+ title->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ dismiss = memnew( TextureButton );
+ dismiss->connect("pressed",this,"_close");
+ title_hb->add_child(dismiss);
+
+ title->set_clip_text(true);
+
+ vb->add_spacer();
+
+ status = memnew (Label("Idle"));
+ vb->add_child(status);
+ status->add_color_override("font_color", Color(0.5,0.5,0.5) );
+ progress = memnew( ProgressBar );
+ vb->add_child(progress);
+
+
+
+ HBoxContainer *hb2 = memnew( HBoxContainer );
+ vb->add_child(hb2);
+ hb2->add_spacer();
+
+ install = memnew( Button );
+ install->set_text("Install");
+ install->set_disabled(true);
+ install->connect("pressed",this,"_install");
+
+ retry = memnew( Button );
+ retry->set_text("Retry");
+ retry->connect("pressed",this,"_make_request");
+
+ hb2->add_child(retry);
+ hb2->add_child(install);
+ set_custom_minimum_size(Size2(250,0));
+
+ download = memnew( HTTPRequest );
+ add_child(download);
+ download->connect("request_completed",this,"_http_download_completed");
+
+ download_error = memnew( AcceptDialog );
+ add_child(download_error);
+ download_error->set_title("Download Error");
+
+ asset_installer = memnew( EditorAssetInstaller );
+ add_child(asset_installer);
+
+ prev_status=-1;
+
+ external_install=false;
+
+
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void EditorAssetLibrary::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+ TextureRect *tf = memnew(TextureRect);
+ tf->set_texture(get_icon("Error","EditorIcons"));
+ reverse->set_icon(get_icon("Updown","EditorIcons"));
+
+ error_hb->add_child(tf);
+ error_label->raise();
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+ if(is_visible()) {
+ _repository_changed(0); // Update when shown for the first time
+ }
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ HTTPClient::Status s = request->get_http_client_status();
+ bool visible = s!=HTTPClient::STATUS_DISCONNECTED;
+
+ if (visible != load_status->is_visible()) {
+ load_status->set_visible(visible);
+ }
+
+ if (visible) {
+ switch(s) {
+
+ case HTTPClient::STATUS_RESOLVING: {
+ load_status->set_value(0.1);
+ } break;
+ case HTTPClient::STATUS_CONNECTING: {
+ load_status->set_value(0.2);
+ } break;
+ case HTTPClient::STATUS_REQUESTING: {
+ load_status->set_value(0.3);
+ } break;
+ case HTTPClient::STATUS_BODY: {
+ load_status->set_value(0.4);
+ } break;
+ default: {}
+
+ }
+ }
+
+ bool no_downloads = downloads_hb->get_child_count()==0;
+ if (no_downloads == downloads_scroll->is_visible()) {
+ downloads_scroll->set_visible(!no_downloads);
+ }
+ }
+
+}
+
+
+void EditorAssetLibrary::_install_asset() {
+
+ ERR_FAIL_COND(!description);
+
+ for(int i=0;i<downloads_hb->get_child_count();i++) {
+
+ EditorAssetLibraryItemDownload *d = downloads_hb->get_child(i)->cast_to<EditorAssetLibraryItemDownload>();
+ if (d && d->get_asset_id() == description->get_asset_id()) {
+
+ if (EditorNode::get_singleton() != NULL)
+ EditorNode::get_singleton()->show_warning("Download for this asset is already in progress!");
+ return;
+ }
+ }
+
+
+ EditorAssetLibraryItemDownload * download = memnew( EditorAssetLibraryItemDownload );
+ downloads_hb->add_child(download);
+ download->configure(description->get_title(),description->get_asset_id(),description->get_preview_icon(),description->get_download_url(),description->get_sha256());
+
+ if (templates_only) {
+ download->set_external_install(true);
+ download->connect("install_asset",this,"_install_external_asset");
+ }
+
+}
+
+const char* EditorAssetLibrary::sort_key[SORT_MAX]={
+ "rating",
+ "downloads",
+ "name",
+ "cost",
+ "updated"
+};
+
+const char* EditorAssetLibrary::sort_text[SORT_MAX]={
+ "Rating",
+ "Downloads",
+ "Name",
+ "Cost",
+ "Updated"
+};
+
+const char* EditorAssetLibrary::support_key[SUPPORT_MAX]={
+ "official",
+ "community",
+ "testing"
+};
+
+
+void EditorAssetLibrary::_select_author(int p_id) {
+
+ //opemn author window
+}
+
+void EditorAssetLibrary::_select_category(int p_id){
+
+ for(int i=0;i<categories->get_item_count();i++) {
+
+ if (i==0)
+ continue;
+ int id = categories->get_item_metadata(i);
+ if (id==p_id) {
+ categories->select(i);
+ _search();
+ break;
+ }
+ }
+}
+void EditorAssetLibrary::_select_asset(int p_id){
+
+ _api_request("asset/"+itos(p_id), REQUESTING_ASSET);
+
+ /*
+ if (description) {
+ memdelete(description);
+ }
+
+
+ description = memnew( EditorAssetLibraryItemDescription );
+ add_child(description);
+ description->popup_centered_minsize();*/
+}
+
+void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByteArray& p_data, int p_queue_id) {
+ Object *obj = ObjectDB::get_instance(image_queue[p_queue_id].target);
+
+ if (obj) {
+ bool image_set = false;
+ PoolByteArray image_data = p_data;
+
+ if(use_cache) {
+ String cache_filename_base = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp").plus_file("assetimage_"+image_queue[p_queue_id].image_url.md5_text());
+
+ FileAccess* file = FileAccess::open(cache_filename_base+".data", FileAccess::READ);
+
+ if(file) {
+ PoolByteArray cached_data;
+ int len=file->get_32();
+ cached_data.resize(len);
+
+ PoolByteArray::Write w=cached_data.write();
+ file->get_buffer(w.ptr(), len);
+
+ image_data = cached_data;
+ file->close();
+ }
+ }
+
+ int len=image_data.size();
+ PoolByteArray::Read r=image_data.read();
+ Image image(r.ptr(),len);
+ if (!image.empty()) {
+ float max_height = 10000;
+ switch(image_queue[p_queue_id].image_type) {
+ case IMAGE_QUEUE_ICON: max_height=80; break;
+ case IMAGE_QUEUE_THUMBNAIL: max_height=80; break;
+ case IMAGE_QUEUE_SCREENSHOT: max_height=345; break;
+ }
+ float scale_ratio = max_height / image.get_height();
+ if(scale_ratio < 1) {
+ image.resize(image.get_width() * scale_ratio, image.get_height() * scale_ratio, Image::INTERPOLATE_CUBIC);
+ }
+
+ Ref<ImageTexture> tex;
+ tex.instance();
+ tex->create_from_image(image);
+
+ obj->call("set_image",image_queue[p_queue_id].image_type,image_queue[p_queue_id].image_index,tex);
+ image_set = true;
+ }
+
+ if(!image_set && final) {
+ obj->call("set_image",image_queue[p_queue_id].image_type,image_queue[p_queue_id].image_index,get_icon("ErrorSign","EditorIcons"));
+ }
+ }
+}
+
+void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data,int p_queue_id) {
+
+ ERR_FAIL_COND( !image_queue.has(p_queue_id) );
+
+ if (p_status==HTTPRequest::RESULT_SUCCESS) {
+
+ print_line("GOT IMAGE YAY!");
+
+ if(p_code != HTTPClient::RESPONSE_NOT_MODIFIED) {
+ for(int i=0;i<headers.size();i++) {
+ if (headers[i].findn("ETag:")==0) { // Save etag
+ String cache_filename_base = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp").plus_file("assetimage_"+image_queue[p_queue_id].image_url.md5_text());
+ String new_etag = headers[i].substr(headers[i].find(":")+1,headers[i].length()).strip_edges();
+ FileAccess* file;
+
+ file = FileAccess::open(cache_filename_base+".etag", FileAccess::WRITE);
+ if(file) {
+ file->store_line(new_etag);
+ file->close();
+ }
+
+ int len=p_data.size();
+ PoolByteArray::Read r=p_data.read();
+ file = FileAccess::open(cache_filename_base+".data", FileAccess::WRITE);
+ if(file) {
+ file->store_32(len);
+ file->store_buffer(r.ptr(),len);
+ file->close();
+ }
+
+ break;
+ }
+ }
+ }
+ _image_update(p_code == HTTPClient::RESPONSE_NOT_MODIFIED, true, p_data, p_queue_id);
+
+ } else {
+ WARN_PRINTS("Error getting PNG file for asset id "+itos(image_queue[p_queue_id].asset_id));
+ Object *obj = ObjectDB::get_instance(image_queue[p_queue_id].target);
+ if (obj) {
+ obj->call("set_image",image_queue[p_queue_id].image_type,image_queue[p_queue_id].image_index,get_icon("ErrorSign","EditorIcons"));
+ }
+ }
+
+ image_queue[p_queue_id].request->queue_delete();
+ image_queue.erase(p_queue_id);
+
+ _update_image_queue();
+
+}
+
+void EditorAssetLibrary::_update_image_queue() {
+
+ int max_images=2;
+ int current_images=0;
+
+ List<int> to_delete;
+ for (Map<int,ImageQueue>::Element *E=image_queue.front();E;E=E->next()) {
+ if (!E->get().active && current_images<max_images) {
+
+ String cache_filename_base = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp").plus_file("assetimage_"+E->get().image_url.md5_text());
+ Vector<String> headers;
+
+ if(FileAccess::exists(cache_filename_base+".etag") && FileAccess::exists(cache_filename_base+".data")) {
+ FileAccess* file = FileAccess::open(cache_filename_base+".etag", FileAccess::READ);
+ if (file) {
+ headers.push_back("If-None-Match: " + file->get_line());
+ file->close();
+ }
+ }
+
+ print_line("REQUEST ICON FOR: "+itos(E->get().asset_id));
+ Error err = E->get().request->request(E->get().image_url, headers);
+ if (err!=OK) {
+ to_delete.push_back(E->key());
+ } else {
+ E->get().active=true;
+ }
+ current_images++;
+ } else if (E->get().active) {
+ current_images++;
+ }
+ }
+
+ while(to_delete.size()) {
+ image_queue[to_delete.front()->get()].request->queue_delete();
+ image_queue.erase(to_delete.front()->get());
+ to_delete.pop_front();
+ }
+}
+
+void EditorAssetLibrary::_request_image(ObjectID p_for,String p_image_url,ImageType p_type,int p_image_index) {
+
+
+ ImageQueue iq;
+ iq.image_url=p_image_url;
+ iq.image_index=p_image_index;
+ iq.image_type=p_type;
+ iq.request = memnew( HTTPRequest );
+
+ iq.target=p_for;
+ iq.queue_id=++last_queue_id;
+ iq.active=false;
+
+ iq.request->connect("request_completed",this,"_image_request_completed",varray(iq.queue_id));
+
+ image_queue[iq.queue_id]=iq;
+
+ add_child(iq.request);
+
+ _image_update(true, false, PoolByteArray(), iq.queue_id);
+ _update_image_queue();
+
+
+}
+
+void EditorAssetLibrary::_repository_changed(int p_repository_id) {
+ host=repository->get_item_metadata(p_repository_id);
+ print_line(".." + host);
+ if(templates_only) {
+ _api_request("configure", REQUESTING_CONFIG, "?type=project");
+ } else {
+ _api_request("configure", REQUESTING_CONFIG);
+ }
+}
+
+void EditorAssetLibrary::_support_toggled(int p_support) {
+ support->get_popup()->set_item_checked(p_support, !support->get_popup()->is_item_checked(p_support));
+ _search();
+}
+
+void EditorAssetLibrary::_rerun_search(int p_ignore) {
+ _search();
+}
+
+void EditorAssetLibrary::_search(int p_page) {
+
+ String args;
+
+ if(templates_only) {
+ args += "?type=project&";
+ } else {
+ args += "?";
+ }
+ args+=String()+"sort="+sort_key[sort->get_selected()];
+
+
+ String support_list;
+ for(int i = 0; i < SUPPORT_MAX; i++) {
+ if(support->get_popup()->is_item_checked(i)) {
+ support_list += String(support_key[i]) + "+";
+ }
+ }
+ if(support_list != String()) {
+ args += "&support=" + support_list.substr(0, support_list.length() - 1);
+ }
+
+ if (categories->get_selected()>0) {
+
+ args+="&category="+itos(categories->get_item_metadata(categories->get_selected()));
+ }
+
+ if (reverse->is_pressed()) {
+
+ args+="&reverse=true";
+ }
+
+ if (filter->get_text()!=String()) {
+ args+="&filter="+filter->get_text().http_escape();
+ }
+
+ if (p_page>0) {
+ args+="&page="+itos(p_page);
+ }
+
+ _api_request("asset",REQUESTING_SEARCH,args);
+}
+
+HBoxContainer* EditorAssetLibrary::_make_pages(int p_page,int p_page_count,int p_page_len,int p_total_items,int p_current_items) {
+
+ HBoxContainer * hbc = memnew( HBoxContainer );
+
+ //do the mario
+ int from = p_page-5;
+ if (from<0)
+ from=0;
+ int to = from+10;
+ if (to>p_page_count)
+ to=p_page_count;
+
+ Color gray = Color(0.65,0.65,0.65);
+
+ hbc->add_spacer();
+ hbc->add_constant_override("separation",10);
+
+ if(p_page != 0) {
+ LinkButton *first = memnew( LinkButton );
+ first->set_text("first");
+ first->add_color_override("font_color", gray );
+ first->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ first->connect("pressed",this,"_search",varray(0));
+ hbc->add_child(first);
+ }
+
+ if (p_page>0) {
+ LinkButton *prev = memnew( LinkButton );
+ prev->set_text("prev");
+ prev->add_color_override("font_color", gray );
+ prev->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ prev->connect("pressed",this,"_search",varray(p_page-1));
+ hbc->add_child(prev);
+ }
+
+ for(int i=from;i<to;i++) {
+
+ if (i==p_page) {
+
+ Label *current = memnew(Label);
+ current->set_text(itos(i+1));
+ hbc->add_child(current);
+ } else {
+
+ LinkButton *current = memnew( LinkButton );
+ current->add_color_override("font_color", gray );
+ current->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ current->set_text(itos(i+1));
+ current->connect("pressed",this,"_search",varray(i));
+
+ hbc->add_child(current);
+
+ }
+ }
+
+ if (p_page<p_page_count-1) {
+ LinkButton *next = memnew( LinkButton );
+ next->set_text("next");
+ next->add_color_override("font_color", gray );
+ next->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ next->connect("pressed",this,"_search",varray(p_page+1));
+
+ hbc->add_child(next);
+ }
+
+ if(p_page != p_page_count-1) {
+ LinkButton *last = memnew( LinkButton );
+ last->set_text("last");
+ last->add_color_override("font_color", gray );
+ last->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
+ hbc->add_child(last);
+ last->connect("pressed",this,"_search",varray(p_page_count-1));
+ }
+
+ Label *totals = memnew( Label );
+ totals->set_text("( "+itos(from*p_page_len)+" - "+itos(from*p_page_len+p_current_items-1)+" / "+itos(p_total_items)+" )");
+ hbc->add_child(totals);
+
+ hbc->add_spacer();
+
+ return hbc;
+}
+
+
+void EditorAssetLibrary::_api_request(const String& p_request, RequestType p_request_type, const String& p_arguments) {
+
+ if (requesting!=REQUESTING_NONE) {
+ request->cancel_request();
+ }
+
+ requesting=p_request_type;
+
+ error_hb->hide();
+ request->request(host+"/"+p_request+p_arguments);
+}
+
+
+
+void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data) {
+
+
+ String str;
+
+ {
+ int datalen=p_data.size();
+ PoolByteArray::Read r = p_data.read();
+ str.parse_utf8((const char*)r.ptr(),datalen);
+ }
+
+ bool error_abort=true;
+
+ switch(p_status) {
+
+ case HTTPRequest::RESULT_CANT_RESOLVE: {
+ error_label->set_text("Can't resolve hostname: "+host);
+ } break;
+ case HTTPRequest::RESULT_BODY_SIZE_LIMIT_EXCEEDED:
+ case HTTPRequest::RESULT_CONNECTION_ERROR:
+ case HTTPRequest::RESULT_CHUNKED_BODY_SIZE_MISMATCH: {
+ error_label->set_text("Connection error, please try again.");
+ } break;
+ case HTTPRequest::RESULT_SSL_HANDSHAKE_ERROR:
+ case HTTPRequest::RESULT_CANT_CONNECT: {
+ error_label->set_text("Can't connect to host: "+host);
+ } break;
+ case HTTPRequest::RESULT_NO_RESPONSE: {
+ error_label->set_text("No response from host: "+host);
+ } break;
+ case HTTPRequest::RESULT_REQUEST_FAILED: {
+ error_label->set_text("Request failed, return code: "+itos(p_code));
+ } break;
+ case HTTPRequest::RESULT_REDIRECT_LIMIT_REACHED: {
+ error_label->set_text("Request failed, too many redirects");
+
+ } break;
+ default: {
+ if (p_code!=200) {
+ error_label->set_text("Request failed, return code: "+itos(p_code));
+ } else {
+
+ error_abort=false;
+ }
+ } break;
+
+ }
+
+
+ if (error_abort) {
+ error_hb->show();
+ return;
+ }
+
+ print_line("response: "+itos(p_status)+" code: "+itos(p_code));
+
+ Dictionary d;
+ {
+ Variant js;
+ String errs;
+ int errl;
+ JSON::parse(str,js,errs,errl);
+ d=js;
+ }
+
+
+ print_line(Variant(d).get_construct_string());
+
+ RequestType requested = requesting;
+ requesting=REQUESTING_NONE;
+
+ switch(requested) {
+ case REQUESTING_CONFIG: {
+
+ categories->clear();
+ categories->add_item("All");
+ categories->set_item_metadata(0,0);
+ if (d.has("categories")) {
+ Array clist = d["categories"];
+ for(int i=0;i<clist.size();i++) {
+ Dictionary cat = clist[i];
+ if (!cat.has("name") || !cat.has("id"))
+ continue;
+ String name=cat["name"];
+ int id=cat["id"];
+ categories->add_item(name);
+ categories->set_item_metadata( categories->get_item_count() -1, id);
+ category_map[cat["id"]] = name;
+ }
+ }
+
+ _search();
+ } break;
+ case REQUESTING_SEARCH: {
+ if (asset_items) {
+ memdelete(asset_items);
+ }
+
+ if (asset_top_page) {
+ memdelete(asset_top_page);
+ }
+
+ if (asset_bottom_page) {
+ memdelete(asset_bottom_page);
+ }
+
+ int page=0;
+ int pages=1;
+ int page_len=10;
+ int total_items=1;
+ Array result;
+
+
+ if (d.has("page")) {
+ page=d["page"];
+ }
+ if (d.has("pages")) {
+ pages=d["pages"];
+ }
+ if (d.has("page_length")) {
+ page_len=d["page_length"];
+ }
+ if (d.has("total")) {
+ total_items=d["total"];
+ }
+ if (d.has("result")) {
+ result=d["result"];
+ }
+
+ asset_top_page = _make_pages(page,pages,page_len,total_items,result.size());
+ library_vb->add_child(asset_top_page);
+
+ asset_items = memnew( GridContainer );
+ asset_items->set_columns(2);
+ asset_items->add_constant_override("hseparation",10);
+ asset_items->add_constant_override("vseparation",10);
+
+ library_vb->add_child(asset_items);
+
+ asset_bottom_page = _make_pages(page,pages,page_len,total_items,result.size());
+ library_vb->add_child(asset_bottom_page);
+
+ for(int i=0;i<result.size();i++) {
+
+ Dictionary r = result[i];
+
+ ERR_CONTINUE(!r.has("title"));
+ ERR_CONTINUE(!r.has("asset_id"));
+ ERR_CONTINUE(!r.has("author"));
+ ERR_CONTINUE(!r.has("author_id"));
+ ERR_CONTINUE(!r.has("category_id"));
+ ERR_FAIL_COND(!category_map.has(r["category_id"]));
+ ERR_CONTINUE(!r.has("rating"));
+ ERR_CONTINUE(!r.has("cost"));
+
+
+ EditorAssetLibraryItem *item = memnew( EditorAssetLibraryItem );
+ asset_items->add_child(item);
+ item->configure(r["title"],r["asset_id"],category_map[r["category_id"]],r["category_id"],r["author"],r["author_id"],r["rating"],r["cost"]);
+ item->connect("asset_selected",this,"_select_asset");
+ item->connect("author_selected",this,"_select_author");
+ item->connect("category_selected",this,"_select_category");
+
+ if(r.has("icon_url") && r["icon_url"] != "") {
+ _request_image(item->get_instance_ID(),r["icon_url"],IMAGE_QUEUE_ICON,0);
+ }
+ }
+ } break;
+ case REQUESTING_ASSET: {
+ Dictionary r = d;
+
+ ERR_FAIL_COND(!r.has("title"));
+ ERR_FAIL_COND(!r.has("asset_id"));
+ ERR_FAIL_COND(!r.has("author"));
+ ERR_FAIL_COND(!r.has("author_id"));
+ ERR_FAIL_COND(!r.has("version"));
+ ERR_FAIL_COND(!r.has("version_string"));
+ ERR_FAIL_COND(!r.has("category_id"));
+ ERR_FAIL_COND(!category_map.has(r["category_id"]));
+ ERR_FAIL_COND(!r.has("rating"));
+ ERR_FAIL_COND(!r.has("cost"));
+ ERR_FAIL_COND(!r.has("description"));
+ ERR_FAIL_COND(!r.has("download_url"));
+ ERR_FAIL_COND(!r.has("download_hash"));
+ ERR_FAIL_COND(!r.has("browse_url"));
+
+ if (description) {
+ memdelete(description);
+ }
+
+ description = memnew( EditorAssetLibraryItemDescription );
+ add_child(description);
+ description->popup_centered_minsize();
+ description->connect("confirmed",this,"_install_asset");
+
+ description->configure(r["title"],r["asset_id"],category_map[r["category_id"]],r["category_id"],r["author"],r["author_id"],r["rating"],r["cost"],r["version"],r["version_string"],r["description"],r["download_url"],r["browse_url"], r["download_hash"]);
+ /*item->connect("asset_selected",this,"_select_asset");
+ item->connect("author_selected",this,"_select_author");
+ item->connect("category_selected",this,"_category_selected");*/
+
+ if(r.has("icon_url") && r["icon_url"] != "") {
+ _request_image(description->get_instance_ID(),r["icon_url"],IMAGE_QUEUE_ICON,0);
+ }
+
+ if (d.has("previews")) {
+ Array previews = d["previews"];
+
+ for(int i=0;i<previews.size();i++) {
+
+
+ Dictionary p=previews[i];
+
+ ERR_CONTINUE(!p.has("type"));
+ ERR_CONTINUE(!p.has("link"));
+
+ bool is_video=p.has("type") && String(p["type"])=="video";
+ String video_url;
+ if (is_video && p.has("link")) {
+ video_url=p["link"];
+ }
+
+ description->add_preview(i,is_video,video_url);
+
+ if(p.has("thumbnail")) {
+ _request_image(description->get_instance_ID(),p["thumbnail"],IMAGE_QUEUE_THUMBNAIL,i);
+ }
+ if(is_video) {
+ //_request_image(description->get_instance_ID(),p["link"],IMAGE_QUEUE_SCREENSHOT,i);
+ } else {
+ _request_image(description->get_instance_ID(),p["link"],IMAGE_QUEUE_SCREENSHOT,i);
+ }
+
+ }
+ }
+ } break;
+ default: break;
+ }
+
+}
+
+
+void EditorAssetLibrary::_asset_file_selected(const String& p_file) {
+
+ if (asset_installer) {
+ memdelete( asset_installer );
+ asset_installer=NULL;
+ }
+
+ asset_installer = memnew( EditorAssetInstaller );
+ add_child(asset_installer);
+ asset_installer->open(p_file);
+
+
+}
+
+void EditorAssetLibrary::_asset_open() {
+
+ asset_open->popup_centered_ratio();
+}
+
+void EditorAssetLibrary::_manage_plugins() {
+
+ ProjectSettings::get_singleton()->popup_project_settings();
+ ProjectSettings::get_singleton()->set_plugins_page();
+}
+
+
+
+void EditorAssetLibrary::_install_external_asset(String p_zip_path,String p_title) {
+
+ emit_signal("install_asset",p_zip_path,p_title);
+}
+
+void EditorAssetLibrary::_bind_methods() {
+
+ ClassDB::bind_method("_http_request_completed",&EditorAssetLibrary::_http_request_completed);
+ ClassDB::bind_method("_select_asset",&EditorAssetLibrary::_select_asset);
+ ClassDB::bind_method("_select_author",&EditorAssetLibrary::_select_author);
+ ClassDB::bind_method("_select_category",&EditorAssetLibrary::_select_category);
+ ClassDB::bind_method("_image_request_completed",&EditorAssetLibrary::_image_request_completed);
+ ClassDB::bind_method("_search",&EditorAssetLibrary::_search,DEFVAL(0));
+ ClassDB::bind_method("_install_asset",&EditorAssetLibrary::_install_asset);
+ ClassDB::bind_method("_manage_plugins",&EditorAssetLibrary::_manage_plugins);
+ ClassDB::bind_method("_asset_open",&EditorAssetLibrary::_asset_open);
+ ClassDB::bind_method("_asset_file_selected",&EditorAssetLibrary::_asset_file_selected);
+ ClassDB::bind_method("_repository_changed",&EditorAssetLibrary::_repository_changed);
+ ClassDB::bind_method("_support_toggled",&EditorAssetLibrary::_support_toggled);
+ ClassDB::bind_method("_rerun_search",&EditorAssetLibrary::_rerun_search);
+ ClassDB::bind_method("_install_external_asset",&EditorAssetLibrary::_install_external_asset);
+
+
+
+ ADD_SIGNAL(MethodInfo("install_asset",PropertyInfo(Variant::STRING,"zip_path"),PropertyInfo(Variant::STRING,"name")));
+
+}
+
+EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
+
+ templates_only=p_templates_only;
+
+ Ref<StyleBoxEmpty> border;
+ border.instance();
+ border->set_default_margin(MARGIN_LEFT,15);
+ border->set_default_margin(MARGIN_RIGHT,15);
+ border->set_default_margin(MARGIN_BOTTOM,5);
+ border->set_default_margin(MARGIN_TOP,5);
+
+ add_style_override("panel",border);
+
+ VBoxContainer *library_main = memnew( VBoxContainer );
+
+ add_child(library_main);
+
+ HBoxContainer *search_hb = memnew( HBoxContainer );
+
+ library_main->add_child(search_hb);
+ library_main->add_constant_override("separation",10);
+
+
+
+ search_hb->add_child( memnew( Label(TTR("Search:")+" ")));
+ filter =memnew( LineEdit );
+ search_hb->add_child(filter);
+ filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ filter->connect("text_entered",this,"_search");
+ search = memnew( Button("Search"));
+ search->connect("pressed",this,"_search");
+ search_hb->add_child(search);
+
+ if (!p_templates_only)
+ search_hb->add_child(memnew( VSeparator ));
+
+ Button * open_asset = memnew( Button );
+ open_asset->set_text("Import");
+ search_hb->add_child(open_asset);
+ open_asset->connect("pressed",this,"_asset_open");
+
+ Button * plugins = memnew( Button );
+ plugins->set_text("Plugins");
+ search_hb->add_child(plugins);
+ plugins->connect("pressed",this,"_manage_plugins");
+
+ if (p_templates_only) {
+ open_asset->hide();
+ plugins->hide();
+ }
+
+
+ HBoxContainer *search_hb2 = memnew( HBoxContainer );
+ library_main->add_child(search_hb2);
+
+ search_hb2->add_child( memnew( Label(TTR("Sort:")+" ")));
+ sort = memnew( OptionButton );
+ for(int i=0;i<SORT_MAX;i++) {
+ sort->add_item(sort_text[i]);
+ }
+
+ search_hb2->add_child(sort);
+
+ sort->set_h_size_flags(SIZE_EXPAND_FILL);
+ sort->connect("item_selected", this, "_rerun_search");
+
+ reverse = memnew( ToolButton );
+ reverse->set_toggle_mode(true);
+ reverse->connect("toggled", this, "_rerun_search");
+ //reverse->set_text(TTR("Reverse"));
+ search_hb2->add_child(reverse);
+
+ search_hb2->add_child(memnew(VSeparator));
+
+ //search_hb2->add_spacer();
+
+ search_hb2->add_child( memnew( Label(TTR("Category:")+" ")));
+ categories = memnew( OptionButton );
+ categories->add_item(TTR("All"));
+ search_hb2->add_child(categories);
+ categories->set_h_size_flags(SIZE_EXPAND_FILL);
+ //search_hb2->add_spacer();
+ categories->connect("item_selected", this, "_rerun_search");
+
+ search_hb2->add_child(memnew(VSeparator));
+
+ search_hb2->add_child( memnew( Label(TTR("Site:")+" ")));
+ repository = memnew( OptionButton );
+
+ repository->add_item("Godot");
+ repository->set_item_metadata(0, "https://godotengine.org/asset-library/api");
+ repository->add_item("Localhost"); // TODO: Maybe remove?
+ repository->set_item_metadata(1, "http://127.0.0.1/asset-library/api");
+ repository->connect("item_selected",this,"_repository_changed");
+
+ search_hb2->add_child(repository);
+ repository->set_h_size_flags(SIZE_EXPAND_FILL);
+
+
+ search_hb2->add_child(memnew(VSeparator));
+
+ support = memnew( MenuButton );
+ search_hb2->add_child(support);
+ support->set_text(TTR("Support.."));
+ support->get_popup()->add_check_item(TTR("Official"),SUPPORT_OFFICIAL);
+ support->get_popup()->add_check_item(TTR("Community"),SUPPORT_COMMUNITY);
+ support->get_popup()->add_check_item(TTR("Testing"),SUPPORT_TESTING);
+ support->get_popup()->set_item_checked(SUPPORT_OFFICIAL,true);
+ support->get_popup()->set_item_checked(SUPPORT_COMMUNITY,true);
+ support->get_popup()->connect("id_pressed",this,"_support_toggled");
+
+ /////////
+
+ PanelContainer * library_scroll_bg = memnew( PanelContainer );
+ library_main->add_child(library_scroll_bg);
+ library_scroll_bg->add_style_override("panel",get_stylebox("normal","TextEdit"));
+ library_scroll_bg->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ library_scroll = memnew( ScrollContainer );
+ library_scroll->set_enable_v_scroll(true);
+ library_scroll->set_enable_h_scroll(false);
+
+ library_scroll_bg->add_child(library_scroll);
+
+
+ Ref<StyleBoxEmpty> border2;
+ border2.instance();
+ border2->set_default_margin(MARGIN_LEFT,15);
+ border2->set_default_margin(MARGIN_RIGHT,35);
+ border2->set_default_margin(MARGIN_BOTTOM,15);
+ border2->set_default_margin(MARGIN_TOP,15);
+
+
+ PanelContainer * library_vb_border = memnew( PanelContainer );
+ library_scroll->add_child(library_vb_border);
+ library_vb_border->add_style_override("panel",border2);
+ library_vb_border->set_h_size_flags(SIZE_EXPAND_FILL);
+ library_vb_border->set_mouse_filter(MOUSE_FILTER_PASS);
+
+
+
+ library_vb = memnew( VBoxContainer );
+ library_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ library_vb_border->add_child(library_vb);
+ //margin_panel->set_stop_mouse(false);
+
+ asset_top_page = memnew( HBoxContainer );
+ library_vb->add_child(asset_top_page);
+
+ asset_items = memnew( GridContainer );
+ asset_items->set_columns(2);
+ asset_items->add_constant_override("hseparation",10);
+ asset_items->add_constant_override("vseparation",10);
+
+ library_vb->add_child(asset_items);
+
+ asset_bottom_page = memnew( HBoxContainer );
+ library_vb->add_child(asset_bottom_page);
+
+ request = memnew( HTTPRequest );
+ add_child(request);
+ request->set_use_threads(EDITOR_DEF("asset_library/use_threads",true));
+ request->connect("request_completed",this,"_http_request_completed");
+
+ last_queue_id=0;
+
+ library_vb->add_constant_override("separation",20);
+
+ load_status = memnew( ProgressBar );
+ load_status->set_min(0);
+ load_status->set_max(1);
+ load_status->set_step(0.001);
+ library_main->add_child(load_status);
+
+ error_hb = memnew( HBoxContainer );
+ library_main->add_child(error_hb);
+ error_label = memnew( Label );
+ error_label->add_color_override("color",Color(1,0.4,0.3));
+ error_hb->add_child(error_label);
+
+ description = NULL;
+
+ set_process(true);
+
+ downloads_scroll = memnew( ScrollContainer );
+ downloads_scroll->set_enable_h_scroll(true);
+ downloads_scroll->set_enable_v_scroll(false);
+ library_main->add_child(downloads_scroll);
+ downloads_hb = memnew( HBoxContainer );
+ downloads_scroll->add_child(downloads_hb);
+
+ asset_open = memnew( EditorFileDialog );
+
+ asset_open->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ asset_open->add_filter("*.zip ; "+TTR("Assets ZIP File"));
+ asset_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ add_child(asset_open);
+ asset_open->connect("file_selected",this,"_asset_file_selected");
+
+ asset_installer=NULL;
+
+}
+
+
+///////
+
+
+void AssetLibraryEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ addon_library->show();
+ } else {
+
+ addon_library->hide();
+ }
+
+}
+
+AssetLibraryEditorPlugin::AssetLibraryEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ addon_library = memnew( EditorAssetLibrary );
+ addon_library->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor->get_viewport()->add_child(addon_library);
+ addon_library->set_area_as_parent_rect();
+ addon_library->hide();
+
+}
+
+AssetLibraryEditorPlugin::~AssetLibraryEditorPlugin() {
+
+}
diff --git a/editor/asset_library_editor_plugin.h b/editor/asset_library_editor_plugin.h
new file mode 100644
index 0000000000..0598ea90ea
--- /dev/null
+++ b/editor/asset_library_editor_plugin.h
@@ -0,0 +1,342 @@
+/*************************************************************************/
+/* asset_library_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ASSET_LIBRARY_EDITOR_PLUGIN_H
+#define ASSET_LIBRARY_EDITOR_PLUGIN_H
+
+
+#include "editor_plugin.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/link_button.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/progress_bar.h"
+#include "scene/gui/separator.h"
+
+#include "scene/gui/grid_container.h"
+#include "scene/gui/scroll_container.h"
+#include "scene/gui/texture_button.h"
+#include "scene/gui/rich_text_label.h"
+#include "editor_plugin_settings.h"
+
+#include "scene/main/http_request.h"
+#include "editor_asset_installer.h"
+
+class EditorAssetLibraryItem : public PanelContainer {
+
+ GDCLASS( EditorAssetLibraryItem, PanelContainer );
+
+ TextureButton *icon;
+ LinkButton* title;
+ LinkButton* category;
+ LinkButton* author;
+ TextureRect *stars[5];
+ Label* price;
+
+ int asset_id;
+ int category_id;
+ int author_id;
+
+
+ void _asset_clicked();
+ void _category_clicked();
+ void _author_clicked();
+
+
+ void set_image(int p_type,int p_index,const Ref<Texture>& p_image);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void configure(const String& p_title,int p_asset_id,const String& p_category,int p_category_id,const String& p_author,int p_author_id,int p_rating,const String& p_cost);
+
+
+ EditorAssetLibraryItem();
+};
+
+
+class EditorAssetLibraryItemDescription : public ConfirmationDialog {
+
+ GDCLASS(EditorAssetLibraryItemDescription, ConfirmationDialog);
+
+ EditorAssetLibraryItem *item;
+ RichTextLabel *description;
+ ScrollContainer *previews;
+ HBoxContainer *preview_hb;
+
+ struct Preview {
+ int id;
+ bool is_video;
+ String video_link;
+ Button *button;
+ Ref<Texture> image;
+ };
+
+ Vector<Preview> preview_images;
+ TextureRect *preview;
+
+ void set_image(int p_type,int p_index,const Ref<Texture>& p_image);
+
+ int asset_id;
+ String download_url;
+ String title;
+ String sha256;
+ Ref<Texture> icon;
+
+ void _link_click(const String& p_url);
+ void _preview_click(int p_index);
+protected:
+
+ static void _bind_methods();
+public:
+
+ void configure(const String& p_title,int p_asset_id,const String& p_category,int p_category_id,const String& p_author,int p_author_id,int p_rating,const String& p_cost,int p_version,const String& p_version_string,const String& p_description,const String& p_download_url,const String& p_browse_url,const String& p_sha256_hash);
+ void add_preview(int p_id, bool p_video,const String& p_url);
+
+ String get_title() { return title; }
+ Ref<Texture> get_preview_icon() { return icon; }
+ String get_download_url() { return download_url; }
+ int get_asset_id() { return asset_id; }
+ String get_sha256() { return sha256; }
+ EditorAssetLibraryItemDescription();
+
+};
+
+class EditorAssetLibraryItemDownload : public PanelContainer {
+
+ GDCLASS(EditorAssetLibraryItemDownload, PanelContainer);
+
+
+ TextureRect *icon;
+ Label* title;
+ ProgressBar *progress;
+ Button *install;
+ Button *retry;
+ TextureButton *dismiss;
+
+ AcceptDialog *download_error;
+ HTTPRequest *download;
+ String host;
+ String sha256;
+ Label *status;
+
+ int prev_status;
+
+ int asset_id;
+
+ bool external_install;
+
+ EditorAssetInstaller *asset_installer;
+
+ void _close();
+ void _install();
+ void _make_request();
+ void _http_download_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_external_install(bool p_enable) { external_install=p_enable; }
+ int get_asset_id() { return asset_id; }
+ void configure(const String& p_title,int p_asset_id,const Ref<Texture>& p_preview, const String& p_download_url, const String& p_sha256_hash);
+ EditorAssetLibraryItemDownload();
+
+};
+
+class EditorAssetLibrary : public PanelContainer {
+ GDCLASS(EditorAssetLibrary,PanelContainer);
+
+ String host;
+
+ EditorFileDialog *asset_open;
+ EditorAssetInstaller *asset_installer;
+
+
+ void _asset_open();
+ void _asset_file_selected(const String& p_file);
+
+
+ ScrollContainer *library_scroll;
+ VBoxContainer *library_vb;
+ LineEdit *filter;
+ OptionButton *categories;
+ OptionButton *repository;
+ OptionButton *sort;
+ ToolButton *reverse;
+ Button *search;
+ ProgressBar *load_status;
+ HBoxContainer *error_hb;
+ Label *error_label;
+ MenuButton *support;
+
+ HBoxContainer *contents;
+
+ HBoxContainer *asset_top_page;
+ GridContainer *asset_items;
+ HBoxContainer *asset_bottom_page;
+
+ HTTPRequest *request;
+
+ bool templates_only;
+
+ enum Support {
+ SUPPORT_OFFICIAL,
+ SUPPORT_COMMUNITY,
+ SUPPORT_TESTING,
+ SUPPORT_MAX
+ };
+
+ enum SortOrder {
+ SORT_RATING,
+ SORT_DOWNLOADS,
+ SORT_NAME,
+ SORT_COST,
+ SORT_UPDATED,
+ SORT_MAX
+ };
+
+
+ static const char* sort_key[SORT_MAX];
+ static const char* sort_text[SORT_MAX];
+ static const char* support_key[SUPPORT_MAX];
+
+
+ ///MainListing
+
+ enum ImageType {
+ IMAGE_QUEUE_ICON,
+ IMAGE_QUEUE_THUMBNAIL,
+ IMAGE_QUEUE_SCREENSHOT,
+
+ };
+
+ struct ImageQueue {
+
+ bool active;
+ int queue_id;
+ int asset_id;
+ ImageType image_type;
+ int image_index;
+ String image_url;
+ HTTPRequest *request;
+ ObjectID target;
+ };
+
+ int last_queue_id;
+ Map<int,ImageQueue> image_queue;
+
+ void _image_update(bool use_cache, bool final, const PoolByteArray& p_data, int p_queue_id);
+ void _image_request_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data, int p_queue_id);
+ void _request_image(ObjectID p_for,String p_image_url,ImageType p_type,int p_image_index);
+ void _update_image_queue();
+
+ HBoxContainer* _make_pages(int p_page, int p_page_count, int p_page_len, int p_total_items, int p_current_items);
+
+ //
+ EditorAssetLibraryItemDescription *description;
+ //
+
+ enum RequestType {
+ REQUESTING_NONE,
+ REQUESTING_CONFIG,
+ REQUESTING_SEARCH,
+ REQUESTING_ASSET,
+ };
+
+
+ RequestType requesting;
+ Dictionary category_map;
+
+
+ ScrollContainer *downloads_scroll;
+ HBoxContainer *downloads_hb;
+
+
+
+ void _install_asset();
+
+ void _select_author(int p_id);
+ void _select_category(int p_id);
+ void _select_asset(int p_id);
+
+ void _manage_plugins();
+
+ void _search(int p_page=0);
+ void _rerun_search(int p_ignore);
+ void _api_request(const String& p_request, RequestType p_request_type, const String &p_arguments="");
+ void _http_request_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data);
+ void _http_download_completed(int p_status, int p_code, const PoolStringArray& headers, const PoolByteArray& p_data);
+
+ void _repository_changed(int p_repository_id);
+ void _support_toggled(int p_support);
+
+ void _install_external_asset(String p_zip_path,String p_title);
+
+friend class EditorAssetLibraryItemDescription;
+friend class EditorAssetLibraryItem;
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+ EditorAssetLibrary(bool p_templates_only=false);
+};
+
+class AssetLibraryEditorPlugin : public EditorPlugin {
+
+ GDCLASS( AssetLibraryEditorPlugin, EditorPlugin );
+
+ EditorAssetLibrary *addon_library;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "AssetLib"; }
+ bool has_main_screen() const { return true; }
+ virtual void edit(Object *p_object) {}
+ virtual bool handles(Object *p_object) const { return false; }
+ virtual void make_visible(bool p_visible);
+ //virtual bool get_remove_list(List<Node*> *p_list) { return canvas_item_editor->get_remove_list(p_list); }
+ //virtual Dictionary get_state() const;
+ //virtual void set_state(const Dictionary& p_state);
+
+ AssetLibraryEditorPlugin(EditorNode *p_node);
+ ~AssetLibraryEditorPlugin();
+
+};
+
+#endif // EDITORASSETLIBRARY_H
diff --git a/editor/call_dialog.cpp b/editor/call_dialog.cpp
new file mode 100644
index 0000000000..6dfeb87dfd
--- /dev/null
+++ b/editor/call_dialog.cpp
@@ -0,0 +1,341 @@
+/*************************************************************************/
+/* call_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "call_dialog.h"
+
+#if 0
+#include "scene/gui/label.h"
+#include "class_db.h"
+#include "print_string.h"
+
+
+class CallDialogParams : public Object {
+
+ GDCLASS( CallDialogParams, Object );
+public:
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ values[p_name]=p_value;
+ return true;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ if (values.has(p_name)) {
+ r_ret=values[p_name];
+ return true;
+ }
+ return false;
+ }
+
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ for(int i=0;i<method.arguments.size();i++)
+ p_list->push_back(method.arguments[i]);
+ }
+
+ MethodInfo method;
+ HashMap<String,Variant> values;
+
+ CallDialogParams() {}
+};
+
+
+void CallDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+
+ call->connect("pressed", this,"_call");
+ cancel->connect("pressed", this,"_cancel");
+ //filter->get_path()->connect("text_changed", this,"_text_changed");
+ _update_method_list();
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ call->disconnect("pressed", this,"_call");
+ cancel->disconnect("pressed", this,"_cancel");
+
+ //filter->get_path()->connect("text_changed", this,"_text_changed");
+ _update_method_list();
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ RID ci = get_canvas_item();
+ get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+}
+
+
+void CallDialog::_call() {
+
+ if (!tree->get_selected())
+ return;
+
+ TreeItem* item=tree->get_selected();
+ ERR_FAIL_COND(!item);
+ int idx=item->get_metadata(0);
+ ERR_FAIL_INDEX(idx,methods.size());
+ MethodInfo &m = methods[idx];
+
+ Variant args[VARIANT_ARG_MAX];
+
+ for(int i=0;i<VARIANT_ARG_MAX;i++) {
+
+ if (i>=m.arguments.size())
+ continue;
+
+ if (call_params->values.has(m.arguments[i].name))
+ args[i]=call_params->values[m.arguments[i].name];
+ }
+
+ Variant ret = object->call(m.name,args[0],args[1],args[2],args[3],args[4]);
+ if (ret.get_type()!=Variant::NIL)
+ return_value->set_text(ret);
+ else
+ return_value->set_text("");
+}
+
+void CallDialog::_cancel() {
+
+ hide();
+}
+
+
+void CallDialog::_item_selected() {
+
+ TreeItem* item=tree->get_selected();
+ ERR_FAIL_COND(!item);
+
+ if (item->get_metadata(0).get_type()==Variant::NIL) {
+
+ call->set_disabled(true);
+ return;
+ }
+
+ call->set_disabled(false);
+
+ int idx=item->get_metadata(0);
+ ERR_FAIL_INDEX(idx,methods.size());
+
+ MethodInfo &m = methods[idx];
+
+ call_params->values.clear();
+ call_params->method=m;
+
+ property_editor->edit(call_params);
+ property_editor->update_tree();
+
+
+}
+
+void CallDialog::_update_method_list() {
+
+ tree->clear();
+ if (!object)
+ return;
+
+ TreeItem *root = tree->create_item();
+
+ List<MethodInfo> method_list;
+ object->get_method_list(&method_list);
+ method_list.sort();
+ methods.clear();
+
+ List<String> inheritance_list;
+
+ String type = object->get_class();
+
+ while(type!="") {
+ inheritance_list.push_back( type );
+ type=ClassDB::get_parent_class(type);
+ }
+
+ TreeItem *selected_item=NULL;
+
+ for(int i=0;i<inheritance_list.size();i++) {
+
+ String type=inheritance_list[i];
+ String parent_type=ClassDB::get_parent_class(type);
+
+ TreeItem *type_item=NULL;
+
+ List<MethodInfo>::Element *N,*E=method_list.front();
+
+ while(E) {
+
+ N=E->next();
+
+ if (parent_type!="" && ClassDB::get_method(parent_type,E->get().name)!=NULL) {
+ E=N;
+ continue;
+ }
+
+ if (!type_item) {
+ type_item=tree->create_item(root);
+ type_item->set_text(0,type);
+ if (has_icon(type,"EditorIcons"))
+ type_item->set_icon(0,get_icon(type,"EditorIcons"));
+ }
+
+ TreeItem *method_item = tree->create_item(type_item);
+ method_item->set_text(0,E->get().name);
+ method_item->set_metadata(0,methods.size());
+ if (E->get().name==selected)
+ selected_item=method_item;
+ methods.push_back( E->get() );
+
+ method_list.erase(E);
+ E=N;
+ }
+ }
+
+
+
+ if (selected_item)
+ selected_item->select(0);
+}
+
+void CallDialog::_bind_methods() {
+
+ ClassDB::bind_method("_call",&CallDialog::_call);
+ ClassDB::bind_method("_cancel",&CallDialog::_cancel);
+ ClassDB::bind_method("_item_selected", &CallDialog::_item_selected);
+
+}
+
+void CallDialog::set_object(Object *p_object,StringName p_selected) {
+
+ object=p_object;
+ selected=p_selected;
+ property_editor->edit(NULL);
+ call->set_disabled(true);
+ return_value->clear();
+
+ _update_method_list();
+ method_label->set_text(vformat(TTR("Method List For '%s':"),p_object->get_class()));
+}
+
+CallDialog::CallDialog() {
+
+ object=NULL;
+
+ call = memnew( Button );
+ call->set_anchor( MARGIN_LEFT, ANCHOR_END );
+ call->set_anchor( MARGIN_TOP, ANCHOR_END );
+ call->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ call->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ call->set_begin( Point2( 70, 29 ) );
+ call->set_end( Point2( 15, 15 ) );
+ call->set_text(TTR("Call"));
+
+ add_child(call);
+
+ cancel = memnew( Button );
+ cancel->set_anchor( MARGIN_TOP, ANCHOR_END );
+ cancel->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ cancel->set_begin( Point2( 15, 29 ) );
+ cancel->set_end( Point2( 70, 15 ) );
+ cancel->set_text(TTR("Close"));
+
+ add_child(cancel);
+
+ tree = memnew( Tree );
+
+ tree->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ tree->set_begin( Point2( 20,50 ) );
+ tree->set_margin(MARGIN_BOTTOM, 44 );
+ tree->set_margin(MARGIN_RIGHT, 0.5 );
+ tree->set_select_mode( Tree::SELECT_ROW );
+ add_child(tree);
+
+ tree->connect("item_selected", this,"_item_selected");
+ tree->set_hide_root(true);
+
+ property_editor = memnew( PropertyEditor );
+
+ property_editor->set_anchor_and_margin( MARGIN_RIGHT, ANCHOR_END, 15 );
+ property_editor->set_anchor_and_margin( MARGIN_TOP, ANCHOR_BEGIN, 50 );
+ //property_editor->set_anchor_and_margin( MARGIN_LEFT, ANCHOR_RATIO, 0.55 );
+ property_editor->set_anchor_and_margin( MARGIN_BOTTOM, ANCHOR_END, 90 );
+ property_editor->get_scene_tree()->set_hide_root( true );
+ property_editor->hide_top_label();
+
+ add_child(property_editor);
+ method_label = memnew( Label );
+ method_label->set_pos( Point2( 15,25) );
+ method_label->set_text(TTR("Method List:"));
+
+ add_child(method_label);
+
+ Label *label = memnew( Label );
+ //label->set_anchor_and_margin( MARGIN_LEFT, ANCHOR_RATIO, 0.53 );
+ label->set_anchor_and_margin( MARGIN_TOP, ANCHOR_BEGIN, 25 );
+ label->set_text(TTR("Arguments:"));
+
+ add_child(label);
+
+ return_label = memnew( Label );
+ //return_label->set_anchor_and_margin( MARGIN_LEFT, ANCHOR_RATIO, 0.53 );
+ return_label->set_anchor_and_margin( MARGIN_TOP, ANCHOR_END, 85 );
+ return_label->set_text(TTR("Return:"));
+
+ add_child(return_label);
+
+ return_value = memnew( LineEdit );
+ //return_value->set_anchor_and_margin( MARGIN_LEFT, ANCHOR_RATIO, 0.55 );
+ return_value->set_anchor_and_margin( MARGIN_RIGHT, ANCHOR_END, 15 );
+ return_value->set_anchor_and_margin( MARGIN_TOP, ANCHOR_END, 65 );
+
+ add_child(return_value);
+
+ /*
+ label = memnew( Label );
+ label->set_anchor( MARGIN_TOP, ANCHOR_END );
+ label->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+
+ label->set_begin( Point2( 15,54) );
+ label->set_end( Point2( 16,44) );
+ label->set_text("Parameters:");
+
+ add_child(label);
+ */
+
+
+ call_params = memnew( CallDialogParams );
+ set_as_toplevel(true);
+}
+
+
+CallDialog::~CallDialog()
+{
+ memdelete(call_params);
+}
+#endif
diff --git a/editor/call_dialog.h b/editor/call_dialog.h
new file mode 100644
index 0000000000..56fc07c3df
--- /dev/null
+++ b/editor/call_dialog.h
@@ -0,0 +1,85 @@
+/*************************************************************************/
+/* call_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CALL_DIALOG_H
+#define CALL_DIALOG_H
+
+#include "scene/gui/popup.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/line_edit.h"
+#include "editor/property_editor.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+#if 0
+
+class CallDialogParams;
+
+class CallDialog : public Popup {
+
+ GDCLASS( CallDialog, Popup );
+
+
+ Label* method_label;
+ Tree *tree;
+ Button *call;
+ Button *cancel;
+
+ CallDialogParams *call_params;
+ PropertyEditor *property_editor;
+
+ Label *return_label;
+ LineEdit *return_value;
+ Object *object;
+ StringName selected;
+
+ Vector<MethodInfo> methods;
+
+
+ void _item_selected();
+ void _update_method_list();
+ void _call();
+ void _cancel();
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void set_object(Object *p_object,StringName p_selected="");
+
+ CallDialog();
+ ~CallDialog();
+
+};
+
+#endif
+#endif
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
new file mode 100644
index 0000000000..8e9925a0d3
--- /dev/null
+++ b/editor/code_editor.cpp
@@ -0,0 +1,1323 @@
+/*************************************************************************/
+/* code_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "code_editor.h"
+
+#include "editor_settings.h"
+#include "scene/gui/margin_container.h"
+#include "scene/gui/separator.h"
+#include "scene/resources/dynamic_font.h"
+#include "os/keyboard.h"
+#include "editor/editor_scale.h"
+
+void GotoLineDialog::popup_find_line(TextEdit *p_edit) {
+
+ text_editor=p_edit;
+
+ line->set_text(itos(text_editor->cursor_get_line()));
+ line->select_all();
+ popup_centered(Size2(180,80));
+ line->grab_focus();
+}
+
+
+int GotoLineDialog::get_line() const {
+
+ return line->get_text().to_int();
+}
+
+
+void GotoLineDialog::ok_pressed() {
+
+ if (get_line()<1 || get_line()>text_editor->get_line_count())
+ return;
+ text_editor->cursor_set_line(get_line()-1);
+ hide();
+}
+
+GotoLineDialog::GotoLineDialog() {
+
+ set_title(TTR("Go to Line"));
+ Label *l = memnew(Label);
+ l->set_text(TTR("Line Number:"));
+ l->set_pos(Point2(5,5));
+ add_child(l);
+
+ line = memnew( LineEdit );
+ line->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ line->set_begin( Point2(15,22) );
+ line->set_end( Point2(15,35) );
+ add_child(line);
+ register_text_enter(line);
+ text_editor=NULL;
+
+ set_hide_on_ok(false);
+}
+
+
+void FindReplaceBar::_notification(int p_what) {
+
+ if (p_what == NOTIFICATION_READY) {
+
+ find_prev->set_icon(get_icon("MoveUp", "EditorIcons"));
+ find_next->set_icon(get_icon("MoveDown", "EditorIcons"));
+ hide_button->set_normal_texture(get_icon("Close","EditorIcons"));
+ hide_button->set_hover_texture(get_icon("CloseHover","EditorIcons"));
+ hide_button->set_pressed_texture(get_icon("Close","EditorIcons"));
+
+ } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+
+ set_process_unhandled_input(is_visible_in_tree());
+ }
+}
+
+void FindReplaceBar::_unhandled_input(const InputEvent &p_event) {
+
+ if (p_event.type == InputEvent::KEY) {
+
+ const InputEventKey& k = p_event.key;
+
+ if (k.pressed && (text_edit->has_focus() || text_vbc->is_a_parent_of(get_focus_owner()))) {
+
+ bool accepted = true;
+
+ switch (k.scancode) {
+
+ case KEY_ESCAPE: {
+
+ _hide_bar();
+ } break;
+ default: {
+
+ accepted = false;
+ } break;
+ }
+
+ if (accepted) {
+ accept_event();
+ }
+ }
+ }
+}
+
+bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) {
+
+ int line, col;
+ String text=get_search_text();
+
+ bool found=text_edit->search(text,p_flags,p_from_line,p_from_col,line,col);
+
+ if (found) {
+ if (!preserve_cursor) {
+ text_edit->cursor_set_line(line, false);
+ text_edit->cursor_set_column(col+text.length(), false);
+ text_edit->center_viewport_to_cursor();
+ }
+
+ text_edit->set_search_text(text);
+ text_edit->set_search_flags(p_flags);
+ text_edit->set_current_search_result(line,col);
+
+ result_line=line;
+ result_col=col;
+
+ set_error("");
+ } else {
+ result_line=-1;
+ result_col=-1;
+ text_edit->set_search_text("");
+ set_error(text.empty()?"":TTR("No Matches"));
+ }
+
+ return found;
+}
+
+void FindReplaceBar::_replace() {
+
+ if (result_line!=-1 && result_col!=-1) {
+ text_edit->begin_complex_operation();
+
+ text_edit->select(result_line,result_col,result_line,result_col+get_search_text().length());
+ text_edit->insert_text_at_cursor(get_replace_text());
+
+ text_edit->end_complex_operation();
+ }
+
+ search_current();
+}
+
+void FindReplaceBar::_replace_all() {
+
+ // line as x so it gets priority in comparison, column as y
+ Point2i orig_cursor(text_edit->cursor_get_line(),text_edit->cursor_get_column());
+ Point2i prev_match=Point2(-1,-1);
+
+ bool selection_enabled = text_edit->is_selection_active();
+ Point2i selection_begin,selection_end;
+ if (selection_enabled) {
+ selection_begin=Point2i(text_edit->get_selection_from_line(),text_edit->get_selection_from_column());
+ selection_end=Point2i(text_edit->get_selection_to_line(),text_edit->get_selection_to_column());
+ }
+
+ int vsval = text_edit->get_v_scroll();
+
+ text_edit->cursor_set_line(0);
+ text_edit->cursor_set_column(0);
+
+ String replace_text=get_replace_text();
+ int search_text_len=get_search_text().length();
+
+ int rc=0;
+
+ replace_all_mode = true;
+
+ text_edit->begin_complex_operation();
+
+ while (search_next()) {
+
+ // replace area
+ Point2i match_from(result_line,result_col);
+ Point2i match_to(result_line,result_col+search_text_len);
+
+ if (match_from < prev_match)
+ break; // done
+
+ prev_match=Point2i(result_line,result_col+replace_text.length());
+
+ text_edit->select(result_line,result_col,result_line,match_to.y);
+
+ if (selection_enabled && is_selection_only()) {
+
+ if (match_from<selection_begin || match_to>selection_end)
+ continue;
+
+ // replace but adjust selection bounds
+ text_edit->insert_text_at_cursor(replace_text);
+ if (match_to.x==selection_end.x)
+ selection_end.y+=replace_text.length()-search_text_len;
+ } else {
+ // just replace
+ text_edit->insert_text_at_cursor(replace_text);
+ }
+
+ rc++;
+ }
+
+ text_edit->end_complex_operation();
+
+ replace_all_mode = false;
+
+ // restore editor state (selection, cursor, scroll)
+ text_edit->cursor_set_line(orig_cursor.x);
+ text_edit->cursor_set_column(orig_cursor.y);
+
+ if (selection_enabled && is_selection_only()) {
+ // reselect
+ text_edit->select(selection_begin.x,selection_begin.y,selection_end.x,selection_end.y);
+ } else {
+ text_edit->deselect();
+ }
+
+ text_edit->set_v_scroll(vsval);
+ set_error(vformat(TTR("Replaced %d Ocurrence(s)."), rc));
+}
+
+void FindReplaceBar::_get_search_from(int& r_line, int& r_col) {
+
+ r_line=text_edit->cursor_get_line();
+ r_col=text_edit->cursor_get_column();
+
+ if (text_edit->is_selection_active() && !replace_all_mode) {
+
+ int selection_line=text_edit->get_selection_from_line();
+
+ if (text_edit->get_selection_text()==get_search_text() && r_line==selection_line) {
+
+ int selection_from_col=text_edit->get_selection_from_column();
+
+ if (r_col>=selection_from_col && r_col<=text_edit->get_selection_to_column()) {
+ r_col=selection_line;
+ r_col=selection_from_col;
+ }
+ }
+ }
+
+ if (r_line==result_line && r_col>=result_col && r_col<=result_col+get_search_text().length()) {
+ r_col=result_col;
+ }
+}
+
+bool FindReplaceBar::search_current() {
+
+ uint32_t flags=0;
+
+ if (is_whole_words())
+ flags|=TextEdit::SEARCH_WHOLE_WORDS;
+ if (is_case_sensitive())
+ flags|=TextEdit::SEARCH_MATCH_CASE;
+
+ int line, col;
+ _get_search_from(line, col);
+
+ return _search(flags,line,col);
+}
+
+bool FindReplaceBar::search_prev() {
+
+ uint32_t flags=0;
+ String text = get_search_text();
+
+ if (is_whole_words())
+ flags|=TextEdit::SEARCH_WHOLE_WORDS;
+ if (is_case_sensitive())
+ flags|=TextEdit::SEARCH_MATCH_CASE;
+
+ flags|=TextEdit::SEARCH_BACKWARDS;
+
+ int line, col;
+ _get_search_from(line, col);
+
+ col-=text.length();
+ if (col<0) {
+ line-=1;
+ if (line<0)
+ line=text_edit->get_line_count()-1;
+ col=text_edit->get_line(line).length();
+ }
+
+ return _search(flags,line,col);
+}
+
+bool FindReplaceBar::search_next() {
+
+ uint32_t flags=0;
+ String text = get_search_text();
+
+ if (is_whole_words())
+ flags|=TextEdit::SEARCH_WHOLE_WORDS;
+ if (is_case_sensitive())
+ flags|=TextEdit::SEARCH_MATCH_CASE;
+
+ int line, col;
+ _get_search_from(line, col);
+
+ if (line==result_line && col==result_col) {
+ col+=text.length();
+ if (col>text_edit->get_line(line).length()) {
+ line+=1;
+ if (line>=text_edit->get_line_count())
+ line=0;
+ col=0;
+ }
+ }
+
+ return _search(flags,line,col);
+}
+
+void FindReplaceBar::_hide_bar() {
+
+ if (replace_text->has_focus() || search_text->has_focus())
+ text_edit->grab_focus();
+
+ text_edit->set_search_text("");
+ result_line = -1;
+ result_col = -1;
+ replace_hbc->hide();
+ replace_options_hbc->hide();
+ hide();
+}
+
+void FindReplaceBar::_show_search() {
+
+ show();
+ search_text->grab_focus();
+
+ if (text_edit->is_selection_active() && !selection_only->is_pressed()) {
+ search_text->set_text(text_edit->get_selection_text());
+ }
+
+ if (!get_search_text().empty()) {
+ search_text->select_all();
+ search_text->set_cursor_pos(search_text->get_text().length());
+ search_current();
+ }
+}
+
+void FindReplaceBar::popup_search() {
+
+ replace_hbc->hide();
+ replace_options_hbc->hide();
+ _show_search();
+}
+
+void FindReplaceBar::popup_replace() {
+
+
+ if (!replace_hbc->is_visible_in_tree() || !replace_options_hbc->is_visible_in_tree()) {
+ replace_text->clear();
+ replace_hbc->show();
+ replace_options_hbc->show();
+
+ }
+
+ selection_only->set_pressed( (text_edit->is_selection_active() && text_edit->get_selection_from_line() < text_edit->get_selection_to_line()) );
+
+ _show_search();
+}
+
+void FindReplaceBar::_search_options_changed(bool p_pressed) {
+
+ search_current();
+}
+
+void FindReplaceBar::_editor_text_changed() {
+
+ if (is_visible_in_tree()) {
+ preserve_cursor=true;
+ search_current();
+ preserve_cursor=false;
+ }
+}
+
+void FindReplaceBar::_search_text_changed(const String& p_text) {
+
+ search_current();
+}
+
+void FindReplaceBar::_search_text_entered(const String& p_text) {
+
+ search_next();
+}
+
+void FindReplaceBar::_replace_text_entered(const String& p_text) {
+
+ if (selection_only->is_pressed() && text_edit->is_selection_active()) {
+ _replace_all();
+ _hide_bar();
+ }
+}
+
+String FindReplaceBar::get_search_text() const {
+
+ return search_text->get_text();
+}
+
+String FindReplaceBar::get_replace_text() const {
+
+ return replace_text->get_text();
+}
+
+bool FindReplaceBar::is_case_sensitive() const {
+
+ return case_sensitive->is_pressed();
+}
+
+bool FindReplaceBar::is_whole_words() const {
+
+ return whole_words->is_pressed();
+}
+
+bool FindReplaceBar::is_selection_only() const {
+
+ return selection_only->is_pressed();
+}
+
+void FindReplaceBar::set_error(const String &p_label) {
+
+ error_label->set_text(p_label);
+}
+
+void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) {
+
+ text_edit = p_text_edit;
+ text_edit->connect("text_changed",this,"_editor_text_changed");
+}
+
+void FindReplaceBar::_bind_methods() {
+
+ ClassDB::bind_method("_unhandled_input",&FindReplaceBar::_unhandled_input);
+
+ ClassDB::bind_method("_editor_text_changed",&FindReplaceBar::_editor_text_changed);
+ ClassDB::bind_method("_search_text_changed",&FindReplaceBar::_search_text_changed);
+ ClassDB::bind_method("_search_text_entered",&FindReplaceBar::_search_text_entered);
+ ClassDB::bind_method("_replace_text_entered",&FindReplaceBar::_replace_text_entered);
+ ClassDB::bind_method("_search_current",&FindReplaceBar::search_current);
+ ClassDB::bind_method("_search_next",&FindReplaceBar::search_next);
+ ClassDB::bind_method("_search_prev",&FindReplaceBar::search_prev);
+ ClassDB::bind_method("_replace_pressed",&FindReplaceBar::_replace);
+ ClassDB::bind_method("_replace_all_pressed",&FindReplaceBar::_replace_all);
+ ClassDB::bind_method("_search_options_changed",&FindReplaceBar::_search_options_changed);
+ ClassDB::bind_method("_hide_pressed",&FindReplaceBar::_hide_bar);
+
+ ADD_SIGNAL(MethodInfo("search"));
+}
+
+FindReplaceBar::FindReplaceBar() {
+
+ replace_all_mode=false;
+ preserve_cursor=false;
+
+ text_vbc = memnew(VBoxContainer);
+ add_child(text_vbc);
+
+ HBoxContainer *search_hbc = memnew(HBoxContainer);
+ text_vbc->add_child(search_hbc);
+
+ search_text = memnew(LineEdit);
+ search_hbc->add_child(search_text);
+ search_text->set_custom_minimum_size(Size2(200, 0));
+ search_text->connect("text_changed",this,"_search_text_changed");
+ search_text->connect("text_entered",this,"_search_text_entered");
+
+ find_prev = memnew(ToolButton);
+ search_hbc->add_child(find_prev);
+ find_prev->set_focus_mode(FOCUS_NONE);
+ find_prev->connect("pressed",this,"_search_prev");
+
+ find_next = memnew(ToolButton);
+ search_hbc->add_child(find_next);
+ find_next->set_focus_mode(FOCUS_NONE);
+ find_next->connect("pressed",this,"_search_next");
+
+ replace_hbc = memnew(HBoxContainer);
+ text_vbc->add_child(replace_hbc);
+ replace_hbc->hide();
+
+ replace_text = memnew(LineEdit);
+ replace_hbc->add_child(replace_text);
+ replace_text->set_custom_minimum_size(Size2(200, 0));
+ replace_text->connect("text_entered",this,"_replace_text_entered");
+
+
+ replace = memnew(Button);
+ replace_hbc->add_child(replace);
+ replace->set_text(TTR("Replace"));
+ //replace->set_focus_mode(FOCUS_NONE);
+ replace->connect("pressed",this,"_replace_pressed");
+
+ replace_all = memnew(Button);
+ replace_hbc->add_child(replace_all);
+ replace_all->set_text(TTR("Replace All"));
+ //replace_all->set_focus_mode(FOCUS_NONE);
+ replace_all->connect("pressed",this,"_replace_all_pressed");
+
+ Control *spacer_split = memnew( Control );
+ spacer_split->set_custom_minimum_size(Size2(0, 1));
+ text_vbc->add_child(spacer_split);
+
+ VBoxContainer *options_vbc = memnew(VBoxContainer);
+ add_child(options_vbc);
+ options_vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *search_options = memnew(HBoxContainer);
+ options_vbc->add_child(search_options);
+
+ case_sensitive = memnew(CheckBox);
+ search_options->add_child(case_sensitive);
+ case_sensitive->set_text(TTR("Match Case"));
+ case_sensitive->set_focus_mode(FOCUS_NONE);
+ case_sensitive->connect("toggled",this,"_search_options_changed");
+
+ whole_words = memnew(CheckBox);
+ search_options->add_child(whole_words);
+ whole_words->set_text(TTR("Whole Words"));
+ whole_words->set_focus_mode(FOCUS_NONE);
+ whole_words->connect("toggled",this,"_search_options_changed");
+
+ error_label = memnew(Label);
+ search_options->add_child(error_label);
+ error_label->add_color_override("font_color", Color(1,1,0,1));
+ error_label->add_color_override("font_color_shadow", Color(0,0,0,1));
+ error_label->add_constant_override("shadow_as_outline", 1);
+
+ search_options->add_spacer();
+
+ hide_button = memnew(TextureButton);
+ search_options->add_child(hide_button);
+ hide_button->set_focus_mode(FOCUS_NONE);
+ hide_button->connect("pressed",this,"_hide_pressed");
+
+ replace_options_hbc = memnew(HBoxContainer);
+ options_vbc->add_child(replace_options_hbc);
+ replace_options_hbc->hide();
+
+ selection_only = memnew(CheckBox);
+ replace_options_hbc->add_child(selection_only);
+ selection_only->set_text(TTR("Selection Only"));
+ selection_only->set_focus_mode(FOCUS_NONE);
+ selection_only->connect("toggled",this,"_search_options_changed");
+}
+
+
+void FindReplaceDialog::popup_search() {
+
+ set_title(TTR("Search"));
+ replace_mc->hide();
+ replace_label->hide();
+ replace_vb->hide();
+ skip->hide();
+ popup_centered(Point2(300,190));
+ get_ok()->set_text(TTR("Find"));
+ search_text->grab_focus();
+ if (text_edit->is_selection_active() && ( text_edit->get_selection_from_line() == text_edit->get_selection_to_line())) {
+
+ search_text->set_text( text_edit->get_selection_text() );
+ }
+ search_text->select_all();
+
+ error_label->set_text("");
+
+}
+
+void FindReplaceDialog::popup_replace() {
+
+
+ set_title(TTR("Replace"));
+ bool do_selection=(text_edit->is_selection_active() && text_edit->get_selection_from_line() < text_edit->get_selection_to_line());
+
+ set_replace_selection_only(do_selection);
+
+ if (!do_selection && text_edit->is_selection_active()) {
+ search_text->set_text(text_edit->get_selection_text());
+ }
+
+ replace_mc->show();
+ replace_label->show();
+ replace_vb->show();
+ popup_centered(Point2(300,300));
+ if (search_text->get_text()!="" && replace_text->get_text()=="") {
+ search_text->select(0,0);
+ replace_text->grab_focus();
+ } else {
+ search_text->grab_focus();
+ search_text->select_all();
+ }
+ error_label->set_text("");
+
+ if (prompt->is_pressed()) {
+ skip->show();
+ get_ok()->set_text(TTR("Next"));
+ selection_only->set_disabled(true);
+
+ } else {
+ skip->hide();
+ get_ok()->set_text(TTR("Replace"));
+ selection_only->set_disabled(false);
+ }
+
+}
+
+void FindReplaceDialog::_search_callback() {
+
+ if (is_replace_mode())
+ _replace();
+ else
+ _search();
+
+}
+
+void FindReplaceDialog::_replace_skip_callback() {
+
+ _search();
+}
+
+void FindReplaceDialog::_replace() {
+
+ text_edit->begin_complex_operation();
+ if (is_replace_all_mode()) {
+
+ //line as x so it gets priority in comparison, column as y
+ Point2i orig_cursor(text_edit->cursor_get_line(),text_edit->cursor_get_column());
+ Point2i prev_match=Point2(-1,-1);
+
+
+ bool selection_enabled = text_edit->is_selection_active();
+ Point2i selection_begin,selection_end;
+ if (selection_enabled) {
+ selection_begin=Point2i(text_edit->get_selection_from_line(),text_edit->get_selection_from_column());
+ selection_end=Point2i(text_edit->get_selection_to_line(),text_edit->get_selection_to_column());
+ }
+ int vsval = text_edit->get_v_scroll();
+ //int hsval = text_edit->get_h_scroll();
+
+ text_edit->cursor_set_line(0);
+ text_edit->cursor_set_column(0);
+
+ int rc=0;
+
+ while(_search()) {
+
+ if (!text_edit->is_selection_active()) {
+ //search selects
+ break;
+ }
+
+ //replace area
+ Point2i match_from(text_edit->get_selection_from_line(),text_edit->get_selection_from_column());
+ Point2i match_to(text_edit->get_selection_to_line(),text_edit->get_selection_to_column());
+
+ if (match_from < prev_match)
+ break; //done
+
+ prev_match=match_to;
+
+ if (selection_enabled && is_replace_selection_only()) {
+
+ if (match_from<selection_begin || match_to>selection_end)
+ continue;
+
+ //replace but adjust selection bounds
+
+ text_edit->insert_text_at_cursor(get_replace_text());
+ if (match_to.x==selection_end.x)
+ selection_end.y+=get_replace_text().length() - get_search_text().length();
+ } else {
+ //just replace
+ text_edit->insert_text_at_cursor(get_replace_text());
+ }
+ rc++;
+
+ }
+ //restore editor state (selection, cursor, scroll)
+ text_edit->cursor_set_line(orig_cursor.x);
+ text_edit->cursor_set_column(orig_cursor.y);
+
+ if (selection_enabled && is_replace_selection_only()) {
+ //reselect
+ text_edit->select(selection_begin.x,selection_begin.y,selection_end.x,selection_end.y);
+ } else {
+ text_edit->deselect();
+ }
+
+ text_edit->set_v_scroll(vsval);
+ //text_edit->set_h_scroll(hsval);
+ error_label->set_text(vformat(TTR("Replaced %d ocurrence(s)."),rc));
+
+
+ //hide();
+ } else {
+
+ if (text_edit->get_selection_text()==get_search_text()) {
+
+ text_edit->insert_text_at_cursor(get_replace_text());
+ }
+
+ _search();
+ }
+ text_edit->end_complex_operation();
+}
+
+
+
+bool FindReplaceDialog::_search() {
+
+
+ String text=get_search_text();
+ uint32_t flags=0;
+
+ if (is_whole_words())
+ flags|=TextEdit::SEARCH_WHOLE_WORDS;
+ if (is_case_sensitive())
+ flags|=TextEdit::SEARCH_MATCH_CASE;
+ if (is_backwards())
+ flags|=TextEdit::SEARCH_BACKWARDS;
+
+ int line=text_edit->cursor_get_line(),col=text_edit->cursor_get_column();
+
+ if (is_backwards()) {
+ col-=1;
+ if (col<0) {
+ line-=1;
+ if (line<0) {
+ line=text_edit->get_line_count()-1;
+ }
+ col=text_edit->get_line(line).length();
+ }
+ }
+ bool found = text_edit->search(text,flags,line,col,line,col);
+
+
+ if (found) {
+ // print_line("found");
+ text_edit->cursor_set_line(line);
+ if (is_backwards())
+ text_edit->cursor_set_column(col);
+ else
+ text_edit->cursor_set_column(col+text.length());
+ text_edit->select(line,col,line,col+text.length());
+ set_error("");
+ return true;
+ } else {
+
+ set_error(TTR("Not found!"));
+ return false;
+ }
+
+}
+
+void FindReplaceDialog::_prompt_changed() {
+
+ if (prompt->is_pressed()) {
+ skip->show();
+ get_ok()->set_text(TTR("Next"));
+ selection_only->set_disabled(true);
+
+ } else {
+ skip->hide();
+ get_ok()->set_text(TTR("Replace"));
+ selection_only->set_disabled(false);
+ }
+}
+
+
+void FindReplaceDialog::_skip_pressed() {
+
+ _replace_skip_callback();
+}
+
+bool FindReplaceDialog::is_replace_mode() const {
+
+ return replace_text->is_visible_in_tree();
+}
+
+bool FindReplaceDialog::is_replace_all_mode() const {
+
+ return !prompt->is_pressed();
+}
+
+bool FindReplaceDialog::is_replace_selection_only() const {
+
+ return selection_only->is_pressed();
+}
+void FindReplaceDialog::set_replace_selection_only(bool p_enable){
+
+ selection_only->set_pressed(p_enable);
+}
+
+
+void FindReplaceDialog::ok_pressed() {
+
+ _search_callback();
+}
+
+void FindReplaceDialog::_search_text_entered(const String& p_text) {
+
+ if (replace_text->is_visible_in_tree())
+ return;
+ emit_signal("search");
+ _search();
+
+}
+
+void FindReplaceDialog::_replace_text_entered(const String& p_text) {
+
+ if (!replace_text->is_visible_in_tree())
+ return;
+
+ emit_signal("search");
+ _replace();
+
+}
+
+
+String FindReplaceDialog::get_search_text() const {
+
+ return search_text->get_text();
+}
+String FindReplaceDialog::get_replace_text() const {
+
+ return replace_text->get_text();
+}
+bool FindReplaceDialog::is_whole_words() const {
+
+ return whole_words->is_pressed();
+}
+bool FindReplaceDialog::is_case_sensitive() const {
+
+ return case_sensitive->is_pressed();
+
+}
+bool FindReplaceDialog::is_backwards() const {
+
+ return backwards->is_pressed();
+
+}
+
+void FindReplaceDialog::set_error(const String& p_error) {
+
+ error_label->set_text(p_error);
+}
+
+void FindReplaceDialog::set_text_edit(TextEdit *p_text_edit) {
+
+ text_edit=p_text_edit;
+}
+
+void FindReplaceDialog::search_next() {
+ _search();
+}
+
+
+void FindReplaceDialog::_bind_methods() {
+
+ ClassDB::bind_method("_search_text_entered",&FindReplaceDialog::_search_text_entered);
+ ClassDB::bind_method("_replace_text_entered",&FindReplaceDialog::_replace_text_entered);
+ ClassDB::bind_method("_prompt_changed",&FindReplaceDialog::_prompt_changed);
+ ClassDB::bind_method("_skip_pressed",&FindReplaceDialog::_skip_pressed);
+ ADD_SIGNAL(MethodInfo("search"));
+ ADD_SIGNAL(MethodInfo("skip"));
+
+}
+
+FindReplaceDialog::FindReplaceDialog() {
+
+ set_self_modulate(Color(1,1,1,0.8));
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+
+
+
+ search_text = memnew( LineEdit );
+ vb->add_margin_child(TTR("Search"),search_text);
+ search_text->connect("text_entered", this,"_search_text_entered");
+ //search_text->set_self_opacity(0.7);
+
+
+
+ replace_label = memnew( Label);
+ replace_label->set_text(TTR("Replace By"));
+ vb->add_child(replace_label);
+ replace_mc= memnew( MarginContainer);
+ vb->add_child(replace_mc);
+
+ replace_text = memnew( LineEdit );
+ replace_text->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ replace_text->set_begin( Point2(15,132) );
+ replace_text->set_end( Point2(15,135) );
+ //replace_text->set_self_opacity(0.7);
+ replace_mc->add_child(replace_text);
+
+
+ replace_text->connect("text_entered", this,"_replace_text_entered");
+
+
+
+ MarginContainer *opt_mg = memnew( MarginContainer );
+ vb->add_child(opt_mg);
+ VBoxContainer *svb = memnew( VBoxContainer);
+ opt_mg->add_child(svb);
+
+ svb ->add_child(memnew(Label));
+
+ whole_words = memnew( CheckButton );
+ whole_words->set_text(TTR("Whole Words"));
+ svb->add_child(whole_words);
+
+ case_sensitive = memnew( CheckButton );
+ case_sensitive->set_text(TTR("Case Sensitive"));
+ svb->add_child(case_sensitive);
+
+ backwards = memnew( CheckButton );
+ backwards->set_text(TTR("Backwards"));
+ svb->add_child(backwards);
+
+ opt_mg = memnew( MarginContainer );
+ vb->add_child(opt_mg);
+ VBoxContainer *rvb = memnew( VBoxContainer);
+ opt_mg->add_child(rvb);
+ replace_vb=rvb;
+ //rvb ->add_child(memnew(HSeparator));
+ rvb ->add_child(memnew(Label));
+
+ prompt = memnew( CheckButton );
+ prompt->set_text(TTR("Prompt On Replace"));
+ rvb->add_child(prompt);
+ prompt->connect("pressed", this,"_prompt_changed");
+
+ selection_only = memnew( CheckButton );
+ selection_only->set_text(TTR("Selection Only"));
+ rvb->add_child(selection_only);
+
+
+ int margin = get_constant("margin","Dialogs");
+ int button_margin = get_constant("button_margin","Dialogs");
+
+ skip = memnew( Button );
+ skip->set_anchor( MARGIN_LEFT, ANCHOR_END );
+ skip->set_anchor( MARGIN_TOP, ANCHOR_END );
+ skip->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ skip->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ skip->set_begin( Point2( 70, button_margin ) );
+ skip->set_end( Point2( 10, margin ) );
+ skip->set_text(TTR("Skip"));
+ add_child(skip);
+ skip->connect("pressed", this,"_skip_pressed");
+
+
+ error_label = memnew( Label );
+ error_label->set_align(Label::ALIGN_CENTER);
+ error_label->add_color_override("font_color",Color(1,0.4,0.3));
+ error_label->add_color_override("font_color_shadow",Color(0,0,0,0.2));
+ error_label->add_constant_override("shadow_as_outline",1);
+
+ vb->add_child(error_label);
+
+
+ set_hide_on_ok(false);
+
+}
+
+
+/*** CODE EDITOR ****/
+
+void CodeTextEditor::_text_editor_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON) {
+
+ const InputEventMouseButton& mb=p_event.mouse_button;
+
+ if (mb.pressed && mb.mod.command) {
+
+ if (mb.button_index==BUTTON_WHEEL_UP) {
+ _zoom_in();
+ } else if (mb.button_index==BUTTON_WHEEL_DOWN) {
+ _zoom_out();
+ }
+ }
+ } else if (p_event.type==InputEvent::KEY) {
+
+ if (p_event.key.pressed) {
+ if (ED_IS_SHORTCUT("script_editor/zoom_in", p_event)) {
+ _zoom_in();
+ }
+ if (ED_IS_SHORTCUT("script_editor/zoom_out", p_event)) {
+ _zoom_out();
+ }
+ if (ED_IS_SHORTCUT("script_editor/reset_zoom", p_event)) {
+ _reset_zoom();
+ }
+ }
+ }
+}
+
+void CodeTextEditor::_zoom_in() {
+ font_resize_val+=1;
+
+ if (font_resize_timer->get_time_left()==0)
+ font_resize_timer->start();
+}
+
+void CodeTextEditor::_zoom_out() {
+ font_resize_val-=1;
+
+ if (font_resize_timer->get_time_left()==0)
+ font_resize_timer->start();
+}
+
+void CodeTextEditor::_reset_zoom() {
+ Ref<DynamicFont> font = text_editor->get_font("font"); // reset source font size to default
+
+ if (font.is_valid()) {
+ EditorSettings::get_singleton()->set("interface/source_font_size",14);
+ font->set_size(14);
+ }
+}
+
+void CodeTextEditor::_line_col_changed() {
+
+ line_nb->set_text(itos(text_editor->cursor_get_line() + 1));
+ col_nb->set_text(itos(text_editor->cursor_get_column() + 1));
+}
+
+void CodeTextEditor::_text_changed() {
+
+ code_complete_timer->start();
+ idle->start();
+}
+
+void CodeTextEditor::_code_complete_timer_timeout() {
+ if (!is_visible_in_tree())
+ return;
+ if (enable_complete_timer)
+ text_editor->query_code_comple();
+}
+
+void CodeTextEditor::_complete_request() {
+
+ List<String> entries;
+ String ctext = text_editor->get_text_for_completion();
+ _code_complete_script(ctext,&entries);
+ if (code_complete_func) {
+ code_complete_func(code_complete_ud,ctext,&entries);
+ }
+ // print_line("COMPLETE: "+p_request);
+ if (entries.size()==0)
+ return;
+ Vector<String> strs;
+ strs.resize(entries.size());
+ int i=0;
+ for(List<String>::Element *E=entries.front();E;E=E->next()) {
+
+ strs[i++]=E->get();
+ }
+
+ text_editor->code_complete(strs);
+}
+
+void CodeTextEditor::_font_resize_timeout() {
+
+ Ref<DynamicFont> font = text_editor->get_font("font");
+
+ if (font.is_valid()) {
+ int size=font->get_size()+font_resize_val;
+
+ if (size>=8 && size<=96) {
+ EditorSettings::get_singleton()->set("interface/source_font_size",size);
+ font->set_size(size);
+ }
+
+ font_resize_val=0;
+ }
+}
+
+void CodeTextEditor::update_editor_settings() {
+
+ text_editor->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/completion/auto_brace_complete"));
+ text_editor->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
+ text_editor->set_tab_size(EditorSettings::get_singleton()->get("text_editor/indent/tab_size"));
+ text_editor->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
+ text_editor->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
+ text_editor->set_line_numbers_zero_padded(EditorSettings::get_singleton()->get("text_editor/line_numbers/line_numbers_zero_padded"));
+ text_editor->set_show_line_length_guideline(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_length_guideline"));
+ text_editor->set_line_length_guideline_column(EditorSettings::get_singleton()->get("text_editor/line_numbers/line_length_guideline_column"));
+ text_editor->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
+ text_editor->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
+ text_editor->cursor_set_blink_enabled(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink"));
+ text_editor->cursor_set_blink_speed(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink_speed"));
+ text_editor->set_draw_breakpoint_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_breakpoint_gutter"));
+ text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
+}
+
+void CodeTextEditor::set_error(const String& p_error) {
+
+ if (p_error!="") {
+ error->set_text(p_error);
+ error->show();
+ } else {
+ error->hide();
+ }
+
+}
+
+void CodeTextEditor::_update_font() {
+
+ // FONTS
+ String editor_font = EDITOR_DEF("text_editor/theme/font", "");
+ bool font_overridden = false;
+ if (editor_font!="") {
+ Ref<Font> fnt = ResourceLoader::load(editor_font);
+ if (fnt.is_valid()) {
+ text_editor->add_font_override("font",fnt);
+ font_overridden = true;
+ }
+ }
+ if(!font_overridden) {
+
+ text_editor->add_font_override("font",get_font("source","EditorFonts"));
+ }
+}
+
+void CodeTextEditor::_on_settings_change() {
+
+ _update_font();
+
+ // AUTO BRACE COMPLETION
+ text_editor->set_auto_brace_completion(
+ EDITOR_DEF("text_editor/completion/auto_brace_complete", true)
+ );
+
+ code_complete_timer->set_wait_time(
+ EDITOR_DEF("text_editor/completion/code_complete_delay",.3f)
+ );
+
+ enable_complete_timer = EDITOR_DEF("text_editor/completion/enable_code_completion_delay",true);
+
+ // call hint settings
+ text_editor->set_callhint_settings(
+ EDITOR_DEF("text_editor/completion/put_callhint_tooltip_below_current_line", true),
+ EDITOR_DEF("text_editor/completion/callhint_tooltip_offset", Vector2())
+ );
+}
+
+void CodeTextEditor::_text_changed_idle_timeout() {
+
+
+ _validate_script();
+ emit_signal("validate_script");
+}
+
+void CodeTextEditor::_notification(int p_what) {
+
+
+ if (p_what==EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+ _load_theme_settings();
+ emit_signal("load_theme_settings");
+ }
+ if (p_what==NOTIFICATION_THEME_CHANGED) {
+ _update_font();
+ }
+}
+
+void CodeTextEditor::_bind_methods() {
+
+ ClassDB::bind_method("_text_editor_gui_input",&CodeTextEditor::_text_editor_gui_input);
+ ClassDB::bind_method("_line_col_changed",&CodeTextEditor::_line_col_changed);
+ ClassDB::bind_method("_text_changed",&CodeTextEditor::_text_changed);
+ ClassDB::bind_method("_on_settings_change",&CodeTextEditor::_on_settings_change);
+ ClassDB::bind_method("_text_changed_idle_timeout",&CodeTextEditor::_text_changed_idle_timeout);
+ ClassDB::bind_method("_code_complete_timer_timeout",&CodeTextEditor::_code_complete_timer_timeout);
+ ClassDB::bind_method("_complete_request",&CodeTextEditor::_complete_request);
+ ClassDB::bind_method("_font_resize_timeout",&CodeTextEditor::_font_resize_timeout);
+
+ ADD_SIGNAL(MethodInfo("validate_script"));
+ ADD_SIGNAL(MethodInfo("load_theme_settings"));
+
+}
+
+void CodeTextEditor::set_code_complete_func(CodeTextEditorCodeCompleteFunc p_code_complete_func,void * p_ud) {
+ code_complete_func=p_code_complete_func;
+ code_complete_ud=p_ud;
+}
+
+
+CodeTextEditor::CodeTextEditor() {
+
+ code_complete_func=NULL;
+ ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KEY_MASK_CMD|KEY_EQUAL);
+ ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KEY_MASK_CMD|KEY_MINUS);
+ ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KEY_MASK_CMD|KEY_0);
+
+ find_replace_bar = memnew( FindReplaceBar );
+ add_child(find_replace_bar);
+ find_replace_bar->set_h_size_flags(SIZE_EXPAND_FILL);
+ find_replace_bar->hide();
+
+ text_editor = memnew( TextEdit );
+ add_child(text_editor);
+ text_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ find_replace_bar->set_text_edit(text_editor);
+
+ text_editor->set_show_line_numbers(true);
+ text_editor->set_brace_matching(true);
+ text_editor->set_auto_indent(true);
+
+ MarginContainer *status_mc = memnew( MarginContainer );
+ add_child(status_mc);
+ status_mc->set("custom_constants/margin_left", 2);
+ status_mc->set("custom_constants/margin_top", 5);
+ status_mc->set("custom_constants/margin_right", 2);
+ status_mc->set("custom_constants/margin_bottom", 1);
+
+ HBoxContainer *status_bar = memnew( HBoxContainer );
+ status_mc->add_child(status_bar);
+ status_bar->set_h_size_flags(SIZE_EXPAND_FILL);
+ status_bar->add_child( memnew( Label ) ); //to keep the height if the other labels are not visible
+
+ idle = memnew( Timer );
+ add_child(idle);
+ idle->set_one_shot(true);
+ idle->set_wait_time(EDITOR_DEF("text_editor/completion/idle_parse_delay",2));
+
+ code_complete_timer = memnew(Timer);
+ add_child(code_complete_timer);
+ code_complete_timer->set_one_shot(true);
+ enable_complete_timer = EDITOR_DEF("text_editor/completion/enable_code_completion_delay",true);
+
+ code_complete_timer->set_wait_time(EDITOR_DEF("text_editor/completion/code_complete_delay",.3f));
+
+ error = memnew( Label );
+ status_bar->add_child(error);
+ error->hide();
+ error->set_valign(Label::VALIGN_CENTER);
+ error->add_color_override("font_color",Color(1,0.7,0.6,0.9));
+
+ status_bar->add_spacer();
+
+ Label *line_txt = memnew( Label );
+ status_bar->add_child(line_txt);
+ line_txt->set_align(Label::ALIGN_RIGHT);
+ line_txt->set_valign(Label::VALIGN_CENTER);
+ line_txt->set_v_size_flags(SIZE_FILL);
+ line_txt->set_text(TTR("Line:"));
+
+ line_nb = memnew( Label );
+ status_bar->add_child(line_nb);
+ line_nb->set_valign(Label::VALIGN_CENTER);
+ line_nb->set_v_size_flags(SIZE_FILL);
+ line_nb->set_autowrap(true); // workaround to prevent resizing the label on each change
+ line_nb->set_custom_minimum_size(Size2(40,1)*EDSCALE);
+
+ Label *col_txt = memnew( Label );
+ status_bar->add_child(col_txt);
+ col_txt->set_align(Label::ALIGN_RIGHT);
+ col_txt->set_valign(Label::VALIGN_CENTER);
+ col_txt->set_v_size_flags(SIZE_FILL);
+ col_txt->set_text(TTR("Col:"));
+
+ col_nb = memnew( Label );
+ status_bar->add_child(col_nb);
+ col_nb->set_valign(Label::VALIGN_CENTER);
+ col_nb->set_v_size_flags(SIZE_FILL);
+ col_nb->set_autowrap(true); // workaround to prevent resizing the label on each change
+ col_nb->set_custom_minimum_size(Size2(40,1)*EDSCALE);
+
+ text_editor->connect("gui_input", this,"_text_editor_gui_input");
+ text_editor->connect("cursor_changed", this,"_line_col_changed");
+ text_editor->connect("text_changed", this,"_text_changed");
+ text_editor->connect("request_completion", this,"_complete_request");
+ Vector<String> cs;
+ cs.push_back(".");
+ cs.push_back(",");
+ cs.push_back("(");
+ cs.push_back("$");
+ text_editor->set_completion(true,cs);
+ idle->connect("timeout", this,"_text_changed_idle_timeout");
+
+ code_complete_timer->connect("timeout", this,"_code_complete_timer_timeout");
+
+ font_resize_val=0;
+ font_resize_timer = memnew(Timer);
+ add_child(font_resize_timer);
+ font_resize_timer->set_one_shot(true);
+ font_resize_timer->set_wait_time(0.07);
+ font_resize_timer->connect("timeout", this, "_font_resize_timeout");
+
+ EditorSettings::get_singleton()->connect("settings_changed",this,"_on_settings_change");
+}
diff --git a/editor/code_editor.h b/editor/code_editor.h
new file mode 100644
index 0000000000..7582985d4c
--- /dev/null
+++ b/editor/code_editor.h
@@ -0,0 +1,261 @@
+/*************************************************************************/
+/* code_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CODE_EDITOR_H
+#define CODE_EDITOR_H
+
+#include "editor/editor_plugin.h"
+#include "scene/gui/text_edit.h"
+#include "scene/gui/dialogs.h"
+#include "scene/main/timer.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/line_edit.h"
+
+
+
+class GotoLineDialog : public ConfirmationDialog {
+
+ GDCLASS(GotoLineDialog,ConfirmationDialog);
+
+ Label *line_label;
+ LineEdit *line;
+
+ TextEdit *text_editor;
+
+ virtual void ok_pressed();
+public:
+
+ void popup_find_line(TextEdit *p_edit);
+ int get_line() const;
+
+
+ void set_text_editor(TextEdit *p_text_editor);
+ GotoLineDialog();
+};
+
+class FindReplaceBar : public HBoxContainer {
+
+ GDCLASS(FindReplaceBar,HBoxContainer);
+
+ LineEdit *search_text;
+ ToolButton *find_prev;
+ ToolButton *find_next;
+ CheckBox *case_sensitive;
+ CheckBox *whole_words;
+ Label *error_label;
+ TextureButton *hide_button;
+
+ LineEdit *replace_text;
+ Button *replace;
+ Button *replace_all;
+ CheckBox *selection_only;
+
+ VBoxContainer *text_vbc;
+ HBoxContainer *replace_hbc;
+ HBoxContainer *replace_options_hbc;
+
+ TextEdit *text_edit;
+
+ int result_line;
+ int result_col;
+
+ bool replace_all_mode;
+ bool preserve_cursor;
+
+ void _get_search_from(int& r_line, int& r_col);
+
+ void _show_search();
+ void _hide_bar();
+
+ void _editor_text_changed();
+ void _search_options_changed(bool p_pressed);
+ void _search_text_changed(const String& p_text);
+ void _search_text_entered(const String& p_text);
+ void _replace_text_entered(const String& p_text);
+
+protected:
+ void _notification(int p_what);
+ void _unhandled_input(const InputEvent &p_event);
+
+ bool _search(uint32_t p_flags, int p_from_line, int p_from_col);
+
+ void _replace();
+ void _replace_all();
+
+ static void _bind_methods();
+
+public:
+ String get_search_text() const;
+ String get_replace_text() const;
+
+ bool is_case_sensitive() const;
+ bool is_whole_words() const;
+ bool is_selection_only() const;
+ void set_error(const String& p_label);
+
+ void set_text_edit(TextEdit *p_text_edit);
+
+ void popup_search();
+ void popup_replace();
+
+ bool search_current();
+ bool search_prev();
+ bool search_next();
+
+ FindReplaceBar();
+};
+
+class FindReplaceDialog : public ConfirmationDialog {
+
+ GDCLASS(FindReplaceDialog,ConfirmationDialog);
+
+ LineEdit *search_text;
+ LineEdit *replace_text;
+ CheckButton *whole_words;
+ CheckButton *case_sensitive;
+ CheckButton *backwards;
+ CheckButton *prompt;
+ CheckButton *selection_only;
+ Button *skip;
+ Label *error_label;
+ MarginContainer *replace_mc;
+ Label *replace_label;
+ VBoxContainer *replace_vb;
+
+ void _search_text_entered(const String& p_text);
+ void _replace_text_entered(const String& p_text);
+ void _prompt_changed();
+ void _skip_pressed();
+
+
+ TextEdit *text_edit;
+protected:
+
+ void _search_callback();
+ void _replace_skip_callback();
+
+ bool _search();
+ void _replace();
+
+ virtual void ok_pressed();
+ static void _bind_methods();
+public:
+
+ String get_search_text() const;
+ String get_replace_text() const;
+ bool is_whole_words() const;
+ bool is_case_sensitive() const;
+ bool is_backwards() const;
+ bool is_replace_mode() const;
+ bool is_replace_all_mode() const;
+ bool is_replace_selection_only() const;
+ void set_replace_selection_only(bool p_enable);
+
+ void set_error(const String& p_error);
+
+ void popup_search();
+ void popup_replace();
+
+ void set_text_edit(TextEdit *p_text_edit);
+
+ void search_next();
+ FindReplaceDialog();
+};
+
+
+typedef void (*CodeTextEditorCodeCompleteFunc)(void* p_ud,const String& p_code, List<String>* r_options);
+
+class CodeTextEditor : public VBoxContainer {
+
+ GDCLASS(CodeTextEditor,VBoxContainer);
+
+ TextEdit *text_editor;
+ FindReplaceBar *find_replace_bar;
+
+ Label *line_nb;
+ Label *col_nb;
+ Label *info;
+ Timer *idle;
+ Timer *code_complete_timer;
+ bool enable_complete_timer;
+
+ Timer *font_resize_timer;
+ int font_resize_val;
+
+ Label *error;
+
+ void _on_settings_change();
+
+ void _update_font();
+ void _complete_request();
+ void _font_resize_timeout();
+
+ void _text_editor_gui_input(const InputEvent& p_event);
+ void _zoom_in();
+ void _zoom_out();
+ void _reset_zoom();
+
+
+ CodeTextEditorCodeCompleteFunc code_complete_func;
+ void *code_complete_ud;
+
+protected:
+
+
+ virtual void _load_theme_settings() {}
+ virtual void _validate_script() {}
+ virtual void _code_complete_script(const String& p_code, List<String>* r_options) {}
+
+ void _text_changed_idle_timeout();
+ void _code_complete_timer_timeout();
+ void _text_changed();
+ void _line_col_changed();
+ void _notification(int);
+ static void _bind_methods();
+
+public:
+
+ void update_editor_settings();
+ void set_error(const String& p_error);
+ void update_line_and_column() { _line_col_changed(); }
+ TextEdit *get_text_edit() { return text_editor; }
+ FindReplaceBar *get_find_replace_bar() { return find_replace_bar; }
+ virtual void apply_code() {}
+
+
+ void set_code_complete_func(CodeTextEditorCodeCompleteFunc p_code_complete_func, void * p_ud);
+
+
+ CodeTextEditor();
+};
+
+
+
+#endif // CODE_EDITOR_H
diff --git a/editor/collada/SCsub b/editor/collada/SCsub
new file mode 100644
index 0000000000..04c9a827ef
--- /dev/null
+++ b/editor/collada/SCsub
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+
+Import('env')
+
+env.add_source_files(env.editor_sources, "*.cpp")
+
+Export('env')
diff --git a/editor/collada/collada.cpp b/editor/collada/collada.cpp
new file mode 100644
index 0000000000..2ba4f648a3
--- /dev/null
+++ b/editor/collada/collada.cpp
@@ -0,0 +1,2801 @@
+/*************************************************************************/
+/* collada.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifdef TOOLS_ENABLED
+
+#include "collada.h"
+
+#include "stdio.h"
+
+//#define DEBUG_DEFAULT_ANIMATION
+//#define DEBUG_COLLADA
+#ifdef DEBUG_COLLADA
+#define COLLADA_PRINT(m_what) print_line(m_what)
+#else
+#define COLLADA_PRINT(m_what)
+#endif
+
+#define COLLADA_IMPORT_SCALE_SCENE
+
+/* HELPERS */
+
+
+
+String Collada::Effect::get_texture_path(const String& p_source,Collada& state) const {
+
+ String image=p_source;
+ ERR_FAIL_COND_V(!state.state.image_map.has(image),"");
+ return state.state.image_map[image].path;
+}
+
+Transform Collada::get_root_transform() const {
+
+ Transform unit_scale_transform;
+#ifndef COLLADA_IMPORT_SCALE_SCENE
+ unit_scale_transform.scale(Vector3(state.unit_scale,state.unit_scale,state.unit_scale));
+#endif
+ return unit_scale_transform;
+}
+
+
+
+void Collada::Vertex::fix_unit_scale(Collada &state) {
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ vertex*=state.state.unit_scale;
+#endif
+}
+
+static String _uri_to_id(const String& p_uri) {
+
+ if (p_uri.begins_with("#"))
+ return p_uri.substr(1,p_uri.size()-1);
+ else
+ return p_uri;
+
+}
+
+/** HELPER FUNCTIONS **/
+
+Transform Collada::fix_transform(const Transform& p_transform) {
+
+ Transform tr=p_transform;
+
+#ifndef NO_UP_AXIS_SWAP
+
+ if (state.up_axis!=Vector3::AXIS_Y) {
+
+ for(int i=0;i<3;i++)
+ SWAP(tr.basis[1][i],tr.basis[state.up_axis][i]);
+ for(int i=0;i<3;i++)
+ SWAP(tr.basis[i][1],tr.basis[i][state.up_axis]);
+
+ SWAP(tr.origin[1],tr.origin[state.up_axis]);
+
+ tr.basis[state.up_axis][0]=-tr.basis[state.up_axis][0];
+ tr.basis[state.up_axis][1]=-tr.basis[state.up_axis][1];
+ tr.basis[0][state.up_axis]=-tr.basis[0][state.up_axis];
+ tr.basis[1][state.up_axis]=-tr.basis[1][state.up_axis];
+ tr.origin[state.up_axis]=-tr.origin[state.up_axis];
+ }
+#endif
+
+ //tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
+ return tr;
+ //return state.matrix_fix * p_transform;
+}
+
+
+static Transform _read_transform_from_array(const Vector<float>& array, int ofs=0) {
+
+ Transform tr;
+ // i wonder why collada matrices are transposed, given that's opposed to opengl..
+ tr.basis.elements[0][0]=array[0+ofs];
+ tr.basis.elements[0][1]=array[1+ofs];
+ tr.basis.elements[0][2]=array[2+ofs];
+ tr.basis.elements[1][0]=array[4+ofs];
+ tr.basis.elements[1][1]=array[5+ofs];
+ tr.basis.elements[1][2]=array[6+ofs];
+ tr.basis.elements[2][0]=array[8+ofs];
+ tr.basis.elements[2][1]=array[9+ofs];
+ tr.basis.elements[2][2]=array[10+ofs];
+ tr.origin.x=array[3+ofs];
+ tr.origin.y=array[7+ofs];
+ tr.origin.z=array[11+ofs];
+ return tr;
+
+}
+
+/* STRUCTURES */
+
+Transform Collada::Node::compute_transform(Collada &state) const {
+
+ Transform xform;
+
+ for(int i=0;i<xform_list.size();i++) {
+
+ Transform xform_step;
+ const XForm& xf = xform_list[i];
+ switch(xf.op) {
+
+ case XForm::OP_ROTATE: {
+ if (xf.data.size()>=4) {
+
+ xform_step.rotate(Vector3(xf.data[0],xf.data[1],xf.data[2]),Math::deg2rad(xf.data[3]));
+ }
+ } break;
+ case XForm::OP_SCALE: {
+
+ if (xf.data.size()>=3) {
+
+ xform_step.scale(Vector3(xf.data[0],xf.data[1],xf.data[2]));
+ }
+
+ } break;
+ case XForm::OP_TRANSLATE: {
+
+ if (xf.data.size()>=3) {
+
+ xform_step.origin=Vector3(xf.data[0],xf.data[1],xf.data[2]);
+ }
+
+ } break;
+ case XForm::OP_MATRIX: {
+
+ if (xf.data.size()>=16) {
+ xform_step = _read_transform_from_array(xf.data,0);
+ }
+
+ } break;
+ default: {}
+
+ }
+
+ xform = xform * xform_step;
+ }
+
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ xform.origin*=state.state.unit_scale;
+#endif
+ return xform;
+}
+
+Transform Collada::Node::get_transform() const {
+
+ return default_transform;
+}
+
+Transform Collada::Node::get_global_transform() const {
+
+ if (parent)
+ return parent->get_global_transform() * default_transform;
+ else
+ return default_transform;
+
+}
+
+Vector<float> Collada::AnimationTrack::get_value_at_time(float p_time) {
+
+ ERR_FAIL_COND_V(keys.size()==0,Vector<float>());
+ int i=0;
+
+ for(i=0;i<keys.size();i++) {
+
+ if (keys[i].time>p_time)
+ break;
+ }
+
+ if (i==0)
+ return keys[0].data;
+ if (i==keys.size())
+ return keys[keys.size()-1].data;
+
+ switch(keys[i].interp_type) {
+
+ case INTERP_BEZIER: //wait for bezier
+ case INTERP_LINEAR: {
+
+ float c = (p_time-keys[i-1].time)/(keys[i].time-keys[i-1].time);
+
+ if (keys[i].data.size()==16) {
+ //interpolate a matrix
+ Transform src = _read_transform_from_array(keys[i-1].data);
+ Transform dst = _read_transform_from_array(keys[i].data);
+
+
+ Transform interp = c<0.001 ? src : src.interpolate_with(dst,c);
+
+ Vector<float> ret;
+ ret.resize(16);
+ Transform tr;
+ // i wonder why collada matrices are transposed, given that's opposed to opengl..
+ ret[0]=interp.basis.elements[0][0];
+ ret[1]=interp.basis.elements[0][1];
+ ret[2]=interp.basis.elements[0][2];
+ ret[4]=interp.basis.elements[1][0];
+ ret[5]=interp.basis.elements[1][1];
+ ret[6]=interp.basis.elements[1][2];
+ ret[8]=interp.basis.elements[2][0];
+ ret[9]=interp.basis.elements[2][1];
+ ret[10]=interp.basis.elements[2][2];
+ ret[3]=interp.origin.x;
+ ret[7]=interp.origin.y;
+ ret[11]=interp.origin.z;
+ ret[12]=0;
+ ret[13]=0;
+ ret[14]=0;
+ ret[15]=1;
+
+ return ret;
+ } else {
+
+ Vector<float> dest;
+ dest.resize(keys[i].data.size());
+ for(int j=0;j<dest.size();j++) {
+
+ dest[j]=keys[i].data[j]*c+keys[i-1].data[j]*(1.0-c);
+ }
+ return dest;
+ //interpolate one by one
+ }
+ } break;
+ }
+
+ ERR_FAIL_V(Vector<float>());
+}
+
+
+
+
+void Collada::_parse_asset(XMLParser& parser) {
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+
+ if (name=="up_axis") {
+
+ parser.read();
+ if (parser.get_node_data()=="X_UP")
+ state.up_axis=Vector3::AXIS_X;
+ if (parser.get_node_data()=="Y_UP")
+ state.up_axis=Vector3::AXIS_Y;
+ if (parser.get_node_data()=="Z_UP")
+ state.up_axis=Vector3::AXIS_Z;
+
+ COLLADA_PRINT("up axis: "+parser.get_node_data());
+ } else if (name=="unit") {
+
+ state.unit_scale = parser.get_attribute_value("meter").to_double();
+ COLLADA_PRINT("unit scale: "+rtos(state.unit_scale));
+ }
+
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="asset")
+ break; //end of <asset>
+ }
+}
+
+
+void Collada::_parse_image(XMLParser& parser) {
+
+ String id=parser.get_attribute_value("id");
+
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+
+ Image image;
+
+
+ if (state.version<State::Version(1,4,0)) {
+ /* <1.4 */
+ String path = parser.get_attribute_value("source").strip_edges();
+ if (path.find("://")==-1 && path.is_rel_path()) {
+ // path is relative to file being loaded, so convert to a resource path
+ image.path=GlobalConfig::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path.percent_decode());
+
+ }
+ } else {
+
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+
+ if (name=="init_from") {
+
+ parser.read();
+ String path = parser.get_node_data().strip_edges().percent_decode();
+
+ if (path.find("://")==-1 && path.is_rel_path()) {
+ // path is relative to file being loaded, so convert to a resource path
+ path=GlobalConfig::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path);
+
+ } else if (path.find("file:///")==0) {
+ path=path.replace_first("file:///","");
+ path=GlobalConfig::get_singleton()->localize_path(path);
+ }
+
+ image.path=path;
+
+ } else if (name=="data") {
+
+ ERR_PRINT("COLLADA Embedded image data not supported!");
+
+ } else if (name=="extra" && !parser.is_empty())
+ parser.skip_section();
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="image")
+ break; //end of <asset>
+
+ }
+ }
+
+ state.image_map[id]=image;
+}
+
+void Collada::_parse_material(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ Material material;
+
+ String id=parser.get_attribute_value("id");
+ if (parser.has_attribute("name"))
+ material.name=parser.get_attribute_value("name");
+
+ if (state.version<State::Version(1,4,0)) {
+ /* <1.4 */
+ ERR_PRINT("Collada Materials < 1.4 are not supported (yet)");
+ } else {
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name()=="instance_effect") {
+
+ material.instance_effect=_uri_to_id(parser.get_attribute_value("url"));
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="material")
+ break; //end of <asset>
+ }
+ }
+
+ state.material_map[id]=material;
+}
+
+//! reads floats from inside of xml element until end of xml element
+Vector<float> Collada::_read_float_array(XMLParser& parser) {
+
+ if (parser.is_empty())
+ return Vector<float>();
+
+ Vector<String> splitters;
+ splitters.push_back(" ");
+ splitters.push_back("\n");
+ splitters.push_back("\r");
+ splitters.push_back("\t");
+
+ Vector<float> array;
+ while(parser.read()==OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse float data
+ String str = parser.get_node_data();
+ array=str.split_floats_mk(splitters,false);
+ //array=str.split_floats(" ",false);
+ }
+ else
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
+ break; // end parsing text
+ }
+
+ return array;
+}
+
+Vector<String> Collada::_read_string_array(XMLParser& parser) {
+
+ if (parser.is_empty())
+ return Vector<String>();
+
+ Vector<String> array;
+ while(parser.read()==OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse String data
+ String str = parser.get_node_data();
+ array=str.split_spaces();
+ /*
+ for(int i=0;i<array.size();i++) {
+ print_line(itos(i)+": "+array[i]);
+ }
+ */
+ }
+ else
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
+ break; // end parsing text
+ }
+
+ return array;
+}
+
+
+
+Transform Collada::_read_transform(XMLParser& parser) {
+
+ if (parser.is_empty())
+ return Transform();
+
+ Vector<String> array;
+ while(parser.read()==OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse float data
+ String str = parser.get_node_data();
+ array=str.split_spaces();
+ }
+ else
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
+ break; // end parsing text
+ }
+
+ ERR_FAIL_COND_V(array.size()!=16,Transform());
+ Vector<float> farr;
+ farr.resize(16);
+ for(int i=0;i<16;i++) {
+ farr[i]=array[i].to_double();
+ }
+
+ return _read_transform_from_array(farr);
+}
+
+String Collada::_read_empty_draw_type(XMLParser& parser) {
+
+ String empty_draw_type = "";
+
+ if (parser.is_empty())
+ return empty_draw_type;
+
+ while (parser.read()==OK) {
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ empty_draw_type = parser.get_node_data();
+ }
+ else
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
+ break; // end parsing text
+ }
+ return empty_draw_type;
+}
+
+Variant Collada::_parse_param(XMLParser& parser) {
+
+ if (parser.is_empty())
+ return Variant();
+
+ String from = parser.get_node_name();
+ Variant data;
+
+ while(parser.read()==OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name() == "float") {
+
+ parser.read();
+ if (parser.get_node_type()==XMLParser::NODE_TEXT) {
+
+ data=parser.get_node_data().to_double();
+ }
+ } else if (parser.get_node_name() == "float2") {
+
+ Vector<float> v2 = _read_float_array(parser);
+
+ if (v2.size()>=2) {
+
+ data=Vector2(v2[0],v2[1]);
+ }
+ } else if (parser.get_node_name() == "float3") {
+
+ Vector<float> v3 = _read_float_array(parser);
+
+ if (v3.size()>=3) {
+
+ data=Vector3(v3[0],v3[1],v3[2]);
+ }
+ } else if (parser.get_node_name() == "float4") {
+
+ Vector<float> v4 = _read_float_array(parser);
+
+ if (v4.size()>=4) {
+
+ data=Color(v4[0],v4[1],v4[2],v4[3]);
+ }
+ } else if (parser.get_node_name() == "sampler2D") {
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="source") {
+
+ parser.read();
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+
+ data=parser.get_node_data();
+ }
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="sampler2D")
+ break;
+
+ }
+ } else if (parser.get_node_name() == "surface") {
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="init_from") {
+
+ parser.read();
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+
+ data=parser.get_node_data();
+ }
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="surface")
+ break;
+
+ }
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==from)
+ break;
+ }
+
+ COLLADA_PRINT("newparam ending "+parser.get_node_name());
+ return data;
+
+}
+
+
+
+void Collada::_parse_effect_material(XMLParser& parser,Effect &effect,String &id) {
+
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ // first come the tags we descend, but ignore the top-levels
+
+ COLLADA_PRINT("node name: "+parser.get_node_name());
+
+ if (!parser.is_empty() && (parser.get_node_name() == "profile_COMMON" || parser.get_node_name() == "technique" || parser.get_node_name() == "extra")) {
+
+ _parse_effect_material(parser,effect,id); // try again
+
+ } else if (parser.get_node_name() == "newparam") {
+ String name = parser.get_attribute_value("sid");
+ Variant value = _parse_param(parser);
+ effect.params[name]=value;
+ COLLADA_PRINT("param: "+name+" value:"+String(value));
+
+ } else if (parser.get_node_name() == "constant" ||
+ parser.get_node_name() == "lambert" ||
+ parser.get_node_name() == "phong" ||
+ parser.get_node_name() == "blinn" )
+ {
+
+ COLLADA_PRINT("shade model: "+parser.get_node_name());
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String what = parser.get_node_name();
+
+ if ( what=="emission" ||
+ what=="diffuse" ||
+ what=="specular" ||
+ what=="reflective") {
+
+
+
+ // color or texture types
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="color") {
+
+ Vector<float> colorarr = _read_float_array(parser);
+ COLLADA_PRINT("colorarr size: "+rtos(colorarr.size()));
+
+ if (colorarr.size()>=3) {
+
+ // alpha strangely not allright? maybe it needs to be multiplied by value as a channel intensity
+ Color color(colorarr[0],colorarr[1],colorarr[2],1.0);
+ if (what=="diffuse")
+ effect.diffuse.color=color;
+ if (what=="specular")
+ effect.specular.color=color;
+ if (what=="emission")
+ effect.emission.color=color;
+
+ COLLADA_PRINT(what+" color: "+color);
+
+ }
+
+ } else if (parser.get_node_name()=="texture") {
+
+ String sampler = parser.get_attribute_value("texture");
+ if (!effect.params.has(sampler)) {
+ ERR_PRINT(String("Couldn't find sampler: "+sampler+" in material:"+id).utf8().get_data());
+ } else {
+ String surface = effect.params[sampler];
+
+ if (!effect.params.has(surface)) {
+ ERR_PRINT(String("Couldn't find surface: "+surface+" in material:"+id).utf8().get_data());
+ } else {
+ String uri = effect.params[surface];
+
+
+ if (what=="diffuse") {
+ effect.diffuse.texture=uri;
+ } else if (what=="specular") {
+ effect.specular.texture=uri;
+ } else if (what=="emission") {
+ effect.emission.texture=uri;
+ } else if (what=="bump") {
+ if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype")!="NORMALMAP") {
+ WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.")
+ }
+
+ effect.bump.texture=uri;
+ }
+
+ COLLADA_PRINT(what+" texture: "+uri);
+ }
+
+ }
+ } else if (!parser.is_empty())
+ parser.skip_section();
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == what)
+ break;
+ }
+
+ } else if (what=="shininess") {
+#if 1
+ effect.shininess=_parse_param(parser);
+#else
+
+ parser.read();
+ float shininess = parser.get_node_data().to_double();
+ effect.shininess=shininess;
+ COLLADA_PRINT("shininess: "+rtos(shininess));
+#endif
+
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && (
+ parser.get_node_name()=="constant" ||
+ parser.get_node_name()=="lambert" ||
+ parser.get_node_name()=="phong" ||
+ parser.get_node_name()=="blinn"))
+ break;
+ }
+ } else if (parser.get_node_name()=="double_sided" || parser.get_node_name()=="show_double_sided") { // colladamax / google earth
+
+ // 3DS Max / Google Earth double sided extension
+ parser.read();
+ effect.found_double_sided=true;
+ effect.double_sided=parser.get_node_data().to_int();
+ COLLADA_PRINT("double sided: "+itos(parser.get_node_data().to_int()));
+ } else if (parser.get_node_name()=="unshaded") {
+ parser.read();
+ effect.unshaded=parser.get_node_data().to_int();
+ } else if (parser.get_node_name()=="bump") {
+
+ // color or texture types
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="texture") {
+
+ String sampler = parser.get_attribute_value("texture");
+ if (!effect.params.has(sampler)) {
+ ERR_PRINT(String("Couldn't find sampler: "+sampler+" in material:"+id).utf8().get_data());
+ } else {
+ String surface = effect.params[sampler];
+
+ if (!effect.params.has(surface)) {
+ ERR_PRINT(String("Couldn't find surface: "+surface+" in material:"+id).utf8().get_data());
+ } else {
+ String uri = effect.params[surface];
+
+ if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype")!="NORMALMAP") {
+ WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.")
+ }
+
+ effect.bump.texture=uri;
+ COLLADA_PRINT(" bump: "+uri);
+ }
+
+ }
+ } else if (!parser.is_empty())
+ parser.skip_section();
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "bump")
+ break;
+ }
+
+ } else if (!parser.is_empty())
+ parser.skip_section();
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END &&
+ (parser.get_node_name() == "effect" ||
+ parser.get_node_name() == "profile_COMMON" ||
+ parser.get_node_name() == "technique" ||
+ parser.get_node_name() == "extra"))
+ break;
+ }
+
+}
+
+void Collada::_parse_effect(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ String id=parser.get_attribute_value("id");
+
+ Effect effect;
+ if (parser.has_attribute("name"))
+ effect.name=parser.get_attribute_value("name");
+ _parse_effect_material(parser,effect,id);
+
+
+
+ state.effect_map[id]=effect;
+
+ COLLADA_PRINT("Effect ID:"+id);
+
+}
+
+void Collada::_parse_camera(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ String id=parser.get_attribute_value("id");
+
+
+ state.camera_data_map[id]=CameraData();
+ CameraData &camera=state.camera_data_map[id];
+
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+
+ if (name=="perspective") {
+
+ camera.mode=CameraData::MODE_PERSPECTIVE;
+ } else if (name=="orthographic") {
+
+ camera.mode=CameraData::MODE_ORTHOGONAL;
+ } else if (name=="xfov") {
+
+ parser.read();
+ camera.perspective.x_fov = parser.get_node_data().to_double();
+
+ } else if (name=="yfov") {
+
+ parser.read();
+ camera.perspective.y_fov = parser.get_node_data().to_double();
+ } else if (name=="xmag") {
+
+ parser.read();
+ camera.orthogonal.x_mag = parser.get_node_data().to_double();
+
+ } else if (name=="ymag") {
+
+ parser.read();
+ camera.orthogonal.y_mag = parser.get_node_data().to_double();
+ } else if (name=="aspect_ratio") {
+
+ parser.read();
+ camera.aspect = parser.get_node_data().to_double();
+
+ } else if (name=="znear") {
+
+ parser.read();
+ camera.z_near = parser.get_node_data().to_double();
+
+ } else if (name=="zfar") {
+
+ parser.read();
+ camera.z_far = parser.get_node_data().to_double();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="camera")
+ break; //end of <asset>
+ }
+
+ COLLADA_PRINT("Camera ID:"+id);
+
+}
+
+void Collada::_parse_light(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ String id=parser.get_attribute_value("id");
+
+
+ state.light_data_map[id]=LightData();
+ LightData &light=state.light_data_map[id];
+
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+
+ if (name=="ambient") {
+
+ light.mode=LightData::MODE_AMBIENT;
+ } else if (name=="directional") {
+
+ light.mode=LightData::MODE_DIRECTIONAL;
+ } else if (name=="point") {
+
+ light.mode=LightData::MODE_OMNI;
+ } else if (name=="spot") {
+
+ light.mode=LightData::MODE_SPOT;
+ } else if (name=="color") {
+
+ parser.read();
+ Vector<float> colorarr = _read_float_array(parser);
+ COLLADA_PRINT("colorarr size: "+rtos(colorarr.size()));
+
+ if (colorarr.size()>=4) {
+ // alpha strangely not allright? maybe it needs to be multiplied by value as a channel intensity
+ Color color(colorarr[0],colorarr[1],colorarr[2],1.0);
+ light.color=color;
+ }
+
+ } else if (name=="constant_attenuation") {
+
+ parser.read();
+ light.constant_att=parser.get_node_data().to_double();
+ } else if (name=="linear_attenuation") {
+
+ parser.read();
+ light.linear_att=parser.get_node_data().to_double();
+ } else if (name=="quadratic_attenuation") {
+
+ parser.read();
+ light.quad_att=parser.get_node_data().to_double();
+ } else if (name=="falloff_angle") {
+
+ parser.read();
+ light.spot_angle= parser.get_node_data().to_double();
+
+ } else if (name=="falloff_exponent") {
+
+ parser.read();
+ light.spot_exp= parser.get_node_data().to_double();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="light")
+ break; //end of <asset>
+ }
+
+ COLLADA_PRINT("Light ID:"+id);
+
+}
+
+
+void Collada::_parse_curve_geometry(XMLParser& parser,String p_id,String p_name) {
+
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ //load everything into a pre dictionary
+
+ state.curve_data_map[p_id]=CurveData();
+
+ CurveData &curvedata = state.curve_data_map[p_id];
+ curvedata.name=p_name;
+
+ COLLADA_PRINT("curve name: "+p_name);
+
+
+ String current_source;
+ // handles geometry node and the curve childs in this loop
+ // read sources with arrays and accessor for each curve
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String section = parser.get_node_name();
+
+ if (section == "source") {
+
+ String id=parser.get_attribute_value("id");
+ curvedata.sources[id]=CurveData::Source();
+ current_source=id;
+ COLLADA_PRINT("source data: "+id);
+
+ } else if (section=="float_array" || section=="array") {
+ // create a new array and read it.
+ if (curvedata.sources.has(current_source)) {
+
+ curvedata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: "+current_source+" read "+itos(curvedata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section=="Name_array") {
+ // create a new array and read it.
+ if (curvedata.sources.has(current_source)) {
+
+ curvedata.sources[current_source].sarray = _read_string_array(parser);
+ COLLADA_PRINT("section: "+current_source+" read "+itos(curvedata.sources[current_source].array.size())+" values.");
+ }
+
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (curvedata.sources.has(current_source)) {
+ curvedata.sources[current_source].stride=parser.get_attribute_value("stride").to_int();
+ COLLADA_PRINT("section: "+current_source+" stride "+itos(curvedata.sources[current_source].stride));
+ }
+ } else if (section == "control_vertices") {
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ curvedata.control_vertices[semantic]=source;
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source);
+
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+ }
+
+ } else if (!parser.is_empty()){
+
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="spline")
+ break;
+ }
+
+
+
+}
+
+
+
+void Collada::_parse_mesh_geometry(XMLParser& parser,String p_id,String p_name) {
+
+
+ if (!(state.import_flags&IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+ return;
+ }
+
+ //load everything into a pre dictionary
+
+ state.mesh_data_map[p_id]=MeshData();
+
+ MeshData &meshdata = state.mesh_data_map[p_id];
+ meshdata.name=p_name;
+
+ COLLADA_PRINT("mesh name: "+p_name);
+
+
+ String current_source;
+ // handles geometry node and the mesh childs in this loop
+ // read sources with arrays and accessor for each mesh
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String section = parser.get_node_name();
+
+
+ if (section == "source") {
+
+ String id=parser.get_attribute_value("id");
+ meshdata.sources[id]=MeshData::Source();
+ current_source=id;
+ COLLADA_PRINT("source data: "+id);
+
+ } else if (section=="float_array" || section=="array") {
+ // create a new array and read it.
+ if (meshdata.sources.has(current_source)) {
+
+ meshdata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: "+current_source+" read "+itos(meshdata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (meshdata.sources.has(current_source)) {
+ meshdata.sources[current_source].stride=parser.get_attribute_value("stride").to_int();
+ COLLADA_PRINT("section: "+current_source+" stride "+itos(meshdata.sources[current_source].stride));
+ }
+ } else if (section == "vertices") {
+
+ MeshData::Vertices vert;
+ String id = parser.get_attribute_value("id");
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ vert.sources[semantic]=source;
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source);
+
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+ }
+
+ meshdata.vertices[id]=vert;
+
+ } else if (section =="triangles" || section=="polylist" || section=="polygons") {
+
+ bool polygons=(section=="polygons");
+ if (polygons) {
+ WARN_PRINT("Primitive type \"polygons\" is not well supported (concave shapes may fail). To ensure that the geometry is properly imported, please re-export using \"triangles\" or \"polylist\".");
+ }
+ MeshData::Primitives prim;
+
+ if (parser.has_attribute("material"))
+ prim.material=parser.get_attribute_value("material");
+ prim.count=parser.get_attribute_value("count").to_int();
+ prim.vertex_size=0;
+ int last_ref=0;
+
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ if (semantic=="TEXCOORD") {
+ /*
+ if (parser.has_attribute("set"))// a texcoord
+ semantic+=parser.get_attribute_value("set");
+ else
+ semantic="TEXCOORD0";*/
+ semantic="TEXCOORD"+itos(last_ref++);
+ }
+ int offset = parser.get_attribute_value("offset").to_int();
+
+
+ MeshData::Primitives::SourceRef sref;
+ sref.source=source;
+ sref.offset=offset;
+ prim.sources[semantic]=sref;
+ prim.vertex_size=MAX(prim.vertex_size,offset+1);
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source+" offset: "+itos(offset));
+
+
+ } else if (parser.get_node_name()=="p") { //indices
+
+ Vector<float> values = _read_float_array(parser);
+ if (polygons) {
+
+ prim.polygons.push_back(values.size()/prim.vertex_size);
+ int from = prim.indices.size();
+ prim.indices.resize(from+values.size());
+ for(int i=0;i<values.size();i++)
+ prim.indices[from+i]=values[i];
+
+ } else if (prim.vertex_size>0){
+ prim.indices=values;
+ }
+
+ COLLADA_PRINT("read "+itos(values.size())+" index values");
+
+ } else if (parser.get_node_name()=="vcount") { // primitive
+
+ Vector<float> values = _read_float_array(parser);
+ prim.polygons=values;
+ COLLADA_PRINT("read "+itos(values.size())+" polygon values");
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+
+ }
+
+ meshdata.primitives.push_back(prim);
+
+ } else if (parser.get_node_name() == "double_sided") {
+
+ parser.read();
+ meshdata.found_double_sided=true;
+ meshdata.double_sided=parser.get_node_data().to_int();
+
+ } else if (parser.get_node_name() == "polygons") {
+ ERR_PRINT("Primitive type \"polygons\" not supported, re-export using \"polylist\" or \"triangles\".");
+ } else if (!parser.is_empty()){
+
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="mesh")
+ break;
+ }
+
+
+
+}
+
+void Collada::_parse_skin_controller(XMLParser& parser,String p_id) {
+
+ state.skin_controller_data_map[p_id]=SkinControllerData();
+ SkinControllerData &skindata = state.skin_controller_data_map[p_id];
+
+ skindata.base=_uri_to_id(parser.get_attribute_value("source"));
+
+ String current_source;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT){
+
+ String section = parser.get_node_name();
+
+ if (section=="bind_shape_matrix") {
+
+ skindata.bind_shape=_read_transform(parser);
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ skindata.bind_shape.origin *= state.unit_scale;
+
+#endif
+ COLLADA_PRINT("skeleton bind shape transform: "+skindata.bind_shape);
+
+
+ } else if (section == "source") {
+
+ String id=parser.get_attribute_value("id");
+ skindata.sources[id]=SkinControllerData::Source();
+ current_source=id;
+ COLLADA_PRINT("source data: "+id);
+
+ } else if (section=="float_array" || section=="array") {
+ // create a new array and read it.
+ if (skindata.sources.has(current_source)) {
+
+ skindata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: "+current_source+" read "+itos(skindata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section=="Name_array" || section=="IDREF_array") {
+ // create a new array and read it.
+
+ if (section=="IDREF_array")
+ skindata.use_idrefs=true;
+ if (skindata.sources.has(current_source)) {
+
+ skindata.sources[current_source].sarray = _read_string_array(parser);
+ if (section=="IDREF_array") {
+ Vector<String> sa = skindata.sources[current_source].sarray;
+ for(int i=0;i<sa.size();i++)
+ state.idref_joints.insert(sa[i]);
+ }
+ COLLADA_PRINT("section: "+current_source+" read "+itos(skindata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (skindata.sources.has(current_source)) {
+
+ int stride=1;
+ if (parser.has_attribute("stride"))
+ stride=parser.get_attribute_value("stride").to_int();
+
+ skindata.sources[current_source].stride=stride;
+ COLLADA_PRINT("section: "+current_source+" stride "+itos(skindata.sources[current_source].stride));
+ }
+
+ } else if (section == "joints") {
+
+ SkinControllerData::Joints joint;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ joint.sources[semantic]=source;
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source);
+
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+ }
+
+ skindata.joints=joint;
+
+ } else if (section=="vertex_weights") {
+
+ SkinControllerData::Weights weights;
+
+ weights.count=parser.get_attribute_value("count").to_int();
+
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ int offset = parser.get_attribute_value("offset").to_int();
+
+ SkinControllerData::Weights::SourceRef sref;
+ sref.source=source;
+ sref.offset=offset;
+ weights.sources[semantic]=sref;
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source+" offset: "+itos(offset));
+
+ } else if (parser.get_node_name()=="v") { //indices
+
+ Vector<float> values = _read_float_array(parser);
+ weights.indices=values;
+ COLLADA_PRINT("read "+itos(values.size())+" index values");
+
+ } else if (parser.get_node_name()=="vcount") { // weightsitive
+
+ Vector<float> values = _read_float_array(parser);
+ weights.sets=values;
+ COLLADA_PRINT("read "+itos(values.size())+" polygon values");
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+
+ }
+
+ skindata.weights=weights;
+
+ }
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="skin")
+ break;
+ }
+
+ /* STORE REST MATRICES */
+
+ Vector<Transform> rests;
+ ERR_FAIL_COND(!skindata.joints.sources.has("JOINT"));
+ ERR_FAIL_COND(!skindata.joints.sources.has("INV_BIND_MATRIX"));
+
+ String joint_arr = skindata.joints.sources["JOINT"];
+ String ibm = skindata.joints.sources["INV_BIND_MATRIX"];
+
+ ERR_FAIL_COND(!skindata.sources.has(joint_arr));
+ ERR_FAIL_COND(!skindata.sources.has(ibm));
+
+ SkinControllerData::Source &joint_source = skindata.sources[joint_arr];
+ SkinControllerData::Source &ibm_source = skindata.sources[ibm];
+
+
+
+ ERR_FAIL_COND(joint_source.sarray.size() != ibm_source.array.size()/16);
+
+ for(int i=0;i<joint_source.sarray.size();i++) {
+
+ String name = joint_source.sarray[i];
+ Transform xform = _read_transform_from_array(ibm_source.array,i*16); //<- this is a mistake, it must be applied to vertices
+ xform.affine_invert(); // inverse for rest, because it's an inverse
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ xform.origin*=state.unit_scale;
+#endif
+ skindata.bone_rest_map[name]=xform;
+ }
+
+
+}
+
+void Collada::_parse_morph_controller(XMLParser& parser, String p_id) {
+
+ state.morph_controller_data_map[p_id]=MorphControllerData();
+ MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
+
+ print_line("morph source: "+parser.get_attribute_value("source")+" id: "+p_id);
+ morphdata.mesh=_uri_to_id(parser.get_attribute_value("source"));
+ print_line("morph source2: "+morphdata.mesh);
+ morphdata.mode=parser.get_attribute_value("method");
+ printf("JJmorph: %p\n",&morphdata);
+ String current_source;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT){
+
+ String section = parser.get_node_name();
+
+ if (section == "source") {
+
+ String id=parser.get_attribute_value("id");
+ morphdata.sources[id]=MorphControllerData::Source();
+ current_source=id;
+ COLLADA_PRINT("source data: "+id);
+
+ } else if (section=="float_array" || section=="array") {
+ // create a new array and read it.
+ if (morphdata.sources.has(current_source)) {
+
+ morphdata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: "+current_source+" read "+itos(morphdata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section=="Name_array" || section=="IDREF_array") {
+ // create a new array and read it.
+
+ /*
+ if (section=="IDREF_array")
+ morphdata.use_idrefs=true;
+ */
+ if (morphdata.sources.has(current_source)) {
+
+ morphdata.sources[current_source].sarray = _read_string_array(parser);
+ /*
+ if (section=="IDREF_array") {
+ Vector<String> sa = morphdata.sources[current_source].sarray;
+ for(int i=0;i<sa.size();i++)
+ state.idref_joints.insert(sa[i]);
+ }*/
+ COLLADA_PRINT("section: "+current_source+" read "+itos(morphdata.sources[current_source].array.size())+" values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (morphdata.sources.has(current_source)) {
+
+ int stride=1;
+ if (parser.has_attribute("stride"))
+ stride=parser.get_attribute_value("stride").to_int();
+
+ morphdata.sources[current_source].stride=stride;
+ COLLADA_PRINT("section: "+current_source+" stride "+itos(morphdata.sources[current_source].stride));
+ }
+
+ } else if (section == "targets") {
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="input") {
+
+ String semantic = parser.get_attribute_value("semantic");
+ String source =_uri_to_id( parser.get_attribute_value("source") );
+
+ morphdata.targets[semantic]=source;
+
+ COLLADA_PRINT(section+" input semantic: "+semantic+" source: "+source);
+
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==section)
+ break;
+ }
+
+
+ }
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="morph")
+ break;
+ }
+
+
+ if (morphdata.targets.has("MORPH_WEIGHT")) {
+
+ state.morph_name_map[ morphdata.targets["MORPH_WEIGHT"] ] = p_id;
+ }
+
+}
+
+void Collada::_parse_controller(XMLParser& parser) {
+
+ String id=parser.get_attribute_value("id");
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT){
+
+ String section = parser.get_node_name();
+
+ if (section=="skin") {
+ _parse_skin_controller(parser,id);
+ } else if (section == "morph") {
+ _parse_morph_controller(parser,id);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="controller")
+ break;
+ }
+
+
+}
+
+
+Collada::Node* Collada::_parse_visual_instance_geometry(XMLParser& parser) {
+
+ String type = parser.get_node_name();
+ NodeGeometry *geom=memnew( NodeGeometry );
+ geom->controller=type=="instance_controller";
+ geom->source = _uri_to_id(parser.get_attribute_value_safe("url"));
+
+
+
+ if (parser.is_empty()) //nothing else to parse...
+ return geom;
+ // try to find also many materials and skeletons!
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="instance_material") {
+
+ String symbol=parser.get_attribute_value("symbol");
+ String target=_uri_to_id(parser.get_attribute_value("target"));
+
+ NodeGeometry::Material mat;
+ mat.target=target;
+ geom->material_map[symbol]=mat;
+ COLLADA_PRINT("uses material: '"+target+"' on primitive'"+symbol+"'");
+ } else if (parser.get_node_name()=="skeleton") {
+
+ parser.read();
+ String uri = _uri_to_id(parser.get_node_data());
+ if (uri!="") {
+ geom->skeletons.push_back(uri);
+ }
+
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==type)
+ break;
+
+
+ }
+
+ if (geom->controller) {
+
+ if (geom->skeletons.empty()) {
+ //XSI style
+
+ if (state.skin_controller_data_map.has(geom->source)) {
+ SkinControllerData *skin = &state.skin_controller_data_map[geom->source];
+ //case where skeletons reference bones with IDREF (XSI)
+ ERR_FAIL_COND_V(!skin->joints.sources.has("JOINT"),geom);
+ String joint_arr = skin->joints.sources["JOINT"];
+ ERR_FAIL_COND_V(!skin->sources.has(joint_arr),geom);
+ Collada::SkinControllerData::Source &joint_source = skin->sources[joint_arr];
+ geom->skeletons=joint_source.sarray; //quite crazy, but should work.
+ }
+
+ }
+
+ }
+
+ return geom;
+}
+
+
+Collada::Node* Collada::_parse_visual_instance_camera(XMLParser& parser) {
+
+ String type = parser.get_node_name();
+ NodeCamera *cam=memnew( NodeCamera );
+ cam->camera= _uri_to_id(parser.get_attribute_value_safe("url"));
+
+ if (state.up_axis==Vector3::AXIS_Z) //collada weirdness
+ cam->post_transform.basis.rotate(Vector3(1,0,0),-Math_PI*0.5);
+
+ if (parser.is_empty()) //nothing else to parse...
+ return cam;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="instance_camera")
+ break;
+ }
+
+ return cam;
+}
+
+Collada::Node* Collada::_parse_visual_instance_light(XMLParser& parser) {
+
+ String type = parser.get_node_name();
+ NodeLight *cam=memnew( NodeLight );
+ cam->light= _uri_to_id(parser.get_attribute_value_safe("url"));
+
+ if (state.up_axis==Vector3::AXIS_Z) //collada weirdness
+ cam->post_transform.basis.rotate(Vector3(1,0,0),-Math_PI*0.5);
+
+ if (parser.is_empty()) //nothing else to parse...
+ return cam;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="instance_light")
+ break;
+ }
+
+ return cam;
+}
+
+
+Collada::Node* Collada::_parse_visual_node_instance_data(XMLParser& parser) {
+
+ String instance_type = parser.get_node_name();
+
+
+ if (instance_type=="instance_geometry" || instance_type=="instance_controller") {
+ return _parse_visual_instance_geometry(parser);
+ } else if (instance_type=="instance_camera") {
+
+ return _parse_visual_instance_camera(parser);
+ } else if (instance_type=="instance_light") {
+ return _parse_visual_instance_light(parser);
+ }
+
+
+ if (parser.is_empty()) //nothing else to parse...
+ return NULL;
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()==instance_type)
+ break;
+ }
+
+ return NULL;
+}
+
+Collada::Node* Collada::_parse_visual_scene_node(XMLParser& parser) {
+
+ String name;
+
+ String id = parser.get_attribute_value_safe("id");
+
+ bool found_name=false;
+
+ if (id=="") {
+
+ id="%NODEID%"+itos(Math::rand());
+
+ } else {
+ found_name=true;
+ }
+
+ Vector<Node::XForm> xform_list;
+ Vector<Node*> children;
+
+ String empty_draw_type="";
+
+ Node *node=NULL;
+
+ name=parser.has_attribute("name")?parser.get_attribute_value_safe("name"):parser.get_attribute_value_safe("id");
+ if (name=="") {
+
+ name=id;
+ } else {
+ found_name=true;
+ }
+
+ if ((parser.has_attribute("type") && parser.get_attribute_value("type")=="JOINT") || state.idref_joints.has(name)) {
+ // handle a bone
+
+ NodeJoint *joint = memnew( NodeJoint );
+
+ if ( parser.has_attribute("sid") ) { //bones may not have sid
+ joint->sid=parser.get_attribute_value("sid");
+ //state.bone_map[joint->sid]=joint;
+ } else if (state.idref_joints.has(name)) {
+ joint->sid=name; //kind of a cheat but..
+ } else if (parser.has_attribute("name")) {
+ joint->sid=parser.get_attribute_value_safe("name");
+ }
+
+
+ if (joint->sid!="") {
+ state.sid_to_node_map[joint->sid]=id;
+ }
+
+ node=joint;
+
+
+ }
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String section = parser.get_node_name();
+
+ if (section=="translate") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id=parser.get_attribute_value("sid");
+ }
+ xf.op=Node::XForm::OP_TRANSLATE;
+
+ Vector<float> xlt = _read_float_array(parser);
+ xf.data=xlt;
+ xform_list.push_back(xf);
+
+ } else if (section=="rotate") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id=parser.get_attribute_value("sid");
+ }
+ xf.op=Node::XForm::OP_ROTATE;
+
+ Vector<float> rot = _read_float_array(parser);
+ xf.data=rot;
+
+ xform_list.push_back(xf);
+
+ } else if (section=="scale") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id=parser.get_attribute_value("sid");
+ }
+
+ xf.op=Node::XForm::OP_SCALE;
+
+ Vector<float> scale = _read_float_array(parser);
+
+ xf.data=scale;
+
+ xform_list.push_back(xf);
+
+ } else if (section=="matrix") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id=parser.get_attribute_value("sid");
+ }
+ xf.op=Node::XForm::OP_MATRIX;
+
+ Vector<float> matrix = _read_float_array(parser);
+
+ xf.data=matrix;
+ String mtx;
+ for(int i=0;i<matrix.size();i++)
+ mtx+=" "+rtos(matrix[i]);
+
+ xform_list.push_back(xf);
+
+ } else if (section=="visibility") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id=parser.get_attribute_value("sid");
+ }
+ xf.op=Node::XForm::OP_VISIBILITY;
+
+ Vector<float> visible = _read_float_array(parser);
+
+ xf.data=visible;
+
+ xform_list.push_back(xf);
+
+ } else if (section=="empty_draw_type") {
+ empty_draw_type = _read_empty_draw_type(parser);
+ } else if (section == "technique" || section=="extra") {
+
+ } else if (section!="node") {
+ //usually what defines the type of node
+ //print_line(" dont know what to do with "+section);
+ if (section.begins_with("instance_")) {
+
+ if (!node) {
+
+ node = _parse_visual_node_instance_data(parser);
+
+ } else {
+ ERR_PRINT("Multiple instance_* not supported.");
+ }
+
+ }
+
+ } else if (section=="node") {
+
+ /* Found a child node!! what to do..*/
+
+ Node *child = _parse_visual_scene_node(parser);
+ children.push_back(child);
+
+
+
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="node")
+ break;
+ }
+
+ if (!node) {
+
+ node = memnew( Node ); //generic node, nothing of relevance found
+ }
+
+ node->noname=!found_name;
+ node->xform_list=xform_list;
+ node->children=children;
+ for(int i=0;i<children.size();i++) {
+ node->children[i]->parent=node;
+ }
+
+ node->name=name;
+ node->id=id;
+ node->empty_draw_type=empty_draw_type;
+
+ if (node->children.size()==1) {
+ if (node->children[0]->noname && !node->noname) {
+ node->children[0]->name=node->name;
+ node->name=node->name+"-base";
+ }
+ }
+
+
+
+ node->default_transform = node->compute_transform(*this);
+ state.scene_map[id]=node;
+
+
+ return node;
+}
+
+void Collada::_parse_visual_scene(XMLParser& parser) {
+
+ String id=parser.get_attribute_value("id");
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ state.visual_scene_map[id]=VisualScene();
+ VisualScene &vscene = state.visual_scene_map[id];
+
+ if (parser.has_attribute("name"))
+ vscene.name=parser.get_attribute_value("name");
+
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String section = parser.get_node_name();
+
+ if (section=="node") {
+ vscene.root_nodes.push_back(_parse_visual_scene_node(parser));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="visual_scene")
+ break;
+ }
+
+
+ COLLADA_PRINT("Scene ID:"+id);
+
+
+}
+
+void Collada::_parse_animation(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_ANIMATION)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+
+
+ return;
+ }
+
+ Map<String,Vector<float> > float_sources;
+ Map<String,Vector<String> > string_sources;
+ Map<String,int > source_strides;
+ Map<String, Map<String,String> > samplers;
+ Map<String,Vector<String> > source_param_names;
+ Map<String,Vector<String> > source_param_types;
+
+ String id="";
+ if (parser.has_attribute("id"))
+ id=parser.get_attribute_value("id");
+
+ String current_source;
+ String current_sampler;
+ Vector<String> channel_sources;
+ Vector<String> channel_targets;
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+ if (name=="source") {
+
+ current_source=parser.get_attribute_value("id");
+ source_param_names[current_source]=Vector<String>();
+ source_param_types[current_source]=Vector<String>();
+
+ } else if (name=="float_array") {
+
+ if (current_source!="") {
+ float_sources[current_source]=_read_float_array(parser);
+ }
+
+ } else if (name=="Name_array") {
+
+ if (current_source!="") {
+ string_sources[current_source]=_read_string_array(parser);
+ }
+ } else if (name=="accessor") {
+
+ if (current_source!="" && parser.has_attribute("stride")) {
+ source_strides[current_source]=parser.get_attribute_value("stride").to_int();
+ }
+ } else if (name=="sampler") {
+
+ current_sampler=parser.get_attribute_value("id");
+ samplers[current_sampler]=Map<String,String>();
+ } else if (name=="param") {
+
+ if (parser.has_attribute("name"))
+ source_param_names[current_source].push_back(parser.get_attribute_value("name"));
+ else
+ source_param_names[current_source].push_back("");
+
+ if (parser.has_attribute("type"))
+ source_param_types[current_source].push_back(parser.get_attribute_value("type"));
+ else
+ source_param_types[current_source].push_back("");
+
+ } else if (name=="input") {
+
+ if (current_sampler!="") {
+
+ samplers[current_sampler][parser.get_attribute_value("semantic")]=parser.get_attribute_value("source");
+ }
+
+ } else if (name=="channel") {
+
+ channel_sources.push_back(parser.get_attribute_value("source"));
+ channel_targets.push_back(parser.get_attribute_value("target"));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="animation")
+ break; //end of <asset>
+
+
+ }
+
+
+ for(int i=0;i<channel_sources.size();i++) {
+
+ String source=_uri_to_id(channel_sources[i]);
+ String target=channel_targets[i];
+ if (!samplers.has(source)) {
+ print_line("channel lacks source: "+source);
+ }
+ ERR_CONTINUE(!samplers.has(source));
+ Map<String,String>& sampler=samplers[source];
+
+ ERR_CONTINUE(!sampler.has("INPUT")); //no input semantic? wtf?
+ String input_id=_uri_to_id(sampler["INPUT"]);
+ COLLADA_PRINT("input id is "+input_id);
+ ERR_CONTINUE(!float_sources.has(input_id));
+
+ ERR_CONTINUE(!sampler.has("OUTPUT"));
+ String output_id=_uri_to_id(sampler["OUTPUT"]);
+ ERR_CONTINUE(!float_sources.has(output_id));
+
+ ERR_CONTINUE(!source_param_names.has(output_id));
+
+ Vector<String> &names = source_param_names[output_id];
+
+ for(int l=0;l<names.size();l++) {
+
+ String name = names[l];
+
+ Vector<float> &time_keys=float_sources[input_id];
+ int key_count = time_keys.size();
+
+ AnimationTrack track; //begin crating track
+ track.id=id;
+
+ track.keys.resize(key_count);
+
+ for(int j=0;j<key_count;j++) {
+ track.keys[j].time=time_keys[j];
+ state.animation_length = MAX(state.animation_length,time_keys[j] );
+ }
+
+ //now read actual values
+
+ int stride=1;
+
+ if (source_strides.has(output_id))
+ stride=source_strides[output_id];
+ int output_len=stride / names.size();
+
+ ERR_CONTINUE(output_len==0);
+ ERR_CONTINUE(!float_sources.has(output_id));
+
+ Vector<float> &output = float_sources[output_id];
+
+ ERR_EXPLAIN("Wrong number of keys in output");
+ ERR_CONTINUE( (output.size()/stride) != key_count );
+
+ for(int j=0;j<key_count;j++) {
+ track.keys[j].data.resize(output_len);
+ for(int k=0;k<output_len;k++)
+ track.keys[j].data[k]=output[l+j*stride+k]; //super weird but should work
+ }
+
+ if(sampler.has("INTERPOLATION")) {
+
+ String interp_id=_uri_to_id(sampler["INTERPOLATION"]);
+ ERR_CONTINUE(!string_sources.has(interp_id));
+ Vector<String> &interps=string_sources[interp_id];
+ ERR_CONTINUE(interps.size()!=key_count);
+
+ for(int j=0;j<key_count;j++) {
+ if (interps[j]=="BEZIER")
+ track.keys[j].interp_type=AnimationTrack::INTERP_BEZIER;
+ else
+ track.keys[j].interp_type=AnimationTrack::INTERP_LINEAR;
+ }
+ }
+
+ if (sampler.has("IN_TANGENT") && sampler.has("OUT_TANGENT")) {
+ //bezier control points..
+ String intangent_id=_uri_to_id(sampler["IN_TANGENT"]);
+ ERR_CONTINUE(!float_sources.has(intangent_id));
+ Vector<float> &intangents=float_sources[intangent_id];
+
+
+
+
+ ERR_CONTINUE(intangents.size()!=key_count*2*names.size());
+
+ String outangent_id=_uri_to_id(sampler["OUT_TANGENT"]);
+ ERR_CONTINUE(!float_sources.has(outangent_id));
+ Vector<float> &outangents=float_sources[outangent_id];
+ ERR_CONTINUE(outangents.size()!=key_count*2*names.size());
+
+ for(int j=0;j<key_count;j++) {
+ track.keys[j].in_tangent=Vector2( intangents[j*2*names.size()+0+l*2],intangents[j*2*names.size()+1+l*2] );
+ track.keys[j].out_tangent=Vector2( outangents[j*2*names.size()+0+l*2],outangents[j*2*names.size()+1+l*2] );
+ }
+ }
+
+ if (target.find("/")!=-1) { //transform component
+ track.target=target.get_slicec('/',0);
+ track.param=target.get_slicec('/',1);
+ if (track.param.find(".")!=-1)
+ track.component=track.param.get_slice(".",1).to_upper();
+ track.param=track.param.get_slice(".",0);
+ if (names.size()>1 && track.component=="") {
+ //this is a guess because the collada spec is ambiguous here...
+ //i suppose if you have many names (outputs) you can't use a component and i should abide to that.
+ track.component=name;
+
+ }
+ } else {
+ track.target=target;
+ }
+
+ print_line("TARGET: "+track.target);
+
+ state.animation_tracks.push_back(track);
+
+ if (!state.referenced_tracks.has(target))
+ state.referenced_tracks[target]=Vector<int>();
+
+ state.referenced_tracks[target].push_back(state.animation_tracks.size()-1);
+
+ if (id!="") {
+ if (!state.by_id_tracks.has(id))
+ state.by_id_tracks[id]=Vector<int>();
+
+ state.by_id_tracks[id].push_back(state.animation_tracks.size()-1);
+ }
+
+ COLLADA_PRINT("loaded animation with "+itos(key_count)+" keys");
+ }
+
+ }
+}
+
+void Collada::_parse_animation_clip(XMLParser& parser) {
+
+ if (!(state.import_flags&IMPORT_FLAG_ANIMATION)) {
+ if (!parser.is_empty())
+ parser.skip_section();
+
+
+ return;
+ }
+
+
+ AnimationClip clip;
+
+ if (parser.has_attribute("name"))
+ clip.name=parser.get_attribute_value("name");
+ else if (parser.has_attribute("id"))
+ clip.name=parser.get_attribute_value("id");
+ if (parser.has_attribute("start"))
+ clip.begin=parser.get_attribute_value("start").to_double();
+ if (parser.has_attribute("end"))
+ clip.end=parser.get_attribute_value("end").to_double();
+
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+ if (name=="instance_animation") {
+
+ String url = _uri_to_id(parser.get_attribute_value("url"));
+ clip.tracks.push_back(url);
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="animation_clip")
+ break; //end of <asset>
+
+ }
+
+ state.animation_clips.push_back(clip);
+ print_line("found anim clip: "+clip.name);
+
+}
+void Collada::_parse_scene(XMLParser& parser) {
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+
+ if (name=="instance_visual_scene") {
+
+ state.root_visual_scene=_uri_to_id(parser.get_attribute_value("url"));
+ print_line("***ROOT VISUAL SCENE: "+state.root_visual_scene);
+ } else if (name=="instance_physics_scene") {
+
+ state.root_physics_scene=_uri_to_id(parser.get_attribute_value("url"));
+
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="scene")
+ break; //end of <asset>
+ }
+}
+
+void Collada::_parse_library(XMLParser& parser) {
+
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while(parser.read()==OK) {
+
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser.get_node_name();
+ COLLADA_PRINT("library name is: "+name);
+ if (name=="image") {
+
+ _parse_image(parser);
+ } else if (name=="material") {
+
+ _parse_material(parser);
+ } else if (name=="effect") {
+
+ _parse_effect(parser);
+ } else if (name=="camera") {
+
+ _parse_camera(parser);
+ } else if (name=="light") {
+
+ _parse_light(parser);
+ } else if (name=="geometry") {
+
+ String id = parser.get_attribute_value("id");
+ String name = parser.get_attribute_value_safe("name");
+ while(parser.read()==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name()=="mesh") {
+ state.mesh_name_map[id]=(name!="")?name:id;
+ _parse_mesh_geometry(parser,id,name);
+ } else if (parser.get_node_name()=="spline") {
+ state.mesh_name_map[id]=(name!="")?name:id;
+ _parse_curve_geometry(parser,id,name);
+ } else if (!parser.is_empty())
+ parser.skip_section();
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="geometry")
+ break;
+ }
+
+ } else if (name=="controller") {
+
+ _parse_controller(parser);
+ } else if (name=="animation") {
+
+ _parse_animation(parser);
+ } else if (name=="animation_clip") {
+
+ _parse_animation_clip(parser);
+ } else if (name=="visual_scene") {
+
+ COLLADA_PRINT("visual scene");
+ _parse_visual_scene(parser);
+ } else if (!parser.is_empty())
+ parser.skip_section();
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name().begins_with("library_"))
+ break; //end of <asset>
+
+
+ }
+
+}
+
+void Collada::_joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner) {
+
+ if (p_node->type==Node::TYPE_JOINT) {
+
+ NodeJoint *nj = static_cast<NodeJoint*>(p_node);
+ nj->owner=p_owner;
+
+ for(int i=0;i<nj->children.size();i++) {
+
+ _joint_set_owner(nj->children[i],p_owner);
+ }
+ }
+}
+
+void Collada::_create_skeletons(Collada::Node **p_node,NodeSkeleton *p_skeleton) {
+
+
+ Node *node = *p_node;
+
+ if (node->type==Node::TYPE_JOINT) {
+
+ if (!p_skeleton) {
+
+ // ohohohoohoo it's a joint node, time to work!
+ NodeSkeleton *sk = memnew( NodeSkeleton );
+ *p_node=sk;
+ sk->children.push_back(node);
+ sk->parent=node->parent;
+ node->parent=sk;
+ p_skeleton=sk;
+ }
+
+ NodeJoint *nj = static_cast<NodeJoint*>(node);
+ nj->owner=p_skeleton;
+ } else {
+ p_skeleton=NULL;
+ }
+
+
+ for(int i=0;i<node->children.size();i++) {
+ _create_skeletons(&node->children[i],p_skeleton);
+ }
+
+}
+
+bool Collada::_remove_node(Node *p_parent,Node *p_node) {
+
+ for(int i=0;i<p_parent->children.size();i++) {
+
+ if (p_parent->children[i]==p_node) {
+ p_parent->children.remove(i);
+ return true;
+ }
+ if (_remove_node(p_parent->children[i],p_node))
+ return true;
+ }
+
+ return false;
+}
+
+void Collada::_remove_node(VisualScene *p_vscene,Node *p_node) {
+
+ for(int i=0;i<p_vscene->root_nodes.size();i++) {
+ if (p_vscene->root_nodes[i]==p_node) {
+
+ p_vscene->root_nodes.remove(i);
+ return;
+ }
+ if (_remove_node(p_vscene->root_nodes[i],p_node))
+ return;
+ }
+
+ ERR_PRINT("ERROR: Not found node to remove?");
+
+}
+
+
+void Collada::_merge_skeletons(VisualScene *p_vscene,Node *p_node) {
+
+ if (p_node->type==Node::TYPE_GEOMETRY) {
+
+ NodeGeometry *gnode = static_cast<NodeGeometry*>(p_node);
+ if (gnode->controller) {
+
+ // recount skeletons used
+ Set<NodeSkeleton*> skeletons;
+
+ for(int i=0;i<gnode->skeletons.size();i++) {
+
+ String nodeid = gnode->skeletons[i];
+
+ ERR_CONTINUE( !state.scene_map.has( nodeid )); //weird, it should have it...
+
+
+ NodeJoint *nj = SAFE_CAST<NodeJoint*>(state.scene_map[nodeid]);
+ if (!nj->owner) {
+ print_line("no owner for: "+String(nodeid));
+ }
+ ERR_CONTINUE( !nj->owner ); //weird, node should have a skeleton owner
+
+ skeletons.insert(nj->owner);
+ }
+
+ if (skeletons.size()>1) {
+
+ //do the merger!!
+ Set<NodeSkeleton*>::Element *E=skeletons.front();
+ NodeSkeleton *base = E->get();
+
+ for(E=E->next();E;E=E->next() ) {
+
+ NodeSkeleton *merged = E->get();
+ _remove_node(p_vscene,merged);
+ for(int i=0;i<merged->children.size();i++) {
+
+ _joint_set_owner(merged->children[i],base);
+ base->children.push_back( merged->children[i] );
+ merged->children[i]->parent=base;
+
+
+ }
+
+ merged->children.clear(); //take children from it
+ memdelete( merged );
+ }
+
+ }
+ }
+ }
+
+ for(int i=0;i<p_node->children.size();i++) {
+ _merge_skeletons(p_vscene,p_node->children[i]);
+ }
+
+}
+
+
+void Collada::_merge_skeletons2(VisualScene *p_vscene) {
+
+ for (Map<String,SkinControllerData>::Element *E=state.skin_controller_data_map.front();E;E=E->next()) {
+
+ SkinControllerData &cd=E->get();
+
+ NodeSkeleton *skeleton=NULL;
+
+ for (Map<String,Transform>::Element *F=cd.bone_rest_map.front();F;F=F->next()) {
+
+ String name;
+
+ if (!state.sid_to_node_map.has(F->key())) {
+ continue;
+ }
+
+ name = state.sid_to_node_map[F->key()];
+
+ if (!state.scene_map.has(name)) {
+ print_line("no foundie node for: "+name);
+ }
+
+ ERR_CONTINUE( !state.scene_map.has(name) );
+
+ Node *node=state.scene_map[name];
+ ERR_CONTINUE( node->type!=Node::TYPE_JOINT );
+ if (node->type!=Node::TYPE_JOINT)
+ continue;
+ NodeSkeleton *sk=NULL;
+
+ while(node && !sk) {
+
+ if (node->type==Node::TYPE_SKELETON) {
+ sk=static_cast<NodeSkeleton*>(node);
+ }
+ node=node->parent;
+ }
+ ERR_CONTINUE( !sk );
+
+ if (!sk)
+ continue; //bleh
+
+ if (!skeleton) {
+ skeleton=sk;
+ continue;
+ }
+
+ if (skeleton!=sk) {
+ //whoa.. wtf, merge.
+ print_line("MERGED BONES!!");
+
+ //NodeSkeleton *merged = E->get();
+ _remove_node(p_vscene,sk);
+ for(int i=0;i<sk->children.size();i++) {
+
+ _joint_set_owner(sk->children[i],skeleton);
+ skeleton->children.push_back( sk->children[i] );
+ sk->children[i]->parent=skeleton;
+
+
+ }
+
+ sk->children.clear(); //take children from it
+ memdelete( sk );
+ }
+ }
+ }
+
+
+
+}
+
+bool Collada::_optimize_skeletons(VisualScene *p_vscene,Node *p_node) {
+
+ Node *node=p_node;
+
+ if (node->type==Node::TYPE_SKELETON && node->parent && node->parent->type==Node::TYPE_NODE && node->parent->children.size()==1) {
+ //replace parent by this...
+ Node *parent = node->parent;
+
+ //i wonder if this is allright.. i think it is since created skeleton (first joint) is already animated by bone..
+ node->id=parent->id;
+ node->name=parent->name;
+ node->xform_list=parent->xform_list;
+ node->default_transform=parent->default_transform;
+
+ state.scene_map[node->id]=node;
+ node->parent=parent->parent;
+
+ if (parent->parent) {
+ Node *gp = parent->parent;
+ bool found=false;
+ for(int i=0;i<gp->children.size();i++) {
+
+ if (gp->children[i]==parent) {
+ gp->children[i]=node;
+ found=true;
+ break;
+ }
+ }
+ if (!found) {
+ ERR_PRINT("BUG");
+ }
+ } else {
+
+ bool found=false;
+
+ for(int i=0;i<p_vscene->root_nodes.size();i++) {
+
+ if (p_vscene->root_nodes[i]==parent) {
+
+ p_vscene->root_nodes[i]=node;
+ found=true;
+ break;
+ }
+ }
+ if (!found) {
+ ERR_PRINT("BUG");
+ }
+
+ }
+
+ parent->children.clear();
+ memdelete(parent);
+ return true;
+ }
+
+ for(int i=0;i<node->children.size();i++) {
+
+ if (_optimize_skeletons(p_vscene,node->children[i]))
+ return false; //stop processing, go up
+ }
+
+ return false;
+
+}
+
+
+bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene,Node *p_node,List<Node*> *p_mgeom) {
+
+ // bind shape matrix escala los huesos y los hace gigantes, asi la matriz despues achica
+ // al modelo?
+ // solucion: aplicarle la bind shape matrix a los VERTICES, y si el objeto viene con escala, se la dejo me parece!
+
+ if (p_node->type==Node::TYPE_GEOMETRY) {
+
+ NodeGeometry *ng = static_cast<NodeGeometry*>(p_node);
+ if (ng->ignore_anim)
+ return false; //already made child of skeleton and processeg
+
+ if (ng->controller && ng->skeletons.size()) {
+
+ String nodeid = ng->skeletons[0];
+
+ ERR_FAIL_COND_V( !state.scene_map.has( nodeid ), false); //weird, it should have it...
+ NodeJoint *nj = SAFE_CAST<NodeJoint*>(state.scene_map[nodeid]);
+ ERR_FAIL_COND_V(!nj,false);
+ if (!nj->owner) {
+ print_line("Has no owner: "+nj->name);
+ }
+ ERR_FAIL_COND_V( !nj->owner,false ); //weird, node should have a skeleton owner
+
+ NodeSkeleton *sk = nj->owner;
+
+ Node *p =sk->parent;
+ bool node_is_parent_of_skeleton=false;
+
+ while (p) {
+ if (p==p_node) {
+ node_is_parent_of_skeleton=true;
+ break;
+ }
+ p=p->parent; // try again
+ }
+
+ ERR_FAIL_COND_V( node_is_parent_of_skeleton, false);
+
+ //this should be correct
+ ERR_FAIL_COND_V( !state.skin_controller_data_map.has(ng->source), false);
+ SkinControllerData &skin=state.skin_controller_data_map[ng->source];
+ Transform skel_inv = sk->get_global_transform().affine_inverse();
+ p_node->default_transform = skel_inv * (skin.bind_shape /* p_node->get_global_transform()*/); // i honestly have no idea what to do with a previous model xform.. most exporters ignore it
+
+ //make rests relative to the skeleton (they seem to be always relative to world)
+ for(Map<String,Transform>::Element *E=skin.bone_rest_map.front();E;E=E->next()) {
+
+ E->get() = skel_inv * E->get(); //make the bone rest local to the skeleton
+ state.bone_rest_map[E->key()]=E->get(); // make it remember where the bone is globally, now that it's relative
+ }
+
+ //but most exporters seem to work only if i do this..
+ //p_node->default_transform = p_node->get_global_transform();
+
+
+
+ //p_node->default_transform=Transform(); //this seems to be correct, because bind shape makes the object local to the skeleton
+ p_node->ignore_anim=true; // collada may animate this later, if it does, then this is not supported (redo your original asset and don't animate the base mesh)
+ p_node->parent=sk;
+ //sk->children.push_back(0,p_node); //avoid INFINIT loop
+ p_mgeom->push_back(p_node);
+ return true;
+ }
+ }
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ if (_move_geometry_to_skeletons(p_vscene,p_node->children[i],p_mgeom)) {
+ p_node->children.remove(i);
+ i--;
+ }
+ }
+
+ return false;
+}
+
+void Collada::_find_morph_nodes(VisualScene *p_vscene,Node *p_node) {
+
+ if (p_node->type==Node::TYPE_GEOMETRY) {
+
+ NodeGeometry *nj = static_cast<NodeGeometry*>(p_node);
+
+ if (nj->controller) {
+
+ String base = nj->source;
+
+ while(base!="" && !state.mesh_data_map.has(base)) {
+
+ if (state.skin_controller_data_map.has(base)) {
+
+ SkinControllerData &sk = state.skin_controller_data_map[base];
+ base=sk.base;
+ } else if (state.morph_controller_data_map.has(base)) {
+
+ state.morph_ownership_map[base]=nj->id;
+ break;
+ } else {
+ ERR_EXPLAIN("Invalid scene");
+ ERR_FAIL();
+ }
+ }
+
+ }
+ }
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ _find_morph_nodes(p_vscene,p_node->children[i]);
+ }
+
+}
+
+void Collada::_optimize() {
+
+
+ for(Map<String,VisualScene>::Element *E=state.visual_scene_map.front();E;E=E->next()) {
+
+ VisualScene &vs = E->get();
+ for(int i=0;i<vs.root_nodes.size();i++) {
+ _create_skeletons(&vs.root_nodes[i]);
+
+ }
+#if 1
+ for(int i=0;i<vs.root_nodes.size();i++) {
+ _merge_skeletons(&vs,vs.root_nodes[i]);
+ }
+
+ _merge_skeletons2(&vs);
+
+
+ for(int i=0;i<vs.root_nodes.size();i++) {
+ _optimize_skeletons(&vs,vs.root_nodes[i]);
+ }
+
+ for(int i=0;i<vs.root_nodes.size();i++) {
+
+ List<Node*> mgeom;
+ if (_move_geometry_to_skeletons(&vs,vs.root_nodes[i],&mgeom)) {
+ vs.root_nodes.remove(i);
+ i--;
+ }
+
+ while(!mgeom.empty()) {
+
+ Node * n= mgeom.front()->get();
+ n->parent->children.push_back(n);
+ mgeom.pop_front();
+ }
+
+ }
+#endif
+ for(int i=0;i<vs.root_nodes.size();i++) {
+ _find_morph_nodes(&vs,vs.root_nodes[i]);
+ }
+
+ }
+}
+
+
+int Collada::get_uv_channel(String p_name) {
+
+ if (!channel_map.has(p_name)) {
+
+ ERR_FAIL_COND_V(channel_map.size()==2,0);
+
+ channel_map[p_name]=channel_map.size();
+ }
+
+ return channel_map[p_name];
+}
+
+Error Collada::load(const String& p_path, int p_flags) {
+
+ Ref<XMLParser> parserr = memnew( XMLParser );
+ XMLParser &parser = *parserr.ptr();
+ Error err = parser.open(p_path);
+ ERR_FAIL_COND_V(err,err);
+
+ state.local_path = GlobalConfig::get_singleton()->localize_path(p_path);
+ state.import_flags=p_flags;
+ /* Skip headers */
+ err=OK;
+ while((err=parser.read())==OK) {
+
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser.get_node_name() == "COLLADA") {
+ break;
+ } else if (!parser.is_empty())
+ parser.skip_section();// unknown section, likely headers
+ }
+ }
+
+ ERR_FAIL_COND_V(err!=OK, ERR_FILE_CORRUPT);
+
+ /* Start loading Collada */
+
+ {
+ //version
+ String version = parser.get_attribute_value("version");
+ state.version.major=version.get_slice(".",0).to_int();
+ state.version.minor=version.get_slice(".",1).to_int();
+ state.version.rev=version.get_slice(".",2).to_int();
+ COLLADA_PRINT("Collada VERSION: "+version);
+ }
+
+
+
+ while((err=parser.read())==OK) {
+
+ /* Read all the main sections.. */
+
+ if (parser.get_node_type() != XMLParser::NODE_ELEMENT)
+ continue; //no idea what this may be, but skipping anyway
+
+ String section = parser.get_node_name();
+
+ COLLADA_PRINT("section: "+section);
+
+ if (section=="asset") {
+ _parse_asset(parser);
+
+ } else if (section.begins_with("library_")) {
+
+ _parse_library(parser);
+ } else if (section=="scene") {
+
+ _parse_scene(parser);
+ } else if (!parser.is_empty()) {
+ parser.skip_section(); // unknown section, likely headers
+ }
+
+ }
+
+ _optimize();
+ return OK;
+}
+
+
+
+
+Collada::Collada() {
+
+
+}
+
+#endif
diff --git a/editor/collada/collada.h b/editor/collada/collada.h
new file mode 100644
index 0000000000..2de2d22935
--- /dev/null
+++ b/editor/collada/collada.h
@@ -0,0 +1,663 @@
+/*************************************************************************/
+/* collada.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifdef TOOLS_ENABLED
+
+#ifndef COLLADA_H
+#define COLLADA_H
+
+
+#include "scene/resources/material.h"
+#include "global_config.h"
+#include "io/xml_parser.h"
+#include "map.h"
+
+class Collada {
+public:
+
+ enum ImportFlags {
+ IMPORT_FLAG_SCENE=1,
+ IMPORT_FLAG_ANIMATION=2
+ };
+
+
+ struct Image {
+
+ String path;
+ };
+
+ struct Material {
+
+ String name;
+ String instance_effect;
+ };
+
+
+ struct Effect {
+
+ String name;
+ Map<String, Variant> params;
+
+ struct Channel {
+
+ int uv_idx;
+ String texture;
+ Color color;
+ Channel() { uv_idx=0; }
+ };
+
+ Channel diffuse,specular,emission,bump;
+ float shininess;
+ bool found_double_sided;
+ bool double_sided;
+ bool unshaded;
+
+ String get_texture_path(const String& p_source,Collada& state) const;
+
+ Effect() {
+ diffuse.color=Color(1,1,1,1);
+ double_sided=true;
+ found_double_sided=false;
+ shininess=40;
+ unshaded=false;
+ }
+ };
+
+ struct CameraData {
+
+ enum Mode {
+ MODE_PERSPECTIVE,
+ MODE_ORTHOGONAL
+ };
+
+ Mode mode;
+
+ union {
+ struct {
+ float x_fov;
+ float y_fov;
+ } perspective;
+ struct {
+ float x_mag;
+ float y_mag;
+ } orthogonal;
+ };
+
+ float aspect;
+ float z_near;
+ float z_far;
+
+ CameraData() {
+
+ mode=MODE_PERSPECTIVE;
+ perspective.y_fov=0;
+ perspective.x_fov=0;
+ aspect=1;
+ z_near=0.1;
+ z_far=100;
+ }
+ };
+
+ struct LightData {
+
+ enum Mode {
+ MODE_AMBIENT,
+ MODE_DIRECTIONAL,
+ MODE_OMNI,
+ MODE_SPOT
+ };
+
+ Mode mode;
+
+ Color color;
+
+ float constant_att;
+ float linear_att;
+ float quad_att;
+
+ float spot_angle;
+ float spot_exp;
+
+ LightData() {
+
+ mode=MODE_AMBIENT;
+ color=Color(1,1,1,1);
+ constant_att=0;
+ linear_att=0;
+ quad_att=0;
+
+ spot_angle=45;
+ spot_exp=1;
+ }
+ };
+
+
+ struct MeshData {
+
+
+ String name;
+ struct Source {
+
+ Vector<float> array;
+ int stride;
+
+ };
+
+ Map<String,Source> sources;
+
+ struct Vertices {
+
+ Map<String,String> sources;
+ };
+
+ Map<String,Vertices> vertices;
+
+ struct Primitives {
+
+ struct SourceRef {
+
+ String source;
+ int offset;
+
+
+ };
+
+ String material;
+ Map<String,SourceRef> sources;
+ Vector<float> polygons;
+ Vector<float> indices;
+ int count;
+ int vertex_size;
+ };
+
+ Vector<Primitives> primitives;
+
+ bool found_double_sided;
+ bool double_sided;
+
+ MeshData() { found_double_sided=false; double_sided=true; }
+ };
+
+ struct CurveData {
+
+
+ String name;
+ bool closed;
+
+ struct Source {
+
+ Vector<String> sarray;
+ Vector<float> array;
+ int stride;
+ };
+
+ Map<String,Source> sources;
+
+
+ Map<String,String> control_vertices;
+
+ CurveData() {
+
+ closed=false;
+ }
+
+ };
+ struct SkinControllerData {
+
+ String base;
+ bool use_idrefs;
+
+ Transform bind_shape;
+
+ struct Source {
+
+ Vector<String> sarray; //maybe for names
+ Vector<float> array;
+ int stride;
+ Source() {
+ stride=1;
+ }
+ };
+
+ Map<String,Source> sources;
+
+ struct Joints {
+
+ Map<String,String> sources;
+ } joints;
+
+ struct Weights {
+
+ struct SourceRef {
+
+ String source;
+ int offset;
+
+
+ };
+
+ String material;
+ Map<String,SourceRef> sources;
+ Vector<float> sets;
+ Vector<float> indices;
+ int count;
+ } weights;
+
+ Map<String,Transform> bone_rest_map;
+
+ SkinControllerData() { use_idrefs=false; }
+ };
+
+
+ struct MorphControllerData {
+
+ String mesh;
+ String mode;
+
+ struct Source {
+
+ int stride;
+ Vector<String> sarray; //maybe for names
+ Vector<float> array;
+ Source() { stride=1; }
+ };
+
+ Map<String,Source> sources;
+
+ Map<String,String> targets;
+ MorphControllerData() { }
+ };
+
+
+ struct Vertex {
+
+ int idx;
+ Vector3 vertex;
+ Vector3 normal;
+ Vector3 uv;
+ Vector3 uv2;
+ Plane tangent;
+ Color color;
+ int uid;
+ struct Weight {
+ int bone_idx;
+ float weight;
+ bool operator<(const Weight w) const { return weight>w.weight; } //heaviest first
+
+ };
+
+ Vector<Weight> weights;
+
+ void fix_weights() {
+
+ weights.sort();
+ if (weights.size()>4) {
+ //cap to 4 and make weights add up 1
+ weights.resize(4);
+ float total=0;
+ for(int i=0;i<4;i++)
+ total+=weights[i].weight;
+ if (total)
+ for(int i=0;i<4;i++)
+ weights[i].weight/=total;
+
+ }
+ }
+
+ void fix_unit_scale(Collada &state);
+
+ bool operator<(const Vertex& p_vert) const {
+
+ if (uid==p_vert.uid) {
+ if (vertex==p_vert.vertex) {
+ if(normal==p_vert.normal) {
+ if(uv==p_vert.uv) {
+ if(uv2==p_vert.uv2) {
+
+ if (!weights.empty() || !p_vert.weights.empty()) {
+
+ if (weights.size()==p_vert.weights.size()) {
+
+ for(int i=0;i<weights.size();i++) {
+ if (weights[i].bone_idx!=p_vert.weights[i].bone_idx)
+ return weights[i].bone_idx<p_vert.weights[i].bone_idx;
+
+ if (weights[i].weight!=p_vert.weights[i].weight)
+ return weights[i].weight<p_vert.weights[i].weight;
+ }
+ } else {
+ return weights.size() < p_vert.weights.size();
+ }
+
+ }
+
+ return (color<p_vert.color);
+ } else
+ return (uv2<p_vert.uv2);
+ } else
+ return (uv<p_vert.uv);
+ } else
+ return (normal<p_vert.normal);
+ } else
+ return vertex<p_vert.vertex;
+ } else
+ return uid < p_vert.uid;
+
+ }
+
+ Vertex() { uid=0; idx=0; }
+ };
+ struct Node {
+
+ enum Type {
+
+ TYPE_NODE,
+ TYPE_JOINT,
+ TYPE_SKELETON, //this bone is not collada, it's added afterwards as optimization
+ TYPE_LIGHT,
+ TYPE_CAMERA,
+ TYPE_GEOMETRY
+ };
+
+
+ struct XForm {
+
+ enum Op {
+ OP_ROTATE,
+ OP_SCALE,
+ OP_TRANSLATE,
+ OP_MATRIX,
+ OP_VISIBILITY
+ };
+
+ String id;
+ Op op;
+ Vector<float> data;
+ };
+
+ Type type;
+
+ String name;
+ String id;
+ String empty_draw_type;
+ bool noname;
+ Vector<XForm> xform_list;
+ Transform default_transform;
+ Transform post_transform;
+ Vector<Node*> children;
+
+ Node* parent;
+
+ Transform compute_transform(Collada &state) const;
+ Transform get_global_transform() const;
+ Transform get_transform() const;
+
+ bool ignore_anim;
+
+
+ Node() {noname=false; type=TYPE_NODE; parent=NULL; ignore_anim=false; }
+ virtual ~Node() { for(int i=0;i<children.size();i++) memdelete( children[i] ); };
+
+ };
+
+ struct NodeSkeleton : public Node {
+
+
+ NodeSkeleton() { type=TYPE_SKELETON; }
+ };
+
+ struct NodeJoint : public Node {
+
+ NodeSkeleton *owner;
+ String sid;
+ NodeJoint() { type=TYPE_JOINT; owner=NULL; }
+ };
+
+
+ struct NodeGeometry : public Node {
+
+ bool controller;
+ String source;
+
+ struct Material {
+ String target;
+ };
+
+ Map<String,Material> material_map;
+ Vector<String> skeletons;
+
+ NodeGeometry() { type=TYPE_GEOMETRY; }
+ };
+
+ struct NodeCamera : public Node {
+
+ String camera;
+
+ NodeCamera() { type=TYPE_CAMERA; }
+ };
+
+ struct NodeLight : public Node {
+
+ String light;
+
+ NodeLight() { type=TYPE_LIGHT; }
+ };
+
+
+ struct VisualScene {
+
+ String name;
+ Vector<Node*> root_nodes;
+
+ ~VisualScene() { for(int i=0;i<root_nodes.size();i++) memdelete( root_nodes[i] ); }
+ };
+
+
+ struct AnimationClip {
+
+ String name;
+ float begin;
+ float end;
+ Vector<String> tracks;
+
+ AnimationClip() { begin=0; end=1; }
+ };
+
+ struct AnimationTrack {
+
+ String id;
+ String target;
+ String param;
+ String component;
+ bool property;
+
+ enum InterpolationType {
+ INTERP_LINEAR,
+ INTERP_BEZIER
+ };
+
+ struct Key {
+
+ enum Type {
+ TYPE_FLOAT,
+ TYPE_MATRIX
+ };
+
+ float time;
+ Vector<float> data;
+ Point2 in_tangent;
+ Point2 out_tangent;
+ InterpolationType interp_type;
+
+ Key() { interp_type=INTERP_LINEAR; }
+ };
+
+
+ Vector<float> get_value_at_time(float p_time);
+
+ Vector<Key> keys;
+
+ AnimationTrack() { property=false; }
+ };
+
+
+ /****************/
+ /* IMPORT STATE */
+ /****************/
+
+
+ struct State {
+
+
+ int import_flags;
+
+ float unit_scale;
+ Vector3::Axis up_axis;
+ bool z_up;
+
+ struct Version {
+
+ int major,minor,rev;
+
+ bool operator<(const Version& p_ver) const { return (major==p_ver.major)?((minor==p_ver.minor)?(rev<p_ver.rev):minor<p_ver.minor):major<p_ver.major; }
+ Version(int p_major=0,int p_minor=0,int p_rev=0) { major=p_major; minor=p_minor; rev=p_rev; }
+ } version;
+
+
+ Map<String,CameraData> camera_data_map;
+ Map<String,MeshData> mesh_data_map;
+ Map<String,LightData> light_data_map;
+ Map<String,CurveData> curve_data_map;
+
+
+ Map<String,String> mesh_name_map;
+ Map<String,String> morph_name_map;
+ Map<String,String> morph_ownership_map;
+ Map<String,SkinControllerData> skin_controller_data_map;
+ Map<String,MorphControllerData> morph_controller_data_map;
+
+
+
+ Map<String,Image > image_map;
+ Map<String,Material> material_map;
+ Map<String,Effect> effect_map;
+
+ Map<String,VisualScene> visual_scene_map;
+ Map<String,Node*> scene_map;
+ Set<String> idref_joints;
+ Map<String,String> sid_to_node_map;
+ //Map<String,NodeJoint*> bone_map;
+
+ Map<String,Transform> bone_rest_map;
+
+ String local_path;
+ String root_visual_scene;
+ String root_physics_scene;
+
+ Vector<AnimationClip> animation_clips;
+ Vector<AnimationTrack> animation_tracks;
+ Map<String,Vector<int> > referenced_tracks;
+ Map<String,Vector<int> > by_id_tracks;
+
+ float animation_length;
+
+ State() { unit_scale=1.0; up_axis=Vector3::AXIS_Y; import_flags=0; animation_length=0; }
+ } state;
+
+
+ Error load(const String& p_path, int p_flags=0);
+
+ Collada();
+
+ Transform fix_transform(const Transform& p_transform);
+
+ Transform get_root_transform() const;
+
+ int get_uv_channel(String p_name);
+
+private: // private stuff
+
+ Map<String,int> channel_map;
+
+ void _parse_asset(XMLParser& parser);
+ void _parse_image(XMLParser& parser);
+ void _parse_material(XMLParser& parser);
+ void _parse_effect_material(XMLParser& parser,Effect &effect,String &id);
+ void _parse_effect(XMLParser& parser);
+ void _parse_camera(XMLParser& parser);
+ void _parse_light(XMLParser& parser);
+ void _parse_animation_clip(XMLParser& parser);
+
+ void _parse_mesh_geometry(XMLParser& parser,String p_id,String p_name);
+ void _parse_curve_geometry(XMLParser& parser,String p_id,String p_name);
+
+ void _parse_skin_controller(XMLParser& parser,String p_id);
+ void _parse_morph_controller(XMLParser& parser, String id);
+ void _parse_controller(XMLParser& parser);
+
+ Node* _parse_visual_instance_geometry(XMLParser& parser);
+ Node* _parse_visual_instance_camera(XMLParser& parser);
+ Node* _parse_visual_instance_light(XMLParser& parser);
+
+ Node* _parse_visual_node_instance_data(XMLParser& parser);
+ Node* _parse_visual_scene_node(XMLParser& parser);
+ void _parse_visual_scene(XMLParser& parser);
+
+ void _parse_animation(XMLParser& parser);
+ void _parse_scene(XMLParser& parser);
+ void _parse_library(XMLParser& parser);
+
+
+ Variant _parse_param(XMLParser& parser);
+ Vector<float> _read_float_array(XMLParser& parser);
+ Vector<String> _read_string_array(XMLParser& parser);
+ Transform _read_transform(XMLParser& parser);
+ String _read_empty_draw_type(XMLParser& parser);
+
+ void _joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner);
+ void _create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton=NULL);
+ void _find_morph_nodes(VisualScene *p_vscene,Node *p_node);
+ bool _remove_node(Node *p_parent,Node *p_node);
+ void _remove_node(VisualScene *p_vscene,Node *p_node);
+ void _merge_skeletons2(VisualScene *p_vscene);
+ void _merge_skeletons(VisualScene *p_vscene,Node *p_node);
+ bool _optimize_skeletons(VisualScene *p_vscene,Node *p_node);
+
+
+ bool _move_geometry_to_skeletons(VisualScene *p_vscene,Node *p_node,List<Node*> *p_mgeom);
+
+
+
+ void _optimize();
+
+
+};
+
+#endif // COLLADA_H
+
+#endif
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
new file mode 100644
index 0000000000..91ba419c97
--- /dev/null
+++ b/editor/connections_dialog.cpp
@@ -0,0 +1,890 @@
+/*************************************************************************/
+/* connections_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "connections_dialog.h"
+
+#include "scene/gui/label.h"
+#include "print_string.h"
+#include "editor_settings.h"
+#include "editor_node.h"
+#include "plugins/script_editor_plugin.h"
+
+class ConnectDialogBinds : public Object {
+
+ GDCLASS( ConnectDialogBinds, Object );
+public:
+
+ Vector<Variant> params;
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ String name=p_name;
+
+ if (name.begins_with("bind/")) {
+ int which = name.get_slice("/",1).to_int()-1;
+ ERR_FAIL_INDEX_V(which,params.size(),false);
+ params[which]=p_value;
+ } else
+ return false;
+
+ return true;
+ }
+
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ String name=p_name;
+
+ if (name.begins_with("bind/")) {
+ int which = name.get_slice("/",1).to_int()-1;
+ ERR_FAIL_INDEX_V(which,params.size(),false);
+ r_ret = params[which];
+ } else
+ return false;
+
+ return true;
+ }
+
+ void _get_property_list(List<PropertyInfo> *p_list) const {
+
+ for(int i=0;i<params.size();i++) {
+ p_list->push_back( PropertyInfo( params[i].get_type(), "bind/"+itos(i+1)) );
+ }
+ }
+
+ void notify_changed() {
+
+ _change_notify();
+ }
+
+ ConnectDialogBinds() {
+
+
+ }
+};
+
+void ConnectDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ //RID ci = get_canvas_item();
+ //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ bind_editor->edit(cdbinds);
+ }
+}
+
+void ConnectDialog::_tree_node_selected() {
+
+ //dst_method_list->get_popup()->clear();
+ Node *current=tree->get_selected();
+
+ if (!current) {
+ make_callback->hide();
+ return;
+ }
+
+
+ if (current->get_script().is_null())
+ make_callback->hide();
+ else
+ make_callback->show();
+#if 0
+ List<MethodInfo> methods;
+ current->get_method_list(&methods);
+ for (List<MethodInfo>::Element *E=methods.front();E;E=E->next()) {
+
+ if (E->get().name.length() && E->get().name[0]=='_')
+ continue; // hidden method, not show!
+
+ if (ClassDB::has_method(node->get_type(),"Node") || ClassDB::has_method(node->get_type(),"Control",true))
+ continue; //avoid too much unnecesary stuff
+
+ String method=E->get().name+"(";
+ for(int i=0;i<E->get().arguments.size();i++) {
+
+ if (i!=0)
+ method+=", ";
+ method+=Variant::get_type_name(E->get().arguments[i].type);
+ if (E->get().arguments[i].name.length()) {
+ method+=" ";
+ method+=E->get().arguments[i].name;
+ }
+ }
+ method+=")";
+
+ //dst_method_list->get_popup()->add_item(method);
+ }
+#endif
+ dst_path->set_text(node->get_path_to(current));
+
+
+}
+
+void ConnectDialog::_dst_method_list_selected(int p_idx) {
+
+ //dst_method->set_text( dst_method_list->get_popup()->get_item_text(p_idx));
+}
+
+void ConnectDialog::edit(Node *p_node) {
+
+ node=p_node;
+
+ //dst_method_list->get_popup()->clear();
+
+
+ tree->set_selected(NULL);
+ tree->set_marked(node,true);
+ dst_path->set_text("");
+ dst_method->set_text("");
+ deferred->set_pressed(false);
+ oneshot->set_pressed(false);
+ cdbinds->params.clear();
+ cdbinds->notify_changed();
+}
+
+void ConnectDialog::ok_pressed() {
+
+ if (dst_method->get_text()=="") {
+
+ error->set_text(TTR("Method in target Node must be specified!"));
+ error->popup_centered_minsize();
+ return;
+ }
+ Node* target = tree->get_selected();
+ if (target->get_script().is_null()) {
+ if (!target->has_method(dst_method->get_text())) {
+ error->set_text(TTR("Target method not found! Specify a valid method or attach a script to target Node."));
+ error->popup_centered_minsize();
+ return;
+ }
+ }
+ emit_signal("connected");
+ hide();
+
+}
+void ConnectDialog::_cancel_pressed() {
+
+ hide();
+}
+
+
+NodePath ConnectDialog::get_dst_path() const {
+
+ return dst_path->get_text();
+}
+
+
+bool ConnectDialog::get_deferred() const {
+
+ return deferred->is_pressed();
+}
+
+bool ConnectDialog::get_oneshot() const {
+
+ return oneshot->is_pressed();
+}
+
+StringName ConnectDialog::get_dst_method() const {
+
+ String txt=dst_method->get_text();
+ if (txt.find("(")!=-1)
+ txt=txt.left( txt.find("(")).strip_edges();
+ return txt;
+}
+
+
+Vector<Variant> ConnectDialog::get_binds() const {
+
+
+ return cdbinds->params;
+}
+
+void ConnectDialog::_add_bind() {
+
+ if (cdbinds->params.size() >= VARIANT_ARG_MAX)
+ return;
+ Variant::Type vt = (Variant::Type)type_list->get_item_ID(type_list->get_selected());
+
+ Variant value;
+
+ switch(vt) {
+
+ case Variant::BOOL: value = false ; break;
+ case Variant::INT: value = 0; break;
+ case Variant::REAL: value = 0.0; break;
+ case Variant::STRING: value = ""; break;
+ case Variant::VECTOR2: value = Vector2(); break;
+ case Variant::RECT2: value = Rect2(); break;
+ case Variant::VECTOR3: value = Vector3(); break;
+ case Variant::PLANE: value = Plane(); break;
+ case Variant::QUAT: value = Quat(); break;
+ case Variant::RECT3: value = Rect3(); break;
+ case Variant::BASIS: value = Basis(); break;
+ case Variant::TRANSFORM: value = Transform(); break;
+ case Variant::COLOR: value = Color(); break;
+ case Variant::IMAGE: value = Image(); break;
+
+ default: { ERR_FAIL(); } break;
+ }
+
+ ERR_FAIL_COND(value.get_type()==Variant::NIL);
+
+ cdbinds->params.push_back(value);
+ cdbinds->notify_changed();
+
+}
+
+void ConnectDialog::_remove_bind() {
+
+ String st = bind_editor->get_selected_path();
+ if (st=="")
+ return;
+ int idx = st.get_slice("/",1).to_int()-1;
+
+ ERR_FAIL_INDEX(idx,cdbinds->params.size());
+ cdbinds->params.remove(idx);
+ cdbinds->notify_changed();
+
+}
+
+void ConnectDialog::set_dst_node(Node* p_node) {
+
+ tree->set_selected(p_node);
+}
+
+void ConnectDialog::set_dst_method(const StringName& p_method) {
+
+ dst_method->set_text(p_method);
+}
+
+void ConnectDialog::_bind_methods() {
+
+ //ClassDB::bind_method("_ok",&ConnectDialog::_ok_pressed);
+ ClassDB::bind_method("_cancel",&ConnectDialog::_cancel_pressed);
+ //ClassDB::bind_method("_dst_method_list_selected",&ConnectDialog::_dst_method_list_selected);
+ ClassDB::bind_method("_tree_node_selected",&ConnectDialog::_tree_node_selected);
+
+ ClassDB::bind_method("_add_bind",&ConnectDialog::_add_bind);
+ ClassDB::bind_method("_remove_bind",&ConnectDialog::_remove_bind);
+
+ ADD_SIGNAL( MethodInfo("connected") );
+}
+
+ConnectDialog::ConnectDialog() {
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+
+ HBoxContainer *main_hb = memnew( HBoxContainer );
+ vbc->add_child(main_hb);
+ main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ VBoxContainer *vbc_left = memnew( VBoxContainer );
+ main_hb->add_child(vbc_left);
+ vbc_left->set_h_size_flags(SIZE_EXPAND_FILL);
+
+
+ tree = memnew(SceneTreeEditor(false));
+ tree->get_scene_tree()->connect("item_activated",this,"_ok");
+ vbc_left->add_margin_child(TTR("Connect To Node:"),tree,true);
+
+
+
+ VBoxContainer *vbc_right = memnew( VBoxContainer );
+ main_hb->add_child(vbc_right);
+ vbc_right->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *add_bind_hb = memnew( HBoxContainer );
+
+ type_list = memnew( OptionButton );
+ type_list->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_bind_hb->add_child(type_list);
+
+
+ type_list->add_item("bool",Variant::BOOL);
+ type_list->add_item("int",Variant::INT);
+ type_list->add_item("real",Variant::REAL);
+ type_list->add_item("string",Variant::STRING);
+ //type_list->add_separator();
+ type_list->add_item("Vector2",Variant::VECTOR2);
+ type_list->add_item("Rect2",Variant::RECT2);
+ type_list->add_item("Vector3",Variant::VECTOR3);
+ type_list->add_item("Plane",Variant::PLANE);
+ type_list->add_item("Quat",Variant::QUAT);
+ type_list->add_item("Rect3",Variant::RECT3);
+ type_list->add_item("Basis",Variant::BASIS);
+ type_list->add_item("Transform",Variant::TRANSFORM);
+ //type_list->add_separator();
+ type_list->add_item("Color",Variant::COLOR);
+ type_list->add_item("Image",Variant::IMAGE);
+ type_list->select(0);
+
+ Button *add_bind = memnew( Button );
+
+ add_bind->set_text(TTR("Add"));
+ add_bind_hb->add_child(add_bind);
+ add_bind->connect("pressed",this,"_add_bind");
+
+ Button *del_bind = memnew( Button );
+ del_bind->set_text(TTR("Remove"));
+ add_bind_hb->add_child(del_bind);
+ del_bind->connect("pressed",this,"_remove_bind");
+
+ vbc_right->add_margin_child(TTR("Add Extra Call Argument:"),add_bind_hb);
+
+ bind_editor = memnew( PropertyEditor );
+ bind_editor->hide_top_label();
+
+ vbc_right->add_margin_child(TTR("Extra Call Arguments:"),bind_editor,true);
+
+
+
+ dst_path = memnew(LineEdit);
+ vbc->add_margin_child(TTR("Path to Node:"),dst_path);
+
+
+ HBoxContainer *dstm_hb = memnew( HBoxContainer );
+ vbc->add_margin_child("Method In Node:",dstm_hb);
+
+ dst_method = memnew(LineEdit);
+ dst_method->set_h_size_flags(SIZE_EXPAND_FILL);
+ dstm_hb->add_child(dst_method);
+
+ /*dst_method_list = memnew( MenuButton );
+ dst_method_list->set_text("List..");
+ dst_method_list->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ dst_method_list->set_anchor( MARGIN_LEFT, ANCHOR_END );
+ dst_method_list->set_anchor( MARGIN_TOP, ANCHOR_END );
+ dst_method_list->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ dst_method_list->set_begin( Point2( 70,59) );
+ dst_method_list->set_end( Point2( 15,39 ) );
+ */
+ //add_child(dst_method_list);
+
+ make_callback = memnew( CheckButton );
+ make_callback->set_toggle_mode(true);
+ make_callback->set_pressed( EDITOR_DEF("text_editor/tools/create_signal_callbacks",true));
+ make_callback->set_text(TTR("Make Function"));
+ dstm_hb->add_child(make_callback);
+
+ deferred = memnew( CheckButton );
+ deferred->set_text(TTR("Deferred"));
+ dstm_hb->add_child(deferred);
+
+ oneshot = memnew( CheckButton );
+ oneshot->set_text(TTR("Oneshot"));
+ dstm_hb->add_child(oneshot);
+
+/*
+ realtime = memnew( CheckButton );
+ realtime->set_anchor( MARGIN_TOP, ANCHOR_END );
+ realtime->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ realtime->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ realtime->set_begin( Point2( 120, button_margin-10 ) );
+ realtime->set_end( Point2( 80, margin ) );
+ realtime->set_text("Realtime");
+ add_child(realtime);
+*/
+
+
+
+
+ //dst_method_list->get_popup()->connect("id_pressed", this,"_dst_method_list_selected");
+ tree->connect("node_selected", this,"_tree_node_selected");
+
+ set_as_toplevel(true);
+
+ cdbinds = memnew( ConnectDialogBinds );
+
+ error = memnew( ConfirmationDialog );
+ add_child(error);
+ error->get_ok()->set_text(TTR("Close"));
+ get_ok()->set_text(TTR("Connect"));
+ //error->get_cancel()->set_text("Close");
+
+
+
+
+}
+
+
+ConnectDialog::~ConnectDialog()
+{
+ memdelete( cdbinds );
+}
+
+
+
+void ConnectionsDock::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ //RID ci = get_canvas_item();
+ //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+}
+
+void ConnectionsDock::_close() {
+
+ hide();
+}
+
+void ConnectionsDock::_connect() {
+
+ TreeItem *it = tree->get_selected();
+ ERR_FAIL_COND(!it);
+ String signal=it->get_metadata(0).operator Dictionary()["name"];
+
+ NodePath dst_path=connect_dialog->get_dst_path();
+ Node *target = node->get_node(dst_path);
+ ERR_FAIL_COND(!target);
+
+ StringName dst_method=connect_dialog->get_dst_method();
+ bool defer=connect_dialog->get_deferred();
+ bool oshot=connect_dialog->get_oneshot();
+ Vector<Variant> binds = connect_dialog->get_binds();
+ PoolStringArray args = it->get_metadata(0).operator Dictionary()["args"];
+ int flags = CONNECT_PERSIST | (defer?CONNECT_DEFERRED:0) | (oshot?CONNECT_ONESHOT:0);
+
+ undo_redo->create_action(vformat(TTR("Connect '%s' to '%s'"),signal,String(dst_method)));
+ undo_redo->add_do_method(node,"connect",signal,target,dst_method,binds,flags);
+ undo_redo->add_undo_method(node,"disconnect",signal,target,dst_method);
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(this,"update_tree");
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+
+ undo_redo->commit_action();
+
+
+ if (connect_dialog->get_make_callback()) {
+
+ print_line("request connect");
+ editor->emit_signal("script_add_function_request",target,dst_method,args);
+ hide();
+ }
+
+ update_tree();
+
+}
+
+
+
+
+void ConnectionsDock::_connect_pressed() {
+
+
+ TreeItem *item = tree->get_selected();
+ if (!item) {
+ //no idea how this happened, but disable
+ connect_button->set_disabled(true);
+ return;
+ }
+ if (item->get_parent()==tree->get_root() || item->get_parent()->get_parent()==tree->get_root()) {
+ //a signal - connect
+ String signal=item->get_metadata(0).operator Dictionary()["name"];
+ String signalname=signal;
+ String midname=node->get_name();
+ for(int i=0;i<midname.length();i++) {
+ CharType c = midname[i];
+ if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_') {
+ //all good
+ } else if (c==' ') {
+ c='_';
+ } else {
+ midname.remove(i);
+ i--;
+ continue;
+ }
+
+ midname[i]=c;
+ }
+
+ connect_dialog->edit(node);
+ connect_dialog->popup_centered_ratio();
+ connect_dialog->set_title(TTR("Connecting Signal:")+" "+signalname);
+ connect_dialog->set_dst_method("_on_"+midname+"_"+signal);
+ connect_dialog->set_dst_node(node->get_owner()?node->get_owner():node);
+
+ } else {
+ //a slot- disconnect
+ Connection c=item->get_metadata(0);
+ ERR_FAIL_COND(c.source!=node); //shouldn't happen but...bugcheck
+
+ undo_redo->create_action(TTR("Create Subscription"));
+ undo_redo->add_do_method(node,"disconnect",c.signal,c.target,c.method);
+ undo_redo->add_undo_method(node,"connect",c.signal,c.target,c.method,Vector<Variant>(),c.flags);
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(this,"update_tree");
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+ undo_redo->commit_action();
+
+ c.source->disconnect(c.signal,c.target,c.method);
+ update_tree();
+ }
+}
+/*
+void ConnectionsDock::_remove() {
+
+ if (!tree->get_selected())
+ return;
+
+ TreeItem *selected=tree->get_selected();
+ if (!selected)
+ return;
+
+ Dictionary meta=selected->get_metadata(0);
+
+ remove_confirm->set_text(String()+"Remove Connection \""+meta["from_event"].operator String()+"\" ?");
+ remove_confirm->popup_centered(Size2(340,80));
+}
+*/
+/*
+void ConnectionsDock::_remove_confirm() {
+
+ if (!tree->get_selected())
+ return;
+ TreeItem *selected=tree->get_selected();
+ if (!selected)
+ return;
+
+ Dictionary meta=selected->get_metadata(0);
+
+ undo_redo->create_action("Remove Subscription");
+ undo_redo->add_do_method(node,"unsubscribe_path_event",meta["from_event"].operator String(),meta["from_path"].operator NodePath(),meta["to_method"].operator String());
+ undo_redo->add_undo_method(node,"subscribe_path_event_persist",meta["from_event"].operator String(),meta["from_path"].operator NodePath(),meta["to_method"].operator String(),Array(),false);
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(this,"update_tree");
+ undo_redo->commit_action();
+
+}
+*/
+
+struct _ConnectionsDockMethodInfoSort {
+
+ _FORCE_INLINE_ bool operator()(const MethodInfo& a, const MethodInfo& b) const {
+ return a.name < b.name;
+ }
+};
+
+void ConnectionsDock::update_tree() {
+
+ tree->clear();
+
+ if (!node)
+ return;
+
+
+ TreeItem *root=tree->create_item();
+
+ List<MethodInfo> node_signals;
+
+ node->get_signal_list(&node_signals);
+
+ //node_signals.sort_custom<_ConnectionsDockMethodInfoSort>();
+ bool did_script=false;
+ StringName base = node->get_class();
+
+ while(base) {
+
+ List<MethodInfo> node_signals;
+ Ref<Texture> icon;
+ String name;
+
+ if (!did_script) {
+
+ Ref<Script> scr = node->get_script();
+ if (scr.is_valid()) {
+ scr->get_script_signal_list(&node_signals);
+ if (scr->get_path().is_resource_file())
+ name=scr->get_path().get_file();
+ else
+ name=scr->get_class();
+
+ if (has_icon(scr->get_class(),"EditorIcons")) {
+ icon=get_icon(scr->get_class(),"EditorIcons");
+ }
+ }
+
+ } else {
+
+ ClassDB::get_signal_list(base,&node_signals,true);
+ if (has_icon(base,"EditorIcons")) {
+ icon=get_icon(base,"EditorIcons");
+ }
+ name=base;
+ }
+
+
+ TreeItem *pitem = NULL;
+
+ if (node_signals.size()) {
+ pitem=tree->create_item(root);
+ pitem->set_text(0,name);
+ pitem->set_icon(0,icon);
+ pitem->set_selectable(0,false);
+ pitem->set_editable(0,false);
+ pitem->set_custom_bg_color(0,get_color("prop_subsection","Editor"));
+ node_signals.sort();
+ }
+
+ for(List<MethodInfo>::Element *E=node_signals.front();E;E=E->next()) {
+
+
+ MethodInfo &mi =E->get();
+
+ String signaldesc;
+ signaldesc=mi.name+"(";
+ PoolStringArray argnames;
+ if (mi.arguments.size()) {
+ signaldesc+=" ";
+ for(int i=0;i<mi.arguments.size();i++) {
+
+ PropertyInfo &pi = mi.arguments[i];
+
+ if (i>0)
+ signaldesc+=", ";
+ String tname="var";
+ if (pi.type!=Variant::NIL) {
+ tname=Variant::get_type_name(pi.type);
+ }
+ signaldesc+=tname+" "+(pi.name==""?String("arg "+itos(i)):pi.name);
+ argnames.push_back(pi.name+":"+tname);
+
+ }
+ signaldesc+=" ";
+ }
+
+ signaldesc+=")";
+
+ TreeItem *item=tree->create_item(pitem);
+ item->set_text(0,signaldesc);
+ Dictionary sinfo;
+ sinfo["name"]=mi.name;
+ sinfo["args"]=argnames;
+ item->set_metadata(0,sinfo);
+ item->set_icon(0,get_icon("Signal","EditorIcons"));
+
+ List<Object::Connection> connections;
+ node->get_signal_connection_list(mi.name,&connections);
+
+ for(List<Object::Connection>::Element *F=connections.front();F;F=F->next()) {
+
+ Object::Connection&c = F->get();
+ if (!(c.flags&CONNECT_PERSIST))
+ continue;
+
+ Node *target = c.target->cast_to<Node>();
+ if (!target)
+ continue;
+
+ String path = String(node->get_path_to(target))+" :: "+c.method+"()";
+ if (c.flags&CONNECT_DEFERRED)
+ path+=" (deferred)";
+ if (c.flags&CONNECT_ONESHOT)
+ path+=" (oneshot)";
+ if (c.binds.size()) {
+
+ path+=" binds( ";
+ for(int i=0;i<c.binds.size();i++) {
+
+ if (i>0)
+ path+=", ";
+ path+=c.binds[i].operator String();
+ }
+ path+=" )";
+ }
+
+ TreeItem *item2=tree->create_item(item);
+ item2->set_text(0,path);
+ item2->set_metadata(0,c);
+ item2->set_icon(0,get_icon("Slot","EditorIcons"));
+
+
+ }
+ }
+
+ if (!did_script) {
+ did_script=true;
+ } else {
+ base=ClassDB::get_parent_class(base);
+ }
+ }
+
+ connect_button->set_text(TTR("Connect"));
+ connect_button->set_disabled(true);
+
+}
+
+void ConnectionsDock::set_node(Node* p_node) {
+
+ node=p_node;
+ update_tree();
+}
+
+void ConnectionsDock::_something_selected() {
+
+ TreeItem *item = tree->get_selected();
+ if (!item) {
+ //no idea how this happened, but disable
+ connect_button->set_text(TTR("Connect.."));
+ connect_button->set_disabled(true);
+
+ } else if (item->get_parent()==tree->get_root() || item->get_parent()->get_parent()==tree->get_root()) {
+ //a signal - connect
+ connect_button->set_text(TTR("Connect.."));
+ connect_button->set_disabled(false);
+
+ } else {
+ //a slot- disconnect
+ connect_button->set_text(TTR("Disconnect"));
+ connect_button->set_disabled(false);
+ }
+
+}
+
+void ConnectionsDock::_something_activated() {
+
+ TreeItem *item = tree->get_selected();
+
+ if (!item)
+ return;
+
+ if (item->get_parent()==tree->get_root() || item->get_parent()->get_parent()==tree->get_root()) {
+ // a signal - connect
+ String signal=item->get_metadata(0).operator Dictionary()["name"];
+ String midname=node->get_name();
+ for(int i=0;i<midname.length();i++) {
+ CharType c = midname[i];
+ if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_') {
+ //all good
+ } else if (c==' ') {
+ c='_';
+ } else {
+ midname.remove(i);
+ i--;
+ continue;
+ }
+
+ midname[i]=c;
+ }
+
+ connect_dialog->edit(node);
+ connect_dialog->popup_centered_ratio();
+ connect_dialog->set_dst_method("_on_"+midname+"_"+signal);
+ connect_dialog->set_dst_node(node->get_owner()?node->get_owner():node);
+ } else {
+ // a slot - go to target method
+ Connection c=item->get_metadata(0);
+ ERR_FAIL_COND(c.source!=node); //shouldn't happen but...bugcheck
+
+ if (!c.target)
+ return;
+
+ Ref<Script> script = c.target->get_script();
+
+ if (script.is_valid() && ScriptEditor::get_singleton()->script_go_to_method(script,c.method)) {
+ editor->call("_editor_select",EditorNode::EDITOR_SCRIPT);
+ }
+ }
+}
+
+void ConnectionsDock::_bind_methods() {
+
+
+ ClassDB::bind_method("_connect",&ConnectionsDock::_connect);
+ ClassDB::bind_method("_something_selected",&ConnectionsDock::_something_selected);
+ ClassDB::bind_method("_something_activated",&ConnectionsDock::_something_activated);
+ ClassDB::bind_method("_close",&ConnectionsDock::_close);
+ ClassDB::bind_method("_connect_pressed",&ConnectionsDock::_connect_pressed);
+ ClassDB::bind_method("update_tree",&ConnectionsDock::update_tree);
+
+
+}
+
+ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
+
+ editor=p_editor;
+ set_name(TTR("Signals"));
+
+
+ VBoxContainer *vbc = this;
+
+ tree = memnew( Tree );
+ tree->set_columns(1);
+ tree->set_select_mode(Tree::SELECT_ROW);
+ tree->set_hide_root(true);
+ vbc->add_child(tree);
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ connect_button = memnew( Button );
+ connect_button->set_text("Connect");
+ HBoxContainer *hb = memnew( HBoxContainer);
+ vbc->add_child(hb);
+ hb->add_spacer();
+ hb->add_child(connect_button);
+ connect_button->connect("pressed",this,"_connect_pressed");
+ //add_child(tree);
+
+ connect_dialog = memnew( ConnectDialog );
+ connect_dialog->set_as_toplevel(true);
+ add_child(connect_dialog);
+
+ remove_confirm = memnew( ConfirmationDialog );
+ remove_confirm->set_as_toplevel(true);
+ add_child(remove_confirm);
+
+ /*
+ node_only->set_anchor( MARGIN_TOP, ANCHOR_END );
+ node_only->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ node_only->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+
+ node_only->set_begin( Point2( 20,51) );
+ node_only->set_end( Point2( 10,44) );
+ */
+
+
+ remove_confirm->connect("confirmed", this,"_remove_confirm");
+ connect_dialog->connect("connected", this,"_connect");
+ tree->connect("item_selected", this,"_something_selected");
+ tree->connect("item_activated", this,"_something_activated");
+
+ add_constant_override("separation",3*EDSCALE);
+}
+
+
+ConnectionsDock::~ConnectionsDock()
+{
+}
+
+
diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h
new file mode 100644
index 0000000000..6407b83f6e
--- /dev/null
+++ b/editor/connections_dialog.h
@@ -0,0 +1,134 @@
+/*************************************************************************/
+/* connections_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CONNECTIONS_DIALOG_H
+#define CONNECTIONS_DIALOG_H
+
+#include "scene/gui/popup.h"
+#include "scene/gui/button.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/line_edit.h"
+#include "editor/scene_tree_editor.h"
+#include "editor/property_editor.h"
+#include "undo_redo.h"
+
+/**
+@author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class ConnectDialogBinds;
+
+class ConnectDialog : public ConfirmationDialog {
+
+ GDCLASS( ConnectDialog, ConfirmationDialog );
+
+
+ ConfirmationDialog *error;
+ LineEdit *dst_path;
+ LineEdit *dst_method;
+ SceneTreeEditor *tree;
+ //MenuButton *dst_method_list;
+ OptionButton *type_list;
+ CheckButton *deferred;
+ CheckButton *oneshot;
+ CheckButton *make_callback;
+ PropertyEditor *bind_editor;
+ Node *node;
+ ConnectDialogBinds *cdbinds;
+ void ok_pressed();
+ void _cancel_pressed();
+ void _tree_node_selected();
+ void _dst_method_list_selected(int p_idx);
+ void _add_bind();
+ void _remove_bind();
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+
+ bool get_make_callback() { return make_callback->is_visible() && make_callback->is_pressed(); }
+ NodePath get_dst_path() const;
+ StringName get_dst_method() const;
+ bool get_deferred() const;
+ bool get_oneshot() const;
+ Vector<Variant> get_binds() const;
+ void set_dst_method(const StringName& p_method);
+ void set_dst_node(Node* p_node);
+
+ //Button *get_ok() { return ok; }
+ //Button *get_cancel() { return cancel; }
+ void edit(Node *p_node);
+
+ ConnectDialog();
+ ~ConnectDialog();
+
+};
+
+class ConnectionsDock : public VBoxContainer {
+
+ GDCLASS( ConnectionsDock , VBoxContainer );
+
+ Button *connect_button;
+ EditorNode *editor;
+ Node *node;
+ Tree *tree;
+ ConfirmationDialog *remove_confirm;
+ ConnectDialog *connect_dialog;
+
+ void update_tree();
+
+ void _close();
+ void _connect();
+ void _something_selected();
+ void _something_activated();
+ UndoRedo *undo_redo;
+
+protected:
+
+ void _connect_pressed();
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_undoredo(UndoRedo *p_undo_redo) { undo_redo=p_undo_redo; }
+
+ void set_node(Node* p_node);
+ String get_selected_type();
+
+ ConnectionsDock(EditorNode *p_editor=NULL);
+ ~ConnectionsDock();
+
+};
+
+#endif
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
new file mode 100644
index 0000000000..58bb148ce1
--- /dev/null
+++ b/editor/create_dialog.cpp
@@ -0,0 +1,961 @@
+/*************************************************************************/
+/* create_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "create_dialog.h"
+
+#include "class_db.h"
+#include "print_string.h"
+#include "scene/gui/box_container.h"
+#include "editor_node.h"
+
+#if 1
+
+#include "os/keyboard.h"
+#include "editor_settings.h"
+#include "editor_help.h"
+
+
+void CreateDialog::popup(bool p_dontclear) {
+
+ recent->clear();
+
+ FileAccess *f = FileAccess::open( EditorSettings::get_singleton()->get_project_settings_path().plus_file("create_recent."+base_type), FileAccess::READ );
+
+ if (f) {
+
+ TreeItem *root = recent->create_item();
+
+ while(!f->eof_reached()) {
+ String l = f->get_line().strip_edges();
+
+ if (l!=String()) {
+
+ TreeItem *ti = recent->create_item(root);
+ ti->set_text(0,l);
+ if (has_icon(l,"EditorIcons")) {
+
+ ti->set_icon(0,get_icon(l,"EditorIcons"));
+ } else {
+ ti->set_icon(0,get_icon("Object","EditorIcons"));
+ }
+ }
+ }
+
+ memdelete(f);
+ }
+
+ favorites->clear();
+
+ f = FileAccess::open( EditorSettings::get_singleton()->get_project_settings_path().plus_file("favorites."+base_type), FileAccess::READ );
+
+ favorite_list.clear();
+
+ if (f) {
+
+
+ while(!f->eof_reached()) {
+ String l = f->get_line().strip_edges();
+
+ if (l!=String()) {
+ favorite_list.push_back(l);
+ }
+ }
+
+ memdelete(f);
+ } else {
+#if 0
+// I think this was way too confusing
+ if (base_type=="Node") {
+ //harcode some favorites :D
+ favorite_list.push_back("Panel");
+ favorite_list.push_back("Button");
+ favorite_list.push_back("Label");
+ favorite_list.push_back("LineEdit");
+ favorite_list.push_back("Node2D");
+ favorite_list.push_back("Sprite");
+ favorite_list.push_back("Camera2D");
+ favorite_list.push_back("Area2D");
+ favorite_list.push_back("CollisionShape2D");
+ favorite_list.push_back("Spatial");
+ favorite_list.push_back("Camera");
+ favorite_list.push_back("Area");
+ favorite_list.push_back("CollisionShape");
+ favorite_list.push_back("TestCube");
+ favorite_list.push_back("AnimationPlayer");
+
+ }
+#endif
+ }
+
+ _update_favorite_list();
+
+ popup_centered_ratio();
+ if (p_dontclear)
+ search_box->select_all();
+ else {
+ search_box->clear();
+ }
+ search_box->grab_focus();
+
+ _update_search();
+
+
+}
+
+
+void CreateDialog::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void CreateDialog::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ search_options->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+
+}
+
+void CreateDialog::add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root,TreeItem **to_select) {
+
+ if (p_types.has(p_type))
+ return;
+ if (!ClassDB::is_parent_class(p_type,base_type) || p_type==base_type)
+ return;
+
+ String inherits=ClassDB::get_parent_class(p_type);
+
+ TreeItem *parent=p_root;
+
+
+ if (inherits.length()) {
+
+ if (!p_types.has(inherits)) {
+
+ add_type(inherits,p_types,p_root,to_select);
+ }
+
+ if (p_types.has(inherits) )
+ parent=p_types[inherits];
+ }
+
+ TreeItem *item = search_options->create_item(parent);
+ item->set_text(0,p_type);
+ if (!ClassDB::can_instance(p_type)) {
+ item->set_custom_color(0, Color(0.5,0.5,0.5) );
+ item->set_selectable(0,false);
+ } else {
+
+ if ((!*to_select && (search_box->get_text().is_subsequence_ofi(p_type))) || search_box->get_text()==p_type) {
+ *to_select=item;
+ }
+
+ }
+
+ if (bool(EditorSettings::get_singleton()->get("docks/scene_tree/start_create_dialog_fully_expanded"))) {
+ item->set_collapsed(false);
+ } else {
+ // don't collapse search results
+ bool collapse = (search_box->get_text() == "");
+ // don't collapse the root node
+ collapse &= (item != p_root);
+ // don't collapse abstract nodes on the first tree level
+ collapse &= ((parent != p_root) || (ClassDB::can_instance(p_type)));
+ item->set_collapsed(collapse);
+ }
+
+ const String& description = EditorHelp::get_doc_data()->class_list[p_type].brief_description;
+ item->set_tooltip(0,description);
+
+
+ if (has_icon(p_type,"EditorIcons")) {
+
+ item->set_icon(0, get_icon(p_type,"EditorIcons"));
+ }
+
+
+
+ p_types[p_type]=item;
+}
+
+void CreateDialog::_update_search() {
+
+
+ search_options->clear();
+ favorite->set_disabled(true);
+
+ help_bit->set_text("");
+ /*
+ TreeItem *root = search_options->create_item();
+ _parse_fs(EditorFileSystem::get_singleton()->get_filesystem());
+*/
+
+ List<StringName> type_list;
+ ClassDB::get_class_list(&type_list);
+
+ HashMap<String,TreeItem*> types;
+
+ TreeItem *root = search_options->create_item();
+
+ root->set_text(0,base_type);
+ if (has_icon(base_type,"EditorIcons")) {
+ root->set_icon(0,get_icon(base_type,"EditorIcons"));
+ }
+
+ List<StringName>::Element *I=type_list.front();
+ TreeItem *to_select=NULL;
+
+ for(;I;I=I->next()) {
+
+
+
+ String type=I->get();
+
+ if (base_type=="Node" && type.begins_with("Editor"))
+ continue; // do not show editor nodes
+
+ if (!ClassDB::can_instance(type))
+ continue; // cant create what can't be instanced
+
+ if (search_box->get_text()=="") {
+ add_type(type,types,root,&to_select);
+ } else {
+
+ bool found=false;
+ String type=I->get();
+ while(type!="" && ClassDB::is_parent_class(type,base_type) && type!=base_type) {
+ if (search_box->get_text().is_subsequence_ofi(type)) {
+
+ found=true;
+ break;
+ }
+
+ type=ClassDB::get_parent_class(type);
+ }
+
+
+ if (found)
+ add_type(I->get(),types,root,&to_select);
+ }
+
+ if (EditorNode::get_editor_data().get_custom_types().has(type) && ClassDB::is_parent_class(type, base_type)) {
+ //there are custom types based on this... cool.
+ //print_line("there are custom types");
+
+
+ const Vector<EditorData::CustomType> &ct = EditorNode::get_editor_data().get_custom_types()[type];
+ for(int i=0;i<ct.size();i++) {
+
+ bool show = search_box->get_text().is_subsequence_ofi(ct[i].name);
+
+ if (!show)
+ continue;
+
+ if (!types.has(type))
+ add_type(type,types,root,&to_select);
+
+ TreeItem *ti;
+ if (types.has(type) )
+ ti=types[type];
+ else
+ ti=search_options->get_root();
+
+
+ TreeItem *item = search_options->create_item(ti);
+ item->set_metadata(0,type);
+ item->set_text(0,ct[i].name);
+ if (ct[i].icon.is_valid()) {
+ item->set_icon(0,ct[i].icon);
+
+ }
+
+ if (!to_select || ct[i].name==search_box->get_text()) {
+ to_select=item;
+ }
+
+ }
+
+ }
+ }
+
+ if (to_select) {
+ to_select->select(0);
+ favorite->set_disabled(false);
+ favorite->set_pressed(favorite_list.find(to_select->get_text(0))!=-1);
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+void CreateDialog::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+
+ FileAccess *f = FileAccess::open( EditorSettings::get_singleton()->get_project_settings_path().plus_file("create_recent."+base_type), FileAccess::WRITE );
+
+ if (f) {
+ f->store_line(get_selected_type());
+ TreeItem *t = recent->get_root();
+ if (t)
+ t=t->get_children();
+ int count=0;
+ while(t) {
+ if (t->get_text(0)!=get_selected_type()) {
+
+ f->store_line(t->get_text(0));
+ }
+
+ if (count>32) {
+ //limit it to 32 entries..
+ break;
+ }
+ t=t->get_next();
+ count++;
+ }
+
+ memdelete(f);
+ }
+
+ emit_signal("create");
+ hide();
+}
+
+void CreateDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+ favorite->set_icon(get_icon("Favorites","EditorIcons"));
+ }
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ disconnect("confirmed",this,"_confirmed");
+
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ if (is_visible_in_tree()) {
+
+ search_box->call_deferred("grab_focus"); // still not visible
+ search_box->select_all();
+ }
+ }
+
+}
+
+void CreateDialog::set_base_type(const String& p_base) {
+
+ base_type=p_base;
+ set_title(TTR("Create New")+" "+p_base);
+ _update_search();
+}
+
+String CreateDialog::get_selected_type() {
+
+ TreeItem *selected = search_options->get_selected();
+ if (selected)
+ return selected->get_text(0);
+ else
+ return String();
+}
+
+Object *CreateDialog::instance_selected() {
+
+ TreeItem *selected = search_options->get_selected();
+
+ if (selected) {
+
+ Variant md = selected->get_metadata(0);
+
+ String custom;
+ if (md.get_type()!=Variant::NIL)
+ custom=md;
+
+ if (custom!=String()) {
+ if (EditorNode::get_editor_data().get_custom_types().has(custom)) {
+
+ for(int i=0;i<EditorNode::get_editor_data().get_custom_types()[custom].size();i++) {
+ if (EditorNode::get_editor_data().get_custom_types()[custom][i].name==selected->get_text(0)) {
+ Ref<Texture> icon = EditorNode::get_editor_data().get_custom_types()[custom][i].icon;
+ Ref<Script> script = EditorNode::get_editor_data().get_custom_types()[custom][i].script;
+ String name = selected->get_text(0);
+
+ Object *ob = ClassDB::instance(custom);
+ ERR_FAIL_COND_V(!ob,NULL);
+ if (ob->is_class("Node")) {
+ ob->call("set_name",name);
+ }
+ ob->set_script(script.get_ref_ptr());
+ if (icon.is_valid())
+ ob->set_meta("_editor_icon",icon);
+ return ob;
+
+ }
+ }
+
+ }
+ } else {
+ return ClassDB::instance(selected->get_text(0));
+ }
+ }
+
+
+ return NULL;
+}
+
+
+String CreateDialog::get_base_type() const {
+
+ return base_type;
+}
+
+void CreateDialog::_item_selected() {
+
+ TreeItem *item = search_options->get_selected();
+ if (!item)
+ return;
+
+ String name = item->get_text(0);
+
+ favorite->set_disabled(false);
+ favorite->set_pressed(favorite_list.find(name)!=-1);
+
+ if (!EditorHelp::get_doc_data()->class_list.has(name))
+ return;
+
+ help_bit->set_text(EditorHelp::get_doc_data()->class_list[name].brief_description);
+
+}
+
+
+void CreateDialog::_favorite_toggled() {
+
+ TreeItem *item = search_options->get_selected();
+ if (!item)
+ return;
+
+ String name = item->get_text(0);
+
+ if (favorite_list.find(name)==-1) {
+ favorite_list.push_back(name);
+ favorite->set_pressed(true);
+ } else {
+ favorite_list.erase(name);
+ favorite->set_pressed(false);
+ }
+
+ _save_favorite_list();
+ _update_favorite_list();
+}
+
+void CreateDialog::_save_favorite_list() {
+
+ FileAccess *f = FileAccess::open( EditorSettings::get_singleton()->get_project_settings_path().plus_file("favorites."+base_type), FileAccess::WRITE );
+
+ if (f) {
+
+ for(int i=0;i<favorite_list.size();i++) {
+
+ f->store_line(favorite_list[i]);
+ }
+ memdelete(f);
+ }
+}
+
+void CreateDialog::_update_favorite_list() {
+
+ favorites->clear();
+ TreeItem *root = favorites->create_item();
+ for(int i=0;i<favorite_list.size();i++) {
+ TreeItem *ti = favorites->create_item(root);
+ String l = favorite_list[i];
+ ti->set_text(0,l);
+
+ if (has_icon(l,"EditorIcons")) {
+
+ ti->set_icon(0,get_icon(l,"EditorIcons"));
+ } else {
+ ti->set_icon(0,get_icon("Object","EditorIcons"));
+ }
+ }
+}
+
+
+void CreateDialog::_history_selected() {
+
+ TreeItem *item = recent->get_selected();
+ if (!item)
+ return;
+
+ search_box->set_text(item->get_text(0));
+ _update_search();
+
+}
+
+void CreateDialog::_favorite_selected(){
+
+ TreeItem *item = favorites->get_selected();
+ if (!item)
+ return;
+
+ search_box->set_text(item->get_text(0));
+ _update_search();
+
+}
+
+void CreateDialog::_history_activated() {
+
+ _confirmed();
+}
+
+void CreateDialog::_favorite_activated(){
+
+ _confirmed();
+}
+
+Variant CreateDialog::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ TreeItem *ti = favorites->get_item_at_pos(p_point);
+ if (ti) {
+ Dictionary d;
+ d["type"]="create_favorite_drag";
+ d["class"]=ti->get_text(0);
+
+ ToolButton *tb = memnew( ToolButton );
+ tb->set_icon(ti->get_icon(0));
+ tb->set_text(ti->get_text(0));
+ set_drag_preview(tb);
+
+ return d;
+ }
+
+ return Variant();
+}
+
+bool CreateDialog::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ Dictionary d = p_data;
+ if (d.has("type") && String(d["type"])=="create_favorite_drag") {
+ favorites->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+ return true;
+ }
+
+ return false;
+}
+void CreateDialog::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ Dictionary d = p_data;
+
+ TreeItem *ti = favorites->get_item_at_pos(p_point);
+ if (!ti)
+ return;
+
+ String drop_at = ti->get_text(0);
+ int ds = favorites->get_drop_section_at_pos(p_point);
+
+ int drop_idx = favorite_list.find(drop_at);
+ if (drop_idx<0)
+ return;
+
+ String type = d["class"];
+
+ int from_idx = favorite_list.find(type);
+ if (from_idx<0)
+ return;
+
+ if (drop_idx==from_idx) {
+ ds=-1; //cause it will be gone
+ } else if (drop_idx>from_idx) {
+ drop_idx--;
+ }
+
+ favorite_list.remove(from_idx);
+
+ if (ds<0) {
+ favorite_list.insert(drop_idx,type);
+ } else {
+ if (drop_idx>=favorite_list.size()-1) {
+ favorite_list.push_back(type);
+ } else {
+ favorite_list.insert(drop_idx+1,type);
+ }
+ }
+
+ _save_favorite_list();
+ _update_favorite_list();
+
+
+}
+
+void CreateDialog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&CreateDialog::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&CreateDialog::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&CreateDialog::_sbox_input);
+ ClassDB::bind_method(D_METHOD("_item_selected"),&CreateDialog::_item_selected);
+ ClassDB::bind_method(D_METHOD("_favorite_toggled"),&CreateDialog::_favorite_toggled);
+ ClassDB::bind_method(D_METHOD("_history_selected"),&CreateDialog::_history_selected);
+ ClassDB::bind_method(D_METHOD("_favorite_selected"),&CreateDialog::_favorite_selected);
+ ClassDB::bind_method(D_METHOD("_history_activated"),&CreateDialog::_history_activated);
+ ClassDB::bind_method(D_METHOD("_favorite_activated"),&CreateDialog::_favorite_activated);
+
+
+ ClassDB::bind_method("get_drag_data_fw",&CreateDialog::get_drag_data_fw);
+ ClassDB::bind_method("can_drop_data_fw",&CreateDialog::can_drop_data_fw);
+ ClassDB::bind_method("drop_data_fw",&CreateDialog::drop_data_fw);
+
+ ADD_SIGNAL(MethodInfo("create"));
+
+}
+
+
+CreateDialog::CreateDialog() {
+
+ HSplitContainer *hbc = memnew( HSplitContainer );
+
+ add_child(hbc);
+
+
+ VBoxContainer *lvbc = memnew( VBoxContainer);
+ hbc->add_child(lvbc);
+ lvbc->set_custom_minimum_size(Size2(150,0)*EDSCALE);
+
+ favorites = memnew (Tree );
+ lvbc->add_margin_child(TTR("Favorites:"),favorites,true);
+ favorites->set_hide_root(true);
+ favorites->set_hide_folding(true);
+ favorites->connect("cell_selected",this,"_favorite_selected");
+ favorites->connect("item_activated",this,"_favorite_activated");
+ favorites->set_drag_forwarding(this);
+
+
+ recent = memnew (Tree );
+ lvbc->add_margin_child(TTR("Recent:"),recent,true);
+ recent->set_hide_root(true);
+ recent->set_hide_folding(true);
+ recent->connect("cell_selected",this,"_history_selected");
+ recent->connect("item_activated",this,"_history_activated");
+
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ hbc->add_child(vbc);
+ vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ HBoxContainer *search_hb = memnew( HBoxContainer );
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ search_hb->add_child(search_box);
+ favorite = memnew( Button );
+ favorite->set_toggle_mode(true);
+ search_hb->add_child(favorite);
+ favorite->connect("pressed",this,"_favorite_toggled");
+ vbc->add_margin_child(TTR("Search:"),search_hb);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("Create"));
+ get_ok()->set_disabled(true);
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
+ search_options->connect("item_activated",this,"_confirmed");
+ search_options->connect("cell_selected",this,"_item_selected");
+ //search_options->set_hide_root(true);
+ base_type="Object";
+
+ help_bit = memnew( EditorHelpBit );
+ vbc->add_margin_child(TTR("Description:"),help_bit);
+ help_bit->connect("request_hide",this,"_closed");
+
+}
+
+
+#else
+
+//old create dialog, disabled
+
+void CreateDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+ connect("confirmed",this,"_create");
+ update_tree();
+ }
+ if (p_what==NOTIFICATION_DRAW) {
+
+ //RID ci = get_canvas_item();
+ //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+}
+
+
+void CreateDialog::_create() {
+
+ if (tree->get_selected())
+ emit_signal("create");
+ hide();
+}
+
+void CreateDialog::_cancel() {
+
+ hide();
+}
+
+void CreateDialog::_text_changed(String p_text) {
+
+ update_tree();
+}
+
+void CreateDialog::add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root) {
+
+ if (p_types.has(p_type))
+ return;
+ if (!ClassDB::is_type(p_type,base) || p_type==base)
+ return;
+
+ String inherits=ClassDB::type_inherits_from(p_type);
+
+ TreeItem *parent=p_root;
+
+
+ if (inherits.length()) {
+
+ if (!p_types.has(inherits)) {
+
+ add_type(inherits,p_types,p_root);
+ }
+
+ if (p_types.has(inherits) )
+ parent=p_types[inherits];
+ }
+
+ TreeItem *item = tree->create_item(parent);
+ item->set_text(0,p_type);
+ if (!ClassDB::can_instance(p_type)) {
+ item->set_custom_color(0, Color(0.5,0.5,0.5) );
+ item->set_selectable(0,false);
+ }
+
+
+ if (has_icon(p_type,"EditorIcons")) {
+
+ item->set_icon(0, get_icon(p_type,"EditorIcons"));
+ }
+
+
+
+ p_types[p_type]=item;
+}
+
+void CreateDialog::update_tree() {
+
+ tree->clear();
+
+ List<String> type_list;
+ ClassDB::get_type_list(&type_list);
+
+ HashMap<String,TreeItem*> types;
+
+ TreeItem *root = tree->create_item();
+
+ root->set_text(0,base);
+
+ List<String>::Element *I=type_list.front();
+
+ for(;I;I=I->next()) {
+
+
+ String type=I->get();
+
+
+ if (!ClassDB::can_instance(type))
+ continue; // cant create what can't be instanced
+ if (filter->get_text()=="")
+ add_type(type,types,root);
+ else {
+
+ bool found=false;
+ String type=I->get();
+ while(type!="" && ClassDB::is_type(type,base) && type!=base) {
+ if (type.findn(filter->get_text())!=-1) {
+
+ found=true;
+ break;
+ }
+
+ type=ClassDB::type_inherits_from(type);
+ }
+
+
+ if (found)
+ add_type(I->get(),types,root);
+ }
+
+ if (EditorNode::get_editor_data().get_custom_types().has(type)) {
+ //there are custom types based on this... cool.
+
+
+ const Vector<EditorData::CustomType> &ct = EditorNode::get_editor_data().get_custom_types()[type];
+ for(int i=0;i<ct.size();i++) {
+
+ bool show = filter->get_text()=="" || ct[i].name.findn(filter->get_text())!=-1;
+
+ if (!show)
+ continue;
+ if (!types.has(type))
+ add_type(type,types,root);
+
+ TreeItem *ti;
+ if (types.has(type) )
+ ti=types[type];
+ else
+ ti=tree->get_root();
+
+
+ TreeItem *item = tree->create_item(ti);
+ item->set_metadata(0,type);
+ item->set_text(0,ct[i].name);
+ if (ct[i].icon.is_valid()) {
+ item->set_icon(0,ct[i].icon);
+
+ }
+ }
+
+ }
+ }
+
+
+}
+
+
+Object *CreateDialog::instance_selected() {
+
+ if (!tree->get_selected())
+ return NULL;
+
+ String base = String(tree->get_selected()->get_metadata(0));
+ if (base!="") {
+
+
+ String name = tree->get_selected()->get_text(0);
+ if (EditorNode::get_editor_data().get_custom_types().has(base)) {
+
+ const Vector<EditorData::CustomType> &ct = EditorNode::get_editor_data().get_custom_types()[base];
+ for(int i=0;i<ct.size();i++) {
+
+ if (ct[i].name==name) {
+
+ Object* obj = ClassDB::instance(base);
+ ERR_FAIL_COND_V(!obj,NULL);
+ obj->set_script(ct[i].script.get_ref_ptr());
+ if (ct[i].icon.is_valid())
+ obj->set_meta("_editor_icon",ct[i].icon);
+ return obj;
+
+
+ }
+ }
+ }
+
+ ERR_FAIL_V(NULL);
+
+ }
+
+ return ClassDB::instance(tree->get_selected()->get_text(0));
+
+}
+
+
+void CreateDialog::_bind_methods() {
+
+ ClassDB::bind_method("_create",&CreateDialog::_create);
+ ClassDB::bind_method("_cancel",&CreateDialog::_cancel);
+ ClassDB::bind_method("_text_changed", &CreateDialog::_text_changed);
+ ADD_SIGNAL( MethodInfo("create"));
+
+}
+
+
+
+
+void CreateDialog::set_base_type(const String& p_base) {
+
+ set_title(vformat("Create %s Type",p_base));
+
+ if (base==p_base)
+ return;
+ base=p_base;
+ if (is_inside_scene())
+ update_tree();
+}
+
+String CreateDialog::get_base_type() const {
+
+ return base;
+}
+
+CreateDialog::CreateDialog() {
+
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+
+ get_ok()->set_text("Create");
+
+ tree = memnew( Tree );
+ vbc->add_margin_child("Type:",tree,true);
+ //tree->set_hide_root(true);
+
+ filter = memnew( LineEdit );
+ vbc->add_margin_child("Filter:",filter);
+
+ base="Node";
+ set_as_toplevel(true);
+
+
+ tree->connect("item_activated", this, "_create");
+ filter->connect("text_changed", this,"_text_changed");
+
+}
+
+
+CreateDialog::~CreateDialog()
+{
+}
+
+
+#endif
diff --git a/editor/create_dialog.h b/editor/create_dialog.h
new file mode 100644
index 0000000000..5ecb4db2c3
--- /dev/null
+++ b/editor/create_dialog.h
@@ -0,0 +1,147 @@
+/*************************************************************************/
+/* create_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CREATE_DIALOG_H
+#define CREATE_DIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/item_list.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/label.h"
+#include "editor_help.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+#if 1
+
+
+class CreateDialog : public ConfirmationDialog {
+
+ GDCLASS(CreateDialog,ConfirmationDialog )
+
+
+ Vector<String> favorite_list;
+ Tree *favorites;
+ Tree *recent;
+
+ Button *favorite;
+ LineEdit *search_box;
+ Tree *search_options;
+ String base_type;
+
+ EditorHelpBit *help_bit;
+
+ void _item_selected();
+
+ void _update_search();
+ void _update_favorite_list();
+ void _save_favorite_list();
+ void _favorite_toggled();
+
+ void _history_selected();
+ void _favorite_selected();
+
+ void _history_activated();
+ void _favorite_activated();
+
+ void _sbox_input(const InputEvent& p_ie);
+
+ void _confirmed();
+ void _text_changed(const String& p_newtext);
+
+ void add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root,TreeItem **to_select);
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ Object *instance_selected();
+ String get_selected_type();
+
+ void set_base_type(const String& p_base);
+ String get_base_type() const;
+
+ void popup(bool p_dontclear);
+
+
+ CreateDialog();
+};
+
+
+#else
+
+//old create dialog, disabled
+
+class CreateDialog : public ConfirmationDialog {
+
+ GDCLASS( CreateDialog, ConfirmationDialog );
+
+ Tree *tree;
+ Button *create;
+ Button *cancel;
+ LineEdit *filter;
+
+
+ void update_tree();
+ void _create();
+ void _cancel();
+ void add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem
+ *p_root);
+
+ String base;
+ void _text_changed(String p_text);
+ virtual void _post_popup() { tree->grab_focus();}
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+
+
+ Object *instance_selected();
+
+ void set_base_type(const String& p_base);
+ String get_base_type() const;
+ CreateDialog();
+ ~CreateDialog();
+
+};
+
+#endif
+
+#endif
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
new file mode 100644
index 0000000000..d7e04db86e
--- /dev/null
+++ b/editor/dependency_editor.cpp
@@ -0,0 +1,725 @@
+/*************************************************************************/
+/* dependency_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "dependency_editor.h"
+
+#include "os/file_access.h"
+#include "scene/gui/margin_container.h"
+#include "io/resource_loader.h"
+#include "editor_node.h"
+
+void DependencyEditor::_notification(int p_what){
+
+
+}
+
+void DependencyEditor::_searched(const String& p_path) {
+
+ Map<String,String> dep_rename;
+ dep_rename[replacing]=p_path;
+
+
+ ResourceLoader::rename_dependencies(editing,dep_rename);
+
+ _update_list();
+ _update_file();
+}
+
+void DependencyEditor::_load_pressed(Object* p_item,int p_cell,int p_button){
+
+ TreeItem *ti=p_item->cast_to<TreeItem>();
+ String fname = ti->get_text(0);
+ replacing = ti->get_text(1);
+
+ search->set_title(TTR("Search Replacement For:")+" "+replacing.get_file());
+
+ search->clear_filters();
+ List<String> ext;
+ ResourceLoader::get_recognized_extensions_for_type(ti->get_metadata(0),&ext);
+ for (List<String>::Element *E=ext.front();E;E=E->next()) {
+ search->add_filter("*"+E->get());
+ }
+ search->popup_centered_ratio();
+
+}
+
+void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String,Map<String,String> >& candidates){
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+ _fix_and_find(efsd->get_subdir(i),candidates);
+ }
+
+ for(int i=0;i<efsd->get_file_count();i++) {
+
+ String file = efsd->get_file(i);
+ if (!candidates.has(file))
+ continue;
+
+ String path = efsd->get_file_path(i);
+
+ for(Map<String,String>::Element *E=candidates[file].front();E;E=E->next()) {
+
+ if (E->get()==String()) {
+ E->get()=path;
+ continue;
+ }
+
+ //must match the best, using subdirs
+ String existing=E->get().replace_first("res://","");
+ String current=path.replace_first("res://","");
+ String lost=E->key().replace_first("res://","");
+
+ Vector<String> existingv=existing.split("/");
+ existingv.invert();
+ Vector<String> currentv=current.split("/");
+ currentv.invert();
+ Vector<String> lostv=lost.split("/");
+ lostv.invert();
+
+ int existing_score=0;
+ int current_score=0;
+
+ for(int j=0;j<lostv.size();j++) {
+
+ if (j<existingv.size() && lostv[j]==existingv[j]) {
+ existing_score++;
+ }
+ if (j<currentv.size() && lostv[j]==currentv[j]) {
+ current_score++;
+ }
+ }
+
+ if (current_score > existing_score) {
+
+ //if it was the same, could track distance to new path but..
+
+ E->get()=path; //replace by more accurate
+ }
+
+ }
+
+ }
+
+}
+
+
+void DependencyEditor::_fix_all(){
+
+ if (!EditorFileSystem::get_singleton()->get_filesystem())
+ return;
+
+ Map<String,Map<String,String> > candidates;
+
+ for (List<String>::Element *E=missing.front();E;E=E->next()) {
+
+ String base = E->get().get_file();
+ if (!candidates.has(base)) {
+ candidates[base]=Map<String,String>();
+ }
+
+ candidates[base][E->get()]="";
+ }
+
+ _fix_and_find(EditorFileSystem::get_singleton()->get_filesystem(),candidates);
+
+ Map<String,String> remaps;
+
+ for (Map<String,Map<String,String> >::Element *E=candidates.front();E;E=E->next()) {
+
+ for (Map<String,String>::Element *F=E->get().front();F;F=F->next()) {
+
+ if (F->get()!=String()) {
+ remaps[F->key()]=F->get();
+ }
+ }
+
+ }
+
+ if (remaps.size()) {
+
+ ResourceLoader::rename_dependencies(editing,remaps);
+
+ _update_list();
+ _update_file();
+ }
+}
+
+void DependencyEditor::_update_file() {
+
+ EditorFileSystem::get_singleton()->update_file(editing);
+
+}
+
+void DependencyEditor::_update_list() {
+
+ List<String> deps;
+ ResourceLoader::get_dependencies(editing,&deps,true);
+
+ tree->clear();
+ missing.clear();
+
+ TreeItem *root = tree->create_item();
+
+ Ref<Texture> folder = get_icon("folder","FileDialog");
+
+ bool broken=false;
+
+ for(List<String>::Element *E=deps.front();E;E=E->next()) {
+
+ TreeItem *item = tree->create_item(root);
+
+ String n = E->get();
+ String path;
+ String type;
+
+ if (n.find("::")!=-1) {
+ path = n.get_slice("::",0);
+ type = n.get_slice("::",1);
+ } else {
+ path=n;
+ type="Resource";
+ }
+ String name = path.get_file();
+
+ Ref<Texture> icon;
+ if (has_icon(type,"EditorIcons")) {
+ icon=get_icon(type,"EditorIcons");
+ } else {
+ icon=get_icon("Object","EditorIcons");
+ }
+ item->set_text(0,name);
+ item->set_icon(0,icon);
+ item->set_metadata(0,type);
+ item->set_text(1,path);
+
+ if (!FileAccess::exists(path)) {
+ item->set_custom_color(1,Color(1,0.4,0.3));
+ missing.push_back(path);
+ broken=true;
+ }
+
+ item->add_button(1,folder,0);
+ }
+
+ fixdeps->set_disabled(!broken);
+
+}
+
+
+
+void DependencyEditor::edit(const String& p_path) {
+
+
+ editing=p_path;
+ set_title(TTR("Dependencies For:")+" "+p_path.get_file());
+
+ _update_list();
+ popup_centered_ratio();
+
+ if (EditorNode::get_singleton()->is_scene_open(p_path)) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Scene '%s' is currently being edited.\nChanges will not take effect unless reloaded."),p_path.get_file()));
+ } else if (ResourceCache::has(p_path)) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Resource '%s' is in use.\nChanges will take effect when reloaded."),p_path.get_file()));
+ }
+}
+
+
+void DependencyEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_searched"),&DependencyEditor::_searched);
+ ClassDB::bind_method(D_METHOD("_load_pressed"),&DependencyEditor::_load_pressed);
+ ClassDB::bind_method(D_METHOD("_fix_all"),&DependencyEditor::_fix_all);
+
+}
+
+DependencyEditor::DependencyEditor() {
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ vb->set_name(TTR("Dependencies"));
+ add_child(vb);
+
+
+ tree = memnew( Tree );
+ tree->set_columns(2);
+ tree->set_column_titles_visible(true);
+ tree->set_column_title(0,TTR("Resource"));
+ tree->set_column_title(1,TTR("Path"));
+ tree->set_hide_root(true);
+ tree->connect("button_pressed",this,"_load_pressed");
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ Label *label = memnew( Label(TTR("Dependencies:")));
+ hbc->add_child(label);
+ hbc->add_spacer();
+ fixdeps = memnew( Button(TTR("Fix Broken")));
+ hbc->add_child(fixdeps);
+ fixdeps->connect("pressed",this,"_fix_all");
+
+ vb->add_child(hbc);
+
+ MarginContainer *mc = memnew( MarginContainer );
+ mc->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ mc->add_child(tree);
+ vb->add_child(mc);
+
+ set_title(TTR("Dependency Editor"));
+ search = memnew( EditorFileDialog );
+ search->connect("file_selected",this,"_searched");
+ search->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ search->set_title(TTR("Search Replacement Resource:"));
+ add_child(search);
+
+}
+
+/////////////////////////////////////
+
+
+
+void DependencyEditorOwners::_fill_owners(EditorFileSystemDirectory *efsd) {
+
+ if (!efsd)
+ return;
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+ _fill_owners(efsd->get_subdir(i));
+ }
+
+ for(int i=0;i<efsd->get_file_count();i++) {
+
+ Vector<String> deps = efsd->get_file_deps(i);
+ //print_line(":::"+efsd->get_file_path(i));
+ bool found=false;
+ for(int j=0;j<deps.size();j++) {
+ //print_line("\t"+deps[j]+" vs "+editing);
+ if (deps[j]==editing) {
+ //print_line("found");
+ found=true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+
+ Ref<Texture> icon;
+ String type=efsd->get_file_type(i);
+ if (!has_icon(type,"EditorIcons")) {
+ icon=get_icon("Object","EditorIcons");
+ } else {
+ icon=get_icon(type,"EditorIcons");
+ }
+
+ owners->add_item(efsd->get_file_path(i),icon);
+ }
+
+}
+
+void DependencyEditorOwners::show(const String& p_path) {
+
+ editing=p_path;
+ owners->clear();
+ _fill_owners(EditorFileSystem::get_singleton()->get_filesystem());
+ popup_centered_ratio();
+
+ set_title(TTR("Owners Of:")+" "+p_path.get_file());
+
+}
+
+DependencyEditorOwners::DependencyEditorOwners() {
+
+
+ owners = memnew( ItemList );
+ add_child(owners);
+
+
+
+}
+
+///////////////////////
+
+
+void DependencyRemoveDialog::_fill_owners(EditorFileSystemDirectory *efsd) {
+
+ if (!efsd)
+ return;
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+ _fill_owners(efsd->get_subdir(i));
+ }
+
+ for(int i=0;i<efsd->get_file_count();i++) {
+
+ Vector<String> deps = efsd->get_file_deps(i);
+ //print_line(":::"+efsd->get_file_path(i));
+ Set<String> met;
+ for(int j=0;j<deps.size();j++) {
+ if (files.has(deps[j])) {
+ met.insert(deps[j]);
+ }
+ }
+ if (!met.size())
+ continue;
+
+ exist=true;
+
+ Ref<Texture> icon;
+ String type=efsd->get_file_type(i);
+ if (!has_icon(type,"EditorIcons")) {
+ icon=get_icon("Object","EditorIcons");
+ } else {
+ icon=get_icon(type,"EditorIcons");
+ }
+
+
+ for(Set<String>::Element *E=met.front();E;E=E->next()) {
+
+ String which = E->get();
+ if (!files[which]) {
+ TreeItem *ti=owners->create_item(owners->get_root());
+ ti->set_text(0,which.get_file());
+ files[which]=ti;
+
+ }
+ TreeItem *ti=owners->create_item(files[which]);
+ ti->set_text(0,efsd->get_file_path(i));
+ ti->set_icon(0,icon);
+ }
+
+ }
+
+}
+
+void DependencyRemoveDialog::show(const Vector<String> &to_erase) {
+
+ exist=false;
+ owners->clear();
+ files.clear();
+ owners->create_item(); // root
+ for(int i=0;i<to_erase.size();i++) {
+ files[to_erase[i]]=NULL;
+ }
+
+ _fill_owners(EditorFileSystem::get_singleton()->get_filesystem());
+
+
+ if (exist) {
+ owners->show();
+ text->set_text(TTR("The files being removed are required by other resources in order for them to work.\nRemove them anyway? (no undo)"));
+ popup_centered_minsize(Size2(500,220));
+ } else {
+ owners->hide();
+ text->set_text(TTR("Remove selected files from the project? (no undo)"));
+ popup_centered_minsize(Size2(400,100));
+ }
+
+}
+
+void DependencyRemoveDialog::ok_pressed() {
+
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ for (Map<String,TreeItem*>::Element *E=files.front();E;E=E->next()) {
+
+ if (ResourceCache::has(E->key())) {
+ Resource *res = ResourceCache::get(E->key());
+ res->set_path(""); //clear reference to path
+ }
+ da->remove(E->key());
+ EditorFileSystem::get_singleton()->update_file(E->key());
+ }
+ memdelete(da);
+
+}
+
+DependencyRemoveDialog::DependencyRemoveDialog() {
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+
+
+ text = memnew( Label );
+ vb->add_child(text);
+
+ owners = memnew( Tree );
+ owners->set_hide_root(true);
+ vb->add_child(owners);
+ owners->set_v_size_flags(SIZE_EXPAND_FILL);
+ get_ok()->set_text(TTR("Remove"));
+}
+
+
+//////////////
+
+
+void DependencyErrorDialog::show(const String& p_for_file,const Vector<String> &report) {
+
+
+ for_file=p_for_file;
+ set_title(TTR("Error loading:")+" "+p_for_file.get_file());
+ files->clear();
+
+ TreeItem *root = files->create_item(NULL);
+ for(int i=0;i<report.size();i++) {
+
+ String dep;
+ String type="Object";
+ dep=report[i].get_slice("::",0);
+ if (report[i].get_slice_count("::")>0)
+ type=report[i].get_slice("::",1);
+
+ Ref<Texture> icon;
+ if (!has_icon(type,"EditorIcons")) {
+ icon=get_icon("Object","EditorIcons");
+ } else {
+ icon=get_icon(type,"EditorIcons");
+ }
+
+ TreeItem *ti=files->create_item(root);
+ ti->set_text(0,dep);
+ ti->set_icon(0,icon);
+
+ }
+
+ popup_centered_minsize(Size2(500,220));
+
+}
+
+void DependencyErrorDialog::ok_pressed() {
+
+ EditorNode::get_singleton()->load_scene(for_file,true);
+}
+
+void DependencyErrorDialog::custom_action(const String&) {
+
+ EditorNode::get_singleton()->fix_dependencies(for_file);
+}
+
+DependencyErrorDialog::DependencyErrorDialog() {
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+
+
+
+ files = memnew( Tree );
+ files->set_hide_root(true);
+ vb->add_margin_child(TTR("Scene failed to load due to missing dependencies:"),files,true);
+ files->set_v_size_flags(SIZE_EXPAND_FILL);
+ get_ok()->set_text(TTR("Open Anyway"));
+
+ text = memnew( Label );
+ vb->add_child(text);
+ text->set_text(TTR("Which action should be taken?"));
+
+
+ fdep=add_button(TTR("Fix Dependencies"),true,"fixdeps");
+
+ set_title(TTR("Errors loading!"));
+
+}
+
+//////////////////////////////////////////////////////////////////////
+
+
+
+void OrphanResourcesDialog::ok_pressed() {
+
+ paths.clear();
+
+ _find_to_delete(files->get_root(),paths);
+ if (paths.empty())
+ return;
+
+ delete_confirm->set_text(vformat(TTR("Permanently delete %d item(s)? (No undo!)"),paths.size()));
+ delete_confirm->popup_centered_minsize();
+}
+
+bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd,HashMap<String,int>& refs,TreeItem* p_parent){
+
+
+ if (!efsd)
+ return false;
+
+ bool has_childs=false;
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+
+ TreeItem *dir_item=NULL;
+ if (p_parent) {
+ dir_item = files->create_item(p_parent);
+ dir_item->set_text(0,efsd->get_subdir(i)->get_name());
+ dir_item->set_icon(0,get_icon("folder","FileDialog"));
+
+ }
+ bool children = _fill_owners(efsd->get_subdir(i),refs,dir_item);
+
+ if (p_parent) {
+ if (!children) {
+ memdelete(dir_item);
+ } else {
+ has_childs=true;
+ }
+ }
+
+ }
+
+
+ for(int i=0;i<efsd->get_file_count();i++) {
+
+ if (!p_parent) {
+ Vector<String> deps = efsd->get_file_deps(i);
+ //print_line(":::"+efsd->get_file_path(i));
+ for(int j=0;j<deps.size();j++) {
+
+ if (!refs.has(deps[j])) {
+ refs[deps[j]]=1;
+ }
+ }
+ } else {
+
+ String path = efsd->get_file_path(i);
+ if (!refs.has(path)) {
+ TreeItem *ti=files->create_item(p_parent);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ ti->set_text(0,efsd->get_file(i));
+ ti->set_editable(0,true);
+
+ String type=efsd->get_file_type(i);
+
+ Ref<Texture> icon;
+ if (has_icon(type,"EditorIcons")) {
+ icon=get_icon(type,"EditorIcons");
+ } else {
+ icon=get_icon("Object","EditorIcons");
+ }
+ ti->set_icon(0,icon);
+ int ds = efsd->get_file_deps(i).size();
+ ti->set_text(1,itos(ds));
+ if (ds) {
+ ti->add_button(1,get_icon("Visible","EditorIcons"));
+ }
+ ti->set_metadata(0,path);
+ has_childs=true;
+ }
+ }
+
+ }
+
+ return has_childs;
+}
+
+
+void OrphanResourcesDialog::refresh() {
+ HashMap<String,int> refs;
+ _fill_owners(EditorFileSystem::get_singleton()->get_filesystem(),refs,NULL);
+ files->clear();
+ TreeItem *root=files->create_item();
+ _fill_owners(EditorFileSystem::get_singleton()->get_filesystem(),refs,root);
+}
+
+
+void OrphanResourcesDialog::show(){
+
+ refresh();
+ popup_centered_ratio();
+}
+
+
+void OrphanResourcesDialog::_find_to_delete(TreeItem* p_item,List<String>& paths) {
+
+ while(p_item) {
+
+ if (p_item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK && p_item->is_checked(0)) {
+ paths.push_back(p_item->get_metadata(0));
+ }
+
+ if (p_item->get_children()) {
+ _find_to_delete(p_item->get_children(),paths);
+ }
+
+ p_item=p_item->get_next();
+ }
+
+
+}
+
+void OrphanResourcesDialog::_delete_confirm() {
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ for (List<String>::Element *E=paths.front();E;E=E->next()) {
+
+ da->remove(E->get());
+ EditorFileSystem::get_singleton()->update_file(E->get());
+ }
+ memdelete(da);
+ refresh();
+}
+
+void OrphanResourcesDialog::_button_pressed(Object *p_item,int p_column, int p_id) {
+
+ TreeItem *ti=p_item->cast_to<TreeItem>();
+
+ String path = ti->get_metadata(0);
+ dep_edit->edit(path);
+
+}
+
+void OrphanResourcesDialog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_delete_confirm"),&OrphanResourcesDialog::_delete_confirm);
+ ClassDB::bind_method(D_METHOD("_button_pressed"),&OrphanResourcesDialog::_button_pressed);
+
+}
+
+OrphanResourcesDialog::OrphanResourcesDialog(){
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ files = memnew( Tree );
+ files->set_columns(2);
+ files->set_column_titles_visible(true);
+ files->set_column_min_width(1,100);
+ files->set_column_expand(0,true);
+ files->set_column_expand(1,false);
+ files->set_column_title(0,TTR("Resource"));
+ files->set_column_title(1,TTR("Owns"));
+ files->set_hide_root(true);
+ vbc->add_margin_child(TTR("Resources Without Explicit Ownership:"),files,true);
+ set_title(TTR("Orphan Resource Explorer"));
+ delete_confirm = memnew( ConfirmationDialog );
+ delete_confirm->set_text(TTR("Delete selected files?"));
+ get_ok()->set_text(TTR("Delete"));
+ add_child(delete_confirm);
+ dep_edit = memnew( DependencyEditor );
+ add_child(dep_edit);
+ files->connect("button_pressed",this,"_button_pressed");
+ delete_confirm->connect("confirmed",this,"_delete_confirm");
+ set_hide_on_ok(false);
+
+}
diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h
new file mode 100644
index 0000000000..a96ffe5fcf
--- /dev/null
+++ b/editor/dependency_editor.h
@@ -0,0 +1,147 @@
+/*************************************************************************/
+/* dependency_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef DEPENDENCY_EDITOR_H
+#define DEPENDENCY_EDITOR_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/tab_container.h"
+#include "editor_file_dialog.h"
+
+class EditorFileSystemDirectory;
+
+class DependencyEditor : public AcceptDialog {
+ GDCLASS(DependencyEditor,AcceptDialog);
+
+
+ Tree *tree;
+ Button *fixdeps;
+
+ EditorFileDialog *search;
+
+ String replacing;
+ String editing;
+ List<String> missing;
+
+
+ void _fix_and_find(EditorFileSystemDirectory *efsd, Map<String,Map<String,String> >& candidates);
+
+ void _searched(const String& p_path);
+ void _load_pressed(Object* p_item,int p_cell,int p_button);
+ void _fix_all();
+ void _update_list();
+
+ void _update_file();
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+
+ void edit(const String& p_path);
+ DependencyEditor();
+};
+
+class DependencyEditorOwners : public AcceptDialog {
+ GDCLASS(DependencyEditorOwners,AcceptDialog);
+
+ ItemList *owners;
+ String editing;
+ void _fill_owners(EditorFileSystemDirectory *efsd);
+
+public:
+
+ void show(const String& p_path);
+ DependencyEditorOwners();
+};
+
+class DependencyRemoveDialog : public ConfirmationDialog {
+ GDCLASS(DependencyRemoveDialog,ConfirmationDialog);
+
+
+ Label *text;
+ Tree *owners;
+ bool exist;
+ Map<String,TreeItem*> files;
+ void _fill_owners(EditorFileSystemDirectory *efsd);
+
+ void ok_pressed();
+
+public:
+
+ void show(const Vector<String> &to_erase);
+ DependencyRemoveDialog();
+};
+
+
+class DependencyErrorDialog : public ConfirmationDialog {
+ GDCLASS(DependencyErrorDialog,ConfirmationDialog);
+
+
+ String for_file;
+ Button *fdep;
+ Label *text;
+ Tree *files;
+ void ok_pressed();
+ void custom_action(const String&);
+
+public:
+
+ void show(const String& p_for,const Vector<String> &report);
+ DependencyErrorDialog();
+};
+
+
+
+class OrphanResourcesDialog : public ConfirmationDialog {
+ GDCLASS(OrphanResourcesDialog,ConfirmationDialog);
+
+ DependencyEditor *dep_edit;
+ Tree *files;
+ ConfirmationDialog *delete_confirm;
+ void ok_pressed();
+
+ bool _fill_owners(EditorFileSystemDirectory *efsd, HashMap<String,int>& refs, TreeItem *p_parent);
+
+ List<String> paths;
+ void _find_to_delete(TreeItem* p_item,List<String>& paths);
+ void _delete_confirm();
+ void _button_pressed(Object *p_item,int p_column, int p_id);
+
+ void refresh();
+ static void _bind_methods();
+public:
+
+ void show();
+ OrphanResourcesDialog();
+};
+
+#endif // DEPENDENCY_EDITOR_H
diff --git a/editor/doc/SCsub b/editor/doc/SCsub
new file mode 100644
index 0000000000..04c9a827ef
--- /dev/null
+++ b/editor/doc/SCsub
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+
+Import('env')
+
+env.add_source_files(env.editor_sources, "*.cpp")
+
+Export('env')
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
new file mode 100644
index 0000000000..47b8edfa04
--- /dev/null
+++ b/editor/doc/doc_data.cpp
@@ -0,0 +1,1148 @@
+/*************************************************************************/
+/* doc_data.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "doc_data.h"
+
+#include "version.h"
+#include "global_constants.h"
+#include "global_config.h"
+#include "script_language.h"
+#include "io/marshalls.h"
+#include "io/compression.h"
+#include "scene/resources/theme.h"
+
+void DocData::merge_from(const DocData& p_data) {
+
+ for( Map<String,ClassDoc>::Element *E=class_list.front();E;E=E->next()) {
+
+
+ ClassDoc &c = E->get();
+
+ if (!p_data.class_list.has(c.name))
+ continue;
+
+ const ClassDoc &cf = p_data.class_list[c.name];
+
+ c.description=cf.description;
+ c.brief_description=cf.brief_description;
+
+ for(int i=0;i<c.methods.size();i++) {
+
+ MethodDoc &m = c.methods[i];
+
+ for(int j=0;j<cf.methods.size();j++) {
+
+ if (cf.methods[j].name!=m.name)
+ continue;
+ if (cf.methods[j].arguments.size()!=m.arguments.size())
+ continue;
+ // since polymorphic functions are allowed we need to check the type of
+ // the arguments so we make sure they are different.
+ int arg_count = cf.methods[j].arguments.size();
+ Vector<bool> arg_used;
+ arg_used.resize(arg_count);
+ for (int l = 0; l < arg_count; ++l) arg_used[l] = false;
+ // also there is no guarantee that argument ordering will match, so we
+ // have to check one by one so we make sure we have an exact match
+ for (int k = 0; k < arg_count; ++k) {
+ for (int l = 0; l < arg_count; ++l)
+ if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) {
+ arg_used[l] = true;
+ break;
+ }
+ }
+ bool not_the_same = false;
+ for (int l = 0; l < arg_count; ++l)
+ if (!arg_used[l]) // at least one of the arguments was different
+ not_the_same = true;
+ if (not_the_same)
+ continue;
+
+ const MethodDoc &mf = cf.methods[j];
+
+ m.description=mf.description;
+ break;
+ }
+ }
+
+
+ for(int i=0;i<c.signals.size();i++) {
+
+ MethodDoc &m = c.signals[i];
+
+ for(int j=0;j<cf.signals.size();j++) {
+
+ if (cf.signals[j].name!=m.name)
+ continue;
+ const MethodDoc &mf = cf.signals[j];
+
+ m.description=mf.description;
+ break;
+ }
+ }
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ ConstantDoc &m = c.constants[i];
+
+ for(int j=0;j<cf.constants.size();j++) {
+
+ if (cf.constants[j].name!=m.name)
+ continue;
+ const ConstantDoc &mf = cf.constants[j];
+
+ m.description=mf.description;
+ break;
+ }
+ }
+
+ for(int i=0;i<c.properties.size();i++) {
+
+ PropertyDoc &p = c.properties[i];
+
+ for(int j=0;j<cf.properties.size();j++) {
+
+ if (cf.properties[j].name!=p.name)
+ continue;
+ const PropertyDoc &pf = cf.properties[j];
+
+ p.description=pf.description;
+ p.setter=pf.setter;
+ p.getter=pf.getter;
+
+ break;
+ }
+ }
+
+ for(int i=0;i<c.theme_properties.size();i++) {
+
+ PropertyDoc &p = c.theme_properties[i];
+
+ for(int j=0;j<cf.theme_properties.size();j++) {
+
+ if (cf.theme_properties[j].name!=p.name)
+ continue;
+ const PropertyDoc &pf = cf.theme_properties[j];
+
+ p.description=pf.description;
+ break;
+ }
+ }
+
+ }
+
+}
+
+void DocData::remove_from(const DocData &p_data) {
+ for(Map<String,ClassDoc>::Element* E=p_data.class_list.front(); E; E=E->next()) {
+ if(class_list.has(E->key()))
+ class_list.erase(E->key());
+ }
+}
+
+void DocData::generate(bool p_basic_types) {
+
+
+ List<StringName> classes;
+ ClassDB::get_class_list(&classes);
+ classes.sort_custom<StringName::AlphCompare>();
+
+ while(classes.size()) {
+
+ String name=classes.front()->get();
+ String cname=name;
+ if (cname.begins_with("_")) //proxy class
+ cname=cname.substr(1,name.length());
+
+ class_list[cname]=ClassDoc();
+ ClassDoc& c = class_list[cname];
+ c.name=cname;
+ c.inherits=ClassDB::get_parent_class(name);
+ c.category=ClassDB::get_category(name);
+
+
+ List<PropertyInfo> properties;
+ ClassDB::get_property_list(name,&properties,true);
+
+ for(List<PropertyInfo>::Element *E=properties.front();E;E=E->next()) {
+ if (E->get().usage& PROPERTY_USAGE_GROUP || E->get().usage& PROPERTY_USAGE_CATEGORY)
+ continue;
+
+ PropertyDoc prop;
+ StringName setter = ClassDB::get_property_setter(name,E->get().name);
+ StringName getter = ClassDB::get_property_getter(name,E->get().name);
+
+ prop.name=E->get().name;
+ prop.setter=setter;
+ prop.getter=getter;
+ if (E->get().type==Variant::OBJECT && E->get().hint==PROPERTY_HINT_RESOURCE_TYPE)
+ prop.type=E->get().hint_string;
+ else
+ prop.type=Variant::get_type_name(E->get().type);
+
+ c.properties.push_back(prop);
+ }
+
+
+ List<MethodInfo> method_list;
+ ClassDB::get_method_list(name,&method_list,true);
+ method_list.sort();
+
+
+ for(List<MethodInfo>::Element *E=method_list.front();E;E=E->next()) {
+
+ if (E->get().name=="" || (E->get().name[0]=='_' && !(E->get().flags&METHOD_FLAG_VIRTUAL)))
+ continue; //hiden, dont count
+
+ MethodDoc method;
+
+ method.name=E->get().name;
+
+ MethodBind *m = ClassDB::get_method(name,E->get().name);
+
+
+ if (E->get().flags&METHOD_FLAG_VIRTUAL)
+ method.qualifiers="virtual";
+ if (E->get().flags&METHOD_FLAG_CONST) {
+ if (method.qualifiers!="")
+ method.qualifiers+=" ";
+ method.qualifiers+="const";
+
+ } else if (E->get().flags&METHOD_FLAG_VARARG) {
+ if (method.qualifiers!="")
+ method.qualifiers+=" ";
+ method.qualifiers+="vararg";
+ }
+
+ for(int i=-1;i<E->get().arguments.size();i++) {
+
+ PropertyInfo arginfo;
+
+ if (i==-1) {
+
+
+ arginfo=E->get().return_val;
+#ifdef DEBUG_METHODS_ENABLED
+ if (m && m->get_return_type()!=StringName())
+ method.return_type=m->get_return_type();
+ else if (method.name.find(":")!=-1) {
+ method.return_type=method.name.get_slice(":",1);
+ method.name=method.name.get_slice(":",0);
+
+ } else if (arginfo.type!=Variant::NIL) // {
+#endif
+ method.return_type=(arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE)?arginfo.hint_string:Variant::get_type_name(arginfo.type);
+ //}
+
+ } else {
+
+ ArgumentDoc argument;
+
+ arginfo=E->get().arguments[i];
+
+ String type_name;
+
+ if (arginfo.name.find(":")!=-1) {
+ type_name=arginfo.name.get_slice(":",1);
+ arginfo.name=arginfo.name.get_slice(":",0);
+
+ } else if (arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE) {
+ type_name=arginfo.hint_string;
+ } else if (arginfo.type==Variant::NIL)
+ type_name="Variant";
+ else
+ type_name=Variant::get_type_name(arginfo.type);
+
+ if (arginfo.type==Variant::OBJECT) {
+
+ //print_line("validate: "+cname+"::"+method.name);
+ }
+
+ if (m && m->has_default_argument(i)) {
+ Variant default_arg=m->get_default_argument(i);
+ String default_arg_text=m->get_default_argument(i);
+
+ switch(default_arg.get_type()) {
+
+ case Variant::NIL:
+ default_arg_text="NULL";
+ break;
+ // atomic types
+ case Variant::BOOL:
+ if (bool(default_arg))
+ default_arg_text="true";
+ else
+ default_arg_text="false";
+ break;
+ case Variant::INT:
+ case Variant::REAL:
+ //keep it
+ break;
+ case Variant::STRING: // 15
+ case Variant::NODE_PATH: // 15
+ default_arg_text="\""+default_arg_text+"\"";
+ break;
+ case Variant::TRANSFORM:
+ if (default_arg.operator Transform()==Transform()) {
+ default_arg_text="";
+ }
+
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"("+default_arg_text+")";
+ break;
+
+ case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10
+ case Variant::COLOR:
+ case Variant::PLANE:
+ case Variant::POOL_BYTE_ARRAY:
+ case Variant::POOL_INT_ARRAY:
+ case Variant::POOL_REAL_ARRAY:
+ case Variant::POOL_STRING_ARRAY: //25
+ case Variant::POOL_VECTOR2_ARRAY:
+ case Variant::POOL_VECTOR3_ARRAY:
+ case Variant::POOL_COLOR_ARRAY:
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"("+default_arg_text+")";
+ break;
+ case Variant::VECTOR2: // 5
+ case Variant::RECT2:
+ case Variant::VECTOR3:
+ case Variant::QUAT:
+ case Variant::BASIS:
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+default_arg_text;
+ break;
+ case Variant::OBJECT:
+ if (default_arg.is_zero()) {
+ default_arg_text="NULL";
+ break;
+ }
+ case Variant::INPUT_EVENT:
+ case Variant::DICTIONARY: // 20
+ case Variant::ARRAY:
+ case Variant::_RID:
+ case Variant::IMAGE:
+ //case Variant::RESOURCE:
+
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"()";
+ break;
+ default: {}
+
+ }
+
+
+ argument.type=type_name;
+ argument.name=arginfo.name;
+ argument.default_value=default_arg_text;
+ } else {
+
+ argument.type=type_name;
+ argument.name=arginfo.name;
+ }
+
+ if (arginfo.type==Variant::OBJECT) {
+
+ //print_line("validate: "+cname+"::"+method.name);
+ }
+
+ method.arguments.push_back(argument);
+ }
+
+/*
+ String hint;
+ switch(arginfo.hint) {
+ case PROPERTY_HINT_DIR: hint="A directory."; break;
+ case PROPERTY_HINT_RANGE: hint="Range - min: "+arginfo.hint_string.get_slice(",",0)+" max: "+arginfo.hint_string.get_slice(",",1)+" step: "+arginfo.hint_string.get_slice(",",2); break;
+ case PROPERTY_HINT_ENUM: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(j); } break;
+ case PROPERTY_HINT_LENGTH: hint="Length: "+arginfo.hint_string; break;
+ case PROPERTY_HINT_FLAGS: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(1<<j); } break;
+ case PROPERTY_HINT_FILE: hint="A file:"; break;
+ //case PROPERTY_HINT_RESOURCE_TYPE: hint="Type: "+arginfo.hint_string; break;
+ };
+ if (hint!="")
+ _write_string(f,4,hint);
+*/
+
+
+ }
+
+ c.methods.push_back(method);
+ }
+
+ List<MethodInfo> signal_list;
+ ClassDB::get_signal_list(name,&signal_list,true);
+
+ if (signal_list.size()) {
+
+
+ for(List<MethodInfo>::Element *EV=signal_list.front();EV;EV=EV->next()) {
+
+ MethodDoc signal;
+ signal.name=EV->get().name;
+ for(int i=0;i<EV->get().arguments.size();i++) {
+
+ PropertyInfo arginfo=EV->get().arguments[i];
+ ArgumentDoc argument;
+ argument.name=arginfo.name;
+ argument.type=Variant::get_type_name(arginfo.type);
+ signal.arguments.push_back(argument);
+ }
+
+ c.signals.push_back(signal);
+ }
+
+
+ }
+
+ List<String> constant_list;
+ ClassDB::get_integer_constant_list(name, &constant_list, true);
+
+ for(List<String>::Element *E=constant_list.front();E;E=E->next()) {
+
+ ConstantDoc constant;
+ constant.name=E->get();
+ constant.value=itos(ClassDB::get_integer_constant(name, E->get()));
+ c.constants.push_back(constant);
+ }
+
+ //theme stuff
+
+ {
+ List<StringName> l;
+ Theme::get_default()->get_constant_list(cname,&l);
+ for (List<StringName>::Element*E=l.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ pd.name=E->get();
+ pd.type="int";
+ c.theme_properties.push_back(pd);
+ }
+
+ l.clear();
+ Theme::get_default()->get_color_list(cname,&l);
+ for (List<StringName>::Element*E=l.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ pd.name=E->get();
+ pd.type="Color";
+ c.theme_properties.push_back(pd);
+ }
+
+ l.clear();
+ Theme::get_default()->get_icon_list(cname,&l);
+ for (List<StringName>::Element*E=l.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ pd.name=E->get();
+ pd.type="Texture";
+ c.theme_properties.push_back(pd);
+ }
+ l.clear();
+ Theme::get_default()->get_font_list(cname,&l);
+ for (List<StringName>::Element*E=l.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ pd.name=E->get();
+ pd.type="Font";
+ c.theme_properties.push_back(pd);
+ }
+ l.clear();
+ Theme::get_default()->get_stylebox_list(cname,&l);
+ for (List<StringName>::Element*E=l.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ pd.name=E->get();
+ pd.type="StyleBox";
+ c.theme_properties.push_back(pd);
+ }
+
+ }
+
+
+ classes.pop_front();
+ }
+
+
+ {
+ //so it can be documented that it does not exist
+ class_list["Variant"]=ClassDoc();
+ class_list["Variant"].name="Variant";
+ }
+
+ if (!p_basic_types)
+ return;
+
+ for (int i=0;i<Variant::VARIANT_MAX;i++) {
+
+ if (i==Variant::OBJECT)
+ continue; //use the core type instead
+
+ int loops=1;
+
+ if (i==Variant::INPUT_EVENT)
+ loops=InputEvent::TYPE_MAX;
+
+ for(int j=0;j<loops;j++) {
+
+ String cname=Variant::get_type_name(Variant::Type(i));
+
+ if (i==Variant::INPUT_EVENT) {
+ static const char* ie_type[InputEvent::TYPE_MAX]={
+ "","Key","MouseMotion","MouseButton","JoypadMotion","JoypadButton","ScreenTouch","ScreenDrag","Action"
+ };
+ cname+=ie_type[j];
+ }
+
+
+ class_list[cname]=ClassDoc();
+ ClassDoc& c = class_list[cname];
+ c.name=cname;
+ c.category="Built-In Types";
+
+ Variant::CallError cerror;
+ Variant v=Variant::construct(Variant::Type(i),NULL,0,cerror);
+
+ if (i==Variant::INPUT_EVENT) {
+ v.set("type",j);
+ }
+
+ List<MethodInfo> method_list;
+ v.get_method_list(&method_list);
+ method_list.sort();
+ Variant::get_constructor_list(Variant::Type(i),&method_list);
+
+
+ for(List<MethodInfo>::Element *E=method_list.front();E;E=E->next()) {
+
+ MethodInfo &mi=E->get();
+ MethodDoc method;
+
+ method.name=mi.name;
+
+ for(int i=0;i<mi.arguments.size();i++) {
+
+ ArgumentDoc arg;
+ PropertyInfo pi=mi.arguments[i];
+
+ arg.name=pi.name;
+ //print_line("arg name: "+arg.name);
+ if (pi.type==Variant::NIL)
+ arg.type="var";
+ else
+ arg.type=Variant::get_type_name(pi.type);
+ int defarg = mi.default_arguments.size() - mi.arguments.size() + i;
+ if (defarg >=0)
+ arg.default_value=mi.default_arguments[defarg];
+
+ method.arguments.push_back(arg);
+ }
+
+ if (mi.return_val.type==Variant::NIL) {
+ if (mi.return_val.name!="")
+ method.return_type="var";
+
+ } else {
+ method.return_type=Variant::get_type_name(mi.return_val.type);
+ }
+
+ c.methods.push_back(method);
+ }
+
+
+ List<PropertyInfo> properties;
+ v.get_property_list(&properties);
+ for(List<PropertyInfo>::Element *E=properties.front();E;E=E->next()) {
+
+ PropertyInfo pi=E->get();
+ PropertyDoc property;
+ property.name=pi.name;
+ property.type=Variant::get_type_name(pi.type);
+
+ c.properties.push_back(property);
+ }
+
+ List<StringName> constants;
+ Variant::get_numeric_constants_for_type(Variant::Type(i),&constants);
+
+ for(List<StringName>::Element *E=constants.front();E;E=E->next()) {
+
+ ConstantDoc constant;
+ constant.name=E->get();
+ constant.value=itos(Variant::get_numeric_constant_value(Variant::Type(i),E->get()));
+ c.constants.push_back(constant);
+ }
+ }
+
+ }
+
+ //built in constants and functions
+
+ {
+
+ String cname="@Global Scope";
+ class_list[cname]=ClassDoc();
+ ClassDoc& c = class_list[cname];
+ c.name=cname;
+
+
+ for(int i=0;i<GlobalConstants::get_global_constant_count();i++) {
+
+ ConstantDoc cd;
+ cd.name=GlobalConstants::get_global_constant_name(i);
+ cd.value=itos(GlobalConstants::get_global_constant_value(i));
+ c.constants.push_back(cd);
+ }
+
+ List<GlobalConfig::Singleton> singletons;
+ GlobalConfig::get_singleton()->get_singletons(&singletons);
+
+ //servers (this is kind of hackish)
+ for(List<GlobalConfig::Singleton>::Element *E=singletons.front();E;E=E->next()) {
+
+ PropertyDoc pd;
+ GlobalConfig::Singleton &s=E->get();
+ pd.name=s.name;
+ pd.type=s.ptr->get_class();
+ while (String(ClassDB::get_parent_class(pd.type))!="Object")
+ pd.type=ClassDB::get_parent_class(pd.type);
+ if (pd.type.begins_with("_"))
+ pd.type=pd.type.substr(1,pd.type.length());
+ c.properties.push_back(pd);
+
+ }
+
+ }
+
+ //built in script reference
+
+ {
+
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+
+
+ ScriptLanguage *lang = ScriptServer::get_language(i);
+ String cname="@"+lang->get_name();
+ class_list[cname]=ClassDoc();
+ ClassDoc& c = class_list[cname];
+ c.name=cname;
+
+ List<MethodInfo> minfo;
+
+ lang->get_public_functions(&minfo);
+
+
+ for(List<MethodInfo>::Element *E=minfo.front();E;E=E->next()) {
+
+ MethodInfo &mi=E->get();
+ MethodDoc md;
+ md.name=mi.name;
+ if (mi.return_val.name!="")
+ md.return_type=mi.return_val.name;
+ else if (mi.name.find(":")!=-1) {
+ md.return_type=mi.name.get_slice(":",1);
+ md.name=mi.name.get_slice(":",0);
+ } else
+ md.return_type=Variant::get_type_name(mi.return_val.type);
+
+ for(int i=0;i<mi.arguments.size();i++) {
+
+ PropertyInfo &pi=mi.arguments[i];
+
+ ArgumentDoc ad;
+ ad.name=pi.name;
+
+
+ if (pi.type==Variant::NIL)
+ ad.type="Variant";
+ else
+ ad.type=Variant::get_type_name( pi.type );
+
+ md.arguments.push_back(ad);
+ }
+
+ c.methods.push_back(md);
+
+ }
+
+ List<Pair<String,Variant> > cinfo;
+ lang->get_public_constants(&cinfo);
+
+
+ for(List<Pair<String,Variant> >::Element *E=cinfo.front();E;E=E->next()) {
+
+ ConstantDoc cd;
+ cd.name=E->get().first;
+ cd.value=E->get().second;
+ c.constants.push_back(cd);
+ }
+ }
+ }
+
+
+}
+
+
+static Error _parse_methods(Ref<XMLParser>& parser,Vector<DocData::MethodDoc>& methods) {
+
+ String section=parser->get_node_name();
+ String element=section.substr(0,section.length()-1);
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser->get_node_name()==element) {
+
+ DocData::MethodDoc method;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"),ERR_FILE_CORRUPT);
+ method.name=parser->get_attribute_value("name");
+ if (parser->has_attribute("qualifiers"))
+ method.qualifiers=parser->get_attribute_value("qualifiers");
+
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name=parser->get_node_name();
+ if (name=="return") {
+
+ ERR_FAIL_COND_V(!parser->has_attribute("type"),ERR_FILE_CORRUPT);
+ method.return_type=parser->get_attribute_value("type");
+ } else if (name=="argument") {
+
+ DocData::ArgumentDoc argument;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"),ERR_FILE_CORRUPT);
+ argument.name=parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"),ERR_FILE_CORRUPT);
+ argument.type=parser->get_attribute_value("type");
+
+ method.arguments.push_back(argument);
+
+ } else if (name=="description") {
+
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ method.description=parser->get_node_data().strip_edges();
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()==element)
+ break;
+ }
+
+ methods.push_back(method);
+
+ } else {
+ ERR_EXPLAIN("Invalid tag in doc file: "+parser->get_node_name());
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()==section)
+ break;
+ }
+
+ return OK;
+}
+
+Error DocData::load(const String& p_path) {
+
+ Ref<XMLParser> parser=memnew(XMLParser);
+ Error err = parser->open(p_path);
+ if (err)
+ return err;
+ return _load(parser);
+
+}
+Error DocData::_load(Ref<XMLParser> parser) {
+
+ Error err=OK;
+
+ while((err=parser->read())==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ if (parser->get_node_name() == "doc") {
+ break;
+ } else if (!parser->is_empty())
+ parser->skip_section();// unknown section, likely headers
+ }
+ }
+
+ if (parser->has_attribute("version"))
+ version=parser->get_attribute_value("version");
+
+
+ while((err=parser->read())==OK) {
+
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()=="doc")
+ break; //end of <doc>
+
+ if (parser->get_node_type() != XMLParser::NODE_ELEMENT)
+ continue; //no idea what this may be, but skipping anyway
+
+ ERR_FAIL_COND_V( parser->get_node_name()!="class", ERR_FILE_CORRUPT );
+
+ ERR_FAIL_COND_V( !parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ String name = parser->get_attribute_value("name");
+ class_list[name]=ClassDoc();
+ ClassDoc& c = class_list[name];
+
+ //print_line("class: "+name);
+ c.name=name;
+ if (parser->has_attribute("inherits"))
+ c.inherits = parser->get_attribute_value("inherits");
+ if (parser->has_attribute("category"))
+ c.category = parser->get_attribute_value("category");
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser->get_node_name();
+
+ if (name=="brief_description") {
+
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ c.brief_description=parser->get_node_data().strip_edges();
+
+ } else if (name=="description") {
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ c.description=parser->get_node_data().strip_edges();
+ } else if (name=="methods") {
+
+ Error err = _parse_methods(parser,c.methods);
+ ERR_FAIL_COND_V(err,err);
+
+ } else if (name=="signals") {
+
+ Error err = _parse_methods(parser,c.signals);
+ ERR_FAIL_COND_V(err,err);
+ } else if (name=="members") {
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser->get_node_name();
+
+ if (name=="member") {
+
+ PropertyDoc prop;
+
+ ERR_FAIL_COND_V(!parser->has_attribute("name"),ERR_FILE_CORRUPT);
+ prop.name=parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"),ERR_FILE_CORRUPT);
+ prop.type=parser->get_attribute_value("type");
+ if (parser->has_attribute("setter"))
+ prop.setter=parser->get_attribute_value("setter");
+ if (parser->has_attribute("getter"))
+ prop.getter=parser->get_attribute_value("getter");
+ if (parser->has_attribute("brief"))
+ prop.brief_description=parser->get_attribute_value("brief").xml_unescape();
+
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ prop.description=parser->get_node_data().strip_edges();
+ c.properties.push_back(prop);
+ } else {
+ ERR_EXPLAIN("Invalid tag in doc file: "+name);
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()=="members")
+ break; //end of <constants>
+ }
+
+ } else if (name=="theme_items") {
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser->get_node_name();
+
+ if (name=="theme_item") {
+
+ PropertyDoc prop;
+
+ ERR_FAIL_COND_V(!parser->has_attribute("name"),ERR_FILE_CORRUPT);
+ prop.name=parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"),ERR_FILE_CORRUPT);
+ prop.type=parser->get_attribute_value("type");
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ prop.description=parser->get_node_data().strip_edges();
+ c.theme_properties.push_back(prop);
+ } else {
+ ERR_EXPLAIN("Invalid tag in doc file: "+name);
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()=="theme_items")
+ break; //end of <constants>
+ }
+
+ } else if (name=="constants") {
+
+ while(parser->read()==OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name=parser->get_node_name();
+
+ if (name=="constant") {
+
+ ConstantDoc constant;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"),ERR_FILE_CORRUPT);
+ constant.name=parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("value"),ERR_FILE_CORRUPT);
+ constant.value=parser->get_attribute_value("value");
+ parser->read();
+ if (parser->get_node_type()==XMLParser::NODE_TEXT)
+ constant.description=parser->get_node_data().strip_edges();
+ c.constants.push_back(constant);
+ } else {
+ ERR_EXPLAIN("Invalid tag in doc file: "+name);
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()=="constants")
+ break; //end of <constants>
+ }
+
+ } else {
+
+ ERR_EXPLAIN("Invalid tag in doc file: "+name);
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name()=="class")
+ break; //end of <asset>
+ }
+
+
+ }
+
+ return OK;
+}
+
+
+static void _write_string(FileAccess *f,int p_tablevel,const String& p_string) {
+
+ String tab;
+ for(int i=0;i<p_tablevel;i++) tab+="\t";
+ f->store_string(tab+p_string+"\n");
+}
+
+Error DocData::save(const String& p_path) {
+
+ Error err;
+ FileAccess *f = FileAccess::open(p_path,FileAccess::WRITE,&err);
+
+ if (err) {
+ ERR_EXPLAIN("Can't write doc file: "+p_path);
+
+ ERR_FAIL_V(err);
+
+ }
+
+ _write_string(f,0,"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
+ _write_string(f,0,"<doc version=\""+String(VERSION_MKSTRING)+"\" name=\"Engine Types\">");
+
+ for( Map<String,ClassDoc>::Element *E=class_list.front();E;E=E->next()) {
+
+ ClassDoc &c=E->get();
+
+ String header="<class name=\""+c.name+"\"";
+ if (c.inherits!="")
+ header+=" inherits=\""+c.inherits+"\"";
+
+ String category=c.category;
+ if (c.category=="")
+ category="Core";
+ header+=" category=\""+category+"\"";
+ header+=">";
+ _write_string(f,0,header);
+ _write_string(f,1,"<brief_description>");
+ if (c.brief_description!="")
+ _write_string(f,2,c.brief_description.xml_escape());
+ _write_string(f,1,"</brief_description>");
+ _write_string(f,1,"<description>");
+ if (c.description!="")
+ _write_string(f,2,c.description.xml_escape());
+ _write_string(f,1,"</description>");
+ _write_string(f,1,"<methods>");
+
+ c.methods.sort();
+
+ for(int i=0;i<c.methods.size();i++) {
+
+ MethodDoc &m=c.methods[i];
+
+ String qualifiers;
+ if (m.qualifiers!="")
+ qualifiers+=" qualifiers=\""+m.qualifiers.xml_escape()+"\"";
+
+ _write_string(f,2,"<method name=\""+m.name+"\""+qualifiers+">");
+
+ if (m.return_type!="") {
+
+ _write_string(f,3,"<return type=\""+m.return_type+"\">");
+ _write_string(f,3,"</return>");
+ }
+
+ for(int j=0;j<m.arguments.size();j++) {
+
+ ArgumentDoc &a = m.arguments[j];
+ if (a.default_value!="")
+ _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\" default=\""+a.default_value.xml_escape(true)+"\">");
+ else
+ _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\">");
+
+ _write_string(f,3,"</argument>");
+
+ }
+
+ _write_string(f,3,"<description>");
+ if (m.description!="")
+ _write_string(f,4,m.description.xml_escape());
+ _write_string(f,3,"</description>");
+
+ _write_string(f,2,"</method>");
+
+ }
+
+ _write_string(f,1,"</methods>");
+
+ if (c.properties.size()) {
+ _write_string(f,1,"<members>");
+
+ c.properties.sort();
+
+ for(int i=0;i<c.properties.size();i++) {
+
+
+ PropertyDoc &p=c.properties[i];
+ _write_string(f,2,"<member name=\""+p.name+"\" type=\""+p.type+"\" setter=\""+p.setter+"\" getter=\""+p.getter+"\" brief=\""+p.brief_description.xml_escape(true)+"\">");
+ if (p.description!="")
+ _write_string(f,3,p.description.xml_escape());
+ _write_string(f,2,"</member>");
+
+ }
+ _write_string(f,1,"</members>");
+ }
+
+ if (c.signals.size()) {
+
+ c.signals.sort();
+
+ _write_string(f,1,"<signals>");
+ for(int i=0;i<c.signals.size();i++) {
+
+ MethodDoc &m=c.signals[i];
+ _write_string(f,2,"<signal name=\""+m.name+"\">");
+ for(int j=0;j<m.arguments.size();j++) {
+
+ ArgumentDoc &a = m.arguments[j];
+ _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\">");
+ _write_string(f,3,"</argument>");
+
+ }
+
+ _write_string(f,3,"<description>");
+ if (m.description!="")
+ _write_string(f,4,m.description.xml_escape());
+ _write_string(f,3,"</description>");
+
+ _write_string(f,2,"</signal>");
+ }
+
+ _write_string(f,1,"</signals>");
+ }
+
+ _write_string(f,1,"<constants>");
+
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ ConstantDoc &k=c.constants[i];
+ _write_string(f,2,"<constant name=\""+k.name+"\" value=\""+k.value+"\">");
+ if (k.description!="")
+ _write_string(f,3,k.description.xml_escape());
+ _write_string(f,2,"</constant>");
+ }
+
+ _write_string(f,1,"</constants>");
+
+ if (c.theme_properties.size()) {
+
+ c.theme_properties.sort();
+
+ _write_string(f,1,"<theme_items>");
+ for(int i=0;i<c.theme_properties.size();i++) {
+
+
+ PropertyDoc &p=c.theme_properties[i];
+ _write_string(f,2,"<theme_item name=\""+p.name+"\" type=\""+p.type+"\">");
+ _write_string(f,2,"</theme_item>");
+
+ }
+ _write_string(f,1,"</theme_items>");
+ }
+
+ _write_string(f,0,"</class>");
+
+ }
+
+ _write_string(f,0,"</doc>");
+ f->close();
+ memdelete(f);
+
+ return OK;
+}
+
+
+Error DocData::load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size) {
+
+ Vector<uint8_t> data;
+ data.resize(p_uncompressed_size);
+ Compression::decompress(data.ptr(),p_uncompressed_size,p_data,p_compressed_size,Compression::MODE_DEFLATE);
+ class_list.clear();
+
+ Ref<XMLParser> parser = memnew( XMLParser );
+ Error err = parser->open_buffer(data);
+ if (err)
+ return err;
+
+ _load(parser);
+
+ return OK;
+
+}
diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h
new file mode 100644
index 0000000000..7601013979
--- /dev/null
+++ b/editor/doc/doc_data.h
@@ -0,0 +1,111 @@
+/*************************************************************************/
+/* doc_data.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef DOC_DATA_H
+#define DOC_DATA_H
+
+
+#include "variant.h"
+#include "map.h"
+#include "io/xml_parser.h"
+
+class DocData {
+public:
+ struct ArgumentDoc {
+
+ String name;
+ String type;
+ String default_value;
+ };
+
+ struct MethodDoc {
+
+ String name;
+ String return_type;
+ String qualifiers;
+ String description;
+ Vector<ArgumentDoc> arguments;
+ bool operator<(const MethodDoc& p_md) const {
+ return name<p_md.name;
+ }
+ };
+
+ struct ConstantDoc {
+
+ String name;
+ String value;
+ String description;
+ };
+
+ struct PropertyDoc {
+
+ String name;
+ String type;
+ String brief_description;
+ String description;
+ String setter,getter;
+ bool operator<(const PropertyDoc& p_prop) const {
+ return name<p_prop.name;
+ }
+ };
+
+ struct ClassDoc {
+
+ String name;
+ String inherits;
+ String category;
+ String brief_description;
+ String description;
+ Vector<MethodDoc> methods;
+ Vector<MethodDoc> signals;
+ Vector<ConstantDoc> constants;
+ Vector<PropertyDoc> properties;
+ Vector<PropertyDoc> theme_properties;
+
+ };
+
+ String version;
+
+ Map<String,ClassDoc> class_list;
+ Error _load(Ref<XMLParser> parser);
+
+
+public:
+
+ void merge_from(const DocData& p_data);
+ void remove_from(const DocData& p_data);
+ void generate(bool p_basic_types=false);
+ Error load(const String& p_path);
+ Error save(const String& p_path);
+
+ Error load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size);
+
+
+};
+
+#endif // DOC_DATA_H
diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp
new file mode 100644
index 0000000000..5ebba596e9
--- /dev/null
+++ b/editor/doc/doc_dump.cpp
@@ -0,0 +1,313 @@
+/*************************************************************************/
+/* doc_dump.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "doc_dump.h"
+
+#include "version.h"
+#include "os/file_access.h"
+#include "scene/main/node.h"
+
+
+static void _write_string(FileAccess *f,int p_tablevel,const String& p_string) {
+
+ String tab;
+ for(int i=0;i<p_tablevel;i++) tab+="\t";
+ f->store_string(tab+p_string+"\n");
+}
+
+struct _ConstantSort {
+
+ String name;
+ int value;
+ bool operator<(const _ConstantSort& p_c) const {
+
+ String left_a=name.find("_")==-1?name:name.substr(0,name.find("_"));
+ String left_b=p_c.name.find("_")==-1?p_c.name:p_c.name.substr(0,p_c.name.find("_"));
+ if(left_a==left_b)
+ return value<p_c.value;
+ else
+ return left_a<left_b;
+
+ }
+
+};
+
+
+static String _escape_string(const String& p_str) {
+
+ String ret=p_str;
+ ret=ret.replace("&","&amp;");
+ ret=ret.replace("<","&gt;");
+ ret=ret.replace(">","&lt;");
+ ret=ret.replace("'","&apos;");
+ ret=ret.replace("\"","&quot;");
+ for (char i=1;i<32;i++) {
+
+ char chr[2]={i,0};
+ ret=ret.replace(chr,"&#"+String::num(i)+";");
+ }
+ ret=ret.utf8();
+ return ret;
+}
+void DocDump::dump(const String& p_file) {
+
+
+ List<StringName> class_list;
+ ClassDB::get_class_list(&class_list);
+
+ class_list.sort_custom<StringName::AlphCompare>();
+
+
+ FileAccess *f = FileAccess::open(p_file,FileAccess::WRITE);
+
+ _write_string(f,0,"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
+
+ _write_string(f,0,"<doc version=\""+String(VERSION_MKSTRING)+"\" name=\"Engine Types\">");
+ while(class_list.size()) {
+
+ String name=class_list.front()->get();
+
+ String header="<class name=\""+name+"\"";
+ String inherits=ClassDB::get_parent_class(name);
+ if (inherits!="")
+ header+=" inherits=\""+inherits+"\"";
+ String category=ClassDB::get_category(name);
+ if (category=="")
+ category="Core";
+ header+=" category=\""+category+"\"";
+ header+=">";
+ _write_string(f,0,header);
+ _write_string(f,1,"<brief_description>");
+ _write_string(f,1,"</brief_description>");
+ _write_string(f,1,"<description>");
+ _write_string(f,1,"</description>");
+ _write_string(f,1,"<methods>");
+
+ List<MethodInfo> method_list;
+ ClassDB::get_method_list(name,&method_list,true);
+ method_list.sort();
+
+
+ for(List<MethodInfo>::Element *E=method_list.front();E;E=E->next()) {
+ if (E->get().name=="" || E->get().name[0]=='_')
+ continue; //hiden
+
+ MethodBind *m = ClassDB::get_method(name,E->get().name);
+
+ String qualifiers;
+ if (E->get().flags&METHOD_FLAG_CONST)
+ qualifiers+="qualifiers=\"const\"";
+
+ _write_string(f,2,"<method name=\""+_escape_string(E->get().name)+"\" "+qualifiers+" >");
+
+ for(int i=-1;i<E->get().arguments.size();i++) {
+
+ PropertyInfo arginfo;
+
+ if (i==-1) {
+
+ arginfo=E->get().return_val;
+ String type_name=(arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE)?arginfo.hint_string:Variant::get_type_name(arginfo.type);
+
+ if (arginfo.type==Variant::NIL)
+ continue;
+ _write_string(f,3,"<return type=\""+type_name+"\">");
+ } else {
+
+
+ arginfo=E->get().arguments[i];
+
+ String type_name;
+
+ if (arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE)
+ type_name=arginfo.hint_string;
+ else if (arginfo.type==Variant::NIL)
+ type_name="var";
+ else
+ type_name=Variant::get_type_name(arginfo.type);
+
+ if (m && m->has_default_argument(i)) {
+ Variant default_arg=m->get_default_argument(i);
+ String default_arg_text=String(_escape_string(m->get_default_argument(i)));
+
+ switch(default_arg.get_type()) {
+
+ case Variant::NIL:
+ default_arg_text="NULL";
+ break;
+ // atomic types
+ case Variant::BOOL:
+ if (bool(default_arg))
+ default_arg_text="true";
+ else
+ default_arg_text="false";
+ break;
+ case Variant::INT:
+ case Variant::REAL:
+ //keep it
+ break;
+ case Variant::STRING: // 15
+ case Variant::NODE_PATH: // 15
+ default_arg_text="\""+default_arg_text+"\"";
+ break;
+ case Variant::TRANSFORM:
+ if (default_arg.operator Transform()==Transform()) {
+ default_arg_text="";
+ }
+
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"("+default_arg_text+")";
+ break;
+
+ case Variant::VECTOR2: // 5
+ case Variant::RECT2:
+ case Variant::VECTOR3:
+ case Variant::PLANE:
+ case Variant::QUAT:
+ case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10
+ case Variant::BASIS:
+ case Variant::COLOR:
+ case Variant::POOL_BYTE_ARRAY:
+ case Variant::POOL_INT_ARRAY:
+ case Variant::POOL_REAL_ARRAY:
+ case Variant::POOL_STRING_ARRAY: //25
+ case Variant::POOL_VECTOR3_ARRAY:
+ case Variant::POOL_COLOR_ARRAY:
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"("+default_arg_text+")";
+ break;
+ case Variant::OBJECT:
+ case Variant::INPUT_EVENT:
+ case Variant::DICTIONARY: // 20
+ case Variant::ARRAY:
+ case Variant::_RID:
+ case Variant::IMAGE:
+ //case Variant::RESOURCE:
+
+ default_arg_text=Variant::get_type_name(default_arg.get_type())+"()";
+ break;
+ default: {}
+
+ }
+
+
+
+
+ _write_string(f,3,"<argument index=\""+itos(i)+"\" name=\""+_escape_string(arginfo.name)+"\" type=\""+type_name+"\" default=\""+_escape_string(default_arg_text)+"\">");
+ } else
+ _write_string(f,3,"<argument index=\""+itos(i)+"\" name=\""+arginfo.name+"\" type=\""+type_name+"\">");
+ }
+
+
+ String hint;
+ switch(arginfo.hint) {
+ case PROPERTY_HINT_DIR: hint="A directory."; break;
+ case PROPERTY_HINT_RANGE: hint="Range - min: "+arginfo.hint_string.get_slice(",",0)+" max: "+arginfo.hint_string.get_slice(",",1)+" step: "+arginfo.hint_string.get_slice(",",2); break;
+ case PROPERTY_HINT_ENUM: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(j); } break;
+ case PROPERTY_HINT_LENGTH: hint="Length: "+arginfo.hint_string; break;
+ case PROPERTY_HINT_FLAGS: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(1<<j); } break;
+ case PROPERTY_HINT_FILE: hint="A file:"; break;
+ default: {}
+ //case PROPERTY_HINT_RESOURCE_TYPE: hint="Type: "+arginfo.hint_string; break;
+ };
+ if (hint!="")
+ _write_string(f,4,hint);
+
+ _write_string(f,3,(i==-1)?"</return>":"</argument>");
+
+
+ }
+
+ _write_string(f,3,"<description>");
+ _write_string(f,3,"</description>");
+
+ _write_string(f,2,"</method>");
+
+ }
+
+
+ _write_string(f,1,"</methods>");
+
+ List<MethodInfo> signal_list;
+ ClassDB::get_signal_list(name,&signal_list,true);
+
+ if (signal_list.size()) {
+
+ _write_string(f,1,"<signals>");
+ for(List<MethodInfo>::Element *EV=signal_list.front();EV;EV=EV->next()) {
+
+ _write_string(f,2,"<signal name=\""+EV->get().name+"\">");
+ for(int i=0;i<EV->get().arguments.size();i++) {
+ PropertyInfo arginfo=EV->get().arguments[i];
+ _write_string(f,3,"<argument index=\""+itos(i)+"\" name=\""+arginfo.name+"\" type=\""+Variant::get_type_name(arginfo.type)+"\">");
+ _write_string(f,3,"</argument>");
+ }
+ _write_string(f,3,"<description>");
+ _write_string(f,3,"</description>");
+
+ _write_string(f,2,"</signal>");
+ }
+
+ _write_string(f,1,"</signals>");
+ }
+
+
+ _write_string(f,1,"<constants>");
+
+
+ List<String> constant_list;
+ ClassDB::get_integer_constant_list(name, &constant_list, true);
+
+ /* constants are sorted in a special way */
+
+ List<_ConstantSort> constant_sort;
+
+ for(List<String>::Element *E=constant_list.front();E;E=E->next()) {
+ _ConstantSort cs;
+ cs.name=E->get();
+ cs.value=ClassDB::get_integer_constant(name, E->get());
+ constant_sort.push_back(cs);
+ }
+
+ constant_sort.sort();
+
+ for(List<_ConstantSort>::Element *E=constant_sort.front();E;E=E->next()) {
+
+ _write_string(f,2,"<constant name=\""+E->get().name+"\" value=\""+itos(E->get().value)+"\">");
+ _write_string(f,2,"</constant>");
+ }
+
+ _write_string(f,1,"</constants>");
+ _write_string(f,0,"</class>");
+
+ class_list.erase(name);
+ }
+
+ _write_string(f,0,"</doc>");
+ f->close();
+ memdelete(f);
+
+}
diff --git a/editor/doc/doc_dump.h b/editor/doc/doc_dump.h
new file mode 100644
index 0000000000..84629b89c8
--- /dev/null
+++ b/editor/doc/doc_dump.h
@@ -0,0 +1,41 @@
+/*************************************************************************/
+/* doc_dump.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef DOC_DUMP_H
+#define DOC_DUMP_H
+
+#include "class_db.h"
+
+class DocDump {
+public:
+
+ static void dump(const String& p_file);
+
+};
+
+#endif // DOC_DUMP_H
diff --git a/editor/doc_code_font.h b/editor/doc_code_font.h
new file mode 100644
index 0000000000..55f335ab78
--- /dev/null
+++ b/editor/doc_code_font.h
@@ -0,0 +1,32 @@
+/*************************************************************************/
+/* doc_code_font.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+static const int _bi_font_doc_code_font_height=19;
+static const int _bi_font_doc_code_font_ascent=15;
+static const int _bi_font_doc_code_font_charcount=193;
+static const int _bi_font_doc_code_font_characters[]={0, 253, 53, 2, 2, -1, 14, 0, 13, 253, 56, 2, 2, -1, 14, 0, 32, 253, 59, 2, 2, -1, 14, 4, 33, 221, 29, 3, 12, 1, 3, 5, 34, 144, 77, 6, 5, 0, 3, 7, 35, 180, 55, 9, 11, -1, 4, 8, 36, 215, 0, 8, 15, 0, 2, 8, 37, 28, 45, 12, 11, -1, 4, 12, 38, 199, 16, 11, 12, 0, 3, 11, 39, 157, 77, 3, 5, 0, 3, 4, 40, 36, 16, 4, 15, 0, 3, 5, 41, 31, 16, 4, 15, 0, 3, 5, 42, 93, 79, 9, 7, -1, 3, 8, 43, 110, 68, 9, 9, -1, 5, 8, 44, 121, 78, 4, 6, -1, 12, 4, 45, 204, 76, 5, 3, -1, 9, 5, 46, 216, 75, 4, 3, 0, 12, 4, 47, 233, 0, 8, 15, -1, 2, 7, 48, 246, 29, 9, 11, -1, 4, 8, 49, 208, 54, 8, 11, 0, 4, 8, 50, 219, 42, 9, 11, -1, 4, 8, 51, 229, 41, 9, 11, -1, 4, 8, 52, 239, 41, 9, 11, -1, 4, 8, 53, 0, 57, 9, 11, -1, 4, 8, 54, 160, 55, 9, 11, -1, 4, 8, 55, 10, 57, 9, 11, -1, 4, 8, 56, 20, 57, 9, 11, -1, 4, 8, 57, 40, 57, 9, 11, -1, 4, 8, 58, 78, 80, 3, 8, 0, 7, 4, 59, 72, 68, 4, 11, -1, 7, 4, 60, 18, 69, 8, 11, 0, 4, 8, 61, 112, 78, 8, 7, 0, 6, 8, 62, 0, 69, 8, 11, 0, 4, 8, 63, 184, 30, 7, 12, 0, 3, 7, 64, 148, 16, 13, 13, 0, 4, 14, 65, 117, 44, 11, 11, -1, 4, 10, 66, 50, 57, 9, 11, 0, 4, 9, 67, 197, 42, 10, 11, -1, 4, 8, 68, 153, 43, 10, 11, 0, 4, 10, 69, 244, 53, 8, 11, 0, 4, 8, 70, 43, 69, 7, 11, 0, 4, 7, 71, 93, 44, 11, 11, -1, 4, 10, 72, 60, 56, 9, 11, 0, 4, 10, 73, 77, 68, 4, 11, 0, 4, 4, 74, 249, 41, 6, 11, -1, 4, 5, 75, 70, 56, 9, 11, 0, 4, 9, 76, 27, 69, 7, 11, 0, 4, 7, 77, 14, 45, 13, 11, 0, 4, 14, 78, 208, 42, 10, 11, 0, 4, 11, 79, 41, 45, 12, 11, -1, 4, 11, 80, 199, 54, 8, 11, 0, 4, 9, 81, 162, 16, 13, 13, -1, 4, 11, 82, 80, 56, 9, 11, 0, 4, 9, 83, 90, 56, 9, 11, -1, 4, 8, 84, 100, 56, 9, 11, -1, 4, 8, 85, 164, 43, 10, 11, 0, 4, 10, 86, 129, 44, 11, 11, -1, 4, 9, 87, 229, 29, 16, 11, -1, 4, 15, 88, 175, 43, 10, 11, -1, 4, 9, 89, 186, 43, 10, 11, -1, 4, 8, 90, 110, 56, 9, 11, -1, 4, 8, 91, 26, 16, 4, 15, 0, 3, 5, 92, 123, 0, 10, 15, -2, 2, 7, 93, 251, 0, 4, 15, 0, 3, 5, 94, 82, 79, 10, 7, -2, 4, 8, 95, 180, 76, 9, 3, -1, 15, 8, 96, 161, 77, 6, 4, -1, 3, 5, 97, 27, 81, 8, 8, -1, 7, 8, 98, 68, 31, 8, 12, 0, 3, 9, 99, 18, 81, 8, 8, -1, 7, 7, 100, 211, 16, 9, 12, -1, 3, 9, 101, 228, 66, 9, 8, -1, 7, 8, 102, 176, 30, 7, 12, -1, 3, 5, 103, 120, 56, 9, 11, -1, 7, 8, 104, 59, 31, 8, 12, 0, 3, 9, 105, 66, 68, 5, 11, -1, 4, 4, 106, 141, 16, 6, 14, -2, 4, 4, 107, 104, 31, 8, 12, 0, 3, 8, 108, 251, 16, 3, 12, 0, 3, 4, 109, 144, 68, 13, 8, 0, 7, 13, 110, 9, 81, 8, 8, 0, 7, 9, 111, 208, 66, 9, 8, -1, 7, 9, 112, 217, 54, 8, 11, 0, 7, 9, 113, 140, 56, 9, 11, -1, 7, 9, 114, 53, 81, 6, 8, 0, 7, 6, 115, 45, 81, 7, 8, -1, 7, 6, 116, 102, 68, 7, 10, -1, 5, 6, 117, 36, 81, 8, 8, 0, 7, 9, 118, 238, 65, 9, 8, -1, 7, 8, 119, 158, 68, 13, 8, -1, 7, 12, 120, 218, 66, 9, 8, -1, 7, 7, 121, 150, 56, 9, 11, -1, 7, 8, 122, 248, 65, 7, 8, -1, 7, 6, 123, 14, 16, 5, 15, 0, 3, 6, 124, 41, 16, 3, 15, 2, 3, 8, 125, 20, 16, 5, 15, 0, 3, 6, 126, 135, 78, 8, 5, -1, 4, 8, 160, 253, 62, 2, 2, -1, 14, 4, 161, 225, 29, 3, 12, 0, 5, 5, 162, 35, 69, 7, 11, 0, 4, 8, 163, 190, 55, 8, 11, 0, 4, 8, 164, 82, 68, 9, 10, -1, 5, 8, 165, 105, 44, 11, 11, -2, 4, 8, 166, 45, 16, 3, 15, 2, 3, 8, 167, 125, 16, 8, 14, 0, 3, 8, 168, 197, 76, 6, 3, 0, 4, 7, 169, 186, 16, 12, 12, 0, 3, 13, 170, 137, 68, 6, 9, 0, 4, 7, 171, 197, 67, 10, 8, -1, 6, 9, 172, 126, 78, 8, 5, -1, 8, 8, 173, 210, 75, 5, 3, -1, 9, 5, 174, 103, 79, 8, 7, 0, 3, 8, 175, 190, 76, 6, 3, 0, 4, 6, 176, 151, 77, 5, 5, 0, 3, 5, 177, 221, 16, 9, 12, -1, 3, 8, 178, 60, 81, 6, 8, -1, 2, 5, 179, 67, 80, 5, 8, -1, 2, 5, 180, 168, 77, 6, 4, -1, 3, 5, 181, 170, 55, 9, 11, 0, 7, 9, 182, 176, 16, 9, 13, 0, 4, 10, 183, 221, 75, 3, 3, 0, 9, 4, 184, 175, 76, 4, 4, 0, 14, 5, 185, 73, 80, 4, 8, 0, 2, 4, 186, 129, 68, 7, 9, 0, 4, 7, 187, 185, 67, 11, 8, -1, 6, 9, 188, 54, 44, 12, 11, -2, 4, 11, 189, 67, 44, 12, 11, -2, 4, 11, 190, 80, 44, 12, 11, -1, 4, 11, 191, 192, 29, 7, 12, -1, 5, 7, 192, 88, 0, 11, 15, -1, 0, 10, 193, 64, 0, 11, 15, -1, 0, 10, 194, 76, 0, 11, 15, -1, 0, 10, 195, 100, 0, 11, 15, -1, 0, 10, 196, 74, 16, 11, 14, -1, 1, 10, 197, 62, 16, 11, 14, -1, 1, 10, 198, 0, 45, 13, 11, -1, 4, 12, 199, 107, 16, 8, 14, 0, 4, 8, 200, 188, 0, 8, 15, 0, 0, 8, 201, 206, 0, 8, 15, 0, 0, 8, 202, 224, 0, 8, 15, 0, 0, 8, 203, 116, 16, 8, 14, 0, 1, 8, 204, 0, 16, 6, 15, -2, 0, 4, 205, 7, 16, 6, 15, -1, 0, 4, 206, 242, 0, 8, 15, -2, 0, 4, 207, 134, 16, 6, 14, -1, 1, 4, 208, 141, 44, 11, 11, -1, 4, 10, 209, 145, 0, 10, 15, 0, 0, 11, 210, 0, 0, 12, 15, -1, 0, 11, 211, 39, 0, 12, 15, -1, 0, 11, 212, 26, 0, 12, 15, -1, 0, 11, 213, 13, 0, 12, 15, -1, 0, 11, 214, 49, 16, 12, 14, -1, 1, 11, 215, 0, 81, 8, 8, 0, 6, 8, 216, 52, 0, 11, 15, 0, 2, 11, 217, 167, 0, 10, 15, 0, 0, 10, 218, 134, 0, 10, 15, 0, 0, 10, 219, 156, 0, 10, 15, 0, 0, 10, 220, 86, 16, 10, 14, 0, 1, 10, 221, 112, 0, 10, 15, -1, 0, 8, 222, 226, 54, 8, 11, 0, 4, 9, 223, 77, 31, 8, 12, 0, 3, 9, 224, 113, 31, 8, 12, -1, 3, 8, 225, 122, 31, 8, 12, -1, 3, 8, 226, 131, 31, 8, 12, -1, 3, 8, 227, 167, 30, 8, 12, -1, 3, 8, 228, 235, 53, 8, 11, -1, 4, 8, 229, 50, 31, 8, 12, -1, 3, 8, 230, 172, 67, 12, 8, 0, 7, 12, 231, 51, 69, 7, 11, 0, 7, 7, 232, 40, 32, 9, 12, -1, 3, 8, 233, 231, 16, 9, 12, -1, 3, 8, 234, 241, 16, 9, 12, -1, 3, 8, 235, 30, 57, 9, 11, -1, 4, 8, 236, 200, 29, 6, 12, -2, 3, 4, 237, 214, 29, 6, 12, -1, 3, 4, 238, 207, 29, 6, 12, -1, 3, 4, 239, 59, 69, 6, 11, -1, 4, 4, 240, 86, 31, 8, 12, 0, 3, 9, 241, 95, 31, 8, 12, 0, 3, 9, 242, 0, 32, 9, 12, -1, 3, 9, 243, 10, 32, 9, 12, -1, 3, 9, 244, 20, 32, 9, 12, -1, 3, 9, 245, 30, 32, 9, 12, -1, 3, 9, 246, 130, 56, 9, 11, -1, 4, 9, 247, 120, 68, 8, 9, -1, 5, 8, 248, 92, 68, 9, 10, 0, 6, 9, 249, 140, 31, 8, 12, 0, 3, 9, 250, 149, 30, 8, 12, 0, 3, 9, 251, 158, 30, 8, 12, 0, 3, 9, 252, 9, 69, 8, 11, 0, 4, 9, 253, 178, 0, 9, 15, -1, 3, 8, 254, 197, 0, 8, 15, 0, 3, 9, 255, 97, 16, 9, 14, -1, 4, 8};
diff --git a/editor/doc_font.h b/editor/doc_font.h
new file mode 100644
index 0000000000..b598ee26f8
--- /dev/null
+++ b/editor/doc_font.h
@@ -0,0 +1,32 @@
+/*************************************************************************/
+/* doc_font.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+static const int _bi_font_doc_font_height=18;
+static const int _bi_font_doc_font_ascent=14;
+static const int _bi_font_doc_font_charcount=193;
+static const int _bi_font_doc_font_characters[]={0, 253, 3, 2, 2, -1, 13, 0, 13, 253, 9, 2, 2, -1, 13, 0, 32, 253, 0, 2, 2, -1, 13, 3, 33, 220, 26, 3, 11, 1, 3, 5, 34, 187, 59, 5, 5, 0, 3, 6, 35, 88, 40, 9, 10, -1, 4, 7, 36, 50, 0, 8, 14, -1, 2, 7, 37, 175, 14, 11, 11, -1, 3, 11, 38, 187, 14, 11, 11, -1, 3, 10, 39, 198, 58, 3, 5, 0, 3, 3, 40, 98, 0, 4, 14, 0, 3, 5, 41, 103, 0, 4, 14, 0, 3, 5, 42, 146, 61, 7, 6, 0, 3, 7, 43, 246, 48, 8, 8, -1, 5, 7, 44, 193, 58, 4, 5, -1, 11, 4, 45, 13, 73, 5, 2, 0, 9, 5, 46, 241, 57, 3, 3, 0, 11, 4, 47, 84, 0, 7, 14, -1, 2, 6, 48, 246, 37, 8, 10, -1, 4, 7, 49, 33, 52, 7, 10, 0, 4, 7, 50, 237, 37, 8, 10, -1, 4, 7, 51, 219, 38, 8, 10, -1, 4, 7, 52, 128, 39, 9, 10, -1, 4, 7, 53, 41, 52, 7, 10, -1, 4, 7, 54, 9, 53, 7, 10, 0, 4, 7, 55, 228, 38, 8, 10, -1, 4, 7, 56, 57, 52, 7, 10, 0, 4, 7, 57, 65, 51, 7, 10, 0, 4, 7, 58, 98, 62, 4, 8, 0, 6, 4, 59, 162, 50, 5, 10, -1, 6, 4, 60, 174, 49, 8, 9, -1, 4, 7, 61, 179, 59, 7, 5, 0, 7, 7, 62, 228, 49, 8, 8, -1, 5, 7, 63, 89, 28, 7, 11, 0, 3, 7, 64, 54, 15, 12, 12, 0, 4, 13, 65, 36, 41, 10, 10, -1, 4, 9, 66, 97, 51, 7, 10, 0, 4, 8, 67, 174, 38, 8, 10, 0, 4, 8, 68, 156, 39, 8, 10, 0, 4, 9, 69, 105, 51, 7, 10, 0, 4, 7, 70, 121, 51, 6, 10, 0, 4, 7, 71, 0, 53, 8, 10, 0, 4, 9, 72, 192, 38, 8, 10, 0, 4, 9, 73, 251, 26, 3, 10, 0, 4, 4, 74, 156, 50, 5, 10, -1, 4, 5, 75, 147, 39, 8, 10, 0, 4, 8, 76, 135, 50, 6, 10, 0, 4, 6, 77, 13, 41, 11, 10, 0, 4, 12, 78, 210, 38, 8, 10, 0, 4, 10, 79, 68, 40, 9, 10, 0, 4, 10, 80, 113, 51, 7, 10, 0, 4, 8, 81, 199, 14, 10, 11, 0, 4, 10, 82, 183, 38, 8, 10, 0, 4, 8, 83, 128, 50, 6, 10, 0, 4, 7, 84, 108, 40, 9, 10, -1, 4, 7, 85, 165, 39, 8, 10, 0, 4, 9, 86, 25, 41, 10, 10, -1, 4, 9, 87, 236, 26, 14, 10, -1, 4, 13, 88, 98, 40, 9, 10, -1, 4, 8, 89, 118, 40, 9, 10, -1, 4, 7, 90, 138, 39, 8, 10, -1, 4, 7, 91, 49, 15, 4, 13, 0, 3, 5, 92, 76, 0, 7, 14, -1, 2, 6, 93, 43, 15, 5, 13, -1, 3, 5, 94, 137, 61, 8, 6, -1, 4, 7, 95, 245, 57, 9, 2, -1, 15, 7, 96, 230, 58, 5, 3, -1, 3, 4, 97, 57, 63, 7, 8, 0, 6, 7, 98, 81, 28, 7, 11, 0, 3, 8, 99, 79, 62, 6, 8, 0, 6, 6, 100, 33, 29, 7, 11, 0, 3, 8, 101, 9, 64, 7, 8, 0, 6, 8, 102, 200, 26, 6, 11, -1, 3, 5, 103, 153, 27, 7, 11, 0, 6, 7, 104, 121, 27, 7, 11, 0, 3, 8, 105, 224, 26, 3, 11, 0, 3, 4, 106, 92, 0, 5, 14, -2, 3, 4, 107, 25, 29, 7, 11, 0, 3, 7, 108, 228, 26, 3, 11, 0, 3, 4, 109, 204, 49, 11, 8, 0, 6, 12, 110, 17, 63, 7, 8, 0, 6, 8, 111, 33, 63, 7, 8, 0, 6, 8, 112, 17, 29, 7, 11, 0, 6, 8, 113, 9, 29, 7, 11, 0, 6, 8, 114, 86, 62, 5, 8, 0, 6, 5, 115, 92, 62, 5, 8, 0, 6, 6, 116, 168, 50, 5, 10, -1, 4, 5, 117, 49, 63, 7, 8, 0, 6, 8, 118, 0, 64, 8, 8, -1, 6, 7, 119, 216, 49, 11, 8, -1, 6, 10, 120, 41, 63, 7, 8, -1, 6, 7, 121, 0, 30, 8, 11, -1, 6, 7, 122, 72, 62, 6, 8, 0, 6, 6, 123, 8, 15, 6, 13, -1, 3, 5, 124, 0, 0, 3, 15, 1, 2, 7, 125, 15, 15, 6, 13, -1, 3, 5, 126, 202, 58, 8, 4, -1, 4, 7, 160, 253, 6, 2, 2, -1, 13, 3, 161, 232, 26, 3, 11, 0, 4, 5, 162, 149, 50, 6, 10, 0, 4, 7, 163, 17, 52, 7, 10, 0, 4, 7, 164, 183, 49, 8, 9, -1, 5, 7, 165, 47, 41, 10, 10, -2, 4, 7, 166, 4, 0, 3, 15, 2, 2, 7, 167, 122, 14, 7, 12, 0, 3, 7, 168, 0, 73, 6, 2, -1, 4, 6, 169, 162, 14, 12, 11, 0, 3, 13, 170, 65, 62, 6, 8, -1, 4, 6, 171, 112, 62, 8, 7, -1, 6, 8, 172, 211, 58, 7, 4, -1, 8, 7, 173, 19, 72, 5, 2, 0, 9, 5, 174, 103, 62, 8, 7, -1, 3, 8, 175, 7, 73, 5, 2, 0, 3, 6, 176, 171, 61, 7, 5, -1, 3, 5, 177, 58, 40, 9, 10, -1, 4, 7, 178, 154, 61, 5, 6, 0, 2, 5, 179, 160, 61, 5, 6, -1, 2, 5, 180, 224, 58, 5, 3, -1, 3, 4, 181, 241, 14, 8, 11, 0, 6, 8, 182, 97, 15, 8, 12, 0, 4, 9, 183, 236, 58, 4, 3, 0, 8, 4, 184, 219, 58, 4, 4, 0, 13, 5, 185, 166, 61, 4, 6, 0, 2, 4, 186, 25, 63, 7, 8, -1, 4, 6, 187, 129, 61, 7, 7, 0, 6, 8, 188, 221, 14, 9, 11, 0, 3, 10, 189, 231, 14, 9, 11, 0, 3, 10, 190, 210, 14, 10, 11, -1, 3, 10, 191, 41, 29, 7, 11, -1, 4, 7, 192, 141, 0, 10, 13, -1, 1, 9, 193, 130, 0, 10, 13, -1, 1, 9, 194, 119, 0, 10, 13, -1, 1, 9, 195, 20, 0, 10, 14, -1, 0, 9, 196, 67, 15, 10, 12, -1, 2, 9, 197, 108, 0, 10, 13, -1, 1, 9, 198, 0, 42, 12, 10, -1, 4, 11, 199, 228, 0, 8, 13, 0, 4, 8, 200, 245, 0, 7, 13, 0, 1, 7, 201, 237, 0, 7, 13, 0, 1, 7, 202, 0, 16, 7, 13, 0, 1, 7, 203, 130, 14, 7, 12, 0, 2, 7, 204, 36, 15, 6, 13, -2, 1, 4, 205, 22, 15, 6, 13, -1, 1, 4, 206, 29, 15, 6, 13, -1, 1, 4, 207, 154, 14, 7, 12, -2, 2, 4, 208, 78, 40, 9, 10, -1, 4, 9, 209, 59, 0, 8, 14, 0, 0, 10, 210, 172, 0, 9, 13, 0, 1, 10, 211, 152, 0, 9, 13, 0, 1, 10, 212, 182, 0, 9, 13, 0, 1, 10, 213, 31, 0, 9, 14, 0, 0, 10, 214, 78, 15, 9, 12, 0, 2, 10, 215, 121, 62, 7, 7, 0, 6, 7, 216, 8, 0, 11, 14, -1, 2, 10, 217, 192, 0, 8, 13, 0, 1, 9, 218, 210, 0, 8, 13, 0, 1, 9, 219, 201, 0, 8, 13, 0, 1, 9, 220, 88, 15, 8, 12, 0, 2, 9, 221, 162, 0, 9, 13, -1, 1, 7, 222, 81, 51, 7, 10, 0, 4, 8, 223, 49, 29, 7, 11, 0, 3, 8, 224, 57, 28, 7, 11, 0, 3, 7, 225, 65, 28, 7, 11, 0, 3, 7, 226, 73, 28, 7, 11, 0, 3, 7, 227, 138, 14, 7, 12, 0, 2, 7, 228, 25, 52, 7, 10, 0, 4, 7, 229, 146, 14, 7, 12, 0, 2, 7, 230, 192, 49, 11, 8, 0, 6, 12, 231, 207, 26, 6, 11, 0, 6, 6, 232, 97, 28, 7, 11, 0, 3, 8, 233, 105, 28, 7, 11, 0, 3, 8, 234, 113, 28, 7, 11, 0, 3, 8, 235, 73, 51, 7, 10, 0, 4, 8, 236, 214, 26, 5, 11, -2, 3, 3, 237, 250, 14, 5, 11, -1, 3, 3, 238, 193, 26, 6, 11, -2, 3, 3, 239, 142, 50, 6, 10, -2, 4, 3, 240, 185, 26, 7, 11, 0, 3, 8, 241, 106, 15, 7, 12, 0, 2, 8, 242, 129, 27, 7, 11, 0, 3, 8, 243, 137, 27, 7, 11, 0, 3, 8, 244, 145, 27, 7, 11, 0, 3, 8, 245, 114, 14, 7, 12, 0, 2, 8, 246, 49, 52, 7, 10, 0, 4, 8, 247, 237, 48, 8, 8, -1, 5, 7, 248, 201, 38, 8, 10, 0, 5, 8, 249, 161, 27, 7, 11, 0, 3, 8, 250, 169, 26, 7, 11, 0, 3, 8, 251, 177, 26, 7, 11, 0, 3, 8, 252, 89, 51, 7, 10, 0, 4, 8, 253, 41, 0, 8, 14, -1, 3, 7, 254, 68, 0, 7, 14, 0, 3, 8, 255, 219, 0, 8, 13, -1, 4, 7};
diff --git a/editor/doc_title_font.h b/editor/doc_title_font.h
new file mode 100644
index 0000000000..afa0f61eda
--- /dev/null
+++ b/editor/doc_title_font.h
@@ -0,0 +1,32 @@
+/*************************************************************************/
+/* doc_title_font.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+static const int _bi_font_doc_title_font_height=22;
+static const int _bi_font_doc_title_font_ascent=17;
+static const int _bi_font_doc_title_font_charcount=193;
+static const int _bi_font_doc_title_font_characters[]={0, 108, 97, 2, 2, -1, 16, 0, 13, 111, 97, 2, 2, -1, 16, 0, 32, 252, 55, 2, 2, -1, 16, 4, 33, 84, 48, 3, 13, 1, 4, 6, 34, 9, 99, 6, 6, 0, 4, 8, 35, 52, 76, 9, 12, -1, 5, 9, 36, 31, 18, 9, 16, 0, 3, 9, 37, 28, 35, 13, 13, -1, 4, 13, 38, 56, 35, 12, 13, 0, 4, 13, 39, 16, 99, 3, 6, 0, 4, 4, 40, 48, 0, 5, 17, 0, 3, 6, 41, 54, 0, 5, 17, 0, 3, 6, 42, 207, 84, 9, 8, 0, 3, 9, 43, 121, 86, 9, 9, 0, 7, 9, 44, 251, 71, 4, 6, -1, 13, 5, 45, 102, 97, 5, 3, 0, 10, 6, 46, 66, 99, 4, 4, 0, 13, 5, 47, 24, 0, 9, 17, -2, 3, 8, 48, 11, 76, 10, 12, -1, 5, 9, 49, 102, 74, 9, 12, 0, 5, 9, 50, 48, 63, 10, 12, -1, 5, 9, 51, 59, 63, 10, 12, -1, 5, 9, 52, 70, 63, 10, 12, -1, 5, 9, 53, 81, 62, 10, 12, -1, 5, 9, 54, 235, 59, 10, 12, -1, 5, 9, 55, 103, 61, 10, 12, -1, 5, 9, 56, 114, 60, 10, 12, -1, 5, 9, 57, 125, 60, 10, 12, -1, 5, 9, 58, 252, 45, 3, 9, 0, 8, 5, 59, 246, 71, 4, 11, -1, 8, 5, 60, 148, 73, 8, 12, 0, 5, 9, 61, 0, 100, 8, 7, 0, 8, 9, 62, 139, 73, 8, 12, 0, 5, 9, 63, 40, 49, 8, 13, 0, 4, 8, 64, 184, 17, 15, 14, 0, 5, 16, 65, 178, 47, 12, 12, -1, 5, 11, 66, 136, 60, 10, 12, 0, 5, 10, 67, 240, 45, 11, 12, -1, 5, 10, 68, 0, 63, 11, 12, 0, 5, 11, 69, 130, 73, 8, 12, 0, 5, 9, 70, 112, 74, 8, 12, 0, 5, 8, 71, 191, 46, 12, 12, -1, 5, 11, 72, 24, 63, 11, 12, 0, 5, 11, 73, 193, 72, 4, 12, 0, 5, 5, 74, 173, 73, 6, 12, -1, 5, 6, 75, 147, 60, 10, 12, 0, 5, 10, 76, 121, 73, 8, 12, 0, 5, 8, 77, 122, 47, 15, 12, 0, 5, 16, 78, 12, 63, 11, 12, 0, 5, 12, 79, 138, 47, 13, 12, -1, 5, 12, 80, 62, 76, 9, 12, 0, 5, 10, 81, 200, 17, 14, 14, -1, 5, 12, 82, 158, 60, 10, 12, 0, 5, 10, 83, 32, 76, 9, 12, -1, 5, 9, 84, 169, 60, 10, 12, -1, 5, 9, 85, 204, 46, 11, 12, 0, 5, 12, 86, 165, 47, 12, 12, -1, 5, 11, 87, 88, 48, 17, 12, -1, 5, 16, 88, 216, 46, 11, 12, -1, 5, 10, 89, 228, 46, 11, 12, -1, 5, 9, 90, 180, 60, 10, 12, -1, 5, 9, 91, 249, 0, 5, 16, 0, 4, 6, 92, 13, 0, 10, 17, -2, 3, 8, 93, 85, 17, 5, 16, 0, 4, 6, 94, 196, 85, 10, 8, -1, 5, 9, 95, 71, 99, 10, 3, -1, 17, 9, 96, 46, 99, 6, 4, -1, 4, 5, 97, 111, 87, 9, 9, -1, 8, 9, 98, 207, 32, 9, 13, 0, 4, 10, 99, 161, 86, 8, 9, -1, 8, 8, 100, 69, 34, 10, 13, -1, 4, 10, 101, 89, 88, 10, 9, -1, 8, 9, 102, 58, 49, 7, 13, -1, 4, 6, 103, 191, 59, 10, 12, -1, 8, 9, 104, 177, 33, 9, 13, 0, 4, 10, 105, 187, 73, 5, 12, -1, 5, 4, 106, 177, 17, 6, 15, -2, 5, 5, 107, 217, 32, 9, 13, 0, 4, 9, 108, 250, 17, 4, 13, 0, 4, 4, 109, 24, 89, 14, 9, 0, 8, 15, 110, 151, 86, 9, 9, 0, 8, 10, 111, 100, 87, 10, 9, -1, 8, 10, 112, 42, 76, 9, 12, 0, 8, 10, 113, 213, 59, 10, 12, -1, 8, 10, 114, 188, 86, 7, 9, 0, 8, 6, 115, 170, 86, 8, 9, -1, 8, 7, 116, 230, 72, 7, 11, -1, 6, 6, 117, 141, 86, 9, 9, 0, 8, 10, 118, 78, 89, 10, 9, -1, 8, 9, 119, 8, 89, 15, 9, -1, 8, 13, 120, 131, 86, 9, 9, -1, 8, 8, 121, 224, 59, 10, 12, -1, 8, 9, 122, 179, 86, 8, 9, -1, 8, 7, 123, 34, 0, 6, 17, -1, 3, 6, 124, 64, 0, 3, 17, 2, 3, 9, 125, 41, 0, 6, 17, 0, 3, 6, 126, 30, 99, 9, 5, 0, 5, 9, 160, 114, 97, 2, 2, -1, 16, 4, 161, 80, 48, 3, 13, 1, 6, 6, 162, 165, 73, 7, 12, 0, 5, 9, 163, 92, 74, 9, 12, 0, 5, 9, 164, 209, 72, 10, 11, -1, 6, 9, 165, 36, 63, 11, 12, -2, 5, 9, 166, 60, 0, 3, 17, 2, 3, 9, 167, 151, 17, 8, 15, 0, 4, 9, 168, 82, 99, 6, 3, 0, 5, 7, 169, 236, 17, 13, 13, 0, 4, 15, 170, 238, 72, 7, 11, 0, 5, 7, 171, 54, 89, 11, 9, -1, 7, 10, 172, 20, 99, 9, 5, -1, 10, 9, 173, 96, 98, 5, 3, 0, 10, 6, 174, 226, 84, 8, 8, 0, 4, 9, 175, 89, 98, 6, 3, 0, 4, 7, 176, 40, 99, 5, 5, 0, 4, 6, 177, 22, 76, 9, 12, 0, 5, 9, 178, 235, 84, 6, 8, 0, 3, 6, 179, 242, 84, 6, 8, 0, 3, 6, 180, 53, 99, 6, 4, -1, 4, 5, 181, 0, 76, 10, 12, 0, 8, 10, 182, 215, 17, 10, 14, 0, 5, 11, 183, 251, 78, 3, 4, 0, 9, 5, 184, 60, 99, 5, 4, 0, 16, 5, 185, 249, 83, 5, 8, -1, 3, 5, 186, 0, 89, 7, 10, 0, 5, 8, 187, 66, 89, 11, 9, -1, 7, 10, 188, 42, 35, 13, 13, -1, 4, 12, 189, 0, 35, 13, 13, -1, 4, 12, 190, 14, 35, 13, 13, -1, 4, 13, 191, 49, 49, 8, 13, -1, 6, 8, 192, 150, 0, 12, 16, -1, 1, 11, 193, 176, 0, 12, 16, -1, 1, 11, 194, 163, 0, 12, 16, -1, 1, 11, 195, 124, 0, 12, 16, -1, 1, 11, 196, 105, 17, 12, 15, -1, 2, 11, 197, 0, 0, 12, 17, -1, 0, 11, 198, 106, 47, 15, 12, -1, 5, 14, 199, 141, 17, 9, 15, 0, 5, 10, 200, 60, 18, 8, 16, 0, 1, 9, 201, 41, 18, 9, 16, 0, 1, 9, 202, 21, 18, 9, 16, 0, 1, 9, 203, 160, 17, 8, 15, 0, 2, 9, 204, 69, 17, 7, 16, -2, 1, 5, 205, 77, 17, 7, 16, -1, 1, 5, 206, 51, 18, 8, 16, -2, 1, 5, 207, 169, 17, 7, 15, -2, 2, 5, 208, 152, 47, 12, 12, -1, 5, 12, 209, 237, 0, 11, 16, 0, 1, 12, 210, 82, 0, 13, 16, -1, 1, 12, 211, 68, 0, 13, 16, -1, 1, 12, 212, 110, 0, 13, 16, -1, 1, 12, 213, 96, 0, 13, 16, -1, 1, 12, 214, 91, 17, 13, 15, -1, 2, 12, 215, 217, 84, 8, 8, 0, 8, 9, 216, 137, 0, 12, 16, 0, 3, 12, 217, 225, 0, 11, 16, 0, 1, 12, 218, 189, 0, 11, 16, 0, 1, 12, 219, 213, 0, 11, 16, 0, 1, 12, 220, 118, 17, 11, 15, 0, 2, 12, 221, 201, 0, 11, 16, -1, 1, 9, 222, 72, 76, 9, 12, 0, 5, 10, 223, 167, 33, 9, 13, 0, 4, 10, 224, 157, 33, 9, 13, -1, 4, 9, 225, 30, 49, 9, 13, -1, 4, 9, 226, 227, 32, 9, 13, -1, 4, 9, 227, 237, 31, 9, 13, -1, 4, 9, 228, 82, 75, 9, 12, -1, 5, 9, 229, 226, 17, 9, 14, -1, 3, 9, 230, 39, 89, 14, 9, 0, 8, 14, 231, 157, 73, 7, 12, 0, 8, 8, 232, 146, 33, 10, 13, -1, 4, 9, 233, 80, 34, 10, 13, -1, 4, 9, 234, 91, 33, 10, 13, -1, 4, 9, 235, 92, 61, 10, 12, -1, 5, 9, 236, 66, 49, 6, 13, -2, 4, 4, 237, 73, 48, 6, 13, -1, 4, 4, 238, 247, 31, 8, 13, -2, 4, 4, 239, 180, 73, 6, 12, -1, 5, 4, 240, 187, 32, 9, 13, 0, 4, 10, 241, 197, 32, 9, 13, 0, 4, 10, 242, 102, 33, 10, 13, -1, 4, 10, 243, 113, 33, 10, 13, -1, 4, 10, 244, 124, 33, 10, 13, -1, 4, 10, 245, 135, 33, 10, 13, -1, 4, 10, 246, 202, 59, 10, 12, -1, 5, 10, 247, 220, 72, 9, 11, -1, 6, 9, 248, 198, 72, 10, 11, 0, 7, 10, 249, 0, 49, 9, 13, 0, 4, 10, 250, 10, 49, 9, 13, 0, 4, 10, 251, 20, 49, 9, 13, 0, 4, 10, 252, 246, 58, 9, 12, 0, 5, 10, 253, 0, 18, 10, 16, -1, 4, 9, 254, 11, 18, 9, 16, 0, 4, 10, 255, 130, 17, 10, 15, -1, 5, 9};
diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp
new file mode 100644
index 0000000000..8af01012a4
--- /dev/null
+++ b/editor/editor_asset_installer.cpp
@@ -0,0 +1,359 @@
+/*************************************************************************/
+/* editor_asset_installer.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_asset_installer.h"
+
+#include "io/zip_io.h"
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "editor_node.h"
+
+void EditorAssetInstaller::_update_subitems(TreeItem* p_item,bool p_check,bool p_first) {
+
+
+ if (p_check) {
+ if (p_item->get_custom_color(0)==Color()) {
+ p_item->set_checked(0,true);
+ }
+ } else {
+ p_item->set_checked(0,false);
+
+ }
+
+ if (p_item->get_children()) {
+ _update_subitems(p_item->get_children(),p_check);
+ }
+
+ if (!p_first && p_item->get_next()) {
+ _update_subitems(p_item->get_next(),p_check);
+ }
+
+}
+
+void EditorAssetInstaller::_item_edited() {
+
+
+ if (updating)
+ return;
+
+ TreeItem *item = tree->get_edited();
+ if (!item)
+ return;
+
+
+ String path=item->get_metadata(0);
+
+ updating=true;
+ if (path==String()) { //a dir
+ _update_subitems(item,item->is_checked(0),true);
+ }
+
+ if (item->is_checked(0)) {
+ while(item) {
+ item->set_checked(0,true);
+ item=item->get_parent();
+ }
+
+ }
+ updating=false;
+
+}
+
+void EditorAssetInstaller::open(const String& p_path,int p_depth) {
+
+
+ package_path=p_path;
+ Set<String> files_sorted;
+
+ FileAccess *src_f=NULL;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+
+ unzFile pkg = unzOpen2(p_path.utf8().get_data(), &io);
+ if (!pkg) {
+
+ error->set_text("Error opening package file, not in zip format.");
+ return;
+ }
+
+ int ret = unzGoToFirstFile(pkg);
+
+
+ while(ret==UNZ_OK) {
+
+ //get filename
+ unz_file_info info;
+ char fname[16384];
+ ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0);
+
+ String name=fname;
+ files_sorted.insert(name);
+
+ ret = unzGoToNextFile(pkg);
+ }
+
+
+ Map<String,Ref<Texture> > extension_guess;
+ {
+ extension_guess["png"]=get_icon("Texture","EditorIcons");
+ extension_guess["jpg"]=get_icon("Texture","EditorIcons");
+ extension_guess["tex"]=get_icon("Texture","EditorIcons");
+ extension_guess["atex"]=get_icon("Texture","EditorIcons");
+ extension_guess["dds"]=get_icon("Texture","EditorIcons");
+ extension_guess["scn"]=get_icon("PackedScene","EditorIcons");
+ extension_guess["tscn"]=get_icon("PackedScene","EditorIcons");
+ extension_guess["xml"]=get_icon("PackedScene","EditorIcons");
+ extension_guess["xscn"]=get_icon("PackedScene","EditorIcons");
+ extension_guess["mtl"]=get_icon("Material","EditorIcons");
+ extension_guess["shd"]=get_icon("Shader","EditorIcons");
+ extension_guess["gd"]=get_icon("GDScript","EditorIcons");
+ }
+
+ Ref<Texture> generic_extension = get_icon("Object","EditorIcons");
+
+
+ unzClose(pkg);
+
+ updating=true;
+ tree->clear();
+ TreeItem *root=tree->create_item();
+ root->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ root->set_checked(0,true);
+ root->set_icon(0,get_icon("folder","FileDialog"));
+ root->set_text(0,"res://");
+ root->set_editable(0,true);
+ Map<String,TreeItem*> dir_map;
+
+ for(Set<String>::Element *E=files_sorted.front();E;E=E->next()) {
+
+ String path = E->get();
+ int depth=p_depth;
+ bool skip=false;
+ while(depth>0) {
+ int pp = path.find("/");
+ if (pp==-1) {
+ skip=true;
+ break;
+ }
+ path=path.substr(pp+1,path.length());
+ depth--;
+ }
+
+ if (skip || path==String())
+ continue;
+
+ bool isdir=false;
+
+ if (path.ends_with("/")) {
+ //a directory
+ path=path.substr(0,path.length()-1);
+ isdir=true;
+ }
+
+ int pp = path.find_last("/");
+
+
+ TreeItem *parent;
+ if (pp==-1) {
+ parent=root;
+ } else {
+ String ppath=path.substr(0,pp);
+ print_line("PPATH IS: "+ppath);
+ ERR_CONTINUE(!dir_map.has(ppath));
+ parent=dir_map[ppath];
+
+ }
+
+ TreeItem *ti = tree->create_item(parent);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ ti->set_checked(0,true);
+ ti->set_editable(0,true);
+ if (isdir) {
+ dir_map[path]=ti;
+ ti->set_text(0,path.get_file()+"/");
+ ti->set_icon(0,get_icon("folder","FileDialog"));
+ } else {
+ String file = path.get_file();
+ String extension = file.get_extension().to_lower();
+ if (extension_guess.has(extension)) {
+ ti->set_icon(0,extension_guess[extension]);
+ } else {
+ ti->set_icon(0,generic_extension);
+ }
+ ti->set_text(0,file);
+
+
+ String res_path = "res://"+path;
+ if (FileAccess::exists(res_path)) {
+ ti->set_custom_color(0,Color(1,0.3,0.2));
+ ti->set_tooltip(0,res_path+" (Already Exists)");
+ ti->set_checked(0,false);
+ } else {
+ ti->set_tooltip(0,res_path);
+
+ }
+
+ ti->set_metadata(0,res_path);
+
+ }
+
+ status_map[E->get()]=ti;
+
+
+
+ }
+ popup_centered_ratio();
+ updating=false;
+
+}
+
+void EditorAssetInstaller::ok_pressed() {
+
+ FileAccess *src_f=NULL;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+
+ unzFile pkg = unzOpen2(package_path.utf8().get_data(), &io);
+ if (!pkg) {
+
+ error->set_text("Error opening package file, not in zip format.");
+ return;
+ }
+
+ int ret = unzGoToFirstFile(pkg);
+
+ Vector<String> failed_files;
+
+ ProgressDialog::get_singleton()->add_task("uncompress","Uncompressing Assets",status_map.size());
+
+ int idx=0;
+ while(ret==UNZ_OK) {
+
+ //get filename
+ unz_file_info info;
+ char fname[16384];
+ ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0);
+
+ String name=fname;
+
+ if (status_map.has(name) && status_map[name]->is_checked(0)) {
+
+ String path = status_map[name]->get_metadata(0);
+ if (path==String()) { // a dir
+
+ String dirpath;
+ TreeItem *t = status_map[name];
+ while(t) {
+ dirpath=t->get_text(0)+dirpath;
+ t=t->get_parent();
+ }
+
+ if (dirpath.ends_with("/")) {
+ dirpath=dirpath.substr(0,dirpath.length()-1);
+ }
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ da->make_dir(dirpath);
+ memdelete(da);
+
+ } else {
+
+ Vector<uint8_t> data;
+ data.resize(info.uncompressed_size);
+
+ //read
+ unzOpenCurrentFile(pkg);
+ unzReadCurrentFile(pkg,data.ptr(),data.size());
+ unzCloseCurrentFile(pkg);
+
+ FileAccess *f=FileAccess::open(path,FileAccess::WRITE);
+ if (f) {
+ f->store_buffer(data.ptr(),data.size());
+ memdelete(f);
+ } else {
+ failed_files.push_back(path);
+ }
+
+ ProgressDialog::get_singleton()->task_step("uncompress",path,idx);
+ }
+
+ }
+
+ idx++;
+ ret = unzGoToNextFile(pkg);
+ }
+
+ ProgressDialog::get_singleton()->end_task("uncompress");
+ unzClose(pkg);
+
+ if (failed_files.size()) {
+ String msg="The following files failed extraction from package:\n\n";
+ for(int i=0;i<failed_files.size();i++) {
+
+ if (i>15) {
+ msg+="\nAnd "+itos(failed_files.size()-i)+" more files.";
+ break;
+ }
+ msg+=failed_files[i];
+ }
+ if (EditorNode::get_singleton() != NULL)
+ EditorNode::get_singleton()->show_warning(msg);
+ } else {
+ if (EditorNode::get_singleton() != NULL)
+ EditorNode::get_singleton()->show_warning("Package Installed Successfully!","Success!");
+ }
+
+
+
+
+}
+
+void EditorAssetInstaller::_bind_methods() {
+
+ ClassDB::bind_method("_item_edited",&EditorAssetInstaller::_item_edited);
+
+}
+
+EditorAssetInstaller::EditorAssetInstaller() {
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+
+
+ tree = memnew( Tree );
+ vb->add_margin_child("Package Contents:",tree,true);
+ tree->connect("item_edited",this,"_item_edited");
+
+ error = memnew( AcceptDialog) ;
+ add_child(error);
+ get_ok()->set_text("Install");
+ set_title("Package Installer");
+
+ updating=false;
+
+ set_hide_on_ok(true);
+}
+
diff --git a/editor/editor_asset_installer.h b/editor/editor_asset_installer.h
new file mode 100644
index 0000000000..2d0486a6f6
--- /dev/null
+++ b/editor/editor_asset_installer.h
@@ -0,0 +1,56 @@
+/*************************************************************************/
+/* editor_asset_installer.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORASSETINSTALLER_H
+#define EDITORASSETINSTALLER_H
+
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+class EditorAssetInstaller : public ConfirmationDialog {
+
+ GDCLASS( EditorAssetInstaller, ConfirmationDialog );
+
+ Tree *tree;
+ String package_path;
+ AcceptDialog *error;
+ Map<String,TreeItem*> status_map;
+ bool updating;
+ void _update_subitems(TreeItem* p_item,bool p_check,bool p_first=false);
+ void _item_edited();
+ virtual void ok_pressed();
+protected:
+
+ static void _bind_methods();
+public:
+
+ void open(const String& p_path,int p_depth=0);
+ EditorAssetInstaller();
+};
+
+#endif // EDITORASSETINSTALLER_H
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
new file mode 100644
index 0000000000..6ee18f08d8
--- /dev/null
+++ b/editor/editor_audio_buses.cpp
@@ -0,0 +1,1192 @@
+#include "editor_audio_buses.h"
+#include "editor_node.h"
+#include "servers/audio_server.h"
+#include "os/keyboard.h"
+#include "io/resource_saver.h"
+#include "filesystem_dock.h"
+
+void EditorAudioBus::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+
+ vu_l->set_under_texture(get_icon("BusVuEmpty","EditorIcons"));
+ vu_l->set_progress_texture(get_icon("BusVuFull","EditorIcons"));
+ vu_r->set_under_texture(get_icon("BusVuEmpty","EditorIcons"));
+ vu_r->set_progress_texture(get_icon("BusVuFull","EditorIcons"));
+ scale->set_texture( get_icon("BusVuDb","EditorIcons"));
+
+ disabled_vu = get_icon("BusVuFrozen","EditorIcons");
+
+ prev_active=true;
+ update_bus();
+ set_process(true);
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ if (has_focus()) {
+ draw_style_box(get_stylebox("focus","Button"),Rect2(Vector2(),get_size()));
+ }
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ float real_peak[2]={-100,-100};
+ bool activity_found=false;
+
+ int cc;
+ switch(AudioServer::get_singleton()->get_speaker_mode()) {
+ case AudioServer::SPEAKER_MODE_STEREO: cc = 1; break;
+ case AudioServer::SPEAKER_SURROUND_51: cc = 4; break;
+ case AudioServer::SPEAKER_SURROUND_71: cc = 5; break;
+ }
+
+ for(int i=0;i<cc;i++) {
+ if (AudioServer::get_singleton()->is_bus_channel_active(get_index(),i)) {
+ activity_found=true;
+ real_peak[0]=MAX(real_peak[0],AudioServer::get_singleton()->get_bus_peak_volume_left_db(get_index(),i));
+ real_peak[1]=MAX(real_peak[1],AudioServer::get_singleton()->get_bus_peak_volume_right_db(get_index(),i));
+ }
+ }
+
+
+ if (real_peak[0]>peak_l) {
+ peak_l = real_peak[0];
+ } else {
+ peak_l-=get_process_delta_time()*60.0;
+ }
+
+ if (real_peak[1]>peak_r) {
+ peak_r = real_peak[1];
+ } else {
+ peak_r-=get_process_delta_time()*60.0;
+
+ }
+
+ vu_l->set_value(peak_l);
+ vu_r->set_value(peak_r);
+
+ if (activity_found!=prev_active) {
+ if (activity_found) {
+ vu_l->set_over_texture(Ref<Texture>());
+ vu_r->set_over_texture(Ref<Texture>());
+ } else {
+ vu_l->set_over_texture(disabled_vu);
+ vu_r->set_over_texture(disabled_vu);
+
+ }
+
+ prev_active=activity_found;
+ }
+
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ peak_l=-100;
+ peak_r=-100;
+ prev_active=true;
+
+ set_process(is_visible_in_tree());
+ }
+
+}
+
+void EditorAudioBus::update_send() {
+
+ send->clear();
+ if (get_index()==0) {
+ send->set_disabled(true);
+ send->set_text("Speakers");
+ } else {
+ send->set_disabled(false);
+ StringName current_send = AudioServer::get_singleton()->get_bus_send(get_index());
+ int current_send_index=0; //by default to master
+
+ for(int i=0;i<get_index();i++) {
+ StringName send_name = AudioServer::get_singleton()->get_bus_name(i);
+ send->add_item(send_name);
+ if (send_name==current_send) {
+ current_send_index=i;
+ }
+ }
+
+ send->select(current_send_index);
+ }
+}
+
+void EditorAudioBus::update_bus() {
+
+ if (updating_bus)
+ return;
+
+ updating_bus=true;
+
+ int index = get_index();
+
+ slider->set_value(AudioServer::get_singleton()->get_bus_volume_db(index));
+ track_name->set_text(AudioServer::get_singleton()->get_bus_name(index));
+ if (get_index()==0)
+ track_name->set_editable(false);
+
+ solo->set_pressed( AudioServer::get_singleton()->is_bus_solo(index));
+ mute->set_pressed( AudioServer::get_singleton()->is_bus_mute(index));
+ bypass->set_pressed( AudioServer::get_singleton()->is_bus_bypassing_effects(index));
+ // effects..
+ effects->clear();
+
+ TreeItem *root = effects->create_item();
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_effect_count(index);i++) {
+
+ Ref<AudioEffect> afx = AudioServer::get_singleton()->get_bus_effect(index,i);
+
+ TreeItem *fx = effects->create_item(root);
+ fx->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ fx->set_editable(0,true);
+ fx->set_checked(0,AudioServer::get_singleton()->is_bus_effect_enabled(index,i));
+ fx->set_text(0,afx->get_name());
+ fx->set_metadata(0,i);
+
+ }
+
+ TreeItem *add = effects->create_item(root);
+ add->set_cell_mode(0,TreeItem::CELL_MODE_CUSTOM);
+ add->set_editable(0,true);
+ add->set_selectable(0,false);
+ add->set_text(0,"Add Effect");
+
+ update_send();
+
+ updating_bus=false;
+
+}
+
+
+void EditorAudioBus::_name_changed(const String& p_new_name) {
+
+ if (p_new_name==AudioServer::get_singleton()->get_bus_name(get_index()))
+ return;
+
+ String attempt=p_new_name;
+ int attempts=1;
+
+ while(true) {
+
+ bool name_free=true;
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_count();i++) {
+
+ if (AudioServer::get_singleton()->get_bus_name(i)==attempt) {
+ name_free=false;
+ break;
+ }
+ }
+
+ if (name_free) {
+ break;
+ }
+
+ attempts++;
+ attempt=p_new_name+" "+itos(attempts);
+ }
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ StringName current = AudioServer::get_singleton()->get_bus_name(get_index());
+ ur->create_action("Rename Audio Bus");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_name",get_index(),attempt);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_name",get_index(),current);
+
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_count();i++) {
+ if (AudioServer::get_singleton()->get_bus_send(i)==current) {
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_send",i,attempt);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_send",i,current);
+ }
+ }
+
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+
+
+ ur->add_do_method(buses,"_update_sends");
+ ur->add_undo_method(buses,"_update_sends");
+ ur->commit_action();
+
+ updating_bus=false;
+
+}
+
+void EditorAudioBus::_volume_db_changed(float p_db){
+
+ if (updating_bus)
+ return;
+
+ updating_bus=true;
+
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Change Audio Bus Volume",UndoRedo::MERGE_ENDS);
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_volume_db",get_index(),p_db);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_volume_db",get_index(),AudioServer::get_singleton()->get_bus_volume_db(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+
+}
+void EditorAudioBus::_solo_toggled(){
+
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Toggle Audio Bus Solo");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_solo",get_index(),solo->is_pressed());
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_solo",get_index(),AudioServer::get_singleton()->is_bus_solo(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+
+}
+void EditorAudioBus::_mute_toggled(){
+
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Toggle Audio Bus Mute");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_mute",get_index(),mute->is_pressed());
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_mute",get_index(),AudioServer::get_singleton()->is_bus_mute(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+
+}
+void EditorAudioBus::_bypass_toggled(){
+
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Toggle Audio Bus Bypass Effects");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_bypass_effects",get_index(),bypass->is_pressed());
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_bypass_effects",get_index(),AudioServer::get_singleton()->is_bus_bypassing_effects(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+
+
+}
+
+void EditorAudioBus::_send_selected(int p_which) {
+
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Select Audio Bus Send");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_send",get_index(),send->get_item_text(p_which));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_send",get_index(),AudioServer::get_singleton()->get_bus_send(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+}
+
+void EditorAudioBus::_effect_selected() {
+
+ TreeItem *effect = effects->get_selected();
+ if (!effect)
+ return;
+ updating_bus=true;
+
+ if (effect->get_metadata(0)!=Variant()) {
+
+ int index = effect->get_metadata(0);
+ Ref<AudioEffect> effect = AudioServer::get_singleton()->get_bus_effect(get_index(),index);
+ if (effect.is_valid()) {
+ EditorNode::get_singleton()->push_item(effect.ptr());
+ }
+ }
+
+ updating_bus=false;
+
+}
+
+void EditorAudioBus::_effect_edited() {
+
+ if (updating_bus)
+ return;
+
+ TreeItem *effect = effects->get_edited();
+ if (!effect)
+ return;
+
+ if (effect->get_metadata(0)==Variant()) {
+ Rect2 area = effects->get_item_rect(effect);
+
+ effect_options->set_pos(effects->get_global_pos()+area.pos+Vector2(0,area.size.y));
+ effect_options->popup();
+ //add effect
+ } else {
+ int index = effect->get_metadata(0);
+ updating_bus=true;
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Select Audio Bus Send");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_effect_enabled",get_index(),index,effect->is_checked(0));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_effect_enabled",get_index(),index,AudioServer::get_singleton()->is_bus_effect_enabled(get_index(),index));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+ updating_bus=false;
+
+ }
+
+}
+
+void EditorAudioBus::_effect_add(int p_which) {
+
+ if (updating_bus)
+ return;
+
+ StringName name = effect_options->get_item_metadata(p_which);
+
+ Object *fx = ClassDB::instance(name);
+ ERR_FAIL_COND(!fx);
+ AudioEffect *afx = fx->cast_to<AudioEffect>();
+ ERR_FAIL_COND(!afx);
+ Ref<AudioEffect> afxr = Ref<AudioEffect>(afx);
+
+ afxr->set_name(effect_options->get_item_text(p_which));
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Add Audio Bus Effect");
+ ur->add_do_method(AudioServer::get_singleton(),"add_bus_effect",get_index(),afxr,-1);
+ ur->add_undo_method(AudioServer::get_singleton(),"remove_bus_effect",get_index(),AudioServer::get_singleton()->get_bus_effect_count(get_index()));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+}
+
+void EditorAudioBus::_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && p_event.key.scancode==KEY_DELETE && !p_event.key.echo) {
+ accept_event();
+ emit_signal("delete_request");
+ }
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==2 && p_event.mouse_button.pressed) {
+
+ Vector2 pos = Vector2(p_event.mouse_button.x,p_event.mouse_button.y);
+ delete_popup->set_pos(get_global_pos()+pos);
+ delete_popup->popup();
+ }
+}
+
+void EditorAudioBus::_delete_pressed(int p_option) {
+
+ if (p_option==1) {
+ emit_signal("delete_request");
+ } else if (p_option==0) {
+ //duplicate
+ emit_signal("duplicate_request",get_index());
+ }
+
+}
+
+
+Variant EditorAudioBus::get_drag_data(const Point2& p_point) {
+
+ if (get_index()==0) {
+ return Variant();
+ }
+
+ Control *c = memnew(Control);
+ Panel *p = memnew( Panel );
+ c->add_child(p);
+ p->add_style_override("panel",get_stylebox("focus","Button"));
+ p->set_size(get_size());
+ p->set_pos(-p_point);
+ set_drag_preview(c);
+ Dictionary d;
+ d["type"]="move_audio_bus";
+ d["index"]=get_index();
+ emit_signal("drop_end_request");
+ return d;
+}
+
+bool EditorAudioBus::can_drop_data(const Point2& p_point,const Variant& p_data) const {
+
+ if (get_index()==0)
+ return false;
+ Dictionary d=p_data;
+ if (d.has("type") && String(d["type"])=="move_audio_bus") {
+ return true;
+ }
+
+ return false;
+}
+void EditorAudioBus::drop_data(const Point2& p_point,const Variant& p_data) {
+
+ Dictionary d=p_data;
+ emit_signal("dropped",d["index"],get_index());
+
+}
+
+Variant EditorAudioBus::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ print_line("drag fw");
+ TreeItem *item = effects->get_item_at_pos(p_point);
+ if (!item) {
+ print_line("no item");
+ return Variant();
+ }
+
+ Variant md = item->get_metadata(0);
+
+ if (md.get_type()==Variant::INT) {
+ Dictionary fxd;
+ fxd["type"]="audio_bus_effect";
+ fxd["bus"]=get_index();
+ fxd["effect"]=md;
+
+ Label *l = memnew( Label );
+ l->set_text(item->get_text(0));
+ effects->set_drag_preview(l);
+
+ return fxd;
+ }
+
+ return Variant();
+
+}
+
+bool EditorAudioBus::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ Dictionary d = p_data;
+ if (!d.has("type") || String(d["type"])!="audio_bus_effect")
+ return false;
+
+ TreeItem *item = effects->get_item_at_pos(p_point);
+ if (!item)
+ return false;
+
+ effects->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+
+ return true;
+}
+
+void EditorAudioBus::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ Dictionary d = p_data;
+
+ TreeItem *item = effects->get_item_at_pos(p_point);
+ if (!item)
+ return;
+ int pos=effects->get_drop_section_at_pos(p_point);
+ Variant md = item->get_metadata(0);
+
+ int paste_at;
+ int bus = d["bus"];
+ int effect = d["effect"];
+
+ if (md.get_type()==Variant::INT) {
+ paste_at=md;
+ if (pos>0)
+ paste_at++;
+
+ if (bus==get_index() && paste_at >effect) {
+ paste_at--;
+ }
+ } else {
+ paste_at=-1;
+ }
+
+
+ bool enabled = AudioServer::get_singleton()->is_bus_effect_enabled(bus,effect);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Move Bus Effect");
+ ur->add_do_method(AudioServer::get_singleton(),"remove_bus_effect",bus,effect);
+ ur->add_do_method(AudioServer::get_singleton(),"add_bus_effect",get_index(),AudioServer::get_singleton()->get_bus_effect(bus,effect),paste_at);
+
+ if (paste_at==-1) {
+ paste_at = AudioServer::get_singleton()->get_bus_effect_count(get_index());
+ if (bus==get_index()) {
+ paste_at--;
+ }
+ }
+ if (!enabled) {
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_effect_enabled",get_index(),paste_at,false);
+ }
+
+ ur->add_undo_method(AudioServer::get_singleton(),"remove_bus_effect",get_index(),paste_at);
+ ur->add_undo_method(AudioServer::get_singleton(),"add_bus_effect",bus,AudioServer::get_singleton()->get_bus_effect(bus,effect),effect);
+ if (!enabled) {
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_effect_enabled",bus,effect,false);
+ }
+
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ if (get_index()!=bus) {
+ ur->add_do_method(buses,"_update_bus",bus);
+ ur->add_undo_method(buses,"_update_bus",bus);
+ }
+ ur->commit_action();
+
+
+
+}
+
+void EditorAudioBus::_delete_effect_pressed(int p_option) {
+
+ TreeItem * item = effects->get_selected();
+ if (!item)
+ return;
+
+ if (item->get_metadata(0).get_type()!=Variant::INT)
+ return;
+
+ int index = item->get_metadata(0);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Delete Bus Effect");
+ ur->add_do_method(AudioServer::get_singleton(),"remove_bus_effect",get_index(),index);
+ ur->add_undo_method(AudioServer::get_singleton(),"add_bus_effect",get_index(),AudioServer::get_singleton()->get_bus_effect(get_index(),index),index);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_effect_enabled",get_index(),index,AudioServer::get_singleton()->is_bus_effect_enabled(get_index(),index));
+ ur->add_do_method(buses,"_update_bus",get_index());
+ ur->add_undo_method(buses,"_update_bus",get_index());
+ ur->commit_action();
+
+
+}
+
+void EditorAudioBus::_effect_rmb(const Vector2& p_pos) {
+
+ TreeItem * item = effects->get_selected();
+ if (!item)
+ return;
+
+ if (item->get_metadata(0).get_type()!=Variant::INT)
+ return;
+
+ delete_effect_popup->set_pos(get_global_mouse_pos());
+ delete_effect_popup->popup();
+}
+
+void EditorAudioBus::_bind_methods() {
+
+ ClassDB::bind_method("update_bus",&EditorAudioBus::update_bus);
+ ClassDB::bind_method("update_send",&EditorAudioBus::update_send);
+ ClassDB::bind_method("_name_changed",&EditorAudioBus::_name_changed);
+ ClassDB::bind_method("_volume_db_changed",&EditorAudioBus::_volume_db_changed);
+ ClassDB::bind_method("_solo_toggled",&EditorAudioBus::_solo_toggled);
+ ClassDB::bind_method("_mute_toggled",&EditorAudioBus::_mute_toggled);
+ ClassDB::bind_method("_bypass_toggled",&EditorAudioBus::_bypass_toggled);
+ ClassDB::bind_method("_name_focus_exit",&EditorAudioBus::_name_focus_exit);
+ ClassDB::bind_method("_send_selected",&EditorAudioBus::_send_selected);
+ ClassDB::bind_method("_effect_edited",&EditorAudioBus::_effect_edited);
+ ClassDB::bind_method("_effect_selected",&EditorAudioBus::_effect_selected);
+ ClassDB::bind_method("_effect_add",&EditorAudioBus::_effect_add);
+ ClassDB::bind_method("_gui_input",&EditorAudioBus::_gui_input);
+ ClassDB::bind_method("_delete_pressed",&EditorAudioBus::_delete_pressed);
+ ClassDB::bind_method("get_drag_data_fw",&EditorAudioBus::get_drag_data_fw);
+ ClassDB::bind_method("can_drop_data_fw",&EditorAudioBus::can_drop_data_fw);
+ ClassDB::bind_method("drop_data_fw",&EditorAudioBus::drop_data_fw);
+ ClassDB::bind_method("_delete_effect_pressed",&EditorAudioBus::_delete_effect_pressed);
+ ClassDB::bind_method("_effect_rmb",&EditorAudioBus::_effect_rmb);
+
+
+
+ ADD_SIGNAL(MethodInfo("duplicate_request"));
+ ADD_SIGNAL(MethodInfo("delete_request"));
+ ADD_SIGNAL(MethodInfo("drop_end_request"));
+ ADD_SIGNAL(MethodInfo("dropped"));
+
+}
+
+EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses) {
+
+ buses=p_buses;
+ updating_bus=false;
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+
+ set_v_size_flags(SIZE_EXPAND_FILL);
+
+ track_name = memnew( LineEdit );
+ vb->add_child(track_name);
+ track_name->connect("text_entered",this,"_name_changed");
+ track_name->connect("focus_exited",this,"_name_focus_exit");
+
+ HBoxContainer *hbc = memnew( HBoxContainer);
+ vb->add_child(hbc);
+ hbc->add_spacer();
+ solo = memnew( ToolButton );
+ solo->set_text("S");
+ solo->set_toggle_mode(true);
+ solo->set_modulate(Color(0.8,1.2,0.8));
+ solo->set_focus_mode(FOCUS_NONE);
+ solo->connect("pressed",this,"_solo_toggled");
+ hbc->add_child(solo);
+ mute = memnew( ToolButton );
+ mute->set_text("M");
+ mute->set_toggle_mode(true);
+ mute->set_modulate(Color(1.2,0.8,0.8));
+ mute->set_focus_mode(FOCUS_NONE);
+ mute->connect("pressed",this,"_mute_toggled");
+ hbc->add_child(mute);
+ bypass = memnew( ToolButton );
+ bypass->set_text("B");
+ bypass->set_toggle_mode(true);
+ bypass->set_modulate(Color(1.1,1.1,0.8));
+ bypass->set_focus_mode(FOCUS_NONE);
+ bypass->connect("pressed",this,"_bypass_toggled");
+ hbc->add_child(bypass);
+ hbc->add_spacer();
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ vb->add_child(hb);
+ slider = memnew( VSlider );
+ slider->set_min(-80);
+ slider->set_max(24);
+ slider->set_step(0.1);
+
+ slider->connect("value_changed",this,"_volume_db_changed");
+ hb->add_child(slider);
+ vu_l = memnew( TextureProgress );
+ vu_l->set_fill_mode(TextureProgress::FILL_BOTTOM_TO_TOP);
+ hb->add_child(vu_l);
+ vu_l->set_min(-80);
+ vu_l->set_max(24);
+ vu_l->set_step(0.1);
+
+ vu_r = memnew( TextureProgress );
+ vu_r->set_fill_mode(TextureProgress::FILL_BOTTOM_TO_TOP);
+ hb->add_child(vu_r);
+ vu_r->set_min(-80);
+ vu_r->set_max(24);
+ vu_r->set_step(0.1);
+
+ scale = memnew( TextureRect );
+ hb->add_child(scale);
+
+ //add_child(hb);
+
+ effects = memnew( Tree );
+ effects->set_hide_root(true);
+ effects->set_custom_minimum_size(Size2(0,90)*EDSCALE);
+ effects->set_hide_folding(true);
+ vb->add_child(effects);
+ effects->connect("item_edited",this,"_effect_edited");
+ effects->connect("cell_selected",this,"_effect_selected");
+ effects->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
+ effects->set_drag_forwarding(this);
+ effects->connect("item_rmb_selected",this,"_effect_rmb");
+ effects->set_allow_rmb_select(true);
+
+ send = memnew( OptionButton );
+ send->set_clip_text(true);
+ send->connect("item_selected",this,"_send_selected");
+ vb->add_child(send);
+
+ set_focus_mode(FOCUS_CLICK);
+
+ effect_options = memnew( PopupMenu );
+ effect_options->connect("index_pressed",this,"_effect_add");
+ add_child(effect_options);
+ List<StringName> effects;
+ ClassDB::get_inheriters_from_class("AudioEffect",&effects);
+ effects.sort_custom<StringName::AlphCompare>();
+ for (List<StringName>::Element *E=effects.front();E;E=E->next()) {
+ if (!ClassDB::can_instance(E->get()))
+ continue;
+
+ Ref<Texture> icon;
+ if (has_icon(E->get(),"EditorIcons")) {
+ icon = get_icon(E->get(),"EditorIcons");
+ }
+ String name = E->get().operator String().replace("AudioEffect","");
+ effect_options->add_item(name);
+ effect_options->set_item_metadata(effect_options->get_item_count()-1,E->get());
+ effect_options->set_item_icon(effect_options->get_item_count()-1,icon);
+ }
+
+ delete_popup = memnew( PopupMenu );
+ delete_popup->add_item("Duplicate");
+ delete_popup->add_item("Delete");
+ add_child(delete_popup);
+ delete_popup->connect("index_pressed",this,"_delete_pressed");
+
+ delete_effect_popup = memnew( PopupMenu );
+ delete_effect_popup->add_item("Delete Effect");
+ add_child(delete_effect_popup);
+ delete_effect_popup->connect("index_pressed",this,"_delete_effect_pressed");
+
+}
+
+
+
+bool EditorAudioBusDrop::can_drop_data(const Point2& p_point,const Variant& p_data) const {
+
+ Dictionary d=p_data;
+ if (d.has("type") && String(d["type"])=="move_audio_bus") {
+ return true;
+ }
+
+ return false;
+}
+void EditorAudioBusDrop::drop_data(const Point2& p_point,const Variant& p_data){
+
+ Dictionary d=p_data;
+ emit_signal("dropped",d["index"],-1);
+
+}
+
+void EditorAudioBusDrop::_bind_methods() {
+
+ ADD_SIGNAL(MethodInfo("dropped"));
+}
+
+EditorAudioBusDrop::EditorAudioBusDrop() {
+
+
+}
+
+
+void EditorAudioBuses::_update_buses() {
+
+ while(bus_hb->get_child_count()>0) {
+ memdelete(bus_hb->get_child(0));
+ }
+
+ drop_end=NULL;
+
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_count();i++) {
+
+ EditorAudioBus *audio_bus = memnew( EditorAudioBus(this) );
+ if (i==0) {
+ audio_bus->set_self_modulate(Color(1,0.9,0.9));
+ }
+ bus_hb->add_child(audio_bus);
+ audio_bus->connect("delete_request",this,"_delete_bus",varray(audio_bus),CONNECT_DEFERRED);
+ audio_bus->connect("duplicate_request",this,"_duplicate_bus",varray(),CONNECT_DEFERRED);
+ audio_bus->connect("drop_end_request",this,"_request_drop_end");
+ audio_bus->connect("dropped",this,"_drop_at_index",varray(),CONNECT_DEFERRED);
+
+
+
+ }
+}
+
+EditorAudioBuses *EditorAudioBuses::register_editor() {
+
+ EditorAudioBuses * audio_buses = memnew( EditorAudioBuses );
+ EditorNode::get_singleton()->add_bottom_panel_item("Audio",audio_buses);
+ return audio_buses;
+}
+
+void EditorAudioBuses::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+ _update_buses();
+ }
+
+ if (p_what==NOTIFICATION_DRAG_END) {
+ if (drop_end) {
+ drop_end->queue_delete();
+ drop_end=NULL;
+ }
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ //check if anything was edited
+ bool edited = AudioServer::get_singleton()->is_edited();
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_count();i++) {
+ for(int j=0;j<AudioServer::get_singleton()->get_bus_effect_count(i);j++) {
+ Ref<AudioEffect> effect = AudioServer::get_singleton()->get_bus_effect(i,j);
+ if (effect->is_edited()) {
+ edited=true;
+ effect->set_edited(false);
+ }
+ }
+ }
+
+ AudioServer::get_singleton()->set_edited(false);
+
+ if (edited) {
+
+ save_timer->start();
+ }
+ }
+
+}
+
+
+void EditorAudioBuses::_add_bus() {
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ //need to simulate new name, so we can undi :(
+ ur->create_action("Add Audio Bus");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_count",AudioServer::get_singleton()->get_bus_count()+1);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_count",AudioServer::get_singleton()->get_bus_count());
+ ur->add_do_method(this,"_update_buses");
+ ur->add_undo_method(this,"_update_buses");
+ ur->commit_action();
+
+}
+
+void EditorAudioBuses::_update_bus(int p_index) {
+
+ if (p_index>=bus_hb->get_child_count())
+ return;
+
+ bus_hb->get_child(p_index)->call("update_bus");
+}
+
+void EditorAudioBuses::_update_sends() {
+
+ for(int i=0;i<bus_hb->get_child_count();i++) {
+ bus_hb->get_child(i)->call("update_send");
+ }
+}
+
+void EditorAudioBuses::_delete_bus(Object* p_which) {
+
+ EditorAudioBus *bus = p_which->cast_to<EditorAudioBus>();
+ int index = bus->get_index();
+ if (index==0) {
+ EditorNode::get_singleton()->show_warning("Master bus can't be deleted!");
+ return;
+ }
+
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action("Delete Audio Bus");
+ ur->add_do_method(AudioServer::get_singleton(),"remove_bus",index);
+ ur->add_undo_method(AudioServer::get_singleton(),"add_bus",index);
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_name",index,AudioServer::get_singleton()->get_bus_name(index));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_volume_db",index,AudioServer::get_singleton()->get_bus_volume_db(index));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_send",index,AudioServer::get_singleton()->get_bus_send(index));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_solo",index,AudioServer::get_singleton()->is_bus_solo(index));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_mute",index,AudioServer::get_singleton()->is_bus_mute(index));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_bypass_effects",index,AudioServer::get_singleton()->is_bus_bypassing_effects(index));
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_effect_count(index);i++) {
+
+ ur->add_undo_method(AudioServer::get_singleton(),"add_bus_effect",index,AudioServer::get_singleton()->get_bus_effect(index,i));
+ ur->add_undo_method(AudioServer::get_singleton(),"set_bus_effect_enabled",index,i,AudioServer::get_singleton()->is_bus_effect_enabled(index,i));
+ }
+ ur->add_do_method(this,"_update_buses");
+ ur->add_undo_method(this,"_update_buses");
+ ur->commit_action();
+
+}
+
+
+void EditorAudioBuses::_duplicate_bus(int p_which) {
+
+ int add_at_pos = p_which+1;
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Duplicate Audio Bus");
+ ur->add_do_method(AudioServer::get_singleton(),"add_bus",add_at_pos);
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_name",add_at_pos,AudioServer::get_singleton()->get_bus_name(p_which)+" Copy");
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_volume_db",add_at_pos,AudioServer::get_singleton()->get_bus_volume_db(p_which));
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_send",add_at_pos,AudioServer::get_singleton()->get_bus_send(p_which));
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_solo",add_at_pos,AudioServer::get_singleton()->is_bus_solo(p_which));
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_mute",add_at_pos,AudioServer::get_singleton()->is_bus_mute(p_which));
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_bypass_effects",add_at_pos,AudioServer::get_singleton()->is_bus_bypassing_effects(p_which));
+ for(int i=0;i<AudioServer::get_singleton()->get_bus_effect_count(p_which);i++) {
+
+ ur->add_do_method(AudioServer::get_singleton(),"add_bus_effect",add_at_pos,AudioServer::get_singleton()->get_bus_effect(p_which,i));
+ ur->add_do_method(AudioServer::get_singleton(),"set_bus_effect_enabled",add_at_pos,i,AudioServer::get_singleton()->is_bus_effect_enabled(p_which,i));
+ }
+ ur->add_undo_method(AudioServer::get_singleton(),"remove_bus",add_at_pos);
+ ur->add_do_method(this,"_update_buses");
+ ur->add_undo_method(this,"_update_buses");
+ ur->commit_action();
+
+}
+
+void EditorAudioBuses::_request_drop_end() {
+
+ if (!drop_end && bus_hb->get_child_count()) {
+ drop_end = memnew( EditorAudioBusDrop );
+
+ bus_hb->add_child(drop_end);
+ drop_end->set_custom_minimum_size(bus_hb->get_child(0)->cast_to<Control>()->get_size());
+ drop_end->connect("dropped",this,"_drop_at_index",varray(),CONNECT_DEFERRED);
+ }
+}
+
+void EditorAudioBuses::_drop_at_index(int p_bus,int p_index) {
+
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ //need to simulate new name, so we can undi :(
+ ur->create_action("Move Audio Bus");
+ ur->add_do_method(AudioServer::get_singleton(),"move_bus",p_bus,p_index);
+ int final_pos;
+ if (p_index==p_bus) {
+ final_pos=p_bus;
+ } else if (p_index==-1) {
+ final_pos = AudioServer::get_singleton()->get_bus_count()-1;
+ } else if (p_index<p_bus) {
+ final_pos = p_index;
+ } else {
+ final_pos = p_index -1;
+ }
+ ur->add_undo_method(AudioServer::get_singleton(),"move_bus",final_pos,p_bus);
+
+ ur->add_do_method(this,"_update_buses");
+ ur->add_undo_method(this,"_update_buses");
+ ur->commit_action();
+}
+
+void EditorAudioBuses::_server_save() {
+
+ Ref<AudioBusLayout> state = AudioServer::get_singleton()->generate_bus_layout();
+ ResourceSaver::save(edited_path,state);
+
+}
+
+void EditorAudioBuses::_select_layout() {
+
+ EditorNode::get_singleton()->get_filesystem_dock()->select_file(edited_path);
+}
+
+void EditorAudioBuses::_save_as_layout() {
+
+ file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_title(TTR("Save Audio Bus Layout As.."));
+ file_dialog->set_current_path(edited_path);
+ file_dialog->popup_centered_ratio();
+ new_layout=false;
+}
+
+
+void EditorAudioBuses::_new_layout() {
+
+ file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_title(TTR("Location for New Layout.."));
+ file_dialog->set_current_path(edited_path);
+ file_dialog->popup_centered_ratio();
+ new_layout=true;
+}
+
+void EditorAudioBuses::_load_layout() {
+
+ file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_title(TTR("Open Audio Bus Layout"));
+ file_dialog->set_current_path(edited_path);
+ file_dialog->popup_centered_ratio();
+ new_layout=false;
+}
+
+
+void EditorAudioBuses::_load_default_layout() {
+
+
+ Ref<AudioBusLayout> state = ResourceLoader::load("res://default_bus_layout.tres");
+ if (state.is_null()) {
+ EditorNode::get_singleton()->show_warning("There is no 'res://default_bus_layout.tres' file.");
+ return;
+ }
+
+ edited_path="res://default_bus_layout.tres";
+ file->set_text(edited_path.get_file());
+ AudioServer::get_singleton()->set_bus_layout(state);
+ _update_buses();
+ EditorNode::get_singleton()->get_undo_redo()->clear_history();
+ call_deferred("_select_layout");
+}
+
+void EditorAudioBuses::_file_dialog_callback(const String& p_string) {
+
+ if (file_dialog->get_mode()==EditorFileDialog::MODE_OPEN_FILE) {
+ Ref<AudioBusLayout> state = ResourceLoader::load(p_string);
+ if (state.is_null()) {
+ EditorNode::get_singleton()->show_warning("Invalid file, not an audio bus layout.");
+ return;
+ }
+
+ edited_path=p_string;
+ file->set_text(p_string.get_file());
+ AudioServer::get_singleton()->set_bus_layout(state);
+ _update_buses();
+ EditorNode::get_singleton()->get_undo_redo()->clear_history();
+ call_deferred("_select_layout");
+
+ } else if (file_dialog->get_mode()==EditorFileDialog::MODE_SAVE_FILE) {
+
+ if (new_layout) {
+ Ref<AudioBusLayout> empty_state;
+ empty_state.instance();
+ AudioServer::get_singleton()->set_bus_layout(empty_state);
+ }
+
+ Error err = ResourceSaver::save(p_string,AudioServer::get_singleton()->generate_bus_layout());
+
+ if (err!=OK) {
+ EditorNode::get_singleton()->show_warning("Error saving file: "+p_string);
+ return;
+ }
+
+ edited_path=p_string;
+ file->set_text(p_string.get_file());
+ _update_buses();
+ EditorNode::get_singleton()->get_undo_redo()->clear_history();
+ call_deferred("_select_layout");
+ }
+
+}
+
+void EditorAudioBuses::_bind_methods() {
+
+ ClassDB::bind_method("_add_bus",&EditorAudioBuses::_add_bus);
+ ClassDB::bind_method("_update_buses",&EditorAudioBuses::_update_buses);
+ ClassDB::bind_method("_update_bus",&EditorAudioBuses::_update_bus);
+ ClassDB::bind_method("_update_sends",&EditorAudioBuses::_update_sends);
+ ClassDB::bind_method("_delete_bus",&EditorAudioBuses::_delete_bus);
+ ClassDB::bind_method("_request_drop_end",&EditorAudioBuses::_request_drop_end);
+ ClassDB::bind_method("_drop_at_index",&EditorAudioBuses::_drop_at_index);
+ ClassDB::bind_method("_server_save",&EditorAudioBuses::_server_save);
+ ClassDB::bind_method("_select_layout",&EditorAudioBuses::_select_layout);
+ ClassDB::bind_method("_save_as_layout",&EditorAudioBuses::_save_as_layout);
+ ClassDB::bind_method("_load_layout",&EditorAudioBuses::_load_layout);
+ ClassDB::bind_method("_load_default_layout",&EditorAudioBuses::_load_default_layout);
+ ClassDB::bind_method("_new_layout",&EditorAudioBuses::_new_layout);
+ ClassDB::bind_method("_duplicate_bus",&EditorAudioBuses::_duplicate_bus);
+
+ ClassDB::bind_method("_file_dialog_callback",&EditorAudioBuses::_file_dialog_callback);
+}
+
+EditorAudioBuses::EditorAudioBuses()
+{
+
+ drop_end = NULL;
+ top_hb = memnew( HBoxContainer );
+ add_child(top_hb);
+
+ add = memnew( Button );
+ top_hb->add_child(add);;
+ add->set_text(TTR("Add Bus"));
+
+ add->connect("pressed",this,"_add_bus");
+
+
+
+ top_hb->add_spacer();
+
+ file = memnew( ToolButton );
+ file->set_text("default_bus_layout.tres");
+ top_hb->add_child(file);
+ file->connect("pressed",this,"_select_layout");
+
+ load = memnew( Button );
+ load->set_text(TTR("Load"));
+ top_hb->add_child(load);
+ load->connect("pressed",this,"_load_layout");
+
+ save_as = memnew( Button );
+ save_as->set_text(TTR("Save As"));
+ top_hb->add_child(save_as);
+ save_as->connect("pressed",this,"_save_as_layout");
+
+ _default = memnew( Button );
+ _default->set_text(TTR("Default"));
+ top_hb->add_child(_default);
+ _default->connect("pressed",this,"_load_default_layout");
+
+ _new = memnew( Button );
+ _new->set_text(TTR("Create"));
+ top_hb->add_child(_new);
+ _new->connect("pressed",this,"_new_layout");
+
+ bus_scroll = memnew( ScrollContainer );
+ bus_scroll->set_v_size_flags(SIZE_EXPAND_FILL);
+ bus_scroll->set_enable_h_scroll(true);
+ bus_scroll->set_enable_v_scroll(false);
+ add_child(bus_scroll);
+ bus_hb = memnew( HBoxContainer );
+ bus_scroll->add_child(bus_hb);
+
+ save_timer=memnew(Timer);
+ save_timer->set_wait_time(0.8);
+ save_timer->set_one_shot(true);
+ add_child(save_timer);
+ save_timer->connect("timeout",this,"_server_save");
+
+ set_v_size_flags(SIZE_EXPAND_FILL);
+
+
+ edited_path = "res://default_bus_layout.tres";
+
+ file_dialog = memnew( EditorFileDialog );
+ List<String> ext;
+ ResourceLoader::get_recognized_extensions_for_type("AudioServerState",&ext);
+ for (List<String>::Element *E=ext.front();E;E=E->next()) {
+ file_dialog->add_filter("*."+E->get()+"; Audio Bus State");
+ }
+ add_child(file_dialog);
+ file_dialog->connect("file_selected",this,"_file_dialog_callback");
+
+ set_process(true);
+
+}
+void EditorAudioBuses::open_layout(const String& p_path) {
+
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+
+ Ref<AudioBusLayout> state = ResourceLoader::load(p_path);
+ if (state.is_null()) {
+ EditorNode::get_singleton()->show_warning("Invalid file, not an audio bus layout.");
+ return;
+ }
+
+ edited_path=p_path;
+ file->set_text(p_path.get_file());
+ AudioServer::get_singleton()->set_bus_layout(state);
+ _update_buses();
+ EditorNode::get_singleton()->get_undo_redo()->clear_history();
+ call_deferred("_select_layout");
+}
+
+void AudioBusesEditorPlugin::edit(Object *p_node) {
+
+ if (p_node->cast_to<AudioBusLayout>()) {
+
+ String path = p_node->cast_to<AudioBusLayout>()->get_path();
+ if (path.is_resource_file()) {
+ audio_bus_editor->open_layout(path);
+ }
+ }
+}
+
+bool AudioBusesEditorPlugin::handles(Object *p_node) const {
+
+ return (p_node->cast_to<AudioBusLayout>()!=NULL);
+}
+
+void AudioBusesEditorPlugin::make_visible(bool p_visible){
+
+
+}
+
+AudioBusesEditorPlugin::AudioBusesEditorPlugin(EditorAudioBuses *p_node) {
+
+ audio_bus_editor=p_node;
+}
+
+AudioBusesEditorPlugin::~AudioBusesEditorPlugin() {
+
+}
diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h
new file mode 100644
index 0000000000..4ac8b27004
--- /dev/null
+++ b/editor/editor_audio_buses.h
@@ -0,0 +1,186 @@
+#ifndef EDITORAUDIOBUSES_H
+#define EDITORAUDIOBUSES_H
+
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/scroll_container.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/slider.h"
+#include "scene/gui/texture_progress.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/panel.h"
+#include "editor/editor_file_dialog.h"
+#include "editor_plugin.h"
+
+class EditorAudioBuses;
+
+class EditorAudioBus : public PanelContainer {
+
+ GDCLASS( EditorAudioBus, PanelContainer )
+
+ bool prev_active;
+ float peak_l;
+ float peak_r;
+
+ Ref<Texture> disabled_vu;
+ LineEdit *track_name;
+ VSlider *slider;
+ TextureProgress *vu_l;
+ TextureProgress *vu_r;
+ TextureRect *scale;
+ OptionButton *send;
+
+ PopupMenu *effect_options;
+ PopupMenu *delete_popup;
+ PopupMenu *delete_effect_popup;
+
+ Button *solo;
+ Button *mute;
+ Button *bypass;
+
+ Tree *effects;
+
+ bool updating_bus;
+
+ void _gui_input(const InputEvent& p_event);
+ void _delete_pressed(int p_option);
+
+ void _name_changed(const String& p_new_name);
+ void _name_focus_exit() { _name_changed(track_name->get_text()); }
+ void _volume_db_changed(float p_db);
+ void _solo_toggled();
+ void _mute_toggled();
+ void _bypass_toggled();
+ void _send_selected(int p_which);
+ void _effect_edited();
+ void _effect_add(int p_which);
+ void _effect_selected();
+ void _delete_effect_pressed(int p_option);
+ void _effect_rmb(const Vector2& p_pos);
+
+
+ virtual Variant get_drag_data(const Point2& p_point);
+ virtual bool can_drop_data(const Point2& p_point,const Variant& p_data) const;
+ virtual void drop_data(const Point2& p_point,const Variant& p_data);
+
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+friend class EditorAudioBuses;
+
+ EditorAudioBuses *buses;
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void update_bus();
+ void update_send();
+
+ EditorAudioBus(EditorAudioBuses *p_buses=NULL);
+};
+
+
+class EditorAudioBusDrop : public Panel {
+
+ GDCLASS(EditorAudioBusDrop,Panel);
+
+ virtual bool can_drop_data(const Point2& p_point,const Variant& p_data) const;
+ virtual void drop_data(const Point2& p_point,const Variant& p_data);
+protected:
+
+ static void _bind_methods();
+public:
+
+ EditorAudioBusDrop();
+};
+
+class EditorAudioBuses : public VBoxContainer {
+
+ GDCLASS(EditorAudioBuses,VBoxContainer)
+
+ HBoxContainer *top_hb;
+
+ Button *add;
+ ScrollContainer *bus_scroll;
+ HBoxContainer *bus_hb;
+
+ EditorAudioBusDrop *drop_end;
+
+ Button *file;
+ Button *load;
+ Button *save_as;
+ Button *_default;
+ Button *_new;
+
+ Timer *save_timer;
+ String edited_path;
+
+ void _add_bus();
+ void _update_buses();
+ void _update_bus(int p_index);
+ void _update_sends();
+
+ void _delete_bus(Object* p_which);
+ void _duplicate_bus(int p_which);
+
+
+ void _request_drop_end();
+ void _drop_at_index(int p_bus,int p_index);
+
+ void _server_save();
+
+ void _select_layout();
+ void _load_layout();
+ void _save_as_layout();
+ void _load_default_layout();
+ void _new_layout();
+
+ EditorFileDialog *file_dialog;
+ bool new_layout;
+
+ void _file_dialog_callback(const String& p_string);
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void open_layout(const String& p_path);
+
+ static EditorAudioBuses* register_editor();
+
+ EditorAudioBuses();
+};
+
+
+
+class AudioBusesEditorPlugin : public EditorPlugin {
+
+ GDCLASS( AudioBusesEditorPlugin, EditorPlugin );
+
+ EditorAudioBuses *audio_bus_editor;
+public:
+
+ virtual String get_name() const { return "SampleLibrary"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ AudioBusesEditorPlugin(EditorAudioBuses *p_node);
+ ~AudioBusesEditorPlugin();
+
+};
+
+#endif // EDITORAUDIOBUSES_H
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
new file mode 100644
index 0000000000..3e3362f515
--- /dev/null
+++ b/editor/editor_autoload_settings.cpp
@@ -0,0 +1,610 @@
+/*************************************************************************/
+/* editor_autoload_settings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_autoload_settings.h"
+
+#include "global_config.h"
+#include "global_constants.h"
+#include "editor_node.h"
+
+#define PREVIEW_LIST_MAX_SIZE 10
+
+void EditorAutoloadSettings::_notification(int p_what) {
+
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+
+ List<String> afn;
+ ResourceLoader::get_recognized_extensions_for_type("Script", &afn);
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn);
+
+ EditorFileDialog *file_dialog = autoload_add_path->get_file_dialog();
+
+ for (List<String>::Element *E = afn.front(); E; E = E->next()) {
+
+ file_dialog->add_filter("*." + E->get());
+ }
+ }
+}
+
+bool EditorAutoloadSettings::_autoload_name_is_valid(const String& p_name, String* r_error) {
+
+ if (!p_name.is_valid_identifier()) {
+ if (r_error)
+ *r_error = TTR("Invalid name.") + "\n" + TTR("Valid characters:")+" a-z, A-Z, 0-9 or _";
+
+ return false;
+ }
+
+ if (ClassDB::class_exists(p_name)) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing engine class name.");
+
+ return false;
+ }
+
+ for (int i = 0; i < Variant::VARIANT_MAX; i++) {
+ if (Variant::get_type_name( Variant::Type(i) ) == p_name) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing buit-in type name.");
+
+ return false;
+ }
+ }
+
+ for (int i = 0; i < GlobalConstants::get_global_constant_count(); i++) {
+ if (GlobalConstants::get_global_constant_name(i) == p_name) {
+ if (r_error)
+ *r_error = TTR("Invalid name. Must not collide with an existing global constant name.");
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void EditorAutoloadSettings::_autoload_add() {
+
+ String name = autoload_add_name->get_text();
+
+ String error;
+ if (!_autoload_name_is_valid(name, &error)) {
+ EditorNode::get_singleton()->show_warning(error);
+ return;
+ }
+
+ String path = autoload_add_path->get_line_edit()->get_text();
+ if (!FileAccess::exists(path)) {
+ EditorNode::get_singleton()->show_warning(TTR("Invalid Path.") + "\n" + TTR("File does not exist."));
+ return;
+ }
+
+ if (!path.begins_with("res://")) {
+ EditorNode::get_singleton()->show_warning(TTR("Invalid Path.") + "\n"+ TTR("Not in resource path."));
+ return;
+ }
+
+ name = "autoload/" + name;
+
+ UndoRedo* undo_redo = EditorNode::get_singleton()->get_undo_redo();
+
+ undo_redo->create_action(TTR("Add AutoLoad"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), name, "*" + path);
+
+ if (GlobalConfig::get_singleton()->has(name)) {
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, GlobalConfig::get_singleton()->get(name));
+ } else {
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, Variant());
+ }
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+
+ autoload_add_path->get_line_edit()->set_text("");
+ autoload_add_name->set_text("");
+}
+
+void EditorAutoloadSettings::_autoload_selected() {
+
+ TreeItem *ti = tree->get_selected();
+
+ if (!ti)
+ return;
+
+ selected_autoload = "autoload/" + ti->get_text(0);
+}
+
+void EditorAutoloadSettings::_autoload_edited() {
+
+ if (updating_autoload)
+ return;
+
+ TreeItem *ti = tree->get_edited();
+ int column = tree->get_edited_column();
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ if (column == 0) {
+ String name = ti->get_text(0);
+ String old_name = selected_autoload.get_slice("/", 1);
+
+ if (name == old_name)
+ return;
+
+ String error;
+ if (!_autoload_name_is_valid(name, &error)) {
+ ti->set_text(0, old_name);
+ EditorNode::get_singleton()->show_warning(error);
+ return;
+ }
+
+ if (GlobalConfig::get_singleton()->has("autoload/" + name)) {
+ ti->set_text(0, old_name);
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Autoload '%s' already exists!"), name));
+ return;
+ }
+
+ updating_autoload = true;
+
+ name = "autoload/" + name;
+
+ int order = GlobalConfig::get_singleton()->get_order(selected_autoload);
+ String path = GlobalConfig::get_singleton()->get(selected_autoload);
+
+ undo_redo->create_action(TTR("Rename Autoload"));
+
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), name, path);
+ undo_redo->add_do_method(GlobalConfig::get_singleton(), "set_order", name, order);
+ undo_redo->add_do_method(GlobalConfig::get_singleton(), "clear", selected_autoload);
+
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), selected_autoload, path);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_order", selected_autoload, order);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "clear", name);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+
+ selected_autoload = name;
+ } else if (column == 2) {
+ updating_autoload = true;
+
+ bool checked = ti->is_checked(2);
+ String base = "autoload/" + ti->get_text(0);
+
+ int order = GlobalConfig::get_singleton()->get_order(base);
+ String path = GlobalConfig::get_singleton()->get(base);
+
+ if (path.begins_with("*"))
+ path = path.substr(1, path.length());
+
+ if (checked)
+ path = "*" + path;
+
+ undo_redo->create_action(TTR("Toggle AutoLoad Globals"));
+
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), base, path);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), base, GlobalConfig::get_singleton()->get(base));
+
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set_order", base, order);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set_order", base, order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ }
+
+ updating_autoload = false;
+}
+
+void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_column, int p_button) {
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+
+ String name = "autoload/" + ti->get_text(0);
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ switch (p_button) {
+
+ case BUTTON_MOVE_UP:
+ case BUTTON_MOVE_DOWN: {
+
+ TreeItem *swap = NULL;
+
+ if (p_button == BUTTON_MOVE_UP) {
+ swap = ti->get_prev();
+ } else {
+ swap = ti->get_next();
+ }
+
+ if (!swap)
+ return;
+
+ String swap_name = "autoload/" + swap->get_text(0);
+
+ int order = GlobalConfig::get_singleton()->get_order(name);
+ int swap_order = GlobalConfig::get_singleton()->get_order(swap_name);
+
+ undo_redo->create_action(TTR("Move Autoload"));
+
+ undo_redo->add_do_method(GlobalConfig::get_singleton(), "set_order", name, swap_order);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_order", name, order);
+
+ undo_redo->add_do_method(GlobalConfig::get_singleton(), "set_order", swap_name, order);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_order", swap_name, swap_order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ } break;
+ case BUTTON_DELETE: {
+
+ int order = GlobalConfig::get_singleton()->get_order(name);
+
+ undo_redo->create_action(TTR("Remove Autoload"));
+
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), name, Variant());
+
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, GlobalConfig::get_singleton()->get(name));
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_persisting", name, true);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_order", order);
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+ } break;
+ }
+}
+
+void EditorAutoloadSettings::_autoload_file_callback(const String& p_path) {
+
+ autoload_add_name->set_text(p_path.get_file().get_basename());
+}
+
+void EditorAutoloadSettings::update_autoload() {
+
+ if (updating_autoload)
+ return;
+
+ updating_autoload = true;
+
+ autoload_cache.clear();
+
+ tree->clear();
+ TreeItem *root = tree->create_item();
+
+ List<PropertyInfo> props;
+ GlobalConfig::get_singleton()->get_property_list(&props);
+
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+
+ const PropertyInfo &pi = E->get();
+
+ if (!pi.name.begins_with("autoload/"))
+ continue;
+
+ String name = pi.name.get_slice("/", 1);
+ String path = GlobalConfig::get_singleton()->get(pi.name);
+
+ if (name.empty())
+ continue;
+
+ AutoLoadInfo info;
+ info.name = pi.name;
+ info.order = GlobalConfig::get_singleton()->get_order(pi.name);
+
+ autoload_cache.push_back(info);
+
+ bool global = false;
+
+ if (path.begins_with("*")) {
+ global = true;
+ path = path.substr(1, path.length());
+ }
+
+ TreeItem *item = tree->create_item(root);
+ item->set_text(0, name);
+ item->set_editable(0, true);
+
+ item->set_text(1, path);
+ item->set_selectable(1, false);
+
+ item->set_cell_mode(2, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(2, true);
+ item->set_text(2, TTR("Enable"));
+ item->set_checked(2, global);
+
+ item->add_button(3, get_icon("MoveUp","EditorIcons"), BUTTON_MOVE_UP);
+ item->add_button(3, get_icon("MoveDown","EditorIcons"), BUTTON_MOVE_DOWN);
+ item->add_button(3, get_icon("Del","EditorIcons"), BUTTON_DELETE);
+ item->set_selectable(3, false);
+ }
+
+ updating_autoload = false;
+}
+
+Variant EditorAutoloadSettings::get_drag_data_fw(const Point2& p_point, Control *p_control) {
+
+ if (autoload_cache.size() <= 1)
+ return false;
+
+ PoolStringArray autoloads;
+
+ TreeItem *next = tree->get_next_selected(NULL);
+
+ while (next) {
+ autoloads.push_back(next->get_text(0));
+ next = tree->get_next_selected(next);
+ }
+
+ if (autoloads.size() == 0 || autoloads.size() == autoload_cache.size())
+ return Variant();
+
+ VBoxContainer *preview = memnew( VBoxContainer );
+
+ int max_size = MIN(PREVIEW_LIST_MAX_SIZE, autoloads.size());
+
+ for (int i = 0; i < max_size; i++) {
+ Label *label = memnew( Label(autoloads[i]) );
+ label->set_self_modulate(Color(1,1,1,Math::lerp(1, 0, float(i)/PREVIEW_LIST_MAX_SIZE)));
+
+ preview->add_child(label);
+ }
+
+ tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+ tree->set_drag_preview(preview);
+
+ Dictionary drop_data;
+ drop_data["type"] = "autoload";
+ drop_data["autoloads"] = autoloads;
+
+ return drop_data;
+}
+
+bool EditorAutoloadSettings::can_drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_control) const {
+ if (updating_autoload)
+ return false;
+
+ Dictionary drop_data = p_data;
+
+ if (!drop_data.has("type"))
+ return false;
+
+ if (drop_data.has("type")) {
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+
+ if (!ti)
+ return false;
+
+ int section = tree->get_drop_section_at_pos(p_point);
+
+ if (section < -1)
+ return false;
+
+ return true;
+ }
+
+ return false;
+}
+
+void EditorAutoloadSettings::drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_control) {
+
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+
+ if (!ti)
+ return;
+
+ int section = tree->get_drop_section_at_pos(p_point);
+
+ if (section < -1)
+ return;
+
+ String name;
+ bool move_to_back = false;
+
+ if (section < 0) {
+ name = ti->get_text(0);
+ } else if (ti->get_next()) {
+ name = ti->get_next()->get_text(0);
+ } else {
+ name = ti->get_text(0);
+ move_to_back = true;
+ }
+
+ int order = GlobalConfig::get_singleton()->get_order("autoload/" + name);
+
+ AutoLoadInfo aux;
+ List<AutoLoadInfo>::Element *E = NULL;
+
+ if (!move_to_back) {
+ aux.order = order;
+ E = autoload_cache.find(aux);
+ }
+
+ Dictionary drop_data = p_data;
+ PoolStringArray autoloads = drop_data["autoloads"];
+
+ Vector<int> orders;
+ orders.resize(autoload_cache.size());
+
+ for (int i = 0; i < autoloads.size(); i++) {
+ aux.order = GlobalConfig::get_singleton()->get_order("autoload/" + autoloads[i]);
+
+ List<AutoLoadInfo>::Element *I = autoload_cache.find(aux);
+
+ if (move_to_back) {
+ autoload_cache.move_to_back(I);
+ } else if (E != I) {
+ autoload_cache.move_before(I, E);
+ } else if (E->next()) {
+ E = E->next();
+ } else {
+ break;
+ }
+ }
+
+ int i = 0;
+
+ for (List<AutoLoadInfo>::Element *E = autoload_cache.front(); E; E = E->next()) {
+ orders[i++] = E->get().order;
+ }
+
+ orders.sort();
+
+ UndoRedo *undo_redo = EditorNode::get_undo_redo();
+
+ undo_redo->create_action(TTR("Rearrange Autoloads"));
+
+ i = 0;
+
+ for (List<AutoLoadInfo>::Element *E = autoload_cache.front(); E; E = E->next()) {
+ undo_redo->add_do_method(GlobalConfig::get_singleton(), "set_order", E->get().name, orders[i++]);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(), "set_order", E->get().name, E->get().order);
+ }
+
+ orders.clear();
+
+ undo_redo->add_do_method(this, "update_autoload");
+ undo_redo->add_undo_method(this, "update_autoload");
+
+ undo_redo->add_do_method(this, "emit_signal", autoload_changed);
+ undo_redo->add_undo_method(this, "emit_signal", autoload_changed);
+
+ undo_redo->commit_action();
+}
+
+void EditorAutoloadSettings::_bind_methods() {
+
+ ClassDB::bind_method("_autoload_add", &EditorAutoloadSettings::_autoload_add);
+ ClassDB::bind_method("_autoload_selected", &EditorAutoloadSettings::_autoload_selected);
+ ClassDB::bind_method("_autoload_edited", &EditorAutoloadSettings::_autoload_edited);
+ ClassDB::bind_method("_autoload_button_pressed", &EditorAutoloadSettings::_autoload_button_pressed);
+ ClassDB::bind_method("_autoload_file_callback", &EditorAutoloadSettings::_autoload_file_callback);
+
+ ClassDB::bind_method("get_drag_data_fw", &EditorAutoloadSettings::get_drag_data_fw);
+ ClassDB::bind_method("can_drop_data_fw", &EditorAutoloadSettings::can_drop_data_fw);
+ ClassDB::bind_method("drop_data_fw", &EditorAutoloadSettings::drop_data_fw);
+
+ ClassDB::bind_method("update_autoload", &EditorAutoloadSettings::update_autoload);
+
+ ADD_SIGNAL(MethodInfo("autoload_changed"));
+}
+
+EditorAutoloadSettings::EditorAutoloadSettings() {
+
+ autoload_changed = "autoload_changed";
+
+ updating_autoload = false;
+ selected_autoload = "";
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ add_child(hbc);
+
+ VBoxContainer *vbc_path = memnew( VBoxContainer );
+ vbc_path->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ autoload_add_path = memnew( EditorLineEditFileChooser );
+ autoload_add_path->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ autoload_add_path->get_file_dialog()->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ autoload_add_path->get_file_dialog()->connect("file_selected", this, "_autoload_file_callback");
+
+ vbc_path->add_margin_child(TTR("Path:"), autoload_add_path);
+ hbc->add_child(vbc_path);
+
+ VBoxContainer *vbc_name = memnew( VBoxContainer );
+ vbc_name->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *hbc_name = memnew( HBoxContainer );
+
+ autoload_add_name = memnew( LineEdit );
+ autoload_add_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc_name->add_child(autoload_add_name);
+
+ Button *add_autoload = memnew( Button );
+ add_autoload->set_text(TTR("Add"));
+ hbc_name->add_child(add_autoload);
+ add_autoload->connect("pressed", this, "_autoload_add");
+
+ vbc_name->add_margin_child(TTR("Node Name:"), hbc_name);
+ hbc->add_child(vbc_name);
+
+ tree = memnew( Tree );
+ tree->set_hide_root(true);
+ tree->set_select_mode(Tree::SELECT_MULTI);
+ tree->set_single_select_cell_editing_only_when_already_selected(true);
+
+ tree->set_drag_forwarding(this);
+
+ tree->set_columns(4);
+ tree->set_column_titles_visible(true);
+
+ tree->set_column_title(0,TTR("Name"));
+ tree->set_column_expand(0,true);
+ tree->set_column_min_width(0,100);
+
+ tree->set_column_title(1,TTR("Path"));
+ tree->set_column_expand(1,true);
+ tree->set_column_min_width(1,100);
+
+ tree->set_column_title(2,TTR("Singleton"));
+ tree->set_column_expand(2,false);
+ tree->set_column_min_width(2,80);
+
+ tree->set_column_expand(3,false);
+ tree->set_column_min_width(3,80);
+
+ tree->connect("cell_selected", this, "_autoload_selected");
+ tree->connect("item_edited", this, "_autoload_edited");
+ tree->connect("button_pressed", this, "_autoload_button_pressed");
+
+ add_margin_child(TTR("List:"), tree, true);
+}
+
diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h
new file mode 100644
index 0000000000..2afe239000
--- /dev/null
+++ b/editor/editor_autoload_settings.h
@@ -0,0 +1,94 @@
+/*************************************************************************/
+/* editor_autoload_settings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#ifndef EDITOR_AUTOLOAD_SETTINGS_H
+#define EDITOR_AUTOLOAD_SETTINGS_H
+
+#include "scene/gui/tree.h"
+
+#include "editor_file_dialog.h"
+
+class EditorAutoloadSettings : public VBoxContainer {
+
+ GDCLASS( EditorAutoloadSettings, VBoxContainer );
+
+ enum {
+ BUTTON_MOVE_UP,
+ BUTTON_MOVE_DOWN,
+ BUTTON_DELETE
+ };
+
+ String autoload_changed;
+
+ struct AutoLoadInfo {
+ String name;
+ int order;
+
+ bool operator==(const AutoLoadInfo& p_info) {
+ return order == p_info.order;
+ }
+ };
+
+ List<AutoLoadInfo> autoload_cache;
+
+ bool updating_autoload;
+ int number_of_autoloads;
+ String selected_autoload;
+
+ Tree *tree;
+ EditorLineEditFileChooser *autoload_add_path;
+ LineEdit *autoload_add_name;
+
+ bool _autoload_name_is_valid(const String& p_string, String *r_error = NULL);
+
+ void _autoload_add();
+ void _autoload_selected();
+ void _autoload_edited();
+ void _autoload_button_pressed(Object *p_item, int p_column, int p_button);
+ void _autoload_file_callback(const String& p_path);
+
+ Variant get_drag_data_fw(const Point2& p_point, Control *p_from);
+ bool can_drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_from) const;
+ void drop_data_fw(const Point2& p_point, const Variant& p_data, Control *p_from);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void update_autoload();
+
+ EditorAutoloadSettings();
+
+};
+
+#endif
+
diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp
new file mode 100644
index 0000000000..d2fa40e08c
--- /dev/null
+++ b/editor/editor_data.cpp
@@ -0,0 +1,979 @@
+/*************************************************************************/
+/* editor_data.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_data.h"
+
+#include "global_config.h"
+#include "editor_settings.h"
+#include "os/dir_access.h"
+#include "io/resource_loader.h"
+#include "scene/resources/packed_scene.h"
+#include "os/file_access.h"
+#include "editor_node.h"
+
+void EditorHistory::_cleanup_history() {
+
+ for(int i=0;i<history.size();i++) {
+
+ bool fail=false;
+
+ for(int j=0;j<history[i].path.size();j++) {
+ if (!history[i].path[j].ref.is_null())
+ continue;
+
+ if (ObjectDB::get_instance(history[i].path[j].object))
+ continue; //has isntance, try next
+
+ if (j<=history[i].level) {
+ //before or equal level, complete fail
+ fail=true;
+ } else {
+ //after level, clip
+ history[i].path.resize(j);
+ }
+
+ break;
+ }
+
+ if (fail) {
+ history.remove(i);
+ i--;
+ }
+ }
+
+ if (current>=history.size())
+ current=history.size()-1;
+}
+
+void EditorHistory::_add_object(ObjectID p_object,const String& p_property,int p_level_change) {
+
+ Object *obj = ObjectDB::get_instance(p_object);
+ ERR_FAIL_COND(!obj);
+ Reference *r = obj->cast_to<Reference>();
+ Obj o;
+ if (r)
+ o.ref=REF(r);
+ o.object=p_object;
+ o.property=p_property;
+
+ History h;
+
+ bool has_prev = current>=0 && current<history.size();
+
+ if (has_prev) {
+ history.resize(current+1); //clip history to next
+ }
+
+ if (p_property!="" && has_prev) {
+ //add a sub property
+ History &pr = history[current];
+ h=pr;
+ h.path.resize(h.level+1);
+ h.path.push_back(o);
+ h.level++;
+ } else if (p_level_change!=-1 && has_prev) {
+ //add a sub property
+ History &pr = history[current];
+ h=pr;
+ ERR_FAIL_INDEX(p_level_change,h.path.size());
+ h.level=p_level_change;
+ } else {
+ //add a new node
+ h.path.push_back(o);
+ h.level=0;
+ }
+
+ history.push_back(h);
+ current++;
+}
+
+void EditorHistory::add_object(ObjectID p_object) {
+
+ _add_object(p_object,"",-1);
+}
+
+void EditorHistory::add_object(ObjectID p_object,const String& p_subprop) {
+
+ _add_object(p_object,p_subprop,-1);
+}
+
+void EditorHistory::add_object(ObjectID p_object,int p_relevel){
+
+ _add_object(p_object,"",p_relevel);
+}
+
+int EditorHistory::get_history_len() {
+ return history.size();
+}
+int EditorHistory::get_history_pos() {
+ return current;
+}
+
+ObjectID EditorHistory::get_history_obj(int p_obj) const {
+ ERR_FAIL_INDEX_V(p_obj,history.size(),0);
+ ERR_FAIL_INDEX_V(history[p_obj].level,history[p_obj].path.size(),0);
+ return history[p_obj].path[history[p_obj].level].object;
+}
+
+bool EditorHistory::is_at_begining() const {
+ return current<=0;
+}
+bool EditorHistory::is_at_end() const {
+
+ return ((current+1)>=history.size());
+}
+
+
+bool EditorHistory::next() {
+
+
+ _cleanup_history();
+
+ if ((current+1)<history.size())
+ current++;
+ else
+ return false;
+
+ return true;
+}
+
+bool EditorHistory::previous() {
+
+
+ _cleanup_history();
+
+ if (current>0)
+ current--;
+ else
+ return false;
+
+ return true;
+}
+
+ObjectID EditorHistory::get_current() {
+
+
+ if (current<0 || current >=history.size())
+ return 0;
+
+ History &h=history[current];
+ Object *obj = ObjectDB::get_instance(h.path[h.level].object);
+ if (!obj)
+ return 0;
+
+ return obj->get_instance_ID();
+}
+
+int EditorHistory::get_path_size() const {
+
+ if (current<0 || current >=history.size())
+ return 0;
+
+ const History &h=history[current];
+ return h.path.size();
+
+}
+
+ObjectID EditorHistory::get_path_object(int p_index) const {
+
+ if (current<0 || current >=history.size())
+ return 0;
+
+ const History &h=history[current];
+
+ ERR_FAIL_INDEX_V(p_index,h.path.size(),0);
+
+ Object *obj = ObjectDB::get_instance(h.path[p_index].object);
+ if (!obj)
+ return 0;
+
+ return obj->get_instance_ID();
+}
+
+String EditorHistory::get_path_property(int p_index) const {
+
+ if (current<0 || current >=history.size())
+ return "";
+
+ const History &h=history[current];
+
+ ERR_FAIL_INDEX_V(p_index,h.path.size(),"");
+
+ return h.path[p_index].property;
+
+}
+
+void EditorHistory::clear() {
+
+ history.clear();
+ current=-1;
+}
+
+EditorHistory::EditorHistory() {
+
+ current=-1;
+}
+
+EditorPlugin* EditorData::get_editor(Object *p_object) {
+
+ for (int i=0;i<editor_plugins.size();i++) {
+
+ if (editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object))
+ return editor_plugins[i];
+ }
+
+ return NULL;
+}
+
+EditorPlugin* EditorData::get_subeditor(Object *p_object) {
+
+ for (int i=0;i<editor_plugins.size();i++) {
+
+ if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object))
+ return editor_plugins[i];
+ }
+
+ return NULL;
+}
+
+Vector<EditorPlugin*> EditorData::get_subeditors(Object* p_object) {
+ Vector<EditorPlugin*> sub_plugins;
+ for (int i = 0; i < editor_plugins.size(); i++) {
+ if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) {
+ sub_plugins.push_back(editor_plugins[i]);
+ }
+ }
+ return sub_plugins;
+}
+
+EditorPlugin* EditorData::get_editor(String p_name) {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ if (editor_plugins[i]->get_name()==p_name)
+ return editor_plugins[i];
+ }
+
+ return NULL;
+}
+
+void EditorData::copy_object_params(Object *p_object) {
+
+ clipboard.clear();
+
+ List<PropertyInfo> pinfo;
+ p_object->get_property_list(&pinfo);
+
+ for( List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ if (!(E->get().usage&PROPERTY_USAGE_EDITOR))
+ continue;
+
+ PropertyData pd;
+ pd.name=E->get().name;
+ pd.value=p_object->get(pd.name);
+ clipboard.push_back(pd);
+ }
+}
+
+void EditorData::get_editor_breakpoints(List<String> *p_breakpoints) {
+
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->get_breakpoints(p_breakpoints);
+ }
+
+
+}
+
+Dictionary EditorData::get_editor_states() const {
+
+ Dictionary metadata;
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ Dictionary state=editor_plugins[i]->get_state();
+ if (state.empty())
+ continue;
+ metadata[editor_plugins[i]->get_name()]=state;
+ }
+
+ return metadata;
+
+}
+
+Dictionary EditorData::get_scene_editor_states(int p_idx) const
+{
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),Dictionary());
+ EditedScene es = edited_scene[p_idx];
+ return es.editor_states;
+}
+
+void EditorData::set_editor_states(const Dictionary& p_states) {
+
+ List<Variant> keys;
+ p_states.get_key_list(&keys);
+
+ List<Variant>::Element *E=keys.front();
+ for(;E;E=E->next()) {
+
+ String name = E->get();
+ int idx=-1;
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ if (editor_plugins[i]->get_name()==name) {
+ idx=i;
+ break;
+ }
+ }
+
+ if (idx==-1)
+ continue;
+ editor_plugins[idx]->set_state(p_states[name]);
+ }
+
+}
+
+void EditorData::notify_edited_scene_changed() {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->edited_scene_changed();
+ }
+}
+
+void EditorData::clear_editor_states() {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->clear();
+ }
+
+}
+
+void EditorData::save_editor_external_data() {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->save_external_data();
+ }
+}
+
+void EditorData::apply_changes_in_editors() {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->apply_changes();
+ }
+
+}
+
+void EditorData::save_editor_global_states() {
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->save_global_state();
+ }
+}
+
+void EditorData::restore_editor_global_states(){
+
+ for(int i=0;i<editor_plugins.size();i++) {
+
+ editor_plugins[i]->restore_global_state();
+ }
+
+}
+
+
+void EditorData::paste_object_params(Object *p_object) {
+
+
+ for( List<PropertyData>::Element *E=clipboard.front();E;E=E->next()) {
+
+ p_object->set( E->get().name, E->get().value);
+ }
+
+}
+
+
+UndoRedo &EditorData::get_undo_redo() {
+
+ return undo_redo;
+}
+
+void EditorData::remove_editor_plugin(EditorPlugin *p_plugin) {
+
+ p_plugin->undo_redo=NULL;
+ editor_plugins.erase(p_plugin);
+
+}
+
+void EditorData::add_editor_plugin(EditorPlugin *p_plugin) {
+
+ p_plugin->undo_redo=&undo_redo;
+ editor_plugins.push_back(p_plugin);
+}
+
+int EditorData::get_editor_plugin_count() const {
+ return editor_plugins.size();
+}
+EditorPlugin *EditorData::get_editor_plugin(int p_idx) {
+
+ ERR_FAIL_INDEX_V(p_idx,editor_plugins.size(),NULL);
+ return editor_plugins[p_idx];
+}
+
+
+void EditorData::add_custom_type(const String& p_type, const String& p_inherits,const Ref<Script>& p_script,const Ref<Texture>& p_icon ) {
+
+ ERR_FAIL_COND(p_script.is_null());
+ CustomType ct;
+ ct.name=p_type;
+ ct.icon=p_icon;
+ ct.script=p_script;
+ if (!custom_types.has(p_inherits)) {
+ custom_types[p_inherits]=Vector<CustomType>();
+ }
+
+ custom_types[p_inherits].push_back(ct);
+}
+
+void EditorData::remove_custom_type(const String& p_type){
+
+
+ for (Map<String,Vector<CustomType> >::Element *E=custom_types.front();E;E=E->next()) {
+
+ for(int i=0;i<E->get().size();i++) {
+ if (E->get()[i].name==p_type) {
+ E->get().remove(i);
+ if (E->get().empty()) {
+ custom_types.erase(E->key());
+ }
+ return;
+ }
+ }
+ }
+
+}
+
+int EditorData::add_edited_scene(int p_at_pos) {
+
+ if (p_at_pos<0)
+ p_at_pos=edited_scene.size();
+ EditedScene es;
+ es.root=NULL;
+ es.history_current=-1;
+ es.version=0;
+ es.live_edit_root=NodePath(String("/root"));
+
+ if (p_at_pos==edited_scene.size())
+ edited_scene.push_back(es);
+ else
+ edited_scene.insert(p_at_pos,es);
+
+ if (current_edited_scene<0)
+ current_edited_scene=0;
+ return p_at_pos;
+}
+
+void EditorData::move_edited_scene_index(int p_idx,int p_to_idx){
+
+ ERR_FAIL_INDEX(p_idx,edited_scene.size());
+ ERR_FAIL_INDEX(p_to_idx,edited_scene.size());
+ SWAP(edited_scene[p_idx],edited_scene[p_to_idx]);
+}
+void EditorData::remove_scene(int p_idx){
+ ERR_FAIL_INDEX(p_idx,edited_scene.size());
+ if (edited_scene[p_idx].root)
+ memdelete(edited_scene[p_idx].root);
+
+ if (current_edited_scene>p_idx)
+ current_edited_scene--;
+ else if (current_edited_scene==p_idx && current_edited_scene>0) {
+ current_edited_scene--;
+ }
+
+ edited_scene.remove(p_idx);
+
+}
+
+bool EditorData::_find_updated_instances(Node* p_root,Node *p_node,Set<String> &checked_paths) {
+
+ /*
+ if (p_root!=p_node && p_node->get_owner()!=p_root && !p_root->is_editable_instance(p_node->get_owner()))
+ return false;
+ */
+
+ Ref<SceneState> ss;
+
+ if (p_node==p_root) {
+ ss=p_node->get_scene_inherited_state();
+ } else if (p_node->get_filename()!=String()){
+ ss=p_node->get_scene_instance_state();
+ }
+
+ if (ss.is_valid()) {
+ String path = ss->get_path();
+
+ if (!checked_paths.has(path)) {
+
+ uint64_t modified_time = FileAccess::get_modified_time(path);
+ if (modified_time!=ss->get_last_modified_time()) {
+ return true; //external scene changed
+ }
+
+ checked_paths.insert(path);
+ }
+
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ bool found = _find_updated_instances(p_root,p_node->get_child(i),checked_paths);
+ if (found)
+ return true;
+ }
+
+ return false;
+}
+
+
+bool EditorData::check_and_update_scene(int p_idx) {
+
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),false);
+ if (!edited_scene[p_idx].root)
+ return false;
+
+ Set<String> checked_scenes;
+
+
+ bool must_reload = _find_updated_instances(edited_scene[p_idx].root,edited_scene[p_idx].root,checked_scenes);
+
+ print_line("MUST RELOAD? "+itos(must_reload));
+
+ if (must_reload) {
+ Ref<PackedScene> pscene;
+ pscene.instance();
+
+ EditorProgress ep("update_scene",TTR("Updating Scene"),2);
+ ep.step(TTR("Storing local changes.."),0);
+ //pack first, so it stores diffs to previous version of saved scene
+ Error err = pscene->pack(edited_scene[p_idx].root);
+ ERR_FAIL_COND_V(err!=OK,false);
+ ep.step(TTR("Updating scene.."),1);
+ Node *new_scene = pscene->instance(PackedScene::GEN_EDIT_STATE_MAIN);
+ ERR_FAIL_COND_V(!new_scene,false);
+
+ //transfer selection
+ List<Node*> new_selection;
+ for (List<Node*>::Element *E=edited_scene[p_idx].selection.front();E;E=E->next()) {
+ NodePath p = edited_scene[p_idx].root->get_path_to(E->get());
+ Node *new_node = new_scene->get_node(p);
+ if (new_node)
+ new_selection.push_back(new_node);
+ }
+
+ new_scene->set_filename( edited_scene[p_idx].root->get_filename() );
+
+ memdelete(edited_scene[p_idx].root);
+ edited_scene[p_idx].root=new_scene;
+ edited_scene[p_idx].selection=new_selection;
+
+ return true;
+
+ }
+
+ return false;
+
+}
+
+int EditorData::get_edited_scene() const {
+
+ return current_edited_scene;
+}
+void EditorData::set_edited_scene(int p_idx){
+
+ ERR_FAIL_INDEX(p_idx,edited_scene.size());
+ current_edited_scene=p_idx;
+ //swap
+}
+Node* EditorData::get_edited_scene_root(int p_idx){
+ if (p_idx < 0) {
+ ERR_FAIL_INDEX_V(current_edited_scene,edited_scene.size(),NULL);
+ return edited_scene[current_edited_scene].root;
+ } else {
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),NULL);
+ return edited_scene[p_idx].root;
+ }
+}
+void EditorData::set_edited_scene_root(Node* p_root) {
+
+ ERR_FAIL_INDEX(current_edited_scene,edited_scene.size());
+ edited_scene[current_edited_scene].root=p_root;
+}
+
+int EditorData::get_edited_scene_count() const {
+
+ return edited_scene.size();
+}
+
+void EditorData::set_edited_scene_version(uint64_t version, int scene_idx) {
+ ERR_FAIL_INDEX(current_edited_scene,edited_scene.size());
+ if (scene_idx < 0) {
+ edited_scene[current_edited_scene].version=version;
+ } else {
+ ERR_FAIL_INDEX(scene_idx,edited_scene.size());
+ edited_scene[scene_idx].version=version;
+ }
+
+}
+
+uint64_t EditorData::get_edited_scene_version() const{
+
+ ERR_FAIL_INDEX_V(current_edited_scene,edited_scene.size(),0);
+ return edited_scene[current_edited_scene].version;
+
+}
+uint64_t EditorData::get_scene_version(int p_idx) const{
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),false);
+ return edited_scene[p_idx].version;
+}
+
+String EditorData::get_scene_type(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),String());
+ if (!edited_scene[p_idx].root)
+ return "";
+ return edited_scene[p_idx].root->get_class();
+
+}
+void EditorData::move_edited_scene_to_index(int p_idx) {
+
+ ERR_FAIL_INDEX(current_edited_scene,edited_scene.size());
+ ERR_FAIL_INDEX(p_idx,edited_scene.size());
+
+ EditedScene es=edited_scene[current_edited_scene];
+ edited_scene.remove(current_edited_scene);
+ edited_scene.insert(p_idx,es);
+ current_edited_scene=p_idx;
+}
+
+Ref<Script> EditorData::get_scene_root_script(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),Ref<Script>());
+ if (!edited_scene[p_idx].root)
+ return Ref<Script>();
+ Ref<Script> s=edited_scene[p_idx].root->get_script();
+ if (!s.is_valid() && edited_scene[p_idx].root->get_child_count()) {
+ Node *n = edited_scene[p_idx].root->get_child(0);
+ while(!s.is_valid() && n && n->get_filename()==String()) {
+ s=n->get_script();
+ n=n->get_parent();
+ }
+ }
+ return s;
+}
+
+String EditorData::get_scene_title(int p_idx) const {
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),String());
+ if (!edited_scene[p_idx].root)
+ return "[empty]";
+ if (edited_scene[p_idx].root->get_filename()=="")
+ return "[unsaved]";
+ return edited_scene[p_idx].root->get_filename().get_file();
+}
+
+
+String EditorData::get_scene_path(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,edited_scene.size(),String());
+
+ if (!edited_scene[p_idx].root)
+ return "";
+ return edited_scene[p_idx].root->get_filename();
+
+}
+
+void EditorData::set_edited_scene_live_edit_root(const NodePath& p_root) {
+ ERR_FAIL_INDEX(current_edited_scene,edited_scene.size());
+
+ edited_scene[current_edited_scene].live_edit_root=p_root;
+
+}
+NodePath EditorData::get_edited_scene_live_edit_root() {
+
+ ERR_FAIL_INDEX_V(current_edited_scene,edited_scene.size(),String());
+
+ return edited_scene[current_edited_scene].live_edit_root;
+
+
+
+}
+
+
+void EditorData::save_edited_scene_state(EditorSelection *p_selection, EditorHistory *p_history, const Dictionary& p_custom) {
+
+ ERR_FAIL_INDEX(current_edited_scene,edited_scene.size());
+
+ EditedScene &es=edited_scene[current_edited_scene];
+ es.selection = p_selection->get_selected_node_list();
+ es.history_current=p_history->current;
+ es.history_stored=p_history->history;
+ es.editor_states=get_editor_states();
+ es.custom_state=p_custom;
+
+}
+
+Dictionary EditorData::restore_edited_scene_state(EditorSelection *p_selection, EditorHistory *p_history) {
+ ERR_FAIL_INDEX_V(current_edited_scene,edited_scene.size(),Dictionary());
+
+ EditedScene &es=edited_scene[current_edited_scene];
+
+ p_history->current=es.history_current;
+ p_history->history=es.history_stored;
+
+
+ p_selection->clear();
+ for(List<Node*>::Element *E=es.selection.front();E;E=E->next()) {
+ p_selection->add_node(E->get());
+ }
+ set_editor_states(es.editor_states);
+
+ return es.custom_state;
+}
+
+
+void EditorData::clear_edited_scenes() {
+
+ for(int i=0;i<edited_scene.size();i++) {
+ if (edited_scene[i].root) {
+ memdelete( edited_scene[i].root );
+ }
+ }
+ edited_scene.clear();
+}
+
+
+
+void EditorData::set_plugin_window_layout(Ref<ConfigFile> p_layout) {
+ for(int i=0;i<editor_plugins.size();i++) {
+ editor_plugins[i]->set_window_layout(p_layout);
+ }
+}
+
+void EditorData::get_plugin_window_layout(Ref<ConfigFile> p_layout) {
+ for(int i=0;i<editor_plugins.size();i++) {
+ editor_plugins[i]->get_window_layout(p_layout);
+ }
+}
+
+EditorData::EditorData() {
+
+ current_edited_scene=-1;
+
+ //load_imported_scenes_from_globals();
+}
+
+///////////
+void EditorSelection::_node_removed(Node *p_node) {
+
+ if (!selection.has(p_node))
+ return;
+
+ Object *meta = selection[p_node];
+ if (meta)
+ memdelete(meta);
+ selection.erase(p_node);
+ changed=true;
+ nl_changed=true;
+}
+
+void EditorSelection::add_node(Node *p_node) {
+
+ ERR_FAIL_NULL(p_node);
+ ERR_FAIL_COND(!p_node->is_inside_tree());
+ if (selection.has(p_node))
+ return;
+
+ changed=true;
+ nl_changed=true;
+ Object *meta=NULL;
+ for(List<Object*>::Element *E=editor_plugins.front();E;E=E->next()) {
+
+ meta = E->get()->call("_get_editor_data",p_node);
+ if (meta) {
+ break;
+ }
+
+ }
+ selection[p_node]=meta;
+
+ p_node->connect("tree_exited",this,"_node_removed",varray(p_node),CONNECT_ONESHOT);
+
+ //emit_signal("selection_changed");
+}
+
+void EditorSelection::remove_node(Node *p_node) {
+
+ ERR_FAIL_NULL(p_node);
+
+ if (!selection.has(p_node))
+ return;
+
+ changed=true;
+ nl_changed=true;
+ Object *meta = selection[p_node];
+ if (meta)
+ memdelete(meta);
+ selection.erase(p_node);
+ p_node->disconnect("tree_exited",this,"_node_removed");
+ //emit_signal("selection_changed");
+}
+bool EditorSelection::is_selected(Node * p_node) const {
+
+ return selection.has(p_node);
+}
+
+Array EditorSelection::_get_transformable_selected_nodes() {
+
+ Array ret;
+
+ for (List<Node*>::Element *E=selected_node_list.front();E;E=E->next()) {
+
+ ret.push_back(E->get());
+ }
+
+ return ret;
+}
+
+Array EditorSelection::_get_selected_nodes() {
+
+ Array ret;
+
+ for (Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ ret.push_back(E->key());
+ }
+
+ return ret;
+}
+
+void EditorSelection::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_node_removed"),&EditorSelection::_node_removed);
+ ClassDB::bind_method(D_METHOD("clear"),&EditorSelection::clear);
+ ClassDB::bind_method(D_METHOD("add_node","node:Node"),&EditorSelection::add_node);
+ ClassDB::bind_method(D_METHOD("remove_node","node:Node"),&EditorSelection::remove_node);
+ ClassDB::bind_method(D_METHOD("get_selected_nodes"),&EditorSelection::_get_selected_nodes);
+ ClassDB::bind_method(D_METHOD("get_transformable_selected_nodes"),&EditorSelection::_get_transformable_selected_nodes);
+ ADD_SIGNAL( MethodInfo("selection_changed") );
+
+}
+
+void EditorSelection::add_editor_plugin(Object *p_object) {
+
+ editor_plugins.push_back(p_object);
+}
+
+void EditorSelection::_update_nl() {
+
+ if (!nl_changed)
+ return;
+
+ selected_node_list.clear();
+
+ for (Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+
+ Node *parent = E->key();
+ parent=parent->get_parent();
+ bool skip=false;
+ while (parent) {
+ if (selection.has(parent)) {
+ skip=true;
+ break;
+ }
+ parent=parent->get_parent();
+ }
+
+ if (skip)
+ continue;
+ selected_node_list.push_back(E->key());
+ }
+
+ nl_changed=true;
+}
+
+void EditorSelection::update() {
+
+ _update_nl();
+
+ if (!changed)
+ return;
+ emit_signal("selection_changed");
+ changed=false;
+
+
+}
+
+List<Node*>& EditorSelection::get_selected_node_list() {
+
+ if (changed)
+ update();
+ else
+ _update_nl();
+ return selected_node_list;
+}
+
+
+
+
+void EditorSelection::clear() {
+
+ while( !selection.empty() ) {
+
+ remove_node(selection.front()->key());
+ }
+
+
+ changed=true;
+ nl_changed=true;
+
+}
+EditorSelection::EditorSelection() {
+
+ changed=false;
+ nl_changed=false;
+
+}
+
+EditorSelection::~EditorSelection() {
+
+ clear();
+}
diff --git a/editor/editor_data.h b/editor/editor_data.h
new file mode 100644
index 0000000000..4622791653
--- /dev/null
+++ b/editor/editor_data.h
@@ -0,0 +1,269 @@
+/*************************************************************************/
+/* editor_data.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_DATA_H
+#define EDITOR_DATA_H
+
+#include "editor/editor_plugin.h"
+#include "scene/resources/texture.h"
+#include "list.h"
+#include "undo_redo.h"
+#include "pair.h"
+
+class EditorHistory {
+
+ enum {
+
+ HISTORY_MAX=64
+ };
+
+ struct Obj {
+
+ REF ref;
+ ObjectID object;
+ String property;
+ };
+
+ struct History {
+
+ Vector<Obj> path;
+ int level;
+ };
+friend class EditorData;
+
+ Vector<History> history;
+ int current;
+
+ //Vector<EditorPlugin*> editor_plugins;
+
+ struct PropertyData {
+
+ String name;
+ Variant value;
+ };
+
+
+ void _cleanup_history();
+
+ void _add_object(ObjectID p_object,const String& p_property,int p_level_change);
+
+public:
+
+ bool is_at_begining() const;
+ bool is_at_end() const;
+
+ void add_object(ObjectID p_object);
+ void add_object(ObjectID p_object,const String& p_subprop);
+ void add_object(ObjectID p_object,int p_relevel);
+
+ int get_history_len();
+ int get_history_pos();
+ ObjectID get_history_obj(int p_obj) const;
+
+ bool next();
+ bool previous();
+ ObjectID get_current();
+
+ int get_path_size() const;
+ ObjectID get_path_object(int p_index) const;
+ String get_path_property(int p_index) const;
+
+ void clear();
+
+ EditorHistory();
+};
+
+class EditorSelection;
+
+class EditorData {
+
+public:
+ struct CustomType {
+
+ String name;
+ Ref<Script> script;
+ Ref<Texture> icon;
+ };
+private:
+
+ Vector<EditorPlugin*> editor_plugins;
+
+ struct PropertyData {
+
+ String name;
+ Variant value;
+ };
+ Map<String,Vector<CustomType> > custom_types;
+
+ List<PropertyData> clipboard;
+ UndoRedo undo_redo;
+
+
+ void _cleanup_history();
+
+ struct EditedScene {
+ Node* root;
+ Dictionary editor_states;
+ List<Node*> selection;
+ Vector<EditorHistory::History> history_stored;
+ int history_current;
+ Dictionary custom_state;
+ uint64_t version;
+ NodePath live_edit_root;
+
+
+ };
+
+ Vector<EditedScene> edited_scene;
+ int current_edited_scene;
+
+ bool _find_updated_instances(Node* p_root,Node *p_node,Set<String> &checked_paths);
+
+public:
+
+ EditorPlugin* get_editor(Object *p_object);
+ EditorPlugin* get_subeditor(Object *p_object);
+ Vector<EditorPlugin*> get_subeditors(Object *p_object);
+ EditorPlugin* get_editor(String p_name);
+
+ void copy_object_params(Object *p_object);
+ void paste_object_params(Object *p_object);
+
+ Dictionary get_editor_states() const;
+ Dictionary get_scene_editor_states(int p_idx) const;
+ void set_editor_states(const Dictionary& p_states);
+ void get_editor_breakpoints(List<String> *p_breakpoints);
+ void clear_editor_states();
+ void save_editor_external_data();
+ void apply_changes_in_editors();
+
+ void add_editor_plugin(EditorPlugin *p_plugin);
+ void remove_editor_plugin(EditorPlugin *p_plugin);
+
+ int get_editor_plugin_count() const;
+ EditorPlugin *get_editor_plugin(int p_idx);
+
+ UndoRedo &get_undo_redo();
+
+ void save_editor_global_states();
+ void restore_editor_global_states();
+
+ void add_custom_type(const String& p_type, const String& p_inherits,const Ref<Script>& p_script,const Ref<Texture>& p_icon );
+ void remove_custom_type(const String& p_type);
+ const Map<String,Vector<CustomType> >& get_custom_types() const { return custom_types; }
+
+
+ int add_edited_scene(int p_at_pos);
+ void move_edited_scene_index(int p_idx,int p_to_idx);
+ void remove_scene(int p_idx);
+ void set_edited_scene(int p_idx);
+ void set_edited_scene_root(Node* p_root);
+ int get_edited_scene() const;
+ Node* get_edited_scene_root(int p_idx = -1);
+ int get_edited_scene_count() const;
+ String get_scene_title(int p_idx) const;
+ String get_scene_path(int p_idx) const;
+ String get_scene_type(int p_idx) const;
+ Ref<Script> get_scene_root_script(int p_idx) const;
+ void set_edited_scene_version(uint64_t version, int p_scene_idx = -1);
+ uint64_t get_edited_scene_version() const;
+ uint64_t get_scene_version(int p_idx) const;
+ void clear_edited_scenes();
+ void set_edited_scene_live_edit_root(const NodePath& p_root);
+ NodePath get_edited_scene_live_edit_root();
+ bool check_and_update_scene(int p_idx);
+ void move_edited_scene_to_index(int p_idx);
+
+
+ void set_plugin_window_layout(Ref<ConfigFile> p_layout);
+ void get_plugin_window_layout(Ref<ConfigFile> p_layout);
+
+ void save_edited_scene_state(EditorSelection *p_selection,EditorHistory *p_history,const Dictionary& p_custom);
+ Dictionary restore_edited_scene_state(EditorSelection *p_selection, EditorHistory *p_history);
+ void notify_edited_scene_changed();
+
+
+ EditorData();
+};
+
+
+
+class EditorSelection : public Object {
+
+ GDCLASS(EditorSelection,Object);
+public:
+
+ Map<Node*,Object*> selection;
+
+ bool changed;
+ bool nl_changed;
+
+ void _node_removed(Node *p_node);
+
+ List<Object*> editor_plugins;
+ List<Node*> selected_node_list;
+
+ void _update_nl();
+ Array _get_selected_nodes();
+ Array _get_transformable_selected_nodes();
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ void add_node(Node *p_node);
+ void remove_node(Node *p_node);
+ bool is_selected(Node *) const;
+
+ template<class T>
+ T* get_node_editor_data(Node *p_node) {
+ if (!selection.has(p_node))
+ return NULL;
+ Object *obj = selection[p_node];
+ if (!obj)
+ return NULL;
+ return obj->cast_to<T>();
+ }
+
+ void add_editor_plugin(Object *p_object);
+
+ void update();
+ void clear();
+
+
+ List<Node*>& get_selected_node_list();
+ Map<Node*,Object*>& get_selection() { return selection; }
+
+
+ EditorSelection();
+ ~EditorSelection();
+};
+
+
+#endif // EDITOR_DATA_H
diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp
new file mode 100644
index 0000000000..235d1f06ba
--- /dev/null
+++ b/editor/editor_dir_dialog.cpp
@@ -0,0 +1,276 @@
+/*************************************************************************/
+/* editor_dir_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_dir_dialog.h"
+
+#include "os/os.h"
+#include "os/keyboard.h"
+#include "editor/editor_settings.h"
+#include "editor/editor_file_system.h"
+
+
+void EditorDirDialog::_update_dir(TreeItem* p_item) {
+
+ updating=true;
+ p_item->clear_children();
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ String cdir = p_item->get_metadata(0);
+
+ da->change_dir(cdir);
+ da->list_dir_begin();
+ String p=da->get_next();
+
+ List<String> dirs;
+ bool ishidden;
+ bool show_hidden = EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files");
+
+ while(p!="") {
+
+ ishidden = da->current_is_hidden();
+
+ if (show_hidden || !ishidden) {
+ if (da->current_is_dir() && !p.begins_with(".")) {
+ dirs.push_back(p);
+ }
+ }
+ p=da->get_next();
+ }
+
+ dirs.sort();
+
+ for(List<String>::Element *E=dirs.front();E;E=E->next()) {
+ TreeItem *ti = tree->create_item(p_item);
+ ti->set_text(0,E->get());
+ ti->set_icon(0,get_icon("Folder","EditorIcons"));
+ ti->set_collapsed(true);
+
+ }
+
+ memdelete(da);
+ updating=false;
+
+}
+
+
+void EditorDirDialog::reload() {
+
+ if (!is_visible_in_tree()) {
+ must_reload=true;
+ return;
+ }
+
+ tree->clear();
+ TreeItem *root = tree->create_item();
+ root->set_metadata(0,"res://");
+ root->set_icon(0,get_icon("Folder","EditorIcons"));
+ root->set_text(0,"/");
+ _update_dir(root);
+ _item_collapsed(root);
+ must_reload=false;
+
+}
+
+
+void EditorDirDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ reload();
+
+ if (!tree->is_connected("item_collapsed",this,"_item_collapsed")) {
+ tree->connect("item_collapsed",this,"_item_collapsed",varray(),CONNECT_DEFERRED);
+ }
+
+ if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed",this,"reload")) {
+ EditorFileSystem::get_singleton()->connect("filesystem_changed",this,"reload");
+ }
+
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+ if (must_reload && is_visible_in_tree()) {
+ reload();
+ }
+ }
+}
+
+void EditorDirDialog::_item_collapsed(Object* _p_item){
+
+ TreeItem *p_item=_p_item->cast_to<TreeItem>();
+
+ if (updating || p_item->is_collapsed())
+ return;
+
+ TreeItem *ci = p_item->get_children();
+ while(ci) {
+
+ String p =ci->get_metadata(0);
+ if (p=="") {
+ String pp = p_item->get_metadata(0);
+ ci->set_metadata(0,pp.plus_file(ci->get_text(0)));
+ _update_dir(ci);
+ }
+ ci=ci->get_next();
+ }
+
+}
+
+void EditorDirDialog::set_current_path(const String& p_path) {
+
+ reload();
+ String p = p_path;
+ if (p.begins_with("res://"))
+ p = p.replace_first("res://","");
+
+ Vector<String> dirs = p.split("/",false);
+
+ TreeItem *r=tree->get_root();
+ for(int i=0;i<dirs.size();i++) {
+
+ String d = dirs[i];
+ TreeItem *p = r->get_children();
+ while(p) {
+
+ if (p->get_text(0)==d)
+ break;
+ p=p->get_next();
+ }
+
+ ERR_FAIL_COND(!p);
+ String pp = p->get_metadata(0);
+ if (pp=="") {
+ p->set_metadata(0,String(r->get_metadata(0)).plus_file(d));
+ _update_dir(p);
+ }
+ updating=true;
+ p->set_collapsed(false);
+ updating=false;
+ _item_collapsed(p);
+ r=p;
+ }
+
+ r->select(0);
+
+}
+
+void EditorDirDialog::ok_pressed() {
+
+ TreeItem *ti=tree->get_selected();
+ if (!ti)
+ return;
+
+ String dir = ti->get_metadata(0);
+ emit_signal("dir_selected",dir);
+ hide();
+}
+
+
+void EditorDirDialog::_make_dir() {
+
+ TreeItem *ti=tree->get_selected();
+ if (!ti) {
+ mkdirerr->set_text("Please select a base directory first");
+ mkdirerr->popup_centered_minsize();
+ return;
+ }
+
+ makedialog->popup_centered_minsize(Size2(250,80));
+ makedirname->grab_focus();
+}
+
+void EditorDirDialog::_make_dir_confirm() {
+
+ TreeItem *ti=tree->get_selected();
+ if (!ti)
+ return;
+
+ String dir = ti->get_metadata(0);
+
+ DirAccess *d = DirAccess::open(dir);
+ ERR_FAIL_COND(!d);
+ Error err = d->make_dir(makedirname->get_text());
+
+ if (err!=OK) {
+ mkdirerr->popup_centered_minsize(Size2(250,80));
+ } else {
+ set_current_path(dir.plus_file(makedirname->get_text()));
+ }
+ makedirname->set_text(""); // reset label
+}
+
+
+void EditorDirDialog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_item_collapsed"),&EditorDirDialog::_item_collapsed);
+ ClassDB::bind_method(D_METHOD("_make_dir"),&EditorDirDialog::_make_dir);
+ ClassDB::bind_method(D_METHOD("_make_dir_confirm"),&EditorDirDialog::_make_dir_confirm);
+ ClassDB::bind_method(D_METHOD("reload"),&EditorDirDialog::reload);
+
+ ADD_SIGNAL(MethodInfo("dir_selected",PropertyInfo(Variant::STRING,"dir")));
+}
+
+
+
+EditorDirDialog::EditorDirDialog() {
+
+ updating=false;
+
+ set_title(TTR("Choose a Directory"));
+ set_hide_on_ok(false);
+
+ tree = memnew( Tree );
+ add_child(tree);
+
+ tree->connect("item_activated",this,"_ok");
+
+ makedir = add_button(TTR("Create Folder"),OS::get_singleton()->get_swap_ok_cancel()?true:false,"makedir");
+ makedir->connect("pressed",this,"_make_dir");
+
+ makedialog = memnew( ConfirmationDialog );
+ makedialog->set_title(TTR("Create Folder"));
+ add_child(makedialog);
+
+ VBoxContainer *makevb= memnew( VBoxContainer );
+ makedialog->add_child(makevb);
+ //makedialog->set_child_rect(makevb);
+
+ makedirname = memnew( LineEdit );
+ makevb->add_margin_child(TTR("Name:"),makedirname);
+ makedialog->register_text_enter(makedirname);
+ makedialog->connect("confirmed",this,"_make_dir_confirm");
+
+ mkdirerr = memnew( AcceptDialog );
+ mkdirerr->set_text(TTR("Could not create folder."));
+ add_child(mkdirerr);
+
+ get_ok()->set_text(TTR("Choose"));
+
+ must_reload=false;
+
+
+
+}
diff --git a/editor/editor_dir_dialog.h b/editor/editor_dir_dialog.h
new file mode 100644
index 0000000000..0577ff0442
--- /dev/null
+++ b/editor/editor_dir_dialog.h
@@ -0,0 +1,71 @@
+/*************************************************************************/
+/* editor_dir_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_DIR_DIALOG_H
+#define EDITOR_DIR_DIALOG_H
+
+#include "os/dir_access.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+
+class EditorDirDialog : public ConfirmationDialog {
+ GDCLASS(EditorDirDialog,ConfirmationDialog);
+
+
+ ConfirmationDialog *makedialog;
+ LineEdit *makedirname;
+ AcceptDialog *mkdirerr;
+
+ Button *makedir;
+
+ Tree *tree;
+ bool updating;
+
+ void _item_collapsed(Object* p_item);
+ void _update_dir(TreeItem* p_item);
+
+ void _make_dir();
+ void _make_dir_confirm();
+
+ void ok_pressed();
+
+ bool must_reload;
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_current_path(const String& p_path);
+ void reload();
+ EditorDirDialog();
+};
+
+#endif // EDITOR_DIR_DIALOG_H
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
new file mode 100644
index 0000000000..f5840d00fb
--- /dev/null
+++ b/editor/editor_export.cpp
@@ -0,0 +1,3231 @@
+/*************************************************************************/
+/* editor_import_export.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_export.h"
+#include "version.h"
+#include "script_language.h"
+#include "global_config.h"
+#include "os/file_access.h"
+#include "os/dir_access.h"
+#include "editor/editor_file_system.h"
+#include "io/resource_loader.h"
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "io/config_file.h"
+#include "io/resource_saver.h"
+#include "io/md5.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "io/zip_io.h"
+
+static int _get_pad(int p_alignment, int p_n) {
+
+ int rest = p_n % p_alignment;
+ int pad = 0;
+ if (rest > 0) {
+ pad = p_alignment - rest;
+ };
+
+ return pad;
+};
+
+#define PCK_PADDING 16
+
+bool EditorExportPreset::_set(const StringName& p_name, const Variant& p_value) {
+
+ if (values.has(p_name)) {
+ values[p_name]=p_value;
+ EditorExport::singleton->save_presets();
+ return true;
+ }
+
+ return false;
+}
+
+bool EditorExportPreset::_get(const StringName& p_name,Variant &r_ret) const{
+
+ if (values.has(p_name)) {
+ r_ret=values[p_name];
+ return true;
+ }
+
+ return false;
+}
+void EditorExportPreset::_get_property_list( List<PropertyInfo> *p_list) const{
+
+ for (const List<PropertyInfo>::Element *E=properties.front();E;E=E->next()) {
+
+ p_list->push_back(E->get());
+ }
+}
+
+Ref<EditorExportPlatform> EditorExportPreset::get_platform() const {
+
+ return platform;
+}
+
+Vector<String> EditorExportPreset::get_files_to_export() const {
+
+ Vector<String> files;
+ for(Set<String>::Element *E=selected_files.front();E;E=E->next()) {
+ files.push_back(E->get());
+ }
+ return files;
+}
+
+void EditorExportPreset::set_name(const String& p_name) {
+ name=p_name;
+ EditorExport::singleton->save_presets();
+
+}
+
+String EditorExportPreset::get_name() const {
+ return name;
+
+}
+
+void EditorExportPreset::set_runnable(bool p_enable) {
+
+ runnable=p_enable;
+ EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::is_runnable() const {
+
+ return runnable;
+}
+
+void EditorExportPreset::set_export_filter(ExportFilter p_filter) {
+
+ export_filter=p_filter;
+ EditorExport::singleton->save_presets();
+
+}
+
+EditorExportPreset::ExportFilter EditorExportPreset::get_export_filter() const {
+ return export_filter;
+}
+
+void EditorExportPreset::set_include_filter(const String& p_include) {
+
+ include_filter=p_include;
+ EditorExport::singleton->save_presets();
+
+}
+
+String EditorExportPreset::get_include_filter() const {
+
+ return include_filter;
+}
+
+void EditorExportPreset::set_exclude_filter(const String& p_exclude) {
+
+ exclude_filter=p_exclude;
+ EditorExport::singleton->save_presets();
+}
+
+String EditorExportPreset::get_exclude_filter() const {
+
+ return exclude_filter;
+}
+
+void EditorExportPreset::add_export_file(const String& p_path) {
+
+ selected_files.insert(p_path);
+ EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::remove_export_file(const String& p_path) {
+ selected_files.erase(p_path);
+ EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::has_export_file(const String& p_path) {
+
+ return selected_files.has(p_path);
+}
+
+void EditorExportPreset::add_patch(const String& p_path,int p_at_pos) {
+
+ if (p_at_pos<0)
+ patches.push_back(p_path);
+ else
+ patches.insert(p_at_pos,p_path);
+ EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::remove_patch(int p_idx) {
+ patches.remove(p_idx);
+ EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::set_patch(int p_index,const String& p_path) {
+ ERR_FAIL_INDEX(p_index,patches.size());
+ patches[p_index]=p_path;
+ EditorExport::singleton->save_presets();
+}
+String EditorExportPreset::get_patch(int p_index) {
+
+ ERR_FAIL_INDEX_V(p_index,patches.size(),String());
+ return patches[p_index];
+}
+
+Vector<String> EditorExportPreset::get_patches() const {
+ return patches;
+}
+
+EditorExportPreset::EditorExportPreset() {
+
+ export_filter=EXPORT_ALL_RESOURCES;
+ runnable=false;
+}
+
+
+///////////////////////////////////
+
+void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags) {
+
+ String host = EditorSettings::get_singleton()->get("network/debug_host");
+
+ if (p_flags&DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST)
+ host="localhost";
+
+ if (p_flags&DEBUG_FLAG_DUMB_CLIENT) {
+ int port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
+ String passwd = EditorSettings::get_singleton()->get("filesystem/file_server/password");
+ r_flags.push_back("-rfs");
+ r_flags.push_back(host+":"+itos(port));
+ if (passwd!="") {
+ r_flags.push_back("-rfs_pass");
+ r_flags.push_back(passwd);
+ }
+ }
+
+ if (p_flags&DEBUG_FLAG_REMOTE_DEBUG) {
+
+ r_flags.push_back("-rdebug");
+
+ r_flags.push_back(host+":"+String::num(GLOBAL_DEF("network/debug/remote_port", 6007)));
+
+ List<String> breakpoints;
+ ScriptEditor::get_singleton()->get_breakpoints(&breakpoints);
+
+
+ if (breakpoints.size()) {
+
+ r_flags.push_back("-bp");
+ String bpoints;
+ for(const List<String>::Element *E=breakpoints.front();E;E=E->next()) {
+
+ bpoints+=E->get().replace(" ","%20");
+ if (E->next())
+ bpoints+=",";
+ }
+
+ r_flags.push_back(bpoints);
+ }
+
+ }
+
+ if (p_flags&DEBUG_FLAG_VIEW_COLLISONS) {
+
+ r_flags.push_back("-debugcol");
+ }
+
+ if (p_flags&DEBUG_FLAG_VIEW_NAVIGATION) {
+
+ r_flags.push_back("-debugnav");
+ }
+}
+
+Error EditorExportPlatform::_save_pack_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
+
+ PackData *pd = (PackData*)p_userdata;
+
+ SavedData sd;
+ sd.path_utf8=p_path.utf8();
+ sd.ofs = pd->f->get_pos();
+ sd.size = p_data.size();
+
+ pd->f->store_buffer(p_data.ptr(),p_data.size());
+ int pad = _get_pad(PCK_PADDING,sd.size);
+ for(int i=0;i<pad;i++) {
+ pd->f->store_8(0);
+ }
+
+ {
+ MD5_CTX ctx;
+ MD5Init(&ctx);
+ MD5Update(&ctx,(unsigned char*)p_data.ptr(),p_data.size());
+ MD5Final(&ctx);
+ sd.md5.resize(16);
+ for(int i=0;i<16;i++) {
+ sd.md5[i]=ctx.digest[i];
+ }
+ }
+
+ pd->file_ofs.push_back(sd);
+
+ pd->ep->step(TTR("Storing File:")+" "+p_path,2+p_file*100/p_total,false);
+
+ return OK;
+}
+
+Error EditorExportPlatform::_save_zip_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
+
+
+ String path=p_path.replace_first("res://","");
+
+ ZipData *zd = (ZipData*)p_userdata;
+
+ zipFile zip=(zipFile)zd->zip;
+
+ zipOpenNewFileInZip(zip,
+ path.utf8().get_data(),
+ NULL,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ Z_DEFLATED,
+ Z_DEFAULT_COMPRESSION);
+
+ zipWriteInFileInZip(zip,p_data.ptr(),p_data.size());
+ zipCloseFileInZip(zip);
+
+ zd->ep->step(TTR("Storing File:")+" "+p_path,2+p_file*100/p_total,false);
+
+ return OK;
+}
+
+String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
+
+ String user_file = EditorSettings::get_singleton()->get_settings_path()
+ +"/templates/"+itos(VERSION_MAJOR)+"."+itos(VERSION_MINOR)+"."+_MKSTR(VERSION_STATUS)+"/"+template_file_name;
+ String system_file=OS::get_singleton()->get_installed_templates_path();
+ bool has_system_path=(system_file!="");
+ system_file+=template_file_name;
+
+ // Prefer user file
+ if (FileAccess::exists(user_file)) {
+ return user_file;
+ }
+
+ // Now check system file
+ if (has_system_path) {
+ if (FileAccess::exists(system_file)) {
+ return system_file;
+ }
+ }
+
+ // Not found
+ if (err) {
+ *err+="No export template found at \""+user_file+"\"";
+ if (has_system_path)
+ *err+="\n or \""+system_file+"\".";
+ else
+ *err+=".";
+ }
+ return "";
+}
+
+Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
+
+ Ref<EditorExportPreset> preset;
+ preset.instance();
+ preset->platform=Ref<EditorExportPlatform>(this);
+
+ List<ExportOption> options;
+ get_export_options(&options);
+
+ for (List<ExportOption>::Element *E=options.front();E;E=E->next()) {
+
+ preset->properties.push_back(E->get().option);
+ preset->values[E->get().option.name]=E->get().default_value;
+ }
+
+ return preset;
+
+}
+
+void EditorExportPlatform::_export_find_resources(EditorFileSystemDirectory *p_dir,Set<String>& p_paths) {
+
+ for(int i=0;i<p_dir->get_subdir_count();i++) {
+ _export_find_resources(p_dir->get_subdir(i),p_paths);
+ }
+
+ for(int i=0;i<p_dir->get_file_count();i++) {
+ p_paths.insert(p_dir->get_file_path(i));
+ }
+}
+
+
+void EditorExportPlatform::_export_find_dependencies(const String& p_path,Set<String>& p_paths) {
+
+ if (p_paths.has(p_path))
+ return;
+
+ p_paths.insert(p_path);
+
+ EditorFileSystemDirectory *dir;
+ int file_idx;
+ dir = EditorFileSystem::get_singleton()->find_file(p_path,&file_idx);
+ if (!dir)
+ return;
+
+ Vector<String> deps = dir->get_file_deps(file_idx);
+
+ for(int i=0;i<deps.size();i++) {
+
+ _export_find_dependencies(deps[i],p_paths);
+ }
+}
+
+
+Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset>& p_preset,EditorExportSaveFunction p_func, void* p_udata) {
+
+ Ref<EditorExportPlatform> platform = p_preset->get_platform();
+ List<String> feature_list;
+ platform->get_preset_features(p_preset,&feature_list);
+ //figure out features
+ Set<String> features;
+ for (List<String>::Element *E=feature_list.front();E;E=E->next()) {
+ features.insert(E->get());
+ }
+
+ //figure out paths of files that will be exported
+ Set<String> paths;
+
+ if (p_preset->get_export_filter()==EditorExportPreset::EXPORT_ALL_RESOURCES) {
+ //find stuff
+ _export_find_resources(EditorFileSystem::get_singleton()->get_filesystem(),paths);
+ } else {
+ bool scenes_only = p_preset->get_export_filter()==EditorExportPreset::EXPORT_SELECTED_SCENES;
+
+ Vector<String> files = p_preset->get_files_to_export();
+ for(int i=0;i<files.size();i++) {
+ if (scenes_only && ResourceLoader::get_resource_type(files[i])!="PackedScene")
+ continue;
+
+ _export_find_dependencies(files[i],paths);
+ }
+ }
+
+ //store everything in the export medium
+ int idx = 0;
+ int total=paths.size();
+
+ for(Set<String>::Element *E=paths.front();E;E=E->next()) {
+
+ String path = E->get();
+
+ if (FileAccess::exists(path+".import")) {
+ //file is imported, replace by what it imports
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(path+".import");
+ if (err!=OK) {
+ ERR_PRINTS("Could not parse: '"+path+"', not exported.");
+ continue;
+ }
+
+ List<String> remaps;
+ config->get_section_keys("remap",&remaps);
+
+ for(List<String>::Element *F=remaps.front();F;F=F->next()) {
+
+ String remap=F->get();
+ if (remap=="path") {
+ String remapped_path=config->get_value("remap",remap);
+ Vector<uint8_t> array = FileAccess::get_file_as_array(remapped_path);
+ p_func(p_udata,remapped_path,array,idx,total);
+ } else if (remap.begins_with("path.")) {
+ String feature = remap.get_slice(".",1);
+ if (features.has(feature)) {
+ String remapped_path=config->get_value("remap",remap);
+ Vector<uint8_t> array = FileAccess::get_file_as_array(remapped_path);
+ p_func(p_udata,remapped_path,array,idx,total);
+ }
+ }
+ }
+
+ //also save the .import file
+ Vector<uint8_t> array = FileAccess::get_file_as_array(path+".import");
+ p_func(p_udata,path+".import",array,idx,total);
+
+ } else {
+ //just store it as it comes
+ Vector<uint8_t> array = FileAccess::get_file_as_array(path);
+ p_func(p_udata,path,array,idx,total);
+ }
+
+ idx++;
+ }
+
+ //save config!
+
+ String config_file="godot.cfb";
+ String engine_cfb =EditorSettings::get_singleton()->get_settings_path()+"/tmp/tmp"+config_file;
+ GlobalConfig::get_singleton()->save_custom(engine_cfb);
+ Vector<uint8_t> data = FileAccess::get_file_as_array(engine_cfb);
+
+ p_func(p_udata,"res://"+config_file,data,idx,total);
+
+ return OK;
+}
+
+Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset>& p_preset,const String& p_path) {
+
+ EditorProgress ep("savepack",TTR("Packing"),102);
+
+ String tmppath = EditorSettings::get_singleton()->get_settings_path()+"/tmp/packtmp";
+ FileAccess *ftmp = FileAccess::open(tmppath,FileAccess::WRITE);
+ ERR_FAIL_COND_V(!ftmp,ERR_CANT_CREATE)
+
+ PackData pd;
+ pd.ep=&ep;
+ pd.f=ftmp;
+
+ Error err = export_project_files(p_preset,_save_pack_file,&pd);
+
+ memdelete(ftmp); //close tmp file
+
+ if (err)
+ return err;
+
+ pd.file_ofs.sort(); //do sort, so we can do binary search later
+
+
+ FileAccess *f = FileAccess::open(p_path,FileAccess::WRITE);
+ ERR_FAIL_COND_V(!f,ERR_CANT_CREATE)
+ f->store_32(0x43504447); //GDPK
+ f->store_32(1); //pack version
+ f->store_32(VERSION_MAJOR);
+ f->store_32(VERSION_MINOR);
+ f->store_32(0); //hmph
+ for(int i=0;i<16;i++) {
+ //reserved
+ f->store_32(0);
+ }
+
+ f->store_32(pd.file_ofs.size()); //amount of files
+
+ size_t header_size = f->get_pos();
+
+ //precalculate header size
+
+ for(int i=0;i<pd.file_ofs.size();i++) {
+ header_size += 4; // size of path string (32 bits is enough)
+ uint32_t string_len = pd.file_ofs[i].path_utf8.length();
+ header_size += string_len + _get_pad(4,string_len); ///size of path string
+ header_size += 8; // offset to file _with_ header size included
+ header_size += 8; // size of file
+ header_size +=16; // md5
+
+ }
+
+ size_t header_padding = _get_pad(PCK_PADDING,header_size);
+
+
+ for(int i=0;i<pd.file_ofs.size();i++) {
+
+ uint32_t string_len = pd.file_ofs[i].path_utf8.length();
+ uint32_t pad = _get_pad(4,string_len);;
+ f->store_32(string_len+pad);
+ f->store_buffer((const uint8_t*)pd.file_ofs[i].path_utf8.get_data(),string_len);
+ for(uint32_t j=0;j<pad;j++) {
+ f->store_8(0);
+ }
+
+ f->store_64(pd.file_ofs[i].ofs + header_padding + header_size);
+ f->store_64(pd.file_ofs[i].size); // pay attention here, this is where file is
+ f->store_buffer(pd.file_ofs[i].md5.ptr(),16); //also save md5 for file
+ }
+
+ for(uint32_t j=0;j<header_padding;j++) {
+ f->store_8(0);
+ }
+
+ //save the rest of the data
+
+ ftmp = FileAccess::open(tmppath,FileAccess::READ);
+ if (!ftmp) {
+ memdelete(f);
+ ERR_FAIL_COND_V(!ftmp,ERR_CANT_CREATE)
+ }
+
+ const int bufsize=16384;
+ uint8_t buf[bufsize];
+
+ while(true) {
+
+ int got = ftmp->get_buffer(buf,bufsize);
+ if (got<=0)
+ break;
+ f->store_buffer(buf,got);
+ }
+
+ memdelete(ftmp);
+
+ f->store_32(0x43504447); //GDPK
+ memdelete(f);
+
+ return OK;
+}
+
+Error EditorExportPlatform::save_zip(const Ref<EditorExportPreset>& p_preset,const String& p_path) {
+
+ EditorProgress ep("savezip",TTR("Packing"),102);
+
+ //FileAccess *tmp = FileAccess::open(tmppath,FileAccess::WRITE);
+
+ FileAccess *src_f;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+ zipFile zip=zipOpen2(p_path.utf8().get_data(),APPEND_STATUS_CREATE,NULL,&io);
+
+ ZipData zd;
+ zd.ep=&ep;
+ zd.zip=zip;
+
+
+ Error err = export_project_files(p_preset,_save_zip_file,&zd);
+
+ zipClose(zip,NULL);
+
+ return OK;
+}
+
+EditorExportPlatform::EditorExportPlatform() {
+
+
+}
+
+
+////
+
+EditorExport *EditorExport::singleton=NULL;
+
+
+void EditorExport::_save() {
+
+
+ Ref<ConfigFile> config;
+ config.instance();
+ for(int i=0;i<export_presets.size();i++) {
+
+ Ref<EditorExportPreset> preset = export_presets[i];
+ String section="preset."+itos(i);
+
+ config->set_value(section,"name",preset->get_name());
+ config->set_value(section,"platform",preset->get_platform()->get_name());
+ config->set_value(section,"runnable",preset->is_runnable());
+ bool save_files=false;
+ switch(preset->get_export_filter()) {
+ case EditorExportPreset::EXPORT_ALL_RESOURCES: {
+ config->set_value(section,"export_filter","all_resources");
+ } break;
+ case EditorExportPreset::EXPORT_SELECTED_SCENES: {
+ config->set_value(section,"export_filter","scenes");
+ save_files=true;
+ } break;
+ case EditorExportPreset::EXPORT_SELECTED_RESOURCES: {
+ config->set_value(section,"export_filter","resources");
+ save_files=true;
+ } break;
+
+
+ }
+
+ if (save_files) {
+ Vector<String> export_files = preset->get_files_to_export();
+ config->set_value(section,"export_files",export_files);
+ }
+ config->set_value(section,"include_filter",preset->get_include_filter());
+ config->set_value(section,"exclude_filter",preset->get_exclude_filter());
+ config->set_value(section,"patch_list",preset->get_patches());
+
+ String option_section="preset."+itos(i)+".options";
+
+ for (const List<PropertyInfo>::Element *E=preset->get_properties().front();E;E=E->next()) {
+ config->set_value(option_section,E->get().name,preset->get(E->get().name));
+ }
+ }
+
+ config->save("res://export_presets.cfg");
+
+ print_line("saved ok");
+
+}
+
+
+void EditorExport::save_presets() {
+
+ print_line("save presets");
+ if (block_save)
+ return;
+ save_timer->start();
+}
+
+void EditorExport::_bind_methods() {
+
+ ClassDB::bind_method("_save",&EditorExport::_save);
+}
+
+void EditorExport::add_export_platform(const Ref<EditorExportPlatform>& p_platform) {
+
+ export_platforms.push_back(p_platform);
+}
+
+int EditorExport::get_export_platform_count() {
+
+ return export_platforms.size();
+}
+
+Ref<EditorExportPlatform> EditorExport::get_export_platform(int p_idx) {
+
+ ERR_FAIL_INDEX_V(p_idx,export_platforms.size(),Ref<EditorExportPlatform>());
+
+ return export_platforms[p_idx];
+}
+
+
+void EditorExport::add_export_preset(const Ref<EditorExportPreset>& p_preset,int p_at_pos) {
+
+ if (p_at_pos<0)
+ export_presets.push_back(p_preset);
+ else
+ export_presets.insert(p_at_pos,p_preset);
+
+
+}
+
+int EditorExport::get_export_preset_count() const {
+
+ return export_presets.size();
+}
+
+Ref<EditorExportPreset> EditorExport::get_export_preset(int p_idx) {
+
+ ERR_FAIL_INDEX_V( p_idx, export_presets.size(),Ref<EditorExportPreset>() );
+ return export_presets[p_idx];
+}
+
+void EditorExport::remove_export_preset(int p_idx) {
+
+ export_presets.remove(p_idx);
+}
+
+void EditorExport::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ load_config();
+ }
+}
+
+void EditorExport::load_config() {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load("res://export_presets.cfg");
+ if (err!=OK)
+ return;
+
+ block_save=true;
+
+ int index=0;
+ while(true) {
+
+ String section = "preset."+itos(index);
+ if (!config->has_section(section))
+ break;
+
+ String platform=config->get_value(section,"platform");
+
+ Ref<EditorExportPreset> preset;
+
+ for(int i=0;i<export_platforms.size();i++) {
+ if (export_platforms[i]->get_name()==platform) {
+ preset = export_platforms[i]->create_preset();
+ break;
+ }
+ }
+
+ if (!preset.is_valid()) {
+ index++;
+ ERR_CONTINUE(!preset.is_valid());
+ }
+
+ preset->set_name( config->get_value(section,"name") );
+ preset->set_runnable( config->get_value(section,"runnable") );
+
+ String export_filter = config->get_value(section,"export_filter");
+
+ bool get_files=false;
+
+ if (export_filter=="all_resources") {
+ preset->set_export_filter(EditorExportPreset::EXPORT_ALL_RESOURCES);
+ } else if (export_filter=="scenes") {
+ preset->set_export_filter(EditorExportPreset::EXPORT_SELECTED_SCENES);
+ get_files=true;
+ } else if (export_filter=="resources") {
+ preset->set_export_filter(EditorExportPreset::EXPORT_SELECTED_RESOURCES);
+ get_files=true;
+ }
+
+ if (get_files) {
+
+ Vector<String> files = config->get_value(section,"export_files");
+
+ for(int i=0;i<files.size();i++) {
+ preset->add_export_file(files[i]);
+ }
+ }
+
+ preset->set_include_filter( config->get_value(section,"include_filter") );
+ preset->set_exclude_filter( config->get_value(section,"exclude_filter") );
+
+
+ Vector<String> patch_list = config->get_value(section,"patch_list");
+
+ for(int i=0;i<patch_list.size();i++) {
+ preset->add_patch(patch_list[i]);
+ }
+
+ String option_section="preset."+itos(index)+".options";
+
+ List<String> options;
+
+ config->get_section_keys(option_section,&options);
+
+ for (List<String>::Element *E=options.front();E;E=E->next()) {
+
+ Variant value = config->get_value(option_section,E->get());
+
+ preset->set(E->get(),value);
+ }
+
+ add_export_preset(preset);
+ index++;
+ }
+
+ block_save=false;
+
+}
+
+
+
+EditorExport::EditorExport() {
+
+ save_timer = memnew( Timer );
+ add_child(save_timer);
+ save_timer->set_wait_time(0.8);
+ save_timer->set_one_shot(true);
+ save_timer->connect("timeout",this,"_save");
+ block_save=false;
+
+ singleton=this;
+}
+
+EditorExport::~EditorExport() {
+
+
+}
+
+
+//////////
+
+void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String>* r_features) {
+
+ if (p_preset->get("texture_format/s3tc")) {
+ r_features->push_back("s3tc");
+ }
+ if (p_preset->get("texture_format/etc")) {
+ r_features->push_back("etc");
+ }
+ if (p_preset->get("texture_format/etc2")) {
+ r_features->push_back("etc2");
+ }
+}
+
+void EditorExportPlatformPC::get_export_options(List<ExportOption> *r_options) {
+
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/s3tc"),true));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/etc"),false));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/etc2"),false));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"binary_format/64_bits"),true));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING,"custom_template/release",PROPERTY_HINT_GLOBAL_FILE),""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING,"custom_template/debug",PROPERTY_HINT_GLOBAL_FILE),""));
+}
+
+String EditorExportPlatformPC::get_name() const {
+
+ return name;
+}
+Ref<Texture> EditorExportPlatformPC::get_logo() const {
+
+ return logo;
+}
+
+bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset>& p_preset,String &r_error, bool &r_missing_templates) const {
+
+ r_missing_templates=false;
+
+ if (find_export_template(release_file_32)==String()) {
+ r_missing_templates=true;
+ } else if (find_export_template(debug_file_32)==String()) {
+ r_missing_templates=true;
+ } else if (find_export_template(release_file_64)==String()) {
+ r_missing_templates=true;
+ } else if (find_export_template(debug_file_64)==String()) {
+ r_missing_templates=true;
+ }
+ return !r_missing_templates;
+}
+
+String EditorExportPlatformPC::get_binary_extension() const {
+ return extension;
+}
+
+Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset>& p_preset, bool p_debug, const String& p_path, int p_flags) {
+
+ return OK;
+}
+
+void EditorExportPlatformPC::set_extension(const String& p_extension) {
+ extension=p_extension;
+}
+
+void EditorExportPlatformPC::set_name(const String& p_name) {
+ name=p_name;
+}
+
+void EditorExportPlatformPC::set_logo(const Ref<Texture>& p_logo) {
+ logo=p_logo;
+}
+
+void EditorExportPlatformPC::set_release_64(const String& p_file) {
+
+ release_file_64=p_file;
+}
+
+void EditorExportPlatformPC::set_release_32(const String& p_file){
+
+ release_file_32=p_file;
+}
+void EditorExportPlatformPC::set_debug_64(const String& p_file){
+
+ debug_file_64=p_file;
+}
+void EditorExportPlatformPC::set_debug_32(const String& p_file){
+
+ debug_file_32=p_file;
+
+}
+
+EditorExportPlatformPC::EditorExportPlatformPC() {
+
+}
+
+////////
+
+#if 0
+#include "version.h"
+#include "script_language.h"
+#include "global_config.h"
+#include "os/file_access.h"
+#include "os/dir_access.h"
+#include "editor/editor_file_system.h"
+#include "io/resource_loader.h"
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "io/config_file.h"
+#include "io/resource_saver.h"
+#include "io/md5.h"
+#include "io_plugins/editor_texture_import_plugin.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "io/zip_io.h"
+
+
+String EditorImportPlugin::validate_source_path(const String& p_path) {
+
+ String gp = GlobalConfig::get_singleton()->globalize_path(p_path);
+ String rp = GlobalConfig::get_singleton()->get_resource_path();
+ if (!rp.ends_with("/"))
+ rp+="/";
+
+ return rp.path_to_file(gp);
+}
+
+String EditorImportPlugin::expand_source_path(const String& p_path) {
+
+ if (p_path.is_rel_path()) {
+ return GlobalConfig::get_singleton()->get_resource_path().plus_file(p_path).simplify_path();
+ } else {
+ return p_path;
+ }
+}
+
+
+String EditorImportPlugin::_validate_source_path(const String& p_path) {
+
+ return validate_source_path(p_path);
+}
+
+String EditorImportPlugin::_expand_source_path(const String& p_path) {
+
+ return expand_source_path(p_path);
+}
+
+void EditorImportPlugin::_bind_methods() {
+
+
+ ClassDB::bind_method(D_METHOD("validate_source_path","path"),&EditorImportPlugin::_validate_source_path);
+ ClassDB::bind_method(D_METHOD("expand_source_path","path"),&EditorImportPlugin::_expand_source_path);
+
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::STRING,"get_name"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::STRING,"get_visible_name"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("import_dialog",PropertyInfo(Variant::STRING,"from")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::INT,"import",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"from",PROPERTY_HINT_RESOURCE_TYPE,"ResourceImportMetadata")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::POOL_BYTE_ARRAY,"custom_export",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"platform",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatform")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("import_from_drop",PropertyInfo(Variant::POOL_STRING_ARRAY,"files"),PropertyInfo(Variant::STRING,"dest_path")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("reimport_multiple_files",PropertyInfo(Variant::POOL_STRING_ARRAY,"files")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"can_reimport_multiple_files"));
+
+ //BIND_VMETHOD( mi );
+}
+
+String EditorImportPlugin::get_name() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_name")) {
+ return get_script_instance()->call("get_name");
+ }
+
+ ERR_FAIL_V("");
+}
+
+String EditorImportPlugin::get_visible_name() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_visible_name")) {
+ return get_script_instance()->call("get_visible_name");
+ }
+
+ ERR_FAIL_V("");
+}
+
+
+void EditorImportPlugin::import_dialog(const String& p_from) {
+
+ if (get_script_instance() && get_script_instance()->has_method("import_dialog")) {
+ get_script_instance()->call("import_dialog",p_from);
+ return;
+ }
+
+ ERR_FAIL();
+
+}
+
+Error EditorImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from) {
+
+ if (get_script_instance() && get_script_instance()->has_method("import")) {
+ return Error(get_script_instance()->call("import",p_path,p_from).operator int());
+ }
+
+ ERR_FAIL_V(ERR_UNAVAILABLE);
+}
+
+Vector<uint8_t> EditorImportPlugin::custom_export(const String& p_path, const Ref<EditorExportPlatform> &p_platform) {
+
+ if (get_script_instance() && get_script_instance()->has_method("custom_export")) {
+ get_script_instance()->call("custom_export",p_path,p_platform);
+ }
+
+ return Vector<uint8_t>();
+}
+
+bool EditorImportPlugin::can_reimport_multiple_files() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("can_reimport_multiple_files")) {
+ return get_script_instance()->call("can_reimport_multiple_files");
+ }
+
+ return false;
+}
+void EditorImportPlugin::reimport_multiple_files(const Vector<String>& p_list) {
+
+ if (get_script_instance() && get_script_instance()->has_method("reimport_multiple_files")) {
+ get_script_instance()->call("reimport_multiple_files",p_list);
+ }
+
+}
+
+void EditorImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+ if (get_script_instance() && get_script_instance()->has_method("import_from_drop")) {
+ get_script_instance()->call("import_from_drop",p_drop,p_dest_path);
+ }
+
+}
+
+EditorImportPlugin::EditorImportPlugin() {
+
+
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+void EditorExportPlugin::_bind_methods() {
+
+ MethodInfo mi = MethodInfo("custom_export:Variant",PropertyInfo(Variant::STRING,"name"),PropertyInfo(Variant::OBJECT,"platform",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatform"));
+ mi.return_val.type=Variant::POOL_BYTE_ARRAY;
+
+ BIND_VMETHOD( mi );
+}
+
+
+Vector<uint8_t> EditorExportPlugin::custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform) {
+
+ if (get_script_instance()) {
+
+ Variant d = get_script_instance()->call("custom_export",p_path,p_platform);
+ if (d.get_type()==Variant::NIL)
+ return Vector<uint8_t>();
+ if (d.get_type()==Variant::POOL_BYTE_ARRAY)
+ return d;
+
+ ERR_FAIL_COND_V(d.get_type()!=Variant::DICTIONARY,Vector<uint8_t>());
+ Dictionary dict=d;
+ ERR_FAIL_COND_V(!dict.has("name"),Vector<uint8_t>());
+ ERR_FAIL_COND_V(!dict.has("data"),Vector<uint8_t>());
+ p_path=dict["name"];
+ return dict["data"];
+ }
+
+ return Vector<uint8_t>();
+
+}
+
+
+EditorExportPlugin::EditorExportPlugin() {
+
+
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+static void _add_to_list(EditorFileSystemDirectory *p_efsd,Set<StringName>& r_list) {
+
+ for(int i=0;i<p_efsd->get_subdir_count();i++) {
+
+ _add_to_list(p_efsd->get_subdir(i),r_list);
+ }
+
+ for(int i=0;i<p_efsd->get_file_count();i++) {
+ r_list.insert(p_efsd->get_file_path(i));
+ }
+}
+
+
+struct __EESortDepCmp {
+
+ _FORCE_INLINE_ bool operator()(const StringName& p_l,const StringName& p_r) const {
+ return p_l.operator String() < p_r.operator String();
+ }
+};
+
+
+
+
+static void _edit_files_with_filter(DirAccess *da,const List<String>& p_filters,Set<StringName>& r_list,bool exclude) {
+
+
+ List<String> files;
+ List<String> dirs;
+
+ da->list_dir_begin();
+
+ String f = da->get_next();
+ while(f!="") {
+
+ print_line("HOHO: "+f);
+ if (da->current_is_dir())
+ dirs.push_back(f);
+ else
+ files.push_back(f);
+
+ f=da->get_next();
+ }
+
+ String r = da->get_current_dir().replace("\\","/");
+ if (!r.ends_with("/"))
+ r+="/";
+
+ print_line("AT: "+r);
+
+ for(List<String>::Element *E=files.front();E;E=E->next()) {
+ String fullpath=r+E->get();
+ for(const List<String>::Element *F=p_filters.front();F;F=F->next()) {
+
+ if (fullpath.matchn(F->get())) {
+ String act = TTR("Added:")+" ";
+
+ if (!exclude) {
+ r_list.insert(fullpath);
+ } else {
+ act = TTR("Removed:")+" ";
+ r_list.erase(fullpath);
+ }
+
+
+ print_line(act+fullpath);
+ }
+ }
+ }
+
+ da->list_dir_end();
+
+ for(List<String>::Element *E=dirs.front();E;E=E->next()) {
+ if (E->get().begins_with("."))
+ continue;
+ da->change_dir(E->get());
+ _edit_files_with_filter(da,p_filters,r_list,exclude);
+ da->change_dir("..");
+ }
+
+}
+
+static void _edit_filter_list(Set<StringName>& r_list,const String& p_filter,bool exclude) {
+
+ if (p_filter=="")
+ return;
+ Vector<String> split = p_filter.split(",");
+ List<String> filters;
+ for(int i=0;i<split.size();i++) {
+ String f = split[i].strip_edges();
+ if (f.empty())
+ continue;
+ filters.push_back(f);
+ }
+
+ DirAccess *da = DirAccess::open("res://");
+ ERR_FAIL_NULL(da);
+ _edit_files_with_filter(da,filters,r_list,exclude);
+ memdelete(da);
+}
+
+static void _add_filter_to_list(Set<StringName>& r_list,const String& p_filter) {
+ _edit_filter_list(r_list,p_filter,false);
+}
+
+static void _remove_filter_from_list(Set<StringName>& r_list,const String& p_filter) {
+ _edit_filter_list(r_list,p_filter,true);
+}
+
+bool EditorExportPlatform::_set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+
+ if (n=="debug/debugging_enabled") {
+ set_debugging_enabled(p_value);
+ } else {
+ return false;
+ }
+
+ return true;
+
+}
+
+bool EditorExportPlatform::_get(const StringName& p_name,Variant &r_ret) const {
+
+ String n = p_name;
+
+ if (n=="debug/debugging_enabled") {
+ r_ret=is_debugging_enabled();
+ } else {
+ return false;
+ }
+
+ return true;
+
+}
+
+void EditorExportPlatform::_get_property_list( List<PropertyInfo> *p_list) const {
+
+ p_list->push_front( PropertyInfo( Variant::BOOL, "debug/debugging_enabled"));
+}
+
+Vector<uint8_t> EditorExportPlatform::get_exported_file_default(String& p_fname) const {
+
+ FileAccess *f = FileAccess::open(p_fname,FileAccess::READ);
+ ERR_FAIL_COND_V(!f,Vector<uint8_t>());
+ Vector<uint8_t> ret;
+ ret.resize(f->get_len());
+ int rbs = f->get_buffer(ret.ptr(),ret.size());
+ memdelete(f);
+ return ret;
+}
+
+Vector<uint8_t> EditorExportPlatform::get_exported_file(String& p_fname) const {
+
+ Ref<EditorExportPlatform> ep=EditorImportExport::get_singleton()->get_export_platform(get_name());
+
+ for(int i=0;i<EditorImportExport::get_singleton()->get_export_plugin_count();i++) {
+
+ Vector<uint8_t> data = EditorImportExport::get_singleton()->get_export_plugin(i)->custom_export(p_fname,ep);
+ if (data.size())
+ return data;
+
+ }
+
+
+ return get_exported_file_default(p_fname);
+
+
+}
+
+Vector<StringName> EditorExportPlatform::get_dependencies(bool p_bundles) const {
+
+
+ Set<StringName> exported;
+
+ if (FileAccess::exists("res://godot.cfg"))
+ exported.insert("res://godot.cfg");
+
+ if (EditorImportExport::get_singleton()->get_export_filter()!=EditorImportExport::EXPORT_SELECTED) {
+
+ String filter;
+ if (EditorImportExport::get_singleton()->get_export_filter()==EditorImportExport::EXPORT_ALL) {
+ _add_filter_to_list(exported,"*");
+ } else {
+ _add_to_list(EditorFileSystem::get_singleton()->get_filesystem(),exported);
+ String cf = EditorImportExport::get_singleton()->get_export_custom_filter();
+ if (cf!="")
+ cf+=",";
+ cf+="*.flags";
+ _add_filter_to_list(exported,cf);
+
+ cf = EditorImportExport::get_singleton()->get_export_custom_filter_exclude();
+ _remove_filter_from_list(exported,cf);
+ }
+
+
+ } else {
+
+
+ Map<String,Map<String,String> > remapped_paths;
+
+ Set<String> scene_extensions;
+ Set<String> resource_extensions;
+
+ {
+
+ List<String> l;
+ /*
+ SceneLoader::get_recognized_extensions(&l);
+ for(List<String>::Element *E=l.front();E;E=E->next()) {
+ scene_extensions.insert(E->get());
+ }
+ */
+ ResourceLoader::get_recognized_extensions_for_type("",&l);
+ for(List<String>::Element *E=l.front();E;E=E->next()) {
+
+ resource_extensions.insert(E->get());
+ }
+ }
+
+
+ List<StringName> toexport;
+
+ EditorImportExport::get_singleton()->get_export_file_list(&toexport);
+
+ print_line("TO EXPORT: "+itos(toexport.size()));
+
+
+ for (List<StringName>::Element *E=toexport.front();E;E=E->next()) {
+
+ print_line("DEP: "+String(E->get()));
+ exported.insert(E->get());
+ if (p_bundles && EditorImportExport::get_singleton()->get_export_file_action(E->get())==EditorImportExport::ACTION_BUNDLE) {
+ print_line("NO BECAUSE OF BUNDLE!");
+ continue; //no dependencies needed to be copied
+ }
+
+ List<String> testsubs;
+ testsubs.push_back(E->get());
+
+ while(testsubs.size()) {
+ //recursive subdep search!
+ List<String> deplist;
+ ResourceLoader::get_dependencies(testsubs.front()->get(),&deplist);
+ testsubs.pop_front();
+
+ List<String> subdeps;
+
+ for (List<String>::Element *F=deplist.front();F;F=F->next()) {
+
+ StringName dep = F->get();
+
+ if (exported.has(dep) || EditorImportExport::get_singleton()->get_export_file_action(dep)!=EditorImportExport::ACTION_NONE)
+ continue; //dependency added or to be added
+ print_line(" SUBDEP: "+String(dep));
+
+ exported.insert(dep);
+ testsubs.push_back(dep);
+ }
+ }
+ }
+ String cf = EditorImportExport::get_singleton()->get_export_custom_filter();
+ if (cf!="")
+ cf+=",";
+ cf+="*.flags";
+ _add_filter_to_list(exported,cf);
+
+ cf = EditorImportExport::get_singleton()->get_export_custom_filter_exclude();
+ _remove_filter_from_list(exported,cf);
+
+
+ }
+
+ Vector<StringName> ret;
+ ret.resize(exported.size());
+
+
+ int idx=0;
+ for(Set<StringName>::Element *E=exported.front();E;E=E->next()) {
+
+ ret[idx++]=E->get();
+
+ }
+
+ SortArray<StringName,__EESortDepCmp> sort; //some platforms work better if this is sorted
+ sort.sort(ret.ptr(),ret.size());
+
+ return ret;
+
+}
+
+String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
+ String user_file = EditorSettings::get_singleton()->get_settings_path()
+ +"/templates/"+template_file_name;
+ String system_file=OS::get_singleton()->get_installed_templates_path();
+ bool has_system_path=(system_file!="");
+ system_file+=template_file_name;
+
+ // Prefer user file
+ if (FileAccess::exists(user_file)) {
+ return user_file;
+ }
+
+ // Now check system file
+ if (has_system_path) {
+ if (FileAccess::exists(system_file)) {
+ return system_file;
+ }
+ }
+
+ // Not found
+ if (err) {
+ *err+="No export template found at \""+user_file+"\"";
+ if (has_system_path)
+ *err+="\n or \""+system_file+"\".";
+ else
+ *err+=".";
+ }
+ return "";
+}
+
+bool EditorExportPlatform::exists_export_template(String template_file_name, String *err) const {
+ return find_export_template(template_file_name,err)!="";
+}
+
+///////////////////////////////////////
+
+
+
+bool EditorExportPlatform::is_debugging_enabled() const {
+
+ return debugging_enabled;
+}
+
+void EditorExportPlatform::set_debugging_enabled(bool p_enabled) {
+
+ debugging_enabled = p_enabled;
+}
+
+bool EditorExportPlatformPC::_set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+
+ if (n=="custom_binary/release") {
+
+ custom_release_binary=p_value;
+ } else if (n=="custom_binary/debug") {
+
+ custom_debug_binary=p_value;
+ } else if (n=="resources/pack_mode") {
+
+ export_mode=ExportMode(int(p_value));
+ } else if (n=="resources/bundle_dependencies_(for_optical_disc)") {
+
+ bundle=p_value;
+ } else if (n=="binary/64_bits") {
+
+ use64=p_value;
+ } else
+ return false;
+
+ return true;
+
+}
+
+bool EditorExportPlatformPC::_get(const StringName& p_name,Variant &r_ret) const {
+
+ String n = p_name;
+
+ if (n=="custom_binary/release") {
+
+ r_ret=custom_release_binary;
+ } else if (n=="custom_binary/debug") {
+
+ r_ret=custom_debug_binary;
+ } else if (n=="resources/pack_mode") {
+
+ r_ret=export_mode;
+ } else if (n=="resources/bundle_dependencies_(for_optical_disc)") {
+
+ r_ret=bundle;
+ } else if (n=="binary/64_bits") {
+
+ r_ret=use64;
+ } else
+ return false;
+
+ return true;
+
+}
+
+void EditorExportPlatformPC::_get_property_list( List<PropertyInfo> *p_list) const {
+
+ p_list->push_back( PropertyInfo( Variant::STRING, "custom_binary/debug", PROPERTY_HINT_GLOBAL_FILE,binary_extension));
+ p_list->push_back( PropertyInfo( Variant::STRING, "custom_binary/release", PROPERTY_HINT_GLOBAL_FILE,binary_extension));
+ p_list->push_back( PropertyInfo( Variant::INT, "resources/pack_mode", PROPERTY_HINT_ENUM,"Pack into executable,Pack into binary file (.pck),Pack into archive file (.zip)"));
+ p_list->push_back( PropertyInfo( Variant::BOOL, "resources/bundle_dependencies_(for_optical_disc)"));
+ p_list->push_back( PropertyInfo( Variant::BOOL, "binary/64_bits"));
+}
+
+
+
+static void _exp_add_dep(Map<StringName,List<StringName> > &deps,const StringName& p_path) {
+
+
+ if (deps.has(p_path))
+ return; //already done
+
+ deps.insert(p_path,List<StringName>());
+
+ List<StringName> &deplist=deps[p_path];
+ Set<StringName> depset;
+
+ List<String> dl;
+ ResourceLoader::get_dependencies(p_path,&dl);
+
+ //added in order so child dependencies are always added bfore parent dependencies
+ for (List<String>::Element *E=dl.front();E;E=E->next()) {
+
+
+ if (!deps.has(E->get()))
+ _exp_add_dep(deps,E->get());
+
+ for(List<StringName>::Element *F=deps[E->get()].front();F;F=F->next()) {
+
+
+ if (!depset.has(F->get())) {
+ depset.insert(F->get());
+ deplist.push_back(F->get());
+ }
+ }
+
+ if (!depset.has(E->get())) {
+ depset.insert(E->get());
+ deplist.push_back(E->get());
+ }
+
+ }
+}
+
+
+
+Error EditorExportPlatform::export_project_files(EditorExportSaveFunction p_func, void* p_udata,bool p_make_bundles) {
+
+/* ALL FILES AND DEPENDENCIES */
+
+ Vector<StringName> files=get_dependencies(p_make_bundles);
+
+ Map<StringName,List<StringName> > deps;
+
+ if (false) {
+ for(int i=0;i<files.size();i++) {
+
+ _exp_add_dep(deps,files[i]);
+
+ }
+ }
+
+
+
+/* GROUP ATLAS */
+
+
+ List<StringName> groups;
+
+ EditorImportExport::get_singleton()->image_export_get_groups(&groups);
+
+ Map<StringName,StringName> remap_files;
+ Set<StringName> saved;
+
+ int counter=0;
+
+ for(List<StringName>::Element *E=groups.front();E;E=E->next()) {
+
+ if (!EditorImportExport::get_singleton()->image_export_group_get_make_atlas(E->get()))
+ continue; //uninterested, only process for atlas!
+
+ List<StringName> atlas_images;
+ EditorImportExport::get_singleton()->image_export_get_images_in_group(E->get(),&atlas_images);
+ atlas_images.sort_custom<StringName::AlphCompare>();
+
+ for (List<StringName>::Element *F=atlas_images.front();F;) {
+
+ List<StringName>::Element *N=F->next();
+
+ if (!FileAccess::exists(F->get())) {
+ atlas_images.erase(F);
+ }
+
+ F=N;
+
+ }
+
+ if (atlas_images.size()<=1)
+ continue;
+
+ int group_format=0;
+ float group_lossy_quality=EditorImportExport::get_singleton()->image_export_group_get_lossy_quality(E->get());
+ int group_shrink=EditorImportExport::get_singleton()->image_export_group_get_shrink(E->get());
+ group_shrink*=EditorImportExport::get_singleton()->get_export_image_shrink();
+
+ switch(EditorImportExport::get_singleton()->image_export_group_get_image_action(E->get())) {
+ case EditorImportExport::IMAGE_ACTION_KEEP:
+ case EditorImportExport::IMAGE_ACTION_NONE: {
+
+ switch(EditorImportExport::get_singleton()->get_export_image_action()) {
+ case EditorImportExport::IMAGE_ACTION_NONE: {
+
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS; //?
+
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_DISK: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY;
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_RAM: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM;
+ } break; //use default
+ }
+
+ group_lossy_quality=EditorImportExport::get_singleton()->get_export_image_quality();
+
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_DISK: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY;
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_RAM: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM;
+ } break; //use default
+ }
+
+ String image_listD_METHOD5;
+
+ {
+ MD5_CTX ctx;
+ MD5Init(&ctx);
+ for (List<StringName>::Element *F=atlas_images.front();F;F=F->next()) {
+
+ String p = F->get();
+ MD5Update(&ctx,(unsigned char*)p.utf8().get_data(),p.utf8().length());
+
+ }
+
+ MD5Final(&ctx);
+ image_listD_METHOD5=String::md5(ctx.digest);
+ }
+ //ok see if cached
+ String md5;
+ bool atlas_valid=true;
+ String atlas_name;
+
+ {
+ MD5_CTX ctx;
+ MD5Init(&ctx);
+ String path = GlobalConfig::get_singleton()->get_resource_path()+"::"+String(E->get())+"::"+get_name();
+ MD5Update(&ctx,(unsigned char*)path.utf8().get_data(),path.utf8().length());
+ MD5Final(&ctx);
+ md5 = String::md5(ctx.digest);
+ }
+
+ FileAccess *f=NULL;
+
+ if (!FileAccess::exists(EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-"+md5)) {
+ print_line("NO MD5 INVALID");
+ atlas_valid=false;
+ }
+
+ if (atlas_valid)
+ f=FileAccess::open(EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-"+md5,FileAccess::READ);
+
+ if (atlas_valid) {
+ //compare options
+ /*Dictionary options;
+ options.parse_json(f->get_line());
+ if (!options.has("lossy_quality") || float(options["lossy_quality"])!=group_lossy_quality)
+ atlas_valid=false;
+ else if (!options.has("shrink") || int(options["shrink"])!=group_shrink)
+ atlas_valid=false;
+ else if (!options.has("image_format") || int(options["image_format"])!=group_format)
+ atlas_valid=false;
+
+ if (!atlas_valid)
+ print_line("JSON INVALID");
+*/
+ }
+
+
+ if (atlas_valid) {
+ //check md5 of list of image /names/
+ if (f->get_line().strip_edges()!=image_listD_METHOD5) {
+ atlas_valid=false;
+ print_line("IMAGE MD5 INVALID!");
+ }
+
+ }
+
+ Vector<Rect2> rects;
+ bool resave_deps=false;
+
+ if (atlas_valid) {
+
+ //check if images were not modified
+ for (List<StringName>::Element *F=atlas_images.front();F;F=F->next()) {
+
+ Vector<String> slices = f->get_line().strip_edges().split("::");
+
+ if (slices.size()!=10) {
+ atlas_valid=false;
+ print_line("CANT SLICE IN 10");
+ break;
+ }
+ uint64_t mod_time = slices[0].to_int64();
+ uint64_t file_mod_time = FileAccess::get_modified_time(F->get());
+ if (mod_time!=file_mod_time) {
+
+ String imageD_METHOD5 = slices[1];
+ String fileD_METHOD5 = FileAccess::getD_METHOD5(F->get());
+
+ if (imageD_METHOD5!=fileD_METHOD5) {
+ atlas_valid=false;
+ print_line("IMAGE INVALID "+slices[0]);
+ break;
+ } else {
+ resave_deps=true;
+ }
+ }
+
+ if (atlas_valid) {
+ //push back region and margin
+ rects.push_back(Rect2(slices[2].to_float(),slices[3].to_float(),slices[4].to_float(),slices[5].to_float()));
+ rects.push_back(Rect2(slices[6].to_float(),slices[7].to_float(),slices[8].to_float(),slices[9].to_float()));
+ }
+ }
+
+ }
+
+ if (f) {
+ memdelete(f);
+ f=NULL;
+ }
+
+ print_line("ATLAS VALID? "+itos(atlas_valid)+" RESAVE DEPS? "+itos(resave_deps));
+ if (!atlas_valid) {
+ rects.clear();
+ //oh well, atlas is not valid. need to make new one....
+
+ String dst_file = EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-"+md5+".tex";
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ //imd->set_editor();
+
+
+ for (List<StringName>::Element *F=atlas_images.front();F;F=F->next()) {
+
+ imd->add_source(EditorImportPlugin::validate_source_path(F->get()),FileAccess::getD_METHOD5(F->get()));
+
+ }
+
+
+ imd->set_option("format",group_format);
+
+
+ int flags=0;
+
+ if (GlobalConfig::get_singleton()->get("image_loader/filter"))
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_FILTER;
+ if (!GlobalConfig::get_singleton()->get("image_loader/gen_mipmaps"))
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS;
+ if (!GlobalConfig::get_singleton()->get("image_loader/repeat"))
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_REPEAT;
+
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA;
+
+ imd->set_option("flags",flags);
+ imd->set_option("quality",group_lossy_quality);
+ imd->set_option("atlas",true);
+ imd->set_option("crop",true);
+ imd->set_option("shrink",group_shrink);
+
+
+
+ Ref<EditorTextureImportPlugin> plugin = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture");
+ Error err = plugin->import2(dst_file,imd,get_image_compression(),true);
+ if (err) {
+
+ EditorNode::add_io_error(TTR("Error saving atlas:")+" "+dst_file.get_file());
+ return ERR_CANT_CREATE;
+ }
+
+ ERR_FAIL_COND_V(imd->get_option("rects")==Variant(),ERR_BUG);
+
+ Array r_rects=imd->get_option("rects");
+ rects.resize(r_rects.size());
+ for(int i=0;i<r_rects.size();i++) {
+ //get back region and margins
+ rects[i]=r_rects[i];
+ }
+
+
+ resave_deps=true;
+ }
+
+
+ //atlas is valid (or it was just saved i guess), create the atex files and save them
+
+ if (resave_deps) {
+ f=FileAccess::open(EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-"+md5,FileAccess::WRITE);
+ Dictionary options;
+ options["lossy_quality"]=group_lossy_quality;
+ options["shrink"]=EditorImportExport::get_singleton()->image_export_group_get_shrink(E->get());
+ options["image_format"]=group_format;
+ //f->store_line(options.to_json());
+ f->store_line(image_listD_METHOD5);
+ }
+
+ //go through all ATEX files
+
+ {
+ Ref<ImageTexture> atlas = memnew( ImageTexture ); //fake atlas!
+ String atlas_path="res://atlas-"+md5+".tex";
+ atlas->set_path(atlas_path);
+ int idx=0;
+ for (List<StringName>::Element *F=atlas_images.front();F;F=F->next()) {
+
+ String p = F->get();
+ Ref<AtlasTexture> atex = memnew(AtlasTexture);
+ atex->set_atlas(atlas);
+ Rect2 region=rects[idx++];
+ Rect2 margin=rects[idx++];
+ atex->set_region(region);
+ atex->set_margin(margin);
+
+ String path = EditorSettings::get_singleton()->get_settings_path()+"/tmp/tmpatlas.atex";
+ Error err = ResourceSaver::save(path,atex);
+ if (err!=OK) {
+ EditorNode::add_io_error(TTR("Could not save atlas subtexture:")+" "+path);
+ return ERR_CANT_CREATE;
+ }
+ Vector<uint8_t> data = FileAccess::get_file_as_array(path);
+ String dst_path = F->get().operator String().get_basename()+".atex";
+ err = p_func(p_udata,dst_path,data,counter++,files.size());
+ saved.insert(dst_path);
+ if (err)
+ return err;
+
+ if (f) {
+ //recreating deps..
+ String depline;
+ //depline=String(F->get())+"::"+itos(FileAccess::get_modified_time(F->get()))+"::"+FileAccess::getD_METHOD5(F->get()); name unneccesary by top md5
+ depline=itos(FileAccess::get_modified_time(F->get()))+"::"+FileAccess::getD_METHOD5(F->get());
+ depline+="::"+itos(region.pos.x)+"::"+itos(region.pos.y)+"::"+itos(region.size.x)+"::"+itos(region.size.y);
+ depline+="::"+itos(margin.pos.x)+"::"+itos(margin.pos.y)+"::"+itos(margin.size.x)+"::"+itos(margin.size.y);
+ f->store_line(depline);
+ }
+
+ remap_files[F->get()]=dst_path;
+ }
+
+ Vector<uint8_t> atlas_data = FileAccess::get_file_as_array(EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-"+md5+".tex");
+ Error err = p_func(p_udata,atlas_path,atlas_data,counter,files.size());
+ saved.insert(atlas_path);
+ if (err)
+ return err;
+
+ }
+
+
+ if (f) {
+ memdelete(f);
+ }
+
+ }
+
+
+ StringName engine_cfg="res://godot.cfg";
+ StringName boot_splash;
+ {
+ String splash=GlobalConfig::get_singleton()->get("application/boot_splash"); //avoid splash from being converted
+ splash=splash.strip_edges();
+ if (splash!=String()) {
+ if (!splash.begins_with("res://"))
+ splash="res://"+splash;
+ splash=splash.simplify_path();
+ boot_splash=splash;
+ }
+ }
+ StringName custom_cursor;
+ {
+ String splash=GlobalConfig::get_singleton()->get("display/custom_mouse_cursor"); //avoid splash from being converted
+ splash=splash.strip_edges();
+ if (splash!=String()) {
+ if (!splash.begins_with("res://"))
+ splash="res://"+splash;
+ splash=splash.simplify_path();
+ custom_cursor=splash;
+ }
+ }
+
+
+
+
+ for(int i=0;i<files.size();i++) {
+
+ if (remap_files.has(files[i]) || files[i]==engine_cfg) //gonna be remapped (happened before!)
+ continue; //from atlas?
+ String src=files[i];
+ Vector<uint8_t> buf;
+
+ if (src==boot_splash || src==custom_cursor)
+ buf = get_exported_file_default(src); //bootsplash must be kept if used
+ else
+ buf = get_exported_file(src);
+
+ ERR_CONTINUE( saved.has(src) );
+
+ Error err = p_func(p_udata,src,buf,counter++,files.size());
+ if (err)
+ return err;
+
+ saved.insert(src);
+ if (src!=String(files[i]))
+ remap_files[files[i]]=src;
+
+ }
+
+
+ {
+
+ //make binary godot.cfg config
+ Map<String,Variant> custom;
+
+
+ if (remap_files.size()) {
+ Vector<String> remapsprop;
+ for(Map<StringName,StringName>::Element *E=remap_files.front();E;E=E->next()) {
+ print_line("REMAP: "+String(E->key())+" -> "+E->get());
+ remapsprop.push_back(E->key());
+ remapsprop.push_back(E->get());
+ }
+
+ custom["remap/all"]=remapsprop;
+ }
+
+ //add presaved dependencies
+ for(Map<StringName,List<StringName> >::Element *E=deps.front();E;E=E->next()) {
+
+ if (E->get().size()==0)
+ continue; //no deps
+ String key;
+ Vector<StringName> deps;
+ //if bundle continue (when bundles supported obviously)
+
+ if (remap_files.has(E->key())) {
+ key=remap_files[E->key()];
+ } else {
+ key=E->key();
+ }
+
+ deps.resize(E->get().size());
+ int i=0;
+
+ for(List<StringName>::Element *F=E->get().front();F;F=F->next()) {
+ deps[i++]=F->get();
+ print_line(" -"+String(F->get()));
+ }
+
+ NodePath prop(deps,true,String()); //seems best to use this for performance
+
+ custom["deps/"+key.md5_text()]=prop;
+
+ }
+
+ String remap_file="godot.cfb";
+ String engine_cfb =EditorSettings::get_singleton()->get_settings_path()+"/tmp/tmp"+remap_file;
+ GlobalConfig::get_singleton()->save_custom(engine_cfb,custom);
+ Vector<uint8_t> data = FileAccess::get_file_as_array(engine_cfb);
+
+ Error err = p_func(p_udata,"res://"+remap_file,data,counter,files.size());
+ if (err)
+ return err;
+
+ }
+
+ return OK;
+}
+
+static int _get_pad(int p_alignment, int p_n) {
+
+ int rest = p_n % p_alignment;
+ int pad = 0;
+ if (rest > 0) {
+ pad = p_alignment - rest;
+ };
+
+ return pad;
+};
+
+void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags) {
+
+ String host = EditorSettings::get_singleton()->get("network/debug_host");
+
+ if (p_flags&EXPORT_REMOTE_DEBUG_LOCALHOST)
+ host="localhost";
+
+ if (p_flags&EXPORT_DUMB_CLIENT) {
+ int port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
+ String passwd = EditorSettings::get_singleton()->get("filesystem/file_server/password");
+ r_flags.push_back("-rfs");
+ r_flags.push_back(host+":"+itos(port));
+ if (passwd!="") {
+ r_flags.push_back("-rfs_pass");
+ r_flags.push_back(passwd);
+ }
+ }
+
+ if (p_flags&EXPORT_REMOTE_DEBUG) {
+
+ r_flags.push_back("-rdebug");
+
+ r_flags.push_back(host+":"+String::num(GLOBAL_DEF("network/debug/remote_port", 6007)));
+
+ List<String> breakpoints;
+ ScriptEditor::get_singleton()->get_breakpoints(&breakpoints);
+
+
+ if (breakpoints.size()) {
+
+ r_flags.push_back("-bp");
+ String bpoints;
+ for(const List<String>::Element *E=breakpoints.front();E;E=E->next()) {
+
+ bpoints+=E->get().replace(" ","%20");
+ if (E->next())
+ bpoints+=",";
+ }
+
+ r_flags.push_back(bpoints);
+ }
+
+ }
+
+ if (p_flags&EXPORT_VIEW_COLLISONS) {
+
+ r_flags.push_back("-debugcol");
+ }
+
+ if (p_flags&EXPORT_VIEW_NAVIGATION) {
+
+ r_flags.push_back("-debugnav");
+ }
+
+
+}
+
+Error EditorExportPlatform::save_pack_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
+
+
+ PackData *pd = (PackData*)p_userdata;
+
+ CharString cs=p_path.utf8();
+ pd->f->store_32(cs.length());
+ pd->f->store_buffer((uint8_t*)cs.get_data(),cs.length());
+ TempData td;
+ td.pos=pd->f->get_pos();
+ td.ofs=pd->ftmp->get_pos();
+ td.size=p_data.size();
+ pd->file_ofs.push_back(td);
+ pd->f->store_64(0); //ofs
+ pd->f->store_64(0); //size
+ {
+ MD5_CTX ctx;
+ MD5Init(&ctx);
+ MD5Update(&ctx,(unsigned char*)p_data.ptr(),p_data.size());
+ MD5Final(&ctx);
+ pd->f->store_buffer(ctx.digest,16);
+ }
+ pd->ep->step(TTR("Storing File:")+" "+p_path,2+p_file*100/p_total,false);
+ pd->count++;
+ pd->ftmp->store_buffer(p_data.ptr(),p_data.size());
+ if (pd->alignment > 1) {
+
+ int pad = _get_pad(pd->alignment, pd->ftmp->get_pos());
+ for (int i=0; i<pad; i++) {
+
+ pd->ftmp->store_8(0);
+ };
+ };
+ return OK;
+
+}
+
+Error EditorExportPlatform::save_zip_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
+
+
+ String path=p_path.replace_first("res://","");
+
+ ZipData *zd = (ZipData*)p_userdata;
+
+ zipFile zip=(zipFile)zd->zip;
+
+ zipOpenNewFileInZip(zip,
+ path.utf8().get_data(),
+ NULL,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ Z_DEFLATED,
+ Z_DEFAULT_COMPRESSION);
+
+ zipWriteInFileInZip(zip,p_data.ptr(),p_data.size());
+ zipCloseFileInZip(zip);
+
+ zd->ep->step(TTR("Storing File:")+" "+p_path,2+p_file*100/p_total,false);
+ zd->count++;
+ return OK;
+
+}
+
+Error EditorExportPlatform::save_zip(const String& p_path, bool p_make_bundles) {
+
+ EditorProgress ep("savezip",TTR("Packing"),102);
+
+ //FileAccess *tmp = FileAccess::open(tmppath,FileAccess::WRITE);
+
+ FileAccess *src_f;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+ zipFile zip=zipOpen2(p_path.utf8().get_data(),APPEND_STATUS_CREATE,NULL,&io);
+
+ ZipData zd;
+ zd.count=0;
+ zd.ep=&ep;
+ zd.zip=zip;
+
+
+ Error err = export_project_files(save_zip_file,&zd,p_make_bundles);
+
+ zipClose(zip,NULL);
+
+ return err;
+}
+
+Error EditorExportPlatform::save_pack(FileAccess *dst,bool p_make_bundles, int p_alignment) {
+
+ EditorProgress ep("savepack",TTR("Packing"),102);
+
+ String tmppath = EditorSettings::get_singleton()->get_settings_path()+"/tmp/packtmp";
+ FileAccess *tmp = FileAccess::open(tmppath,FileAccess::WRITE);
+ uint64_t ofs_begin = dst->get_pos();
+
+ dst->store_32(0x43504447); //GDPK
+ dst->store_32(0); //pack version
+ dst->store_32(VERSION_MAJOR);
+ dst->store_32(VERSION_MINOR);
+ dst->store_32(0); //hmph
+ for(int i=0;i<16;i++) {
+ //reserved
+ dst->store_32(0);
+ }
+
+ size_t fcountpos = dst->get_pos();
+ dst->store_32(0);
+
+ PackData pd;
+ pd.ep=&ep;
+ pd.f=dst;
+ pd.ftmp=tmp;
+ pd.count=0;
+ pd.alignment = p_alignment;
+ Error err = export_project_files(save_pack_file,&pd,p_make_bundles);
+ memdelete(tmp);
+ if (err)
+ return err;
+
+ if (p_alignment > 1) {
+ int pad = _get_pad(p_alignment, dst->get_pos());
+ for (int i=0; i<pad; i++) {
+
+ dst->store_8(0);
+ };
+ };
+
+ size_t ofsplus = dst->get_pos();
+ //append file
+
+ tmp = FileAccess::open(tmppath,FileAccess::READ);
+
+ ERR_FAIL_COND_V(!tmp,ERR_CANT_OPEN;)
+ const int bufsize=16384;
+ uint8_t buf[bufsize];
+
+ while(true) {
+
+ int got = tmp->get_buffer(buf,bufsize);
+ if (got<=0)
+ break;
+ dst->store_buffer(buf,got);
+ }
+
+ memdelete(tmp);
+
+ dst->store_64(dst->get_pos()-ofs_begin);
+ dst->store_32(0x43504447); //GDPK
+
+ //fix offsets
+
+ dst->seek(fcountpos);
+ dst->store_32(pd.count);
+ for(int i=0;i<pd.file_ofs.size();i++) {
+
+ dst->seek(pd.file_ofs[i].pos);
+ dst->store_64(pd.file_ofs[i].ofs+ofsplus);
+ dst->store_64(pd.file_ofs[i].size);
+ }
+
+ return OK;
+}
+
+EditorExportPlatform::EditorExportPlatform() {
+
+ debugging_enabled = true;
+}
+
+Error EditorExportPlatformPC::export_project(const String& p_path, bool p_debug, int p_flags) {
+
+
+
+ EditorProgress ep("export",vformat(TTR("Exporting for %s"),get_name()),102);
+
+ const int BUFSIZE = 32768;
+
+
+
+ ep.step(TTR("Setting Up.."),0);
+
+ String exe_path="";
+
+ if (p_debug)
+ exe_path=custom_debug_binary;
+ else
+ exe_path=custom_release_binary;
+
+ if (exe_path=="") {
+ String fname;
+ if (use64) {
+ if (p_debug)
+ fname=debug_binary64;
+ else
+ fname=release_binary64;
+ } else {
+ if (p_debug)
+ fname=debug_binary32;
+ else
+ fname=release_binary32;
+ }
+ String err="";
+ exe_path=find_export_template(fname,&err);
+ if (exe_path=="") {
+ EditorNode::add_io_error(err);
+ return ERR_FILE_CANT_READ;
+ }
+ }
+
+ FileAccess *src_exe=FileAccess::open(exe_path,FileAccess::READ);
+ if (!src_exe) {
+
+ EditorNode::add_io_error("Couldn't read source executable at:\n "+exe_path);
+ return ERR_FILE_CANT_READ;
+ }
+
+ FileAccess *dst=FileAccess::open(p_path,FileAccess::WRITE);
+ if (!dst) {
+
+ EditorNode::add_io_error("Can't copy executable file to:\n "+p_path);
+ return ERR_FILE_CANT_WRITE;
+ }
+
+ uint8_t buff[32768];
+
+ while(true) {
+
+ int c = src_exe->get_buffer(buff,BUFSIZE);
+ if (c>0) {
+
+ dst->store_buffer(buff,c);
+ } else {
+ break;
+ }
+ }
+
+ String dstfile = p_path.replace_first("res://","").replace("\\","/");
+ if (export_mode!=EXPORT_EXE) {
+
+ String dstfile_extension=export_mode==EXPORT_ZIP?".zip":".pck";
+ if (dstfile.find("/")!=-1)
+ dstfile=dstfile.get_base_dir()+"/data"+dstfile_extension;
+ else
+ dstfile="data"+dstfile_extension;
+ if (export_mode==EXPORT_PACK) {
+
+ memdelete(dst);
+
+ dst=FileAccess::open(dstfile,FileAccess::WRITE);
+ if (!dst) {
+
+ EditorNode::add_io_error("Can't write data pack to:\n "+p_path);
+ return ERR_FILE_CANT_WRITE;
+ }
+ }
+ }
+
+
+
+ memdelete(src_exe);
+
+ Error err = export_mode==EXPORT_ZIP?save_zip(dstfile,bundle):save_pack(dst,bundle);
+ memdelete(dst);
+ return err;
+}
+
+void EditorExportPlatformPC::set_binary_extension(const String& p_extension) {
+
+ binary_extension=p_extension;
+}
+
+bool EditorExportPlatformPC::can_export(String *r_error) const {
+
+ String err;
+ bool valid=true;
+
+ if (use64 && (!exists_export_template(debug_binary64) || !exists_export_template(release_binary64))) {
+ valid=false;
+ err="No 64 bits export templates found.\nDownload and install export templates.\n";
+ }
+
+ if (!use64 && (!exists_export_template(debug_binary32) || !exists_export_template(release_binary32))) {
+ valid=false;
+ err="No 32 bits export templates found.\nDownload and install export templates.\n";
+ }
+
+ if(custom_debug_binary=="" && custom_release_binary=="") {
+ if (r_error) *r_error=err;
+ return valid;
+ }
+
+ bool dvalid = true;
+ bool rvalid = true;
+
+ if(!FileAccess::exists(custom_debug_binary)) {
+ dvalid = false;
+ err = "Custom debug binary not found.\n";
+ }
+
+ if(!FileAccess::exists(custom_release_binary)) {
+ rvalid = false;
+ err = "Custom release binary not found.\n";
+ }
+
+ if (dvalid || rvalid)
+ valid = true;
+ else
+ valid = false;
+
+ if (r_error)
+ *r_error=err;
+ return valid;
+}
+
+
+EditorExportPlatformPC::EditorExportPlatformPC() {
+
+ export_mode=EXPORT_PACK;
+ use64=true;
+}
+
+
+
+
+
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+EditorImportExport* EditorImportExport::singleton=NULL;
+
+void EditorImportExport::add_import_plugin(const Ref<EditorImportPlugin>& p_plugin) {
+
+ // Need to make sure the name is unique if we are going to lookup by it
+ ERR_FAIL_COND(by_idx.has(p_plugin->get_name()));
+
+ by_idx[ p_plugin->get_name() ]=plugins.size();
+ plugins.push_back(p_plugin);
+}
+
+void EditorImportExport::remove_import_plugin(const Ref<EditorImportPlugin>& p_plugin) {
+
+ String plugin_name = p_plugin->get_name();
+
+ // Keep the indices the same
+ // Find the index of the target plugin
+ ERR_FAIL_COND(!by_idx.has(plugin_name));
+ int idx = by_idx[plugin_name];
+ int last_idx = plugins.size() - 1;
+
+ // Swap the last plugin and the target one
+ SWAP(plugins[idx], plugins[last_idx]);
+
+ // Update the index of the old last one
+ by_idx[plugins[idx]->get_name()] = idx;
+
+ // Remove the target plugin's by_idx entry
+ by_idx.erase(plugin_name);
+
+ // Erase the plugin
+ plugins.remove(last_idx);
+}
+
+int EditorImportExport::get_import_plugin_count() const{
+
+ return plugins.size();
+}
+Ref<EditorImportPlugin> EditorImportExport::get_import_plugin(int p_idx) const{
+
+ ERR_FAIL_INDEX_V(p_idx,plugins.size(),Ref<EditorImportPlugin>());
+ return plugins[p_idx];
+
+}
+
+
+
+Ref<EditorImportPlugin> EditorImportExport::get_import_plugin_by_name(const String& p_string) const{
+
+ ERR_FAIL_COND_V( !by_idx.has(p_string), Ref<EditorImportPlugin>());
+ return plugins[ by_idx[p_string] ];
+}
+
+void EditorImportExport::add_export_plugin(const Ref<EditorExportPlugin>& p_plugin) {
+
+ ERR_FAIL_COND( p_plugin.is_null() );
+
+ export_plugins.push_back(p_plugin);
+}
+
+void EditorImportExport::remove_export_plugin(const Ref<EditorExportPlugin>& p_plugin) {
+
+ ERR_FAIL_COND( p_plugin.is_null() );
+ export_plugins.erase(p_plugin);
+}
+
+int EditorImportExport::get_export_plugin_count() const{
+
+ return export_plugins.size();
+}
+Ref<EditorExportPlugin> EditorImportExport::get_export_plugin(int p_idx) const{
+
+ ERR_FAIL_INDEX_V(p_idx,export_plugins.size(),Ref<EditorExportPlugin>());
+ return export_plugins[p_idx];
+}
+
+void EditorImportExport::set_export_file_action(const StringName& p_file, FileAction p_action) {
+
+ if (p_action==ACTION_NONE) {
+
+ files.erase(p_file);
+ } else {
+
+ files[p_file]=p_action;
+ }
+
+}
+
+EditorImportExport::FileAction EditorImportExport::get_export_file_action(const StringName& p_file) const{
+
+
+ if (files.has(p_file))
+ return files[p_file];
+
+
+ return ACTION_NONE;
+}
+
+void EditorImportExport::get_export_file_list(List<StringName> *p_files){
+
+
+ for (Map<StringName,FileAction>::Element *E=files.front();E;E=E->next()) {
+
+ p_files->push_back(E->key());
+ }
+
+}
+
+void EditorImportExport::add_export_platform(const Ref<EditorExportPlatform>& p_export) {
+
+ exporters[p_export->get_name()]=p_export;
+}
+
+
+void EditorImportExport::get_export_platforms(List<StringName> *r_platforms) {
+
+ for (Map<StringName,Ref<EditorExportPlatform> >::Element *E=exporters.front();E;E=E->next()) {
+
+ r_platforms->push_back(E->key());
+ }
+}
+
+Ref<EditorExportPlatform> EditorImportExport::get_export_platform(const StringName& p_platform) {
+
+ if (exporters.has(p_platform)) {
+ return exporters[p_platform];
+ } else {
+ return Ref<EditorExportPlatform>();
+ }
+}
+
+
+bool EditorImportExport::poll_export_platforms() {
+
+ bool changed=false;
+ for (Map<StringName,Ref<EditorExportPlatform> >::Element *E=exporters.front();E;E=E->next()) {
+
+ if (E->get()->poll_devices())
+ changed=true;
+ }
+
+ return changed;
+
+}
+
+void EditorImportExport::set_export_filter(ExportFilter p_enable) {
+
+ export_filter=p_enable;
+}
+
+EditorImportExport::ExportFilter EditorImportExport::get_export_filter() const{
+
+ return export_filter;
+}
+
+void EditorImportExport::set_export_custom_filter(const String& p_custom_filter){
+ export_custom_filter=p_custom_filter;
+}
+void EditorImportExport::set_export_custom_filter_exclude(const String& p_custom_filter){
+ export_custom_filter_exclude=p_custom_filter;
+}
+String EditorImportExport::get_export_custom_filter() const{
+ return export_custom_filter;
+}
+String EditorImportExport::get_export_custom_filter_exclude() const{
+ return export_custom_filter_exclude;
+}
+
+void EditorImportExport::set_export_image_action(ImageAction p_action) {
+
+ image_action=p_action;
+}
+
+EditorImportExport::ImageAction EditorImportExport::get_export_image_action() const{
+
+ return image_action;
+}
+
+void EditorImportExport::set_export_image_shrink(float p_shrink) {
+
+ image_shrink=p_shrink;
+}
+
+float EditorImportExport::get_export_image_shrink() const{
+
+ return image_shrink;
+}
+
+
+void EditorImportExport::set_export_image_quality(float p_quality){
+
+ image_action_compress_quality=p_quality;
+}
+
+float EditorImportExport::get_export_image_quality() const{
+
+ return image_action_compress_quality;
+}
+
+void EditorImportExport::image_export_group_create(const StringName& p_name) {
+
+ ERR_FAIL_COND(image_groups.has(p_name));
+ ImageGroup ig;
+ ig.action=IMAGE_ACTION_NONE; //default
+ ig.make_atlas=false;
+ ig.shrink=1;
+ ig.lossy_quality=0.7;
+ image_groups[p_name]=ig;
+
+
+}
+
+
+bool EditorImportExport::image_export_has_group(const StringName& p_name) const {
+
+ return image_groups.has(p_name);
+}
+void EditorImportExport::image_export_get_groups(List<StringName> *r_name) const {
+
+ for (Map<StringName,ImageGroup>::Element *E=image_groups.front();E;E=E->next()) {
+
+ r_name->push_back(E->key());
+ }
+}
+
+void EditorImportExport::image_export_group_remove(const StringName& p_name){
+
+ ERR_FAIL_COND(!image_groups.has(p_name));
+ image_groups.erase(p_name);
+}
+void EditorImportExport::image_export_group_set_image_action(const StringName& p_export_group,ImageAction p_action){
+
+ ERR_FAIL_COND(!image_groups.has(p_export_group));
+ image_groups[p_export_group].action=p_action;
+
+}
+EditorImportExport::ImageAction EditorImportExport::image_export_group_get_image_action(const StringName& p_export_group) const{
+
+ ERR_FAIL_COND_V(!image_groups.has(p_export_group),IMAGE_ACTION_NONE);
+ return image_groups[p_export_group].action;
+
+}
+void EditorImportExport::image_export_group_set_make_atlas(const StringName& p_export_group,bool p_make){
+
+ ERR_FAIL_COND(!image_groups.has(p_export_group));
+ image_groups[p_export_group].make_atlas=p_make;
+
+}
+bool EditorImportExport::image_export_group_get_make_atlas(const StringName& p_export_group) const{
+
+ ERR_FAIL_COND_V(!image_groups.has(p_export_group),false);
+ return image_groups[p_export_group].make_atlas;
+
+}
+void EditorImportExport::image_export_group_set_shrink(const StringName& p_export_group,float p_amount){
+ ERR_FAIL_COND(!image_groups.has(p_export_group));
+ image_groups[p_export_group].shrink=p_amount;
+
+}
+float EditorImportExport::image_export_group_get_shrink(const StringName& p_export_group) const{
+
+ ERR_FAIL_COND_V(!image_groups.has(p_export_group),1);
+ return image_groups[p_export_group].shrink;
+
+}
+
+void EditorImportExport::image_export_group_set_lossy_quality(const StringName& p_export_group,float p_amount){
+ ERR_FAIL_COND(!image_groups.has(p_export_group));
+ image_groups[p_export_group].lossy_quality=p_amount;
+
+}
+float EditorImportExport::image_export_group_get_lossy_quality(const StringName& p_export_group) const{
+
+ ERR_FAIL_COND_V(!image_groups.has(p_export_group),1);
+ return image_groups[p_export_group].lossy_quality;
+
+}
+
+StringName EditorImportExport::image_get_export_group(const StringName& p_image) const {
+
+ if (image_group_files.has(p_image))
+ return image_group_files[p_image];
+ else
+ return StringName();
+
+}
+
+void EditorImportExport::image_add_to_export_group(const StringName& p_image,const StringName& p_export_group) {
+
+
+ bool emptygroup = String(p_export_group)==String();
+ ERR_FAIL_COND(!emptygroup && !image_groups.has(p_export_group));
+
+ if (emptygroup)
+ image_group_files.erase(p_image);
+ else
+ image_group_files[p_image]=p_export_group;
+}
+
+void EditorImportExport::image_export_get_images_in_group(const StringName& p_group,List<StringName> *r_images) const {
+
+ for (Map<StringName,StringName>::Element *E=image_group_files.front();E;E=E->next()) {
+
+ if (p_group==E->get())
+ r_images->push_back(E->key());
+ }
+}
+
+void EditorImportExport::set_convert_text_scenes(bool p_convert) {
+
+ convert_text_scenes=p_convert;
+}
+
+bool EditorImportExport::get_convert_text_scenes() const{
+
+ return convert_text_scenes;
+}
+
+
+void EditorImportExport::load_config() {
+
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+
+ Error err = cf->load("res://export.cfg");
+ if (err!=OK)
+ return; //no export config to be loaded!
+
+
+ export_custom_filter=cf->get_value("export_filter","filter");
+ export_custom_filter_exclude=cf->get_value("export_filter","filter_exclude");
+ String t=cf->get_value("export_filter","type");
+ if (t=="selected")
+ export_filter=EXPORT_SELECTED;
+ else if (t=="resources")
+ export_filter=EXPORT_RESOURCES;
+ else if (t=="all")
+ export_filter=EXPORT_ALL;
+
+ if (cf->has_section("convert_images")) {
+
+ String ci = "convert_images";
+ String action = cf->get_value(ci,"action");
+ if (action=="none")
+ image_action=IMAGE_ACTION_NONE;
+ else if (action=="compress_ram")
+ image_action=IMAGE_ACTION_COMPRESS_RAM;
+ else if (action=="compress_disk")
+ image_action=IMAGE_ACTION_COMPRESS_DISK;
+
+ image_action_compress_quality = cf->get_value(ci,"compress_quality");
+ if (cf->has_section_key(ci,"shrink"))
+ image_shrink = cf->get_value(ci,"shrink");
+ else
+ image_shrink=1;
+ String formats=cf->get_value(ci,"formats");
+ Vector<String> f = formats.split(",");
+ image_formats.clear();
+ for(int i=0;i<f.size();i++) {
+ image_formats.insert(f[i].strip_edges());
+ }
+ }
+
+ if (cf->has_section("convert_scenes")) {
+
+ convert_text_scenes = cf->get_value("convert_scenes","convert_text_scenes");
+ }
+
+
+ if (cf->has_section("export_filter_files")) {
+
+
+ String eff = "export_filter_files";
+ List<String> k;
+ cf->get_section_keys(eff,&k);
+ for(List<String>::Element *E=k.front();E;E=E->next()) {
+
+ String val = cf->get_value(eff,E->get());
+ if (val=="copy") {
+ files[E->get()]=ACTION_COPY;
+ } else if (val=="bundle") {
+ files[E->get()]=ACTION_BUNDLE;
+ }
+ }
+ }
+
+ List<String> sect;
+
+ cf->get_sections(&sect);
+
+ for(List<String>::Element *E=sect.front();E;E=E->next()) {
+
+ String s = E->get();
+ if (!s.begins_with("platform:"))
+ continue;
+ String p = s.substr(s.find(":")+1,s.length());
+
+ if (!exporters.has(p))
+ continue;
+
+ Ref<EditorExportPlatform> ep = exporters[p];
+ if (!ep.is_valid()) {
+ continue;
+ }
+ List<String> keys;
+ cf->get_section_keys(s,&keys);
+ for(List<String>::Element *F=keys.front();F;F=F->next()) {
+ ep->set(F->get(),cf->get_value(s,F->get()));
+ }
+ }
+
+ //save image groups
+
+ if (cf->has_section("image_groups")) {
+
+ sect.clear();
+ cf->get_section_keys("image_groups",&sect);
+ for(List<String>::Element *E=sect.front();E;E=E->next()) {
+
+ Dictionary d = cf->get_value("image_groups",E->get());
+ ImageGroup g;
+ g.action=IMAGE_ACTION_NONE;
+ g.make_atlas=false;
+ g.lossy_quality=0.7;
+ g.shrink=1;
+
+ if (d.has("action")) {
+ String action=d["action"];
+ if (action=="compress_ram")
+ g.action=IMAGE_ACTION_COMPRESS_RAM;
+ else if (action=="compress_disk")
+ g.action=IMAGE_ACTION_COMPRESS_DISK;
+ else if (action=="keep")
+ g.action=IMAGE_ACTION_KEEP;
+ }
+
+ if (d.has("atlas"))
+ g.make_atlas=d["atlas"];
+ if (d.has("lossy_quality"))
+ g.lossy_quality=d["lossy_quality"];
+ if (d.has("shrink")) {
+
+ g.shrink=d["shrink"];
+ g.shrink=CLAMP(g.shrink,1,8);
+ }
+
+ image_groups[E->get()]=g;
+
+ }
+
+ if (cf->has_section_key("image_group_files","files")) {
+
+ Vector<String> sa=cf->get_value("image_group_files","files");
+ if (sa.size()%2==0) {
+ for(int i=0;i<sa.size();i+=2) {
+ image_group_files[sa[i]]=sa[i+1];
+ }
+ }
+ }
+
+ }
+
+
+ if (cf->has_section("script")) {
+
+ if (cf->has_section_key("script","action")) {
+
+ String action = cf->get_value("script","action");
+ if (action=="compile")
+ script_action=SCRIPT_ACTION_COMPILE;
+ else if (action=="encrypt")
+ script_action=SCRIPT_ACTION_ENCRYPT;
+ else
+ script_action=SCRIPT_ACTION_NONE;
+
+ }
+
+ if (cf->has_section_key("script","encrypt_key")) {
+
+ script_key = cf->get_value("script","encrypt_key");
+ }
+ }
+
+ if (cf->has_section("convert_samples")) {
+
+ if (cf->has_section_key("convert_samples","action")) {
+ String action = cf->get_value("convert_samples","action");
+ if (action=="none") {
+ sample_action=SAMPLE_ACTION_NONE;
+ } else if (action=="compress_ram") {
+ sample_action=SAMPLE_ACTION_COMPRESS_RAM;
+ }
+ }
+
+ if (cf->has_section_key("convert_samples","max_hz"))
+ sample_action_max_hz=cf->get_value("convert_samples","max_hz");
+
+ if (cf->has_section_key("convert_samples","trim"))
+ sample_action_trim=cf->get_value("convert_samples","trim");
+ }
+
+
+
+}
+
+
+
+
+
+void EditorImportExport::save_config() {
+
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+
+ switch(export_filter) {
+ case EXPORT_SELECTED: cf->set_value("export_filter","type","selected"); break;
+ case EXPORT_RESOURCES: cf->set_value("export_filter","type","resources"); break;
+ case EXPORT_ALL: cf->set_value("export_filter","type","all"); break;
+ }
+
+ cf->set_value("export_filter","filter",export_custom_filter);
+ cf->set_value("export_filter", "filter_exclude",export_custom_filter_exclude);
+
+ String file_action_section = "export_filter_files";
+
+ for (Map<StringName,FileAction>::Element *E=files.front();E;E=E->next()) {
+
+ String f=E->key();
+ String a;
+ switch (E->get()) {
+ case ACTION_NONE: {}
+ case ACTION_COPY: a="copy"; break;
+ case ACTION_BUNDLE: a="bundle"; break;
+ }
+
+ cf->set_value(file_action_section,f,a);
+ }
+
+
+ for (Map<StringName,Ref<EditorExportPlatform> >::Element *E=exporters.front();E;E=E->next()) {
+
+ String pname = "platform:"+String(E->key());
+
+ Ref<EditorExportPlatform> ep = E->get();
+
+ List<PropertyInfo> pl;
+ ep->get_property_list(&pl);
+
+ for (List<PropertyInfo>::Element *F=pl.front();F;F=F->next()) {
+
+ cf->set_value(pname,F->get().name,ep->get(F->get().name));
+ }
+
+ }
+
+ switch(image_action) {
+ case IMAGE_ACTION_NONE: cf->set_value("convert_images","action","none"); break;
+ case IMAGE_ACTION_COMPRESS_RAM: cf->set_value("convert_images","action","compress_ram"); break;
+ case IMAGE_ACTION_COMPRESS_DISK: cf->set_value("convert_images","action","compress_disk"); break;
+ }
+
+ cf->set_value("convert_images","shrink",image_shrink);
+ cf->set_value("convert_images","compress_quality",image_action_compress_quality);
+
+ String formats;
+ for(Set<String>::Element *E=image_formats.front();E;E=E->next()) {
+
+ if (E!=image_formats.front())
+ formats+=",";
+ formats+=E->get();
+ }
+
+ cf->set_value("convert_images","formats",formats);
+
+ //save image groups
+
+ for(Map<StringName,ImageGroup>::Element *E=image_groups.front();E;E=E->next()) {
+
+ Dictionary d;
+ switch(E->get().action) {
+ case IMAGE_ACTION_NONE: d["action"]="default"; break;
+ case IMAGE_ACTION_COMPRESS_RAM: d["action"]="compress_ram"; break;
+ case IMAGE_ACTION_COMPRESS_DISK: d["action"]="compress_disk"; break;
+ case IMAGE_ACTION_KEEP: d["action"]="keep"; break;
+ }
+
+
+ d["atlas"]=E->get().make_atlas;
+ d["shrink"]=E->get().shrink;
+ d["lossy_quality"]=E->get().lossy_quality;
+ cf->set_value("image_groups",E->key(),d);
+
+ }
+
+ if (image_groups.size() && image_group_files.size()){
+
+ Vector<String> igfkeys;
+ igfkeys.resize(image_group_files.size());
+ int idx=0;
+ for (Map<StringName,StringName>::Element *E=image_group_files.front();E;E=E->next()) {
+ igfkeys[idx++]=E->key();
+ }
+ igfkeys.sort();
+
+ Vector<String> igfsave;
+ igfsave.resize(image_group_files.size()*2);
+ idx=0;
+ for (int i=0;i<igfkeys.size();++i) {
+
+ igfsave[idx++]=igfkeys[i];
+ igfsave[idx++]=image_group_files[igfkeys[i]];
+ }
+ cf->set_value("image_group_files","files",igfsave);
+ }
+
+ switch(script_action) {
+ case SCRIPT_ACTION_NONE: cf->set_value("script","action","none"); break;
+ case SCRIPT_ACTION_COMPILE: cf->set_value("script","action","compile"); break;
+ case SCRIPT_ACTION_ENCRYPT: cf->set_value("script","action","encrypt"); break;
+ }
+
+ cf->set_value("convert_scenes","convert_text_scenes",convert_text_scenes);
+
+ cf->set_value("script","encrypt_key",script_key);
+
+ switch(sample_action) {
+ case SAMPLE_ACTION_NONE: cf->set_value("convert_samples","action","none"); break;
+ case SAMPLE_ACTION_COMPRESS_RAM: cf->set_value("convert_samples","action","compress_ram"); break;
+ }
+
+ cf->set_value("convert_samples","max_hz",sample_action_max_hz);
+ cf->set_value("convert_samples","trim",sample_action_trim);
+
+ cf->save("res://export.cfg");
+
+}
+
+
+void EditorImportExport::script_set_action(ScriptAction p_action) {
+
+ script_action=p_action;
+}
+
+EditorImportExport::ScriptAction EditorImportExport::script_get_action() const{
+
+ return script_action;
+}
+
+void EditorImportExport::script_set_encryption_key(const String& p_key){
+
+ script_key=p_key;
+}
+String EditorImportExport::script_get_encryption_key() const{
+
+ return script_key;
+}
+
+
+void EditorImportExport::sample_set_action(SampleAction p_action) {
+
+ sample_action=p_action;
+}
+
+EditorImportExport::SampleAction EditorImportExport::sample_get_action() const{
+
+ return sample_action;
+}
+
+void EditorImportExport::sample_set_max_hz(int p_hz){
+
+ sample_action_max_hz=p_hz;
+}
+int EditorImportExport::sample_get_max_hz() const{
+
+ return sample_action_max_hz;
+}
+
+void EditorImportExport::sample_set_trim(bool p_trim){
+
+ sample_action_trim=p_trim;
+}
+bool EditorImportExport::sample_get_trim() const{
+
+ return sample_action_trim;
+}
+
+PoolVector<String> EditorImportExport::_get_export_file_list() {
+
+ PoolVector<String> fl;
+ for (Map<StringName,FileAction>::Element *E=files.front();E;E=E->next()) {
+
+ fl.push_back(E->key());
+ }
+
+ return fl;
+}
+
+PoolVector<String> EditorImportExport::_get_export_platforms() {
+
+ PoolVector<String> ep;
+ for (Map<StringName,Ref<EditorExportPlatform> >::Element *E=exporters.front();E;E=E->next()) {
+
+ ep.push_back(E->key());
+ }
+
+ return ep;
+
+}
+
+void EditorImportExport::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("add_import_plugin","plugin:EditorImportPlugin"),&EditorImportExport::add_import_plugin);
+ ClassDB::bind_method(D_METHOD("remove_import_plugin","plugin:EditorImportPlugin"),&EditorImportExport::remove_import_plugin);
+ ClassDB::bind_method(D_METHOD("get_import_plugin_count"),&EditorImportExport::get_import_plugin_count);
+ ClassDB::bind_method(D_METHOD("get_import_plugin:EditorImportPlugin","idx"),&EditorImportExport::get_import_plugin);
+ ClassDB::bind_method(D_METHOD("get_import_plugin_by_name:EditorImportPlugin","name"),&EditorImportExport::get_import_plugin_by_name);
+
+ ClassDB::bind_method(D_METHOD("add_export_plugin","plugin:EditorExportPlugin"),&EditorImportExport::add_export_plugin);
+ ClassDB::bind_method(D_METHOD("remove_export_plugin","plugin:EditorExportPlugin"),&EditorImportExport::remove_export_plugin);
+ ClassDB::bind_method(D_METHOD("get_export_plugin_count"),&EditorImportExport::get_export_plugin_count);
+ ClassDB::bind_method(D_METHOD("get_export_plugin:EditorExportPlugin","idx"),&EditorImportExport::get_export_plugin);
+
+ ClassDB::bind_method(D_METHOD("set_export_file_action","file","action"),&EditorImportExport::set_export_file_action);
+ ClassDB::bind_method(D_METHOD("get_export_file_action","file"),&EditorImportExport::get_export_file_action);
+ ClassDB::bind_method(D_METHOD("get_export_file_list"),&EditorImportExport::_get_export_file_list);
+
+ ClassDB::bind_method(D_METHOD("add_export_platform","platform:EditorExportplatform"),&EditorImportExport::add_export_platform);
+ //ClassDB::bind_method(D_METHOD("remove_export_platform","platform:EditorExportplatform"),&EditorImportExport::add_export_platform);
+ ClassDB::bind_method(D_METHOD("get_export_platform:EditorExportPlatform","name"),&EditorImportExport::get_export_platform);
+ ClassDB::bind_method(D_METHOD("get_export_platforms"),&EditorImportExport::_get_export_platforms);
+
+ ClassDB::bind_method(D_METHOD("set_export_filter","filter"),&EditorImportExport::set_export_filter);
+ ClassDB::bind_method(D_METHOD("get_export_filter"),&EditorImportExport::get_export_filter);
+
+ ClassDB::bind_method(D_METHOD("set_export_custom_filter","filter"),&EditorImportExport::set_export_custom_filter);
+ ClassDB::bind_method(D_METHOD("get_export_custom_filter"),&EditorImportExport::get_export_custom_filter);
+
+ ClassDB::bind_method(D_METHOD("set_export_custom_filter_exclude","filter_exclude"),&EditorImportExport::set_export_custom_filter_exclude);
+ ClassDB::bind_method(D_METHOD("get_export_custom_filter_exclude"),&EditorImportExport::get_export_custom_filter_exclude);
+
+
+ ClassDB::bind_method(D_METHOD("image_export_group_create"),&EditorImportExport::image_export_group_create);
+ ClassDB::bind_method(D_METHOD("image_export_group_remove"),&EditorImportExport::image_export_group_remove);
+ ClassDB::bind_method(D_METHOD("image_export_group_set_image_action"),&EditorImportExport::image_export_group_set_image_action);
+ ClassDB::bind_method(D_METHOD("image_export_group_set_make_atlas"),&EditorImportExport::image_export_group_set_make_atlas);
+ ClassDB::bind_method(D_METHOD("image_export_group_set_shrink"),&EditorImportExport::image_export_group_set_shrink);
+ ClassDB::bind_method(D_METHOD("image_export_group_get_image_action"),&EditorImportExport::image_export_group_get_image_action);
+ ClassDB::bind_method(D_METHOD("image_export_group_get_make_atlas"),&EditorImportExport::image_export_group_get_make_atlas);
+ ClassDB::bind_method(D_METHOD("image_export_group_get_shrink"),&EditorImportExport::image_export_group_get_shrink);
+ ClassDB::bind_method(D_METHOD("image_add_to_export_group"),&EditorImportExport::image_add_to_export_group);
+ ClassDB::bind_method(D_METHOD("script_set_action"),&EditorImportExport::script_set_action);
+ ClassDB::bind_method(D_METHOD("script_set_encryption_key"),&EditorImportExport::script_set_encryption_key);
+ ClassDB::bind_method(D_METHOD("script_get_action"),&EditorImportExport::script_get_action);
+ ClassDB::bind_method(D_METHOD("script_get_encryption_key"),&EditorImportExport::script_get_encryption_key);
+
+
+
+ BIND_CONSTANT( ACTION_NONE );
+ BIND_CONSTANT( ACTION_COPY );
+ BIND_CONSTANT( ACTION_BUNDLE );
+
+ BIND_CONSTANT( EXPORT_SELECTED );
+ BIND_CONSTANT( EXPORT_RESOURCES );
+ BIND_CONSTANT( EXPORT_ALL );
+
+ BIND_CONSTANT( IMAGE_ACTION_NONE );
+ BIND_CONSTANT( IMAGE_ACTION_COMPRESS_DISK );
+ BIND_CONSTANT( IMAGE_ACTION_COMPRESS_RAM );
+ BIND_CONSTANT( IMAGE_ACTION_KEEP );
+
+ BIND_CONSTANT( SCRIPT_ACTION_NONE );
+ BIND_CONSTANT( SCRIPT_ACTION_COMPILE );
+ BIND_CONSTANT( SCRIPT_ACTION_ENCRYPT );
+};
+
+
+
+EditorImportExport::EditorImportExport() {
+
+ export_filter=EXPORT_RESOURCES;
+ singleton=this;
+ image_action=IMAGE_ACTION_NONE;
+ image_action_compress_quality=0.7;
+ image_formats.insert("png");
+ image_shrink=1;
+
+
+ script_action=SCRIPT_ACTION_COMPILE;
+
+ sample_action=SAMPLE_ACTION_NONE;
+ sample_action_max_hz=44100;
+ sample_action_trim=false;
+
+ convert_text_scenes=true;
+
+}
+
+
+
+EditorImportExport::~EditorImportExport() {
+
+
+
+}
+#endif
diff --git a/editor/editor_export.h b/editor/editor_export.h
new file mode 100644
index 0000000000..8a9dc965e5
--- /dev/null
+++ b/editor/editor_export.h
@@ -0,0 +1,297 @@
+/*************************************************************************/
+/* editor_import_export.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_EXPORT_H
+#define EDITOR_EXPORT_H
+
+
+
+#include "resource.h"
+#include "scene/main/node.h"
+#include "scene/resources/texture.h"
+#include "scene/main/timer.h"
+
+class EditorProgress;
+class FileAccess;
+class EditorExportPlatform;
+class EditorFileSystemDirectory;
+
+class EditorExportPreset : public Reference {
+
+ GDCLASS( EditorExportPreset,Reference )
+public:
+ enum ExportFilter {
+ EXPORT_ALL_RESOURCES,
+ EXPORT_SELECTED_SCENES,
+ EXPORT_SELECTED_RESOURCES,
+ };
+
+private:
+
+ Ref<EditorExportPlatform> platform;
+ ExportFilter export_filter;
+ String include_filter;
+ String exclude_filter;
+
+ String exporter;
+ Set<String> selected_files;
+ bool runnable;
+
+ Vector<String> patches;
+
+
+friend class EditorExport;
+friend class EditorExportPlatform;
+
+ List<PropertyInfo> properties;
+ Map<StringName,Variant> values;
+
+ String name;
+protected:
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list( List<PropertyInfo> *p_list) const;
+
+public:
+
+ Ref<EditorExportPlatform> get_platform() const;
+ bool has(const StringName& p_property) const { return values.has(p_property); }
+
+ Vector<String> get_files_to_export() const;
+
+ void add_export_file(const String& p_path);
+ void remove_export_file(const String& p_path);
+ bool has_export_file(const String& p_path);
+
+ void set_name(const String& p_name);
+ String get_name() const;
+
+ void set_runnable(bool p_enable);
+ bool is_runnable() const;
+
+ void set_export_filter(ExportFilter p_filter);
+ ExportFilter get_export_filter() const;
+
+ void set_include_filter(const String& p_include);
+ String get_include_filter() const;
+
+ void set_exclude_filter(const String& p_exclude);
+ String get_exclude_filter() const;
+
+ void add_patch(const String& p_path,int p_at_pos=-1);
+ void set_patch(int p_index,const String& p_path);
+ String get_patch(int p_index);
+ void remove_patch(int p_idx);
+ Vector<String> get_patches() const;
+
+ const List<PropertyInfo>& get_properties() const { return properties; }
+
+ EditorExportPreset();
+};
+
+
+class EditorExportPlatform : public Reference {
+
+ GDCLASS( EditorExportPlatform,Reference )
+
+public:
+
+ typedef Error (*EditorExportSaveFunction)(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total);
+
+private:
+
+ struct SavedData {
+
+ uint64_t ofs;
+ uint64_t size;
+ Vector<uint8_t> md5;
+ CharString path_utf8;
+
+ bool operator<(const SavedData& p_data) const {
+ return path_utf8 < p_data.path_utf8;
+ }
+ };
+
+ struct PackData {
+
+ FileAccess *f;
+ Vector<SavedData> file_ofs;
+ EditorProgress *ep;
+ };
+
+ struct ZipData {
+
+ void* zip;
+ EditorProgress *ep;
+
+ };
+
+ void _export_find_resources(EditorFileSystemDirectory *p_dir,Set<String>& p_paths);
+ void _export_find_dependencies(const String& p_path,Set<String>& p_paths);
+
+ void gen_debug_flags(Vector<String> &r_flags, int p_flags);
+ static Error _save_pack_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total);
+ static Error _save_zip_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total);
+
+
+protected:
+
+ virtual void get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String> *r_features)=0;
+ String find_export_template(String template_file_name, String *err=NULL) const;
+
+public:
+
+
+ struct ExportOption {
+ PropertyInfo option;
+ Variant default_value;
+
+ ExportOption(const PropertyInfo& p_info,const Variant& p_default) { option=p_info; default_value=p_default; }
+ ExportOption() {}
+ };
+
+ virtual Ref<EditorExportPreset> create_preset();
+
+ virtual void get_export_options(List<ExportOption> *r_options)=0;
+ virtual String get_name() const =0;
+ virtual Ref<Texture> get_logo() const =0;
+
+
+ Error export_project_files(const Ref<EditorExportPreset>& p_preset,EditorExportSaveFunction p_func, void* p_udata);
+
+ Error save_pack(const Ref<EditorExportPreset>& p_preset,const String& p_path);
+ Error save_zip(const Ref<EditorExportPreset>& p_preset,const String& p_path);
+
+
+ virtual bool poll_devices() { return false; }
+ virtual int get_device_count() const { return 0; }
+ virtual String get_device_name(int p_device) const { return ""; }
+ virtual String get_device_info(int p_device) const { return ""; }
+
+ enum DebugFlags {
+ DEBUG_FLAG_DUMB_CLIENT=1,
+ DEBUG_FLAG_REMOTE_DEBUG=2,
+ DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST=4,
+ DEBUG_FLAG_VIEW_COLLISONS=8,
+ DEBUG_FLAG_VIEW_NAVIGATION=16,
+ };
+
+ virtual Error run(int p_device,int p_debug_flags) { return OK; }
+
+ virtual bool can_export(const Ref<EditorExportPreset>& p_preset,String &r_error,bool &r_missing_templates) const=0;
+
+ virtual String get_binary_extension() const=0;
+ virtual Error export_project(const Ref<EditorExportPreset>& p_preset,bool p_debug,const String& p_path,int p_flags=0)=0;
+
+ EditorExportPlatform();
+};
+
+
+class EditorExport : public Node {
+ GDCLASS(EditorExport,Node);
+
+ Vector<Ref<EditorExportPlatform> > export_platforms;
+ Vector<Ref<EditorExportPreset> > export_presets;
+
+ Timer *save_timer;
+ bool block_save;
+
+ static EditorExport *singleton;
+
+ void _save();
+protected:
+
+friend class EditorExportPreset;
+ void save_presets();
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ static EditorExport * get_singleton() { return singleton; }
+
+ void add_export_platform(const Ref<EditorExportPlatform>& p_platform);
+ int get_export_platform_count();
+ Ref<EditorExportPlatform> get_export_platform(int p_idx);
+
+
+ void add_export_preset(const Ref<EditorExportPreset>& p_preset,int p_at_pos=-1);
+ int get_export_preset_count() const;
+ Ref<EditorExportPreset> get_export_preset(int p_idx);
+ void remove_export_preset(int p_idx);
+
+ void load_config();
+
+ EditorExport();
+ ~EditorExport();
+};
+
+
+
+
+class EditorExportPlatformPC : public EditorExportPlatform {
+
+ GDCLASS( EditorExportPlatformPC,EditorExportPlatform )
+
+ Ref<ImageTexture> logo;
+ String name;
+ String extension;
+
+ String release_file_32;
+ String release_file_64;
+ String debug_file_32;
+ String debug_file_64;
+
+public:
+
+ virtual void get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String>* r_features);
+
+ virtual void get_export_options(List<ExportOption> *r_options);
+
+ virtual String get_name() const;
+ virtual Ref<Texture> get_logo() const;
+
+ virtual bool can_export(const Ref<EditorExportPreset>& p_preset,String &r_error,bool &r_missing_templates) const;
+ virtual String get_binary_extension() const;
+ virtual Error export_project(const Ref<EditorExportPreset>& p_preset,bool p_debug,const String& p_path,int p_flags=0);
+
+ void set_extension(const String& p_extension);
+ void set_name(const String& p_name);
+
+ void set_logo(const Ref<Texture>& p_loco);
+
+ void set_release_64(const String& p_file);
+ void set_release_32(const String& p_file);
+ void set_debug_64(const String& p_file);
+ void set_debug_32(const String& p_file);
+
+ EditorExportPlatformPC();
+};
+
+
+#endif // EDITOR_IMPORT_EXPORT_H
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
new file mode 100644
index 0000000000..bfaf1906d8
--- /dev/null
+++ b/editor/editor_file_dialog.cpp
@@ -0,0 +1,1531 @@
+/*************************************************************************/
+/* editor_file_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_file_dialog.h"
+
+#include "scene/gui/label.h"
+#include "scene/gui/center_container.h"
+#include "print_string.h"
+#include "os/keyboard.h"
+#include "editor_resource_preview.h"
+#include "editor_settings.h"
+#include "scene/gui/margin_container.h"
+#include "os/file_access.h"
+#include "editor_scale.h"
+
+EditorFileDialog::GetIconFunc EditorFileDialog::get_icon_func=NULL;
+EditorFileDialog::GetIconFunc EditorFileDialog::get_large_icon_func=NULL;
+
+EditorFileDialog::RegisterFunc EditorFileDialog::register_func=NULL;
+EditorFileDialog::RegisterFunc EditorFileDialog::unregister_func=NULL;
+
+
+VBoxContainer *EditorFileDialog::get_vbox() {
+ return vbox;
+
+}
+
+void EditorFileDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ mode_thumbnails->set_icon(get_icon("FileThumbnail","EditorIcons"));
+ mode_list->set_icon(get_icon("FileList","EditorIcons"));
+ dir_prev->set_icon(get_icon("ArrowLeft","EditorIcons"));
+ dir_next->set_icon(get_icon("ArrowRight","EditorIcons"));
+ dir_up->set_icon(get_icon("ArrowUp","EditorIcons"));
+ refresh->set_icon(get_icon("Reload","EditorIcons"));
+ favorite->set_icon(get_icon("Favorites","EditorIcons"));
+
+ fav_up->set_icon(get_icon("MoveUp","EditorIcons"));
+ fav_down->set_icon(get_icon("MoveDown","EditorIcons"));
+ fav_rm->set_icon(get_icon("RemoveSmall","EditorIcons"));
+
+ } else if (p_what==NOTIFICATION_PROCESS) {
+
+ if (preview_waiting) {
+ preview_wheel_timeout-=get_process_delta_time();
+ if (preview_wheel_timeout<=0) {
+ preview_wheel_index++;
+ if (preview_wheel_index>=8)
+ preview_wheel_index=0;
+ Ref<Texture> frame = get_icon("WaitPreview"+itos(preview_wheel_index+1),"EditorIcons");
+ preview->set_texture(frame);
+ preview_wheel_timeout=0.1;
+ }
+ }
+ } else if (p_what==NOTIFICATION_DRAW) {
+
+ //RID ci = get_canvas_item();
+ //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ } else if (p_what==NOTIFICATION_POPUP_HIDE) {
+
+ set_process_unhandled_input(false);
+
+ } else if (p_what==EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+
+ bool show_hidden=EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files");
+ if (show_hidden_files!=show_hidden)
+ set_show_hidden_files(show_hidden);
+ set_display_mode((DisplayMode)EditorSettings::get_singleton()->get("filesystem/file_dialog/display_mode").operator int());
+ }
+}
+
+void EditorFileDialog::_unhandled_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::KEY && is_window_modal_on_top()) {
+
+ if (p_event.key.pressed) {
+
+ bool handled=false;
+
+ if (ED_IS_SHORTCUT("file_dialog/go_back", p_event)) {
+ _go_back();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/go_forward", p_event)) {
+ _go_forward();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/go_up", p_event)) {
+ _go_up();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/refresh", p_event)) {
+ invalidate();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/toggle_hidden_files", p_event)) {
+ bool show=!show_hidden_files;
+ set_show_hidden_files(show);
+ EditorSettings::get_singleton()->set("filesystem/file_dialog/show_hidden_files",show);
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/toggle_favorite", p_event)) {
+ _favorite_toggled(favorite->is_pressed());
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/toggle_mode", p_event)) {
+ if (mode_thumbnails->is_pressed()) {
+ set_display_mode(DISPLAY_LIST);
+ } else {
+ set_display_mode(DISPLAY_THUMBNAILS);
+ }
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/create_folder", p_event)) {
+ _make_dir();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) {
+ dir->grab_focus();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/move_favorite_up", p_event)) {
+ _favorite_move_up();
+ handled=true;
+ }
+ if (ED_IS_SHORTCUT("file_dialog/move_favorite_down", p_event)) {
+ _favorite_move_down();
+ handled=true;
+ }
+
+ if (handled) {
+ accept_event();
+ }
+ }
+ }
+}
+
+void EditorFileDialog::set_enable_multiple_selection(bool p_enable) {
+
+ item_list->set_select_mode(p_enable?ItemList::SELECT_MULTI:ItemList::SELECT_SINGLE);
+
+};
+
+Vector<String> EditorFileDialog::get_selected_files() const {
+
+ Vector<String> list;
+ for(int i=0;i<item_list->get_item_count();i++) {
+ if (item_list->is_selected(i))
+ list.push_back(item_list->get_item_text(i));
+ }
+ return list;
+
+};
+
+void EditorFileDialog::update_dir() {
+
+ dir->set_text(dir_access->get_current_dir());
+}
+
+void EditorFileDialog::_dir_entered(String p_dir) {
+
+
+ dir_access->change_dir(p_dir);
+ file->set_text("");
+ invalidate();
+ update_dir();
+ _push_history();
+
+
+}
+
+void EditorFileDialog::_file_entered(const String& p_file) {
+
+ _action_pressed();
+}
+
+void EditorFileDialog::_save_confirm_pressed() {
+ String f=dir_access->get_current_dir().plus_file(file->get_text());
+ _save_to_recent();
+ emit_signal("file_selected",f);
+ hide();
+}
+
+void EditorFileDialog::_post_popup() {
+
+ ConfirmationDialog::_post_popup();
+ if (invalidated) {
+ update_file_list();
+ invalidated=false;
+ }
+ if (mode==MODE_SAVE_FILE)
+ file->grab_focus();
+ else
+ item_list->grab_focus();
+
+ if (is_visible_in_tree() && get_current_file()!="")
+ _request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
+
+ if (is_visible_in_tree()) {
+ Ref<Texture> folder = get_icon("folder","FileDialog");
+ recent->clear();
+
+
+ bool res = access==ACCESS_RESOURCES;
+ Vector<String> recentd = EditorSettings::get_singleton()->get_recent_dirs();
+ for(int i=0;i<recentd.size();i++) {
+ bool cres = recentd[i].begins_with("res://");
+ if (cres!=res)
+ continue;
+ String name = recentd[i];
+ if (res && name=="res://") {
+ name="/";
+ } else {
+ name=name.get_file()+"/";
+ }
+
+ //print_line("file: "+name);
+ recent->add_item(name,folder);
+ recent->set_item_metadata( recent->get_item_count()-1,recentd[i]);
+ }
+
+ local_history.clear();
+ local_history_pos=-1;
+ _push_history();
+
+ _update_favorites();
+ }
+
+ set_process_unhandled_input(true);
+
+}
+
+void EditorFileDialog::_thumbnail_result(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata) {
+
+ if (display_mode==DISPLAY_LIST || p_preview.is_null())
+ return;
+
+ for(int i=0;i<item_list->get_item_count();i++) {
+ Dictionary d = item_list->get_item_metadata(i);
+ String pname = d["path"];
+ if (pname==p_path) {
+ item_list->set_item_icon(i,p_preview);
+ item_list->set_item_tag_icon(i,Ref<Texture>());
+ }
+ }
+}
+
+void EditorFileDialog::_thumbnail_done(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata) {
+
+ set_process(false);
+ preview_waiting=false;
+
+ if (p_preview.is_valid() && get_current_path()==p_path) {
+
+
+ preview->set_texture(p_preview);
+ if (display_mode==DISPLAY_THUMBNAILS) {
+ preview_vb->hide();
+ } else {
+ preview_vb->show();
+ }
+
+ } else {
+ preview_vb->hide();
+ preview->set_texture(Ref<Texture>());
+
+ }
+
+}
+
+void EditorFileDialog::_request_single_thumbnail(const String& p_path) {
+
+ if (!FileAccess::exists(p_path))
+ return;
+
+ EditorResourcePreview::get_singleton()->queue_resource_preview(p_path,this,"_thumbnail_done",p_path);
+ //print_line("want file "+p_path);
+ set_process(true);
+ preview_waiting=true;
+ preview_wheel_timeout=0;
+
+}
+
+void EditorFileDialog::_action_pressed() {
+
+ if (mode==MODE_OPEN_FILES) {
+
+
+ String fbase=dir_access->get_current_dir();
+
+ PoolVector<String> files;
+ for(int i=0;i<item_list->get_item_count();i++) {
+ if (item_list->is_selected(i))
+ files.push_back( fbase.plus_file(item_list->get_item_text(i) ));
+ }
+
+ if (files.size()) {
+ _save_to_recent();
+ emit_signal("files_selected",files);
+ hide();
+ }
+
+ return;
+ }
+
+ String f=dir_access->get_current_dir().plus_file(file->get_text());
+
+ if ((mode==MODE_OPEN_ANY || mode==MODE_OPEN_FILE) && dir_access->file_exists(f)) {
+ _save_to_recent();
+ emit_signal("file_selected",f);
+ hide();
+ }else if (mode==MODE_OPEN_ANY || mode==MODE_OPEN_DIR) {
+
+ String path=dir_access->get_current_dir();
+
+ path=path.replace("\\","/");
+
+ for(int i=0;i<item_list->get_item_count();i++) {
+ if (item_list->is_selected(i)) {
+ Dictionary d=item_list->get_item_metadata(i);
+ if (d["dir"]) {
+ path=path.plus_file(d["name"]);
+
+ break;
+ }
+ }
+ }
+
+ _save_to_recent();
+ emit_signal("dir_selected",path);
+ hide();
+ }
+
+ if (mode==MODE_SAVE_FILE) {
+
+ bool valid=false;
+
+ if (filter->get_selected()==filter->get_item_count()-1) {
+ valid=true; //match none
+ } else if (filters.size()>1 && filter->get_selected()==0) {
+ // match all filters
+ for (int i=0;i<filters.size();i++) {
+
+ String flt=filters[i].get_slice(";",0);
+ for (int j=0;j<flt.get_slice_count(",");j++) {
+
+ String str = flt.get_slice(",",j).strip_edges();
+ if (f.match(str)) {
+ valid=true;
+ break;
+ }
+ }
+ if (valid)
+ break;
+ }
+ } else {
+ int idx=filter->get_selected();
+ if (filters.size()>1)
+ idx--;
+ if (idx>=0 && idx<filters.size()) {
+
+ String flt=filters[idx].get_slice(";",0);
+ int filterSliceCount=flt.get_slice_count(",");
+ for (int j=0;j<filterSliceCount;j++) {
+
+ String str = (flt.get_slice(",",j).strip_edges());
+ if (f.match(str)) {
+ valid=true;
+ break;
+ }
+ }
+
+ if (!valid && filterSliceCount>0) {
+ String str = (flt.get_slice(",",0).strip_edges());
+ f+=str.substr(1, str.length()-1);
+ _request_single_thumbnail(get_current_dir().plus_file(f.get_file()));
+ file->set_text(f.get_file());
+ valid=true;
+ }
+ } else {
+ valid=true;
+ }
+ }
+
+
+ if (!valid) {
+
+ exterr->popup_centered_minsize(Size2(250,80)*EDSCALE);
+ return;
+
+ }
+
+ if (dir_access->file_exists(f) && !disable_overwrite_warning) {
+ confirm_save->set_text(TTR("File Exists, Overwrite?"));
+ confirm_save->popup_centered(Size2(200,80));
+ } else {
+
+ _save_to_recent();
+ emit_signal("file_selected",f);
+ hide();
+ }
+ }
+}
+
+void EditorFileDialog::_cancel_pressed() {
+
+ file->set_text("");
+ invalidate();
+ hide();
+}
+
+void EditorFileDialog::_item_selected(int p_item) {
+
+ int current = p_item;
+ if (current<0 || current>=item_list->get_item_count())
+ return;
+
+ Dictionary d=item_list->get_item_metadata(current);
+
+ if (!d["dir"]) {
+
+ file->set_text(d["name"]);
+ _request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
+ }
+}
+
+void EditorFileDialog::_push_history() {
+
+ local_history.resize(local_history_pos+1);
+ String new_path = dir_access->get_current_dir();
+ if (local_history.size()==0 || new_path!=local_history[local_history_pos]) {
+ local_history.push_back(new_path);
+ local_history_pos++;
+ dir_prev->set_disabled(local_history_pos==0);
+ dir_next->set_disabled(true);
+ }
+
+}
+void EditorFileDialog::_item_dc_selected(int p_item) {
+
+
+ int current = p_item;
+ if (current<0 || current>=item_list->get_item_count())
+ return;
+
+ Dictionary d=item_list->get_item_metadata(current);
+
+ if (d["dir"]) {
+
+ dir_access->change_dir(d["name"]);
+ call_deferred("_update_file_list");
+ call_deferred("_update_dir");
+
+ _push_history();
+
+
+ } else {
+
+ _action_pressed();
+ }
+}
+
+
+
+void EditorFileDialog::update_file_list() {
+
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ Ref<Texture> folder_thumbnail;
+ Ref<Texture> file_thumbnail;
+
+ item_list->clear();
+
+ if (display_mode==DISPLAY_THUMBNAILS) {
+
+ item_list->set_max_columns(0);
+ item_list->set_icon_mode(ItemList::ICON_MODE_TOP);
+ item_list->set_fixed_column_width(thumbnail_size*3/2);
+ item_list->set_max_text_lines(2);
+ item_list->set_fixed_icon_size(Size2(thumbnail_size,thumbnail_size));
+
+ if (!has_icon("ResizedFolder","EditorIcons")) {
+ Ref<ImageTexture> folder = get_icon("FolderBig","EditorIcons");
+ Image img = folder->get_data();
+ img.resize(thumbnail_size,thumbnail_size);
+ Ref<ImageTexture> resized_folder = Ref<ImageTexture>( memnew( ImageTexture));
+ resized_folder->create_from_image(img,0);
+ Theme::get_default()->set_icon("ResizedFolder","EditorIcons",resized_folder);
+ }
+
+ folder_thumbnail = get_icon("ResizedFolder","EditorIcons");
+
+ if (!has_icon("ResizedFile","EditorIcons")) {
+ Ref<ImageTexture> file = get_icon("FileBig","EditorIcons");
+ Image img = file->get_data();
+ img.resize(thumbnail_size,thumbnail_size);
+ Ref<ImageTexture> resized_file = Ref<ImageTexture>( memnew( ImageTexture));
+ resized_file->create_from_image(img,0);
+ Theme::get_default()->set_icon("ResizedFile","EditorIcons",resized_file);
+ }
+
+ file_thumbnail = get_icon("ResizedFile","EditorIcons");
+
+ preview_vb->hide();
+
+ } else {
+
+ item_list->set_icon_mode(ItemList::ICON_MODE_LEFT);
+ item_list->set_max_columns(1);
+ item_list->set_max_text_lines(1);
+ item_list->set_fixed_column_width(0);
+ item_list->set_fixed_icon_size(Size2());
+ if (preview->get_texture().is_valid())
+ preview_vb->show();
+
+ }
+
+ String cdir = dir_access->get_current_dir();
+ bool skip_pp = access==ACCESS_RESOURCES && cdir=="res://";
+
+ dir_access->list_dir_begin();
+
+
+ Ref<Texture> folder = get_icon("folder","FileDialog");
+ List<String> files;
+ List<String> dirs;
+
+ bool isdir;
+ bool ishidden;
+ bool show_hidden = show_hidden_files;
+ String item;
+
+ while ((item=dir_access->get_next(&isdir))!="") {
+
+ ishidden = dir_access->current_is_hidden();
+
+ if (show_hidden || !ishidden) {
+ if (!isdir)
+ files.push_back(item);
+ else if (item!=".." || !skip_pp)
+ dirs.push_back(item);
+ }
+ }
+
+ if (dirs.find("..")==NULL) {
+ //may happen if lacking permissions
+ dirs.push_back("..");
+ }
+
+ dirs.sort_custom<NoCaseComparator>();
+ files.sort_custom<NoCaseComparator>();
+
+ while(!dirs.empty()) {
+ const String& dir_name=dirs.front()->get();
+
+ item_list->add_item(dir_name+"/");
+
+ if (display_mode==DISPLAY_THUMBNAILS) {
+
+ item_list->set_item_icon(item_list->get_item_count()-1,folder_thumbnail);
+ } else {
+
+ item_list->set_item_icon(item_list->get_item_count()-1,folder);
+ }
+
+ Dictionary d;
+ d["name"]=dir_name;
+ d["path"]=String();
+ d["dir"]=true;
+
+ item_list->set_item_metadata( item_list->get_item_count() -1, d);
+
+ dirs.pop_front();
+ }
+
+ dirs.clear();
+
+ List<String> patterns;
+ // build filter
+ if (filter->get_selected()==filter->get_item_count()-1) {
+
+ // match all
+ } else if (filters.size()>1 && filter->get_selected()==0) {
+ // match all filters
+ for (int i=0;i<filters.size();i++) {
+
+ String f=filters[i].get_slice(";",0);
+ for (int j=0;j<f.get_slice_count(",");j++) {
+
+ patterns.push_back(f.get_slice(",",j).strip_edges());
+ }
+ }
+ } else {
+ int idx=filter->get_selected();
+ if (filters.size()>1)
+ idx--;
+
+ if (idx>=0 && idx<filters.size()) {
+
+ String f=filters[idx].get_slice(";",0);
+ for (int j=0;j<f.get_slice_count(",");j++) {
+
+ patterns.push_back(f.get_slice(",",j).strip_edges());
+ }
+ }
+ }
+
+
+ String base_dir = dir_access->get_current_dir();
+
+
+ while(!files.empty()) {
+
+ bool match=patterns.empty();
+
+ for(List<String>::Element *E=patterns.front();E;E=E->next()) {
+
+ if (files.front()->get().matchn(E->get())) {
+
+ match=true;
+ break;
+ }
+ }
+
+ if (match) {
+ //TreeItem *ti=tree->create_item(root);
+ //ti->set_text(0,files.front()->get());
+ item_list->add_item(files.front()->get());
+
+ if (get_icon_func) {
+
+
+ Ref<Texture> icon = get_icon_func(base_dir.plus_file(files.front()->get()));
+ //ti->set_icon(0,icon);
+ if (display_mode==DISPLAY_THUMBNAILS) {
+
+ item_list->set_item_icon(item_list->get_item_count()-1,file_thumbnail);
+ item_list->set_item_tag_icon(item_list->get_item_count()-1,icon);
+ } else {
+ item_list->set_item_icon(item_list->get_item_count()-1,icon);
+ }
+ }
+
+ if (mode==MODE_OPEN_DIR) {
+ //disabled mode?
+ //ti->set_custom_color(0,get_color("files_disabled"));
+ //ti->set_selectable(0,false);
+ }
+ Dictionary d;
+ d["name"]=files.front()->get();
+ d["dir"]=false;
+ String fullpath = base_dir.plus_file(files.front()->get());
+
+ if (display_mode==DISPLAY_THUMBNAILS) {
+ EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath,this,"_thumbnail_result",fullpath);
+ }
+ d["path"]=base_dir.plus_file(files.front()->get());
+ //ti->set_metadata(0,d);
+ item_list->set_item_metadata(item_list->get_item_count()-1,d);
+
+ if (file->get_text()==files.front()->get())
+ item_list->set_current(item_list->get_item_count()-1);
+ }
+
+ files.pop_front();
+ }
+
+ if (favorites->get_current()>=0) {
+ favorites->unselect(favorites->get_current());
+ }
+
+ favorite->set_pressed(false);
+ fav_up->set_disabled(true);
+ fav_down->set_disabled(true);
+ for(int i=0;i<favorites->get_item_count();i++) {
+ if (favorites->get_item_metadata(i)==base_dir) {
+ favorites->select(i);
+ favorite->set_pressed(true);
+ if (i>0) {
+ fav_up->set_disabled(false);
+ }
+ if (i<favorites->get_item_count()-1) {
+ fav_down->set_disabled(false);
+ }
+ break;
+ }
+
+ }
+ // ??
+ /*
+ if (tree->get_root() && tree->get_root()->get_children())
+ tree->get_root()->get_children()->select(0);
+ */
+
+ files.clear();
+
+}
+
+void EditorFileDialog::_filter_selected(int) {
+
+ update_file_list();
+}
+
+void EditorFileDialog::update_filters() {
+
+ filter->clear();
+
+ if (filters.size()>1) {
+ String all_filters;
+
+ const int max_filters=5;
+
+ for(int i=0;i<MIN( max_filters, filters.size()) ;i++) {
+ String flt=filters[i].get_slice(";",0);
+ if (i>0)
+ all_filters+=",";
+ all_filters+=flt;
+ }
+
+ if (max_filters<filters.size())
+ all_filters+=", ...";
+
+ filter->add_item(TTR("All Recognized")+" ( "+all_filters+" )");
+ }
+ for(int i=0;i<filters.size();i++) {
+
+ String flt=filters[i].get_slice(";",0).strip_edges();
+ String desc=filters[i].get_slice(";",1).strip_edges();
+ if (desc.length())
+ filter->add_item(desc+" ( "+flt+" )");
+ else
+ filter->add_item("( "+flt+" )");
+ }
+
+ filter->add_item(TTR("All Files (*)"));
+
+}
+
+void EditorFileDialog::clear_filters() {
+
+ filters.clear();
+ update_filters();
+ invalidate();
+}
+void EditorFileDialog::add_filter(const String& p_filter) {
+
+ filters.push_back(p_filter);
+ update_filters();
+ invalidate();
+
+}
+
+String EditorFileDialog::get_current_dir() const {
+
+ return dir->get_text();
+}
+String EditorFileDialog::get_current_file() const {
+
+ return file->get_text();
+}
+String EditorFileDialog::get_current_path() const {
+
+ return dir->get_text().plus_file(file->get_text());
+}
+void EditorFileDialog::set_current_dir(const String& p_dir) {
+
+ dir_access->change_dir(p_dir);
+ update_dir();
+ invalidate();
+ //_push_history();
+
+
+}
+void EditorFileDialog::set_current_file(const String& p_file) {
+
+ file->set_text(p_file);
+ update_dir();
+ invalidate();
+ int lp = p_file.find_last(".");
+ if (lp!=-1) {
+ file->select(0,lp);
+ file->grab_focus();
+ }
+
+ if (is_visible_in_tree())
+ _request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
+
+
+}
+void EditorFileDialog::set_current_path(const String& p_path) {
+
+ if (!p_path.size())
+ return;
+ int pos=MAX( p_path.find_last("/"), p_path.find_last("\\") );
+ if (pos==-1) {
+
+ set_current_file(p_path);
+ } else {
+
+ String dir=p_path.substr(0,pos);
+ String file=p_path.substr(pos+1,p_path.length());
+ set_current_dir(dir);
+ set_current_file(file);
+ }
+}
+
+
+void EditorFileDialog::set_mode(Mode p_mode) {
+
+ mode=p_mode;
+ switch(mode) {
+
+ case MODE_OPEN_FILE: get_ok()->set_text(TTR("Open")); set_title("Open a File"); makedir->hide(); break;
+ case MODE_OPEN_FILES: get_ok()->set_text(TTR("Open")); set_title("Open File(s)"); makedir->hide(); break;
+ case MODE_OPEN_DIR: get_ok()->set_text(TTR("Open")); set_title("Open a Directory"); makedir->show(); break;
+ case MODE_OPEN_ANY: get_ok()->set_text(TTR("Open")); set_title("Open a File or Directory"); makedir->show(); break;
+ case MODE_SAVE_FILE: get_ok()->set_text(TTR("Save")); set_title("Save a File"); makedir->show(); break;
+ }
+
+ if (mode==MODE_OPEN_FILES) {
+ item_list->set_select_mode(ItemList::SELECT_MULTI);
+ } else {
+ item_list->set_select_mode(ItemList::SELECT_SINGLE);
+ }
+}
+
+EditorFileDialog::Mode EditorFileDialog::get_mode() const {
+
+ return mode;
+}
+
+void EditorFileDialog::set_access(Access p_access) {
+
+ ERR_FAIL_INDEX(p_access,3);
+ if (access==p_access)
+ return;
+ memdelete( dir_access );
+ switch(p_access) {
+ case ACCESS_FILESYSTEM: {
+
+ dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ } break;
+ case ACCESS_RESOURCES: {
+
+ dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ } break;
+ case ACCESS_USERDATA: {
+
+ dir_access = DirAccess::create(DirAccess::ACCESS_USERDATA);
+ } break;
+ }
+ access=p_access;
+ _update_drives();
+ invalidate();
+ update_filters();
+ update_dir();
+}
+
+void EditorFileDialog::invalidate() {
+
+ if (is_visible_in_tree()) {
+ update_file_list();
+ invalidated=false;
+ } else {
+ invalidated=true;
+ }
+
+}
+
+EditorFileDialog::Access EditorFileDialog::get_access() const{
+
+ return access;
+}
+
+void EditorFileDialog::_make_dir_confirm() {
+
+ Error err = dir_access->make_dir( makedirname->get_text() );
+ if (err==OK) {
+ dir_access->change_dir(makedirname->get_text());
+ invalidate();
+ update_filters();
+ update_dir();
+ _push_history();
+
+ } else {
+ mkdirerr->popup_centered_minsize(Size2(250,50)*EDSCALE);
+ }
+ makedirname->set_text(""); // reset label
+}
+
+
+void EditorFileDialog::_make_dir() {
+
+ makedialog->popup_centered_minsize(Size2(250,80)*EDSCALE);
+ makedirname->grab_focus();
+
+}
+
+void EditorFileDialog::_select_drive(int p_idx) {
+
+ String d = drives->get_item_text(p_idx);
+ dir_access->change_dir(d);
+ file->set_text("");
+ invalidate();
+ update_dir();
+ _push_history();
+
+
+}
+
+void EditorFileDialog::_update_drives() {
+
+
+ int dc = dir_access->get_drive_count();
+ if (dc==0 || access!=ACCESS_FILESYSTEM) {
+ drives->hide();
+ } else {
+ drives->clear();
+ drives->show();
+
+ for(int i=0;i<dir_access->get_drive_count();i++) {
+ String d = dir_access->get_drive(i);
+ drives->add_item(dir_access->get_drive(i));
+ }
+
+ drives->select(dir_access->get_current_drive());
+
+ }
+}
+
+
+void EditorFileDialog::_favorite_selected(int p_idx) {
+
+ Vector<String> favorited = EditorSettings::get_singleton()->get_favorite_dirs();
+ ERR_FAIL_INDEX(p_idx,favorited.size());
+
+ dir_access->change_dir(favorited[p_idx]);
+ file->set_text("");
+ invalidate();
+ update_dir();
+ _push_history();
+}
+
+void EditorFileDialog::_favorite_move_up(){
+
+ int current = favorites->get_current();
+
+ if (current>0 && current<favorites->get_item_count()) {
+ Vector<String> favorited = EditorSettings::get_singleton()->get_favorite_dirs();
+
+ int a_idx=favorited.find(String(favorites->get_item_metadata(current-1)));
+ int b_idx=favorited.find(String(favorites->get_item_metadata(current)));
+
+ if (a_idx==-1 || b_idx==-1)
+ return;
+ SWAP(favorited[a_idx],favorited[b_idx]);
+
+ EditorSettings::get_singleton()->set_favorite_dirs(favorited);
+
+ _update_favorites();
+ update_file_list();
+
+ }
+}
+void EditorFileDialog::_favorite_move_down(){
+
+ int current = favorites->get_current();
+
+ if (current>=0 && current<favorites->get_item_count()-1) {
+ Vector<String> favorited = EditorSettings::get_singleton()->get_favorite_dirs();
+
+ int a_idx=favorited.find(String(favorites->get_item_metadata(current+1)));
+ int b_idx=favorited.find(String(favorites->get_item_metadata(current)));
+
+ if (a_idx==-1 || b_idx==-1)
+ return;
+ SWAP(favorited[a_idx],favorited[b_idx]);
+
+ EditorSettings::get_singleton()->set_favorite_dirs(favorited);
+
+ _update_favorites();
+ update_file_list();
+
+ }
+}
+
+
+void EditorFileDialog::_update_favorites() {
+
+ bool res = access==ACCESS_RESOURCES;
+
+ String current = get_current_dir();
+ Ref<Texture> star = get_icon("Favorites","EditorIcons");
+ favorites->clear();
+
+ favorite->set_pressed(false);
+
+
+ Vector<String> favorited = EditorSettings::get_singleton()->get_favorite_dirs();
+ for(int i=0;i<favorited.size();i++) {
+ bool cres = favorited[i].begins_with("res://");
+ if (cres!=res)
+ continue;
+ String name = favorited[i];
+
+ bool setthis = name==current;
+
+ if (res && name=="res://") {
+ name="/";
+ } else {
+ name=name.get_file()+"/";
+ }
+
+
+ //print_line("file: "+name);
+ favorites->add_item(name,star);
+ favorites->set_item_metadata( favorites->get_item_count()-1,favorited[i]);
+
+ if (setthis) {
+ favorite->set_pressed(true);
+ favorites->set_current(favorites->get_item_count()-1);
+ }
+ }
+
+
+}
+
+void EditorFileDialog::_favorite_toggled(bool p_toggle) {
+ bool res = access==ACCESS_RESOURCES;
+
+ String cd = get_current_dir();
+
+ Vector<String> favorited = EditorSettings::get_singleton()->get_favorite_dirs();
+
+ bool found = false;
+ for(int i=0;i<favorited.size();i++) {
+ bool cres = favorited[i].begins_with("res://");
+ if (cres!=res)
+ continue;
+
+ if (favorited[i]==cd) {
+ found=true;
+ break;
+ }
+ }
+
+ if (found) {
+ favorited.erase(cd);
+ favorite->set_pressed(false);
+ } else {
+ favorited.push_back(cd);
+ favorite->set_pressed(true);
+ }
+
+ EditorSettings::get_singleton()->set_favorite_dirs(favorited);
+
+ _update_favorites();
+
+}
+
+void EditorFileDialog::_recent_selected(int p_idx) {
+
+ Vector<String> recentd = EditorSettings::get_singleton()->get_recent_dirs();
+ ERR_FAIL_INDEX(p_idx,recentd.size());
+
+ dir_access->change_dir(recent->get_item_metadata(p_idx));
+ update_file_list();
+ update_dir();
+ _push_history();
+}
+
+void EditorFileDialog::_go_up() {
+
+ dir_access->change_dir("..");
+ update_file_list();
+ update_dir();
+ _push_history();
+
+}
+
+void EditorFileDialog::_go_back(){
+
+ if (local_history_pos<=0) {
+ return;
+ }
+
+ local_history_pos--;
+ dir_access->change_dir(local_history[local_history_pos]);
+ update_file_list();
+ update_dir();
+
+ dir_prev->set_disabled(local_history_pos==0);
+ dir_next->set_disabled(local_history_pos==local_history.size()-1);
+}
+void EditorFileDialog::_go_forward(){
+
+ if (local_history_pos==local_history.size()-1) {
+ return;
+ }
+
+ local_history_pos++;
+ dir_access->change_dir(local_history[local_history_pos]);
+ update_file_list();
+ update_dir();
+
+ dir_prev->set_disabled(local_history_pos==0);
+ dir_next->set_disabled(local_history_pos==local_history.size()-1);
+
+}
+
+bool EditorFileDialog::default_show_hidden_files=false;
+
+EditorFileDialog::DisplayMode EditorFileDialog::default_display_mode=DISPLAY_THUMBNAILS;
+
+void EditorFileDialog::set_display_mode(DisplayMode p_mode) {
+
+ if (display_mode==p_mode)
+ return;
+ if (p_mode==DISPLAY_THUMBNAILS) {
+ mode_list->set_pressed(false);
+ mode_thumbnails->set_pressed(true);
+ } else {
+ mode_thumbnails->set_pressed(false);
+ mode_list->set_pressed(true);
+ }
+ display_mode=p_mode;
+ invalidate();
+}
+
+EditorFileDialog::DisplayMode EditorFileDialog::get_display_mode() const{
+
+ return display_mode;
+}
+
+
+
+void EditorFileDialog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_unhandled_input"),&EditorFileDialog::_unhandled_input);
+
+ ClassDB::bind_method(D_METHOD("_item_selected"),&EditorFileDialog::_item_selected);
+ ClassDB::bind_method(D_METHOD("_item_db_selected"),&EditorFileDialog::_item_dc_selected);
+ ClassDB::bind_method(D_METHOD("_dir_entered"),&EditorFileDialog::_dir_entered);
+ ClassDB::bind_method(D_METHOD("_file_entered"),&EditorFileDialog::_file_entered);
+ ClassDB::bind_method(D_METHOD("_action_pressed"),&EditorFileDialog::_action_pressed);
+ ClassDB::bind_method(D_METHOD("_cancel_pressed"),&EditorFileDialog::_cancel_pressed);
+ ClassDB::bind_method(D_METHOD("_filter_selected"),&EditorFileDialog::_filter_selected);
+ ClassDB::bind_method(D_METHOD("_save_confirm_pressed"),&EditorFileDialog::_save_confirm_pressed);
+
+ ClassDB::bind_method(D_METHOD("clear_filters"),&EditorFileDialog::clear_filters);
+ ClassDB::bind_method(D_METHOD("add_filter","filter"),&EditorFileDialog::add_filter);
+ ClassDB::bind_method(D_METHOD("get_current_dir"),&EditorFileDialog::get_current_dir);
+ ClassDB::bind_method(D_METHOD("get_current_file"),&EditorFileDialog::get_current_file);
+ ClassDB::bind_method(D_METHOD("get_current_path"),&EditorFileDialog::get_current_path);
+ ClassDB::bind_method(D_METHOD("set_current_dir","dir"),&EditorFileDialog::set_current_dir);
+ ClassDB::bind_method(D_METHOD("set_current_file","file"),&EditorFileDialog::set_current_file);
+ ClassDB::bind_method(D_METHOD("set_current_path","path"),&EditorFileDialog::set_current_path);
+ ClassDB::bind_method(D_METHOD("set_mode","mode"),&EditorFileDialog::set_mode);
+ ClassDB::bind_method(D_METHOD("get_mode"),&EditorFileDialog::get_mode);
+ ClassDB::bind_method(D_METHOD("get_vbox:VBoxContainer"),&EditorFileDialog::get_vbox);
+ ClassDB::bind_method(D_METHOD("set_access","access"),&EditorFileDialog::set_access);
+ ClassDB::bind_method(D_METHOD("get_access"),&EditorFileDialog::get_access);
+ ClassDB::bind_method(D_METHOD("set_show_hidden_files","show"),&EditorFileDialog::set_show_hidden_files);
+ ClassDB::bind_method(D_METHOD("is_showing_hidden_files"),&EditorFileDialog::is_showing_hidden_files);
+ ClassDB::bind_method(D_METHOD("_select_drive"),&EditorFileDialog::_select_drive);
+ ClassDB::bind_method(D_METHOD("_make_dir"),&EditorFileDialog::_make_dir);
+ ClassDB::bind_method(D_METHOD("_make_dir_confirm"),&EditorFileDialog::_make_dir_confirm);
+ ClassDB::bind_method(D_METHOD("_update_file_list"),&EditorFileDialog::update_file_list);
+ ClassDB::bind_method(D_METHOD("_update_dir"),&EditorFileDialog::update_dir);
+ ClassDB::bind_method(D_METHOD("_thumbnail_done"),&EditorFileDialog::_thumbnail_done);
+ ClassDB::bind_method(D_METHOD("set_display_mode","mode"),&EditorFileDialog::set_display_mode);
+ ClassDB::bind_method(D_METHOD("get_display_mode"),&EditorFileDialog::get_display_mode);
+ ClassDB::bind_method(D_METHOD("_thumbnail_result"),&EditorFileDialog::_thumbnail_result);
+ ClassDB::bind_method(D_METHOD("set_disable_overwrite_warning","disable"),&EditorFileDialog::set_disable_overwrite_warning);
+ ClassDB::bind_method(D_METHOD("is_overwrite_warning_disabled"),&EditorFileDialog::is_overwrite_warning_disabled);
+
+ ClassDB::bind_method(D_METHOD("_recent_selected"),&EditorFileDialog::_recent_selected);
+ ClassDB::bind_method(D_METHOD("_go_back"),&EditorFileDialog::_go_back);
+ ClassDB::bind_method(D_METHOD("_go_forward"),&EditorFileDialog::_go_forward);
+ ClassDB::bind_method(D_METHOD("_go_up"),&EditorFileDialog::_go_up);
+
+ ClassDB::bind_method(D_METHOD("_favorite_toggled"),&EditorFileDialog::_favorite_toggled);
+ ClassDB::bind_method(D_METHOD("_favorite_selected"),&EditorFileDialog::_favorite_selected);
+ ClassDB::bind_method(D_METHOD("_favorite_move_up"),&EditorFileDialog::_favorite_move_up);
+ ClassDB::bind_method(D_METHOD("_favorite_move_down"),&EditorFileDialog::_favorite_move_down);
+
+ ClassDB::bind_method(D_METHOD("invalidate"),&EditorFileDialog::invalidate);
+
+ ADD_SIGNAL(MethodInfo("file_selected",PropertyInfo( Variant::STRING,"path")));
+ ADD_SIGNAL(MethodInfo("files_selected",PropertyInfo( Variant::POOL_STRING_ARRAY,"paths")));
+ ADD_SIGNAL(MethodInfo("dir_selected",PropertyInfo( Variant::STRING,"dir")));
+
+ BIND_CONSTANT( MODE_OPEN_FILE );
+ BIND_CONSTANT( MODE_OPEN_FILES );
+ BIND_CONSTANT( MODE_OPEN_DIR );
+ BIND_CONSTANT( MODE_OPEN_ANY );
+ BIND_CONSTANT( MODE_SAVE_FILE );
+
+ BIND_CONSTANT( ACCESS_RESOURCES );
+ BIND_CONSTANT( ACCESS_USERDATA );
+ BIND_CONSTANT( ACCESS_FILESYSTEM );
+
+}
+
+
+void EditorFileDialog::set_show_hidden_files(bool p_show) {
+ show_hidden_files=p_show;
+ invalidate();
+}
+
+bool EditorFileDialog::is_showing_hidden_files() const {
+ return show_hidden_files;
+}
+
+void EditorFileDialog::set_default_show_hidden_files(bool p_show) {
+ default_show_hidden_files=p_show;
+}
+
+void EditorFileDialog::set_default_display_mode(DisplayMode p_mode) {
+ default_display_mode=p_mode;
+}
+
+void EditorFileDialog::_save_to_recent() {
+
+ String dir = get_current_dir();
+ Vector<String> recent = EditorSettings::get_singleton()->get_recent_dirs();
+
+ const int max=20;
+ int count=0;
+ bool res=dir.begins_with("res://");
+
+ for(int i=0;i<recent.size();i++) {
+ bool cres=recent[i].begins_with("res://");
+ if (recent[i]==dir || (res==cres && count>max)) {
+ recent.remove(i);
+ i--;
+ } else {
+ count++;
+ }
+ }
+
+ recent.insert(0,dir);
+
+ EditorSettings::get_singleton()->set_recent_dirs(recent);
+
+
+}
+
+void EditorFileDialog::set_disable_overwrite_warning(bool p_disable) {
+
+ disable_overwrite_warning=p_disable;
+}
+
+bool EditorFileDialog::is_overwrite_warning_disabled() const{
+
+ return disable_overwrite_warning;
+}
+
+
+EditorFileDialog::EditorFileDialog() {
+
+ show_hidden_files=default_show_hidden_files;
+ display_mode=default_display_mode;
+ local_history_pos=0;
+ disable_overwrite_warning=false;
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ mode=MODE_SAVE_FILE;
+ set_title(TTR("Save a File"));
+
+ ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KEY_MASK_ALT|KEY_LEFT);
+ ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KEY_MASK_ALT|KEY_RIGHT);
+ ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KEY_MASK_ALT|KEY_UP);
+ ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), KEY_F5);
+ ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KEY_MASK_CMD|KEY_H);
+ ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KEY_MASK_ALT|KEY_F);
+ ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KEY_MASK_ALT|KEY_V);
+ ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KEY_MASK_CMD|KEY_N);
+ ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KEY_MASK_CMD|KEY_D);
+ ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KEY_MASK_CMD|KEY_UP);
+ ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KEY_MASK_CMD|KEY_DOWN);
+
+ HBoxContainer *pathhb = memnew( HBoxContainer );
+
+ dir_prev = memnew( ToolButton );
+ dir_next = memnew( ToolButton );
+ dir_up = memnew( ToolButton );
+
+ pathhb->add_child(dir_prev);
+ pathhb->add_child(dir_next);
+ pathhb->add_child(dir_up);
+
+ dir_prev->connect("pressed",this,"_go_back");
+ dir_next->connect("pressed",this,"_go_forward");
+ dir_up->connect("pressed",this,"_go_up");
+
+ dir = memnew(LineEdit);
+ pathhb->add_child(dir);
+ dir->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ refresh = memnew( ToolButton );
+ refresh->connect("pressed",this,"_update_file_list");
+ pathhb->add_child(refresh);
+
+ favorite = memnew( ToolButton );
+ favorite->set_toggle_mode(true);
+ favorite->connect("toggled",this,"_favorite_toggled");
+ pathhb->add_child(favorite);
+
+ mode_thumbnails = memnew( ToolButton );
+ mode_thumbnails->connect("pressed",this,"set_display_mode",varray(DISPLAY_THUMBNAILS));
+ mode_thumbnails->set_toggle_mode(true);
+ mode_thumbnails->set_pressed(display_mode==DISPLAY_THUMBNAILS);
+ pathhb->add_child(mode_thumbnails);
+
+ mode_list = memnew( ToolButton );
+ mode_list->connect("pressed",this,"set_display_mode",varray(DISPLAY_LIST));
+ mode_list->set_toggle_mode(true);
+ mode_list->set_pressed(display_mode==DISPLAY_LIST);
+ pathhb->add_child(mode_list);
+
+ drives = memnew( OptionButton );
+ pathhb->add_child(drives);
+ drives->connect("item_selected",this,"_select_drive");
+
+ makedir = memnew( Button );
+ makedir->set_text(TTR("Create Folder"));
+ makedir->connect("pressed",this,"_make_dir");
+ pathhb->add_child(makedir);
+
+ list_hb = memnew( HBoxContainer );
+
+ vbc->add_margin_child(TTR("Path:"),pathhb);
+ vbc->add_child(list_hb);
+ list_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ VBoxContainer *fav_vb = memnew( VBoxContainer );
+ list_hb->add_child(fav_vb);
+ HBoxContainer *fav_hb = memnew( HBoxContainer );
+ fav_vb->add_child(fav_hb);
+ fav_hb->add_child(memnew(Label(TTR("Favorites:"))));
+ fav_hb->add_spacer();
+ fav_up = memnew( ToolButton );
+ fav_hb->add_child(fav_up);
+ fav_up->connect("pressed",this,"_favorite_move_up");
+ fav_down = memnew( ToolButton );
+ fav_hb->add_child(fav_down);
+ fav_down->connect("pressed",this,"_favorite_move_down");
+ fav_rm = memnew( ToolButton );
+ fav_hb->add_child(fav_rm);
+ fav_rm->hide(); // redundant
+
+ MarginContainer *fav_mv = memnew( MarginContainer );
+ fav_vb->add_child(fav_mv);
+ fav_mv->set_v_size_flags(SIZE_EXPAND_FILL);
+ favorites = memnew( ItemList );
+ fav_mv->add_child(favorites);
+ favorites->connect("item_selected",this,"_favorite_selected");
+
+ recent = memnew( ItemList );
+ fav_vb->add_margin_child(TTR("Recent:"),recent,true);
+ recent->connect("item_selected",this,"_recent_selected");
+
+ VBoxContainer *item_vb = memnew( VBoxContainer );
+ list_hb->add_child(item_vb);
+ item_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ item_list = memnew( ItemList );
+ item_list->set_v_size_flags(SIZE_EXPAND_FILL);
+ item_vb->add_margin_child(TTR("Directories & Files:"),item_list,true);
+
+ HBoxContainer* filter_hb = memnew( HBoxContainer );
+ item_vb->add_child(filter_hb);
+
+ VBoxContainer *filter_vb = memnew( VBoxContainer );
+ filter_hb->add_child(filter_vb);
+ filter_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ preview_vb = memnew( VBoxContainer );
+ filter_hb->add_child(preview_vb);
+ CenterContainer *prev_cc = memnew( CenterContainer );
+ preview_vb->add_margin_child(TTR("Preview:"),prev_cc);
+ preview = memnew( TextureRect );
+ prev_cc->add_child(preview);
+ preview_vb->hide();
+
+
+ file = memnew(LineEdit);
+ //add_child(file);
+ filter_vb->add_margin_child(TTR("File:"),file);
+
+
+ filter = memnew( OptionButton );
+ //add_child(filter);
+ filter_vb->add_margin_child(TTR("Filter:"),filter);
+ filter->set_clip_text(true);//too many extensions overflow it
+
+ dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ access=ACCESS_RESOURCES;
+ _update_drives();
+
+
+ connect("confirmed", this,"_action_pressed");
+ //cancel->connect("pressed", this,"_cancel_pressed");
+ item_list->connect("item_selected", this,"_item_selected",varray(),CONNECT_DEFERRED);
+ item_list->connect("item_activated", this,"_item_db_selected",varray());
+ dir->connect("text_entered", this,"_dir_entered");
+ file->connect("text_entered", this,"_file_entered");
+ filter->connect("item_selected", this,"_filter_selected");
+
+
+ confirm_save = memnew( ConfirmationDialog );
+ confirm_save->set_as_toplevel(true);
+ add_child(confirm_save);
+
+
+ confirm_save->connect("confirmed", this,"_save_confirm_pressed");
+
+ makedialog = memnew( ConfirmationDialog );
+ makedialog->set_title(TTR("Create Folder"));
+ VBoxContainer *makevb= memnew( VBoxContainer );
+ makedialog->add_child(makevb);
+
+ makedirname = memnew( LineEdit );
+ makevb->add_margin_child(TTR("Name:"),makedirname);
+ add_child(makedialog);
+ makedialog->register_text_enter(makedirname);
+ makedialog->connect("confirmed",this,"_make_dir_confirm");
+ mkdirerr = memnew( AcceptDialog );
+ mkdirerr->set_text(TTR("Could not create folder."));
+ add_child(mkdirerr);
+
+ exterr = memnew( AcceptDialog );
+ exterr->set_text(TTR("Must use a valid extension."));
+ add_child(exterr);
+
+
+ //update_file_list();
+ update_filters();
+ update_dir();
+
+ set_hide_on_ok(false);
+ vbox=vbc;
+
+
+ invalidated=true;
+ if (register_func)
+ register_func(this);
+
+ preview_wheel_timeout=0;
+ preview_wheel_index=0;
+ preview_waiting=false;
+
+}
+
+
+EditorFileDialog::~EditorFileDialog() {
+
+ if (unregister_func)
+ unregister_func(this);
+ memdelete(dir_access);
+}
+
+
+void EditorLineEditFileChooser::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_browse"),&EditorLineEditFileChooser::_browse);
+ ClassDB::bind_method(D_METHOD("_chosen"),&EditorLineEditFileChooser::_chosen);
+ ClassDB::bind_method(D_METHOD("get_button:Button"),&EditorLineEditFileChooser::get_button);
+ ClassDB::bind_method(D_METHOD("get_line_edit:LineEdit"),&EditorLineEditFileChooser::get_line_edit);
+ ClassDB::bind_method(D_METHOD("get_file_dialog:EditorFileDialog"),&EditorLineEditFileChooser::get_file_dialog);
+
+}
+
+void EditorLineEditFileChooser::_chosen(const String& p_text){
+
+ line_edit->set_text(p_text);
+ line_edit->emit_signal("text_entered",p_text);
+}
+
+void EditorLineEditFileChooser::_browse() {
+
+ dialog->popup_centered_ratio();
+}
+
+EditorLineEditFileChooser::EditorLineEditFileChooser() {
+
+ line_edit = memnew( LineEdit );
+ add_child(line_edit);
+ line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
+ button = memnew( Button );
+ button->set_text(" .. ");
+ add_child(button);
+ button->connect("pressed",this,"_browse");
+ dialog = memnew( EditorFileDialog);
+ add_child(dialog);
+ dialog->connect("file_selected",this,"_chosen");
+ dialog->connect("dir_selected",this,"_chosen");
+ dialog->connect("files_selected",this,"_chosen");
+
+
+}
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
new file mode 100644
index 0000000000..193cbc513c
--- /dev/null
+++ b/editor/editor_file_dialog.h
@@ -0,0 +1,252 @@
+/*************************************************************************/
+/* editor_file_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORFILEDIALOG_H
+#define EDITORFILEDIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/item_list.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/option_button.h"
+#include "os/dir_access.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/tool_button.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class EditorFileDialog : public ConfirmationDialog {
+
+ GDCLASS( EditorFileDialog, ConfirmationDialog );
+
+public:
+
+ enum DisplayMode {
+ DISPLAY_THUMBNAILS,
+ DISPLAY_LIST
+ };
+
+
+ enum Access {
+ ACCESS_RESOURCES,
+ ACCESS_USERDATA,
+ ACCESS_FILESYSTEM
+ };
+
+
+ enum Mode {
+ MODE_OPEN_FILE,
+ MODE_OPEN_FILES,
+ MODE_OPEN_DIR,
+ MODE_OPEN_ANY,
+ MODE_SAVE_FILE
+ };
+
+ typedef Ref<Texture> (*GetIconFunc)(const String&);
+ typedef void (*RegisterFunc)(EditorFileDialog*);
+
+ static GetIconFunc get_icon_func;
+ static GetIconFunc get_large_icon_func;
+ static RegisterFunc register_func;
+ static RegisterFunc unregister_func;
+
+private:
+
+ ConfirmationDialog *makedialog;
+ LineEdit *makedirname;
+
+ Button *makedir;
+ Access access;
+ //Button *action;
+ VBoxContainer *vbox;
+ Mode mode;
+ LineEdit *dir;
+
+ ToolButton *dir_prev;
+ ToolButton *dir_next;
+ ToolButton *dir_up;
+
+ OptionButton *drives;
+ ItemList *item_list;
+ TextureRect *preview;
+ VBoxContainer *preview_vb;
+ HBoxContainer *list_hb;
+ LineEdit *file;
+ AcceptDialog *mkdirerr;
+ AcceptDialog *exterr;
+ OptionButton *filter;
+ DirAccess *dir_access;
+ ConfirmationDialog *confirm_save;
+ ToolButton *mode_thumbnails;
+ ToolButton *mode_list;
+
+
+ ToolButton *refresh;
+ ToolButton *favorite;
+
+ ToolButton *fav_up;
+ ToolButton *fav_down;
+ ToolButton *fav_rm;
+
+ ItemList *favorites;
+ ItemList *recent;
+
+ Vector<String> local_history;
+ int local_history_pos;
+ void _push_history();
+
+ Vector<String> filters;
+
+ bool preview_waiting;
+ int preview_wheel_index;
+ float preview_wheel_timeout;
+ static bool default_show_hidden_files;
+ static DisplayMode default_display_mode;
+ bool show_hidden_files;
+ DisplayMode display_mode;
+
+ bool disable_overwrite_warning;
+ bool invalidated;
+
+ void update_dir();
+ void update_file_list();
+ void update_filters();
+
+ void _update_favorites();
+ void _favorite_toggled(bool p_toggle);
+ void _favorite_selected(int p_idx);
+ void _favorite_move_up();
+ void _favorite_move_down();
+
+
+
+ void _recent_selected(int p_idx);
+
+ void _item_selected(int p_item);
+ void _item_dc_selected(int p_item);
+
+ void _select_drive(int p_idx);
+ void _dir_entered(String p_dir);
+ void _file_entered(const String& p_file);
+ void _action_pressed();
+ void _save_confirm_pressed();
+ void _cancel_pressed();
+ void _filter_selected(int);
+ void _make_dir();
+ void _make_dir_confirm();
+
+ void _update_drives();
+
+ void _go_up();
+ void _go_back();
+ void _go_forward();
+
+ virtual void _post_popup();
+
+ void _save_to_recent();
+ //callback funtion is callback(String p_path,Ref<Texture> preview,Variant udata) preview null if could not load
+
+ void _thumbnail_result(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata);
+ void _thumbnail_done(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata);
+ void _request_single_thumbnail(const String& p_path);
+
+ void _unhandled_input(const InputEvent& p_event);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+ //bind helpers
+public:
+
+ void clear_filters();
+ void add_filter(const String& p_filter);
+
+ void set_enable_multiple_selection(bool p_enable);
+ Vector<String> get_selected_files() const;
+
+ String get_current_dir() const;
+ String get_current_file() const;
+ String get_current_path() const;
+ void set_current_dir(const String& p_dir);
+ void set_current_file(const String& p_file);
+ void set_current_path(const String& p_path);
+
+ void set_display_mode(DisplayMode p_mode);
+ DisplayMode get_display_mode() const;
+
+ void set_mode(Mode p_mode);
+ Mode get_mode() const;
+
+ VBoxContainer *get_vbox();
+ LineEdit *get_line_edit() { return file; }
+
+ void set_access(Access p_access);
+ Access get_access() const;
+
+ void set_show_hidden_files(bool p_show);
+ bool is_showing_hidden_files() const;
+
+ static void set_default_show_hidden_files(bool p_show);
+ static void set_default_display_mode(DisplayMode p_mode);
+
+ void invalidate();
+
+ void set_disable_overwrite_warning(bool p_disable);
+ bool is_overwrite_warning_disabled() const;
+
+ EditorFileDialog();
+ ~EditorFileDialog();
+
+};
+
+class EditorLineEditFileChooser : public HBoxContainer {
+
+ GDCLASS( EditorLineEditFileChooser, HBoxContainer );
+ Button *button;
+ LineEdit *line_edit;
+ EditorFileDialog *dialog;
+
+ void _chosen(const String& p_text);
+ void _browse();
+protected:
+ static void _bind_methods();
+public:
+
+ Button *get_button() { return button; }
+ LineEdit *get_line_edit() { return line_edit; }
+ EditorFileDialog *get_file_dialog() { return dialog; }
+
+ EditorLineEditFileChooser();
+};
+
+VARIANT_ENUM_CAST( EditorFileDialog::Mode );
+VARIANT_ENUM_CAST( EditorFileDialog::Access );
+VARIANT_ENUM_CAST( EditorFileDialog::DisplayMode );
+
+#endif // EDITORFILEDIALOG_H
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
new file mode 100644
index 0000000000..cd151cd90b
--- /dev/null
+++ b/editor/editor_file_system.cpp
@@ -0,0 +1,1550 @@
+/*************************************************************************/
+/* editor_file_system.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_file_system.h"
+
+#include "global_config.h"
+#include "io/resource_loader.h"
+#include "os/os.h"
+#include "os/file_access.h"
+#include "editor_node.h"
+#include "io/resource_saver.h"
+#include "io/resource_import.h"
+#include "editor_settings.h"
+#include "editor_resource_preview.h"
+#include "variant_parser.h"
+
+EditorFileSystem *EditorFileSystem::singleton=NULL;
+
+void EditorFileSystemDirectory::sort_files() {
+
+ files.sort_custom<FileInfoSort>();
+}
+
+int EditorFileSystemDirectory::find_file_index(const String& p_file) const {
+
+ for(int i=0;i<files.size();i++) {
+ if (files[i]->file==p_file)
+ return i;
+ }
+ return -1;
+
+}
+int EditorFileSystemDirectory::find_dir_index(const String& p_dir) const{
+
+
+ for(int i=0;i<subdirs.size();i++) {
+ if (subdirs[i]->name==p_dir)
+ return i;
+ }
+
+ return -1;
+}
+
+
+int EditorFileSystemDirectory::get_subdir_count() const {
+
+ return subdirs.size();
+}
+
+EditorFileSystemDirectory *EditorFileSystemDirectory::get_subdir(int p_idx){
+
+ ERR_FAIL_INDEX_V(p_idx,subdirs.size(),NULL);
+ return subdirs[p_idx];
+
+}
+
+int EditorFileSystemDirectory::get_file_count() const{
+
+ return files.size();
+}
+
+String EditorFileSystemDirectory::get_file(int p_idx) const{
+
+ ERR_FAIL_INDEX_V(p_idx,files.size(),"");
+
+ return files[p_idx]->file;
+}
+
+String EditorFileSystemDirectory::get_path() const {
+
+ String p;
+ const EditorFileSystemDirectory *d=this;
+ while(d->parent) {
+ p=d->name+"/"+p;
+ d=d->parent;
+ }
+
+ return "res://"+p;
+
+}
+
+
+String EditorFileSystemDirectory::get_file_path(int p_idx) const {
+
+ String file = get_file(p_idx);
+ const EditorFileSystemDirectory *d=this;
+ while(d->parent) {
+ file=d->name+"/"+file;
+ d=d->parent;
+ }
+
+ return "res://"+file;
+}
+
+
+Vector<String> EditorFileSystemDirectory::get_file_deps(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,files.size(),Vector<String>());
+ return files[p_idx]->deps;
+
+}
+
+
+StringName EditorFileSystemDirectory::get_file_type(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,files.size(),"");
+ return files[p_idx]->type;
+}
+
+String EditorFileSystemDirectory::get_name() {
+
+ return name;
+}
+
+EditorFileSystemDirectory *EditorFileSystemDirectory::get_parent() {
+
+ return parent;
+}
+
+void EditorFileSystemDirectory::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("get_subdir_count"),&EditorFileSystemDirectory::get_subdir_count);
+ ClassDB::bind_method(D_METHOD("get_subdir","idx"),&EditorFileSystemDirectory::get_subdir);
+ ClassDB::bind_method(D_METHOD("get_file_count"),&EditorFileSystemDirectory::get_file_count);
+ ClassDB::bind_method(D_METHOD("get_file","idx"),&EditorFileSystemDirectory::get_file);
+ ClassDB::bind_method(D_METHOD("get_file_path","idx"),&EditorFileSystemDirectory::get_file_path);
+ ClassDB::bind_method(D_METHOD("get_file_type","idx"),&EditorFileSystemDirectory::get_file_type);
+ ClassDB::bind_method(D_METHOD("get_name"),&EditorFileSystemDirectory::get_name);
+ ClassDB::bind_method(D_METHOD("get_path"),&EditorFileSystemDirectory::get_path);
+ ClassDB::bind_method(D_METHOD("get_parent:EditorFileSystemDirectory"),&EditorFileSystemDirectory::get_parent);
+ ClassDB::bind_method(D_METHOD("find_file_index","name"),&EditorFileSystemDirectory::find_file_index);
+ ClassDB::bind_method(D_METHOD("find_dir_index","name"),&EditorFileSystemDirectory::find_dir_index);
+
+
+}
+
+
+EditorFileSystemDirectory::EditorFileSystemDirectory() {
+
+ modified_time=0;
+ parent=NULL;
+}
+
+EditorFileSystemDirectory::~EditorFileSystemDirectory() {
+
+ for(int i=0;i<files.size();i++) {
+
+ memdelete(files[i]);
+ }
+
+ for(int i=0;i<subdirs.size();i++) {
+
+ memdelete(subdirs[i]);
+ }
+}
+
+
+
+
+
+void EditorFileSystem::_scan_filesystem() {
+
+ ERR_FAIL_COND(!scanning || new_filesystem);
+
+ //read .fscache
+ String cpath;
+
+ sources_changed.clear();
+ file_cache.clear();
+
+ String project=GlobalConfig::get_singleton()->get_resource_path();
+
+ String fscache = EditorSettings::get_singleton()->get_project_settings_path().plus_file("filesystem_cache2");
+ FileAccess *f =FileAccess::open(fscache,FileAccess::READ);
+
+ if (f) {
+ //read the disk cache
+ while(!f->eof_reached()) {
+
+ String l = f->get_line().strip_edges();
+ if (l==String())
+ continue;
+
+ if (l.begins_with("::")) {
+ Vector<String> split = l.split("::");
+ ERR_CONTINUE( split.size() != 3);
+ String name = split[1];
+
+ cpath=name;
+
+ } else {
+ Vector<String> split = l.split("::");
+ ERR_CONTINUE( split.size() != 5);
+ String name = split[0];
+ String file;
+
+ file=name;
+ name=cpath.plus_file(name);
+
+ FileCache fc;
+ fc.type=split[1];
+ fc.modification_time=split[2].to_int64();
+ fc.import_modification_time = split[3].to_int64();
+
+ String deps = split[4].strip_edges();
+ if (deps.length()) {
+ Vector<String> dp = deps.split("<>");
+ for(int i=0;i<dp.size();i++) {
+ String path=dp[i];
+ fc.deps.push_back(path);
+ }
+ }
+
+ file_cache[name]=fc;
+
+ }
+
+ }
+
+ f->close();
+ memdelete(f);
+ }
+
+
+
+ EditorProgressBG scan_progress("efs","ScanFS",1000);
+
+ ScanProgress sp;
+ sp.low=0;
+ sp.hi=1;
+ sp.progress=&scan_progress;
+
+
+ new_filesystem = memnew( EditorFileSystemDirectory );
+ new_filesystem->parent=NULL;
+
+ DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ d->change_dir("res://");
+ _scan_new_dir(new_filesystem,d,sp);
+
+ file_cache.clear(); //clear caches, no longer needed
+
+ memdelete(d);
+
+
+ //save back the findings
+ //String fscache = EditorSettings::get_singleton()->get_project_settings_path().plus_file("file_cache");
+
+ f=FileAccess::open(fscache,FileAccess::WRITE);
+ _save_filesystem_cache(new_filesystem,f);
+ f->close();
+ memdelete(f);
+
+ scanning=false;
+
+}
+
+void EditorFileSystem::_save_filesystem_cache() {
+ String fscache = EditorSettings::get_singleton()->get_project_settings_path().plus_file("filesystem_cache2");
+
+ FileAccess *f=FileAccess::open(fscache,FileAccess::WRITE);
+ _save_filesystem_cache(filesystem,f);
+ f->close();
+ memdelete(f);
+}
+
+void EditorFileSystem::_thread_func(void *_userdata) {
+
+ EditorFileSystem *sd = (EditorFileSystem*)_userdata;
+ sd->_scan_filesystem();
+
+}
+
+bool EditorFileSystem::_update_scan_actions() {
+
+ sources_changed.clear();
+
+ bool fs_changed=false;
+
+ Vector<String> reimports;
+
+ for (List<ItemAction>::Element *E=scan_actions.front();E;E=E->next()) {
+
+ ItemAction&ia = E->get();
+
+ switch(ia.action) {
+ case ItemAction::ACTION_NONE: {
+
+ } break;
+ case ItemAction::ACTION_DIR_ADD: {
+
+ //print_line("*ACTION ADD DIR: "+ia.new_dir->get_name());
+ int idx=0;
+ for(int i=0;i<ia.dir->subdirs.size();i++) {
+
+ if (ia.new_dir->name<ia.dir->subdirs[i]->name)
+ break;
+ idx++;
+ }
+ if (idx==ia.dir->subdirs.size()) {
+ ia.dir->subdirs.push_back(ia.new_dir);
+ } else {
+ ia.dir->subdirs.insert(idx,ia.new_dir);
+ }
+
+ fs_changed=true;
+ } break;
+ case ItemAction::ACTION_DIR_REMOVE: {
+
+ ERR_CONTINUE(!ia.dir->parent);
+ //print_line("*ACTION REMOVE DIR: "+ia.dir->get_name());
+ ia.dir->parent->subdirs.erase(ia.dir);
+ memdelete( ia.dir );
+ fs_changed=true;
+ } break;
+ case ItemAction::ACTION_FILE_ADD: {
+
+ int idx=0;
+ for(int i=0;i<ia.dir->files.size();i++) {
+
+ if (ia.new_file->file<ia.dir->files[i]->file)
+ break;
+ idx++;
+ }
+ if (idx==ia.dir->files.size()) {
+ ia.dir->files.push_back(ia.new_file);
+ } else {
+ ia.dir->files.insert(idx,ia.new_file);
+ }
+
+ fs_changed=true;
+ //print_line("*ACTION ADD FILE: "+ia.new_file->file);
+
+ } break;
+ case ItemAction::ACTION_FILE_REMOVE: {
+
+ int idx = ia.dir->find_file_index(ia.file);
+ ERR_CONTINUE(idx==-1);
+ memdelete( ia.dir->files[idx] );
+ ia.dir->files.remove(idx);
+
+ fs_changed=true;
+ //print_line("*ACTION REMOVE FILE: "+ia.file);
+
+ } break;
+ case ItemAction::ACTION_FILE_REIMPORT: {
+
+
+ int idx = ia.dir->find_file_index(ia.file);
+ ERR_CONTINUE(idx==-1);
+ String full_path = ia.dir->get_file_path(idx);
+ reimports.push_back(full_path);
+
+ fs_changed=true;
+ } break;
+
+ }
+ }
+
+
+ if (reimports.size()) {
+ reimport_files(reimports);
+
+ }
+ scan_actions.clear();
+
+ return fs_changed;
+
+}
+
+void EditorFileSystem::scan() {
+
+ if (false /*&& bool(Globals::get_singleton()->get("debug/disable_scan"))*/)
+ return;
+
+ if (scanning || scanning_changes|| thread)
+ return;
+
+ _update_extensions();
+
+ abort_scan=false;
+ if (!use_threads) {
+ scanning=true;
+ scan_total=0;
+ _scan_filesystem();
+ if (filesystem)
+ memdelete(filesystem);
+ //file_type_cache.clear();
+ filesystem=new_filesystem;
+ new_filesystem=NULL;
+ _update_scan_actions();
+ scanning=false;
+ emit_signal("filesystem_changed");
+ emit_signal("sources_changed",sources_changed.size()>0);
+
+ } else {
+
+ ERR_FAIL_COND(thread);
+ set_process(true);
+ Thread::Settings s;
+ scanning=true;
+ scan_total=0;
+ s.priority=Thread::PRIORITY_LOW;
+ thread = Thread::create(_thread_func,this,s);
+ //tree->hide();
+ //progress->show();
+
+ }
+
+
+
+}
+
+void EditorFileSystem::ScanProgress::update(int p_current,int p_total) const {
+
+ float ratio = low + ((hi-low)/p_total)*p_current;
+ progress->step(ratio*1000);
+ EditorFileSystem::singleton->scan_total=ratio;
+}
+
+EditorFileSystem::ScanProgress EditorFileSystem::ScanProgress::get_sub(int p_current,int p_total) const{
+
+ ScanProgress sp=*this;
+ float slice = (sp.hi-sp.low)/p_total;
+ sp.low+=slice*p_current;
+ sp.hi=slice;
+ return sp;
+
+}
+
+bool EditorFileSystem::_check_missing_imported_files(const String& p_path) {
+
+ if (!reimport_on_missing_imported_files)
+ return true;
+
+ Error err;
+ FileAccess *f= FileAccess::open(p_path+".import",FileAccess::READ,&err);
+
+ if (!f) {
+ print_line("could not open import for "+p_path);
+ return false;
+ }
+
+ VariantParser::StreamFile stream;
+ stream.f=f;
+
+ String assign;
+ Variant value;
+ VariantParser::Tag next_tag;
+
+ int lines=0;
+ String error_text;
+
+ List<String> to_check;
+
+ while(true) {
+
+ assign=Variant();
+ next_tag.fields.clear();
+ next_tag.name=String();
+
+ err = VariantParser::parse_tag_assign_eof(&stream,lines,error_text,next_tag,assign,value,NULL,true);
+ if (err==ERR_FILE_EOF) {
+ memdelete(f);
+ return OK;
+ }
+ else if (err!=OK) {
+ ERR_PRINTS("ResourceFormatImporter::load - "+p_path+".import:"+itos(lines)+" error: "+error_text);
+ memdelete(f);
+ return false;
+ }
+
+ if (assign!=String()) {
+ if (assign.begins_with("path")) {
+ to_check.push_back(value);
+ } else if (assign=="files") {
+ Array fa = value;
+ for(int i=0;i<fa.size();i++) {
+ to_check.push_back(fa[i]);
+ }
+ }
+
+ } else if (next_tag.name!="remap" && next_tag.name!="deps") {
+ break;
+ }
+ }
+
+ memdelete(f);
+
+ for (List<String>::Element *E=to_check.front();E;E=E->next()) {
+ if (!FileAccess::exists(E->get())) {
+ print_line("missing "+E->get()+", reimport" );
+ return false;
+ }
+ }
+ return true;
+}
+
+void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir,DirAccess *da,const ScanProgress& p_progress) {
+
+ List<String> dirs;
+ List<String> files;
+
+ String cd = da->get_current_dir();
+
+ p_dir->modified_time = FileAccess::get_modified_time(cd);
+
+
+ da->list_dir_begin();
+ while (true) {
+
+ bool isdir;
+ String f = da->get_next(&isdir);
+ if (f=="")
+ break;
+
+ if (isdir) {
+
+ if (f.begins_with(".")) //ignore hidden and . / ..
+ continue;
+
+ if (FileAccess::exists(cd.plus_file(f).plus_file("godot.cfg"))) // skip if another project inside this
+ continue;
+
+ dirs.push_back(f);
+
+ } else {
+
+ files.push_back(f);
+ }
+
+ }
+
+ da->list_dir_end();
+
+ dirs.sort();
+ files.sort();
+
+ int total = dirs.size()+files.size();
+ int idx=0;
+
+
+ for (List<String>::Element *E=dirs.front();E;E=E->next(),idx++) {
+
+ if (da->change_dir(E->get())==OK) {
+
+ String d = da->get_current_dir();
+
+ if (d==cd || !d.begins_with(cd)) {
+ da->change_dir(cd); //avoid recursion
+ } else {
+
+
+ EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory );
+
+ efd->parent=p_dir;
+ efd->name=E->get();
+
+ _scan_new_dir(efd,da,p_progress.get_sub(idx,total));
+
+ int idx=0;
+ for(int i=0;i<p_dir->subdirs.size();i++) {
+
+ if (efd->name<p_dir->subdirs[i]->name)
+ break;
+ idx++;
+ }
+ if (idx==p_dir->subdirs.size()) {
+ p_dir->subdirs.push_back(efd);
+ } else {
+ p_dir->subdirs.insert(idx,efd);
+ }
+
+ da->change_dir("..");
+ }
+ } else {
+ ERR_PRINTS("Cannot go into subdir: "+E->get());
+ }
+
+ p_progress.update(idx,total);
+
+ }
+
+ for (List<String>::Element*E=files.front();E;E=E->next(),idx++) {
+
+
+ String ext = E->get().get_extension().to_lower();
+ if (!valid_extensions.has(ext)) {
+ continue; //invalid
+ }
+
+ EditorFileSystemDirectory::FileInfo *fi = memnew( EditorFileSystemDirectory::FileInfo );
+ fi->file=E->get();
+
+ String path = cd.plus_file(fi->file);
+
+ FileCache *fc = file_cache.getptr(path);
+ uint64_t mt = FileAccess::get_modified_time(path);
+
+ if (import_extensions.has(ext)) {
+
+ //is imported
+ uint64_t import_mt=0;
+ if (FileAccess::exists(path+".import")) {
+ import_mt=FileAccess::get_modified_time(path+".import");
+ }
+
+
+ if (fc && fc->modification_time==mt && fc->import_modification_time==import_mt && _check_missing_imported_files(path)) {
+
+ fi->type=fc->type;
+ fi->modified_time=fc->modification_time;
+ fi->import_modified_time=fc->import_modification_time;
+
+ } else {
+
+ if (!fc) {
+ print_line("REIMPORT BECAUSE: not previously found");
+ } else if (fc->modification_time!=mt) {
+ print_line("REIMPORT BECAUSE: modified resource time "+itos(fc->modification_time)+" vs "+itos(mt));
+
+ } else if (fc->import_modification_time!=import_mt) {
+ print_line("REIMPORT BECAUSE: modified .import time"+itos(fc->import_modification_time)+" vs "+itos(import_mt));
+
+ } else {
+
+ print_line("REIMPORT BECAUSE: missing imported files");
+ }
+
+
+ fi->type=ResourceFormatImporter::get_singleton()->get_resource_type(path);
+ fi->modified_time=0;
+ fi->import_modified_time=0;
+
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_FILE_REIMPORT;
+ ia.dir=p_dir;
+ ia.file=E->get();
+ scan_actions.push_back(ia);
+ }
+ } else {
+ //not imported, so just update type if changed
+ if (fc && fc->modification_time == mt) {
+
+ fi->type=fc->type;
+ fi->modified_time=fc->modification_time;
+ fi->import_modified_time=0;
+ } else {
+ fi->type=ResourceLoader::get_resource_type(path);
+ fi->modified_time=mt;
+ fi->import_modified_time=0;
+ }
+ }
+
+ p_dir->files.push_back(fi);
+ p_progress.update(idx,total);
+ }
+
+}
+
+
+
+void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir,const ScanProgress& p_progress) {
+
+ uint64_t current_mtime = FileAccess::get_modified_time(p_dir->get_path());
+
+ bool updated_dir=false;
+ String cd = p_dir->get_path();
+
+ //print_line("dir: "+p_dir->get_path()+" MODTIME: "+itos(p_dir->modified_time)+" CTIME: "+itos(current_mtime));
+
+ if (current_mtime!=p_dir->modified_time) {
+
+ updated_dir=true;
+ p_dir->modified_time=current_mtime;
+ //ooooops, dir changed, see what's going on
+
+ //first mark everything as veryfied
+
+ for(int i=0;i<p_dir->files.size();i++) {
+
+ p_dir->files[i]->verified=false;
+ }
+
+ for(int i=0;i<p_dir->subdirs.size();i++) {
+
+ p_dir->get_subdir(i)->verified=false;
+ }
+
+ //then scan files and directories and check what's different
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+
+ da->change_dir(cd);
+ da->list_dir_begin();
+ while (true) {
+
+ bool isdir;
+ String f = da->get_next(&isdir);
+ if (f=="")
+ break;
+
+ if (isdir) {
+
+ if (f.begins_with(".")) //ignore hidden and . / ..
+ continue;
+
+ int idx = p_dir->find_dir_index(f);
+ if (idx==-1) {
+
+ if (FileAccess::exists(cd.plus_file(f).plus_file("godot.cfg"))) // skip if another project inside this
+ continue;
+
+ EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory );
+
+ efd->parent=p_dir;
+ efd->name=f;
+ DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ d->change_dir(cd.plus_file(f));
+ _scan_new_dir(efd,d,p_progress.get_sub(1,1));
+ memdelete(d);
+
+
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_DIR_ADD;
+ ia.dir=p_dir;
+ ia.file=f;
+ ia.new_dir=efd;
+ scan_actions.push_back(ia);
+ } else {
+ p_dir->subdirs[idx]->verified=true;
+ }
+
+
+ } else {
+ String ext = f.get_extension().to_lower();
+ if (!valid_extensions.has(ext))
+ continue; //invalid
+
+ int idx = p_dir->find_file_index(f);
+
+ if (idx==-1) {
+ //never seen this file, add actition to add it
+ EditorFileSystemDirectory::FileInfo *fi = memnew( EditorFileSystemDirectory::FileInfo );
+ fi->file=f;
+
+ String path = cd.plus_file(fi->file);
+ fi->modified_time=FileAccess::get_modified_time(path);
+ fi->import_modified_time=0;
+ fi->type=ResourceLoader::get_resource_type(path);
+
+ {
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_FILE_ADD;
+ ia.dir=p_dir;
+ ia.file=f;
+ ia.new_file=fi;
+ scan_actions.push_back(ia);
+
+
+ }
+
+ if (import_extensions.has(ext)) {
+ //if it can be imported, and it was added, it needs to be reimported
+ print_line("REIMPORT: file was not found before, reimport");
+ print_line("at dir: "+p_dir->get_path()+" file: "+f);
+ for(int i=0;i<p_dir->files.size();i++) {
+ print_line(itos(i)+": "+p_dir->files[i]->file);
+ }
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_FILE_REIMPORT;
+ ia.dir=p_dir;
+ ia.file=f;
+ scan_actions.push_back(ia);
+ }
+
+ } else {
+ p_dir->files[idx]->verified=true;
+ }
+
+
+ }
+
+ }
+
+ da->list_dir_end();
+ memdelete(da);
+
+ }
+
+ for(int i=0;i<p_dir->files.size();i++) {
+
+ if (updated_dir && !p_dir->files[i]->verified) {
+ //this file was removed, add action to remove it
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_FILE_REMOVE;
+ ia.dir=p_dir;
+ ia.file=p_dir->files[i]->file;
+ scan_actions.push_back(ia);
+ continue;
+
+ }
+
+ if (import_extensions.has(p_dir->files[i]->file.get_extension().to_lower())) {
+ //check here if file must be imported or not
+
+ String path = cd.plus_file(p_dir->files[i]->file);
+
+ uint64_t mt = FileAccess::get_modified_time(path);
+
+ bool reimport=false;
+
+ if (mt!=p_dir->files[i]->modified_time) {
+ print_line("REIMPORT: modified time changed, reimport");
+ reimport=true; //it was modified, must be reimported.
+ } else if (!FileAccess::exists(path+".import")) {
+ print_line("REIMPORT: no .import exists, reimport");
+ reimport=true; //no .import file, obviously reimport
+ } else {
+
+ uint64_t import_mt=FileAccess::get_modified_time(path+".import");
+ print_line(itos(import_mt)+" vs "+itos(p_dir->files[i]->import_modified_time));
+ if (import_mt!=p_dir->files[i]->import_modified_time) {
+ print_line("REIMPORT: import modified changed, reimport");
+ reimport=true;
+ } else if (!_check_missing_imported_files(path)) {
+ print_line("REIMPORT: imported files removed");
+ reimport=true;
+ }
+ }
+
+ if (reimport) {
+
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_FILE_REIMPORT;
+ ia.dir=p_dir;
+ ia.file=p_dir->files[i]->file;
+ scan_actions.push_back(ia);
+ }
+
+ }
+
+ EditorResourcePreview::get_singleton()->check_for_invalidation(p_dir->get_file_path(i));
+ }
+
+ for(int i=0;i<p_dir->subdirs.size();i++) {
+
+ if (updated_dir && !p_dir->subdirs[i]->verified) {
+ //this directory was removed, add action to remove it
+ ItemAction ia;
+ ia.action=ItemAction::ACTION_DIR_REMOVE;
+ ia.dir=p_dir->subdirs[i];
+ scan_actions.push_back(ia);
+ continue;
+
+ }
+ _scan_fs_changes(p_dir->get_subdir(i),p_progress);
+ }
+
+}
+
+void EditorFileSystem::_thread_func_sources(void *_userdata) {
+
+ EditorFileSystem *efs = (EditorFileSystem*)_userdata;
+ if (efs->filesystem) {
+ EditorProgressBG pr("sources",TTR("ScanSources"),1000);
+ ScanProgress sp;
+ sp.progress=&pr;
+ sp.hi=1;
+ sp.low=0;
+ efs->_scan_fs_changes(efs->filesystem,sp);
+ }
+ efs->scanning_changes_done=true;
+}
+
+void EditorFileSystem::get_changed_sources(List<String> *r_changed) {
+
+ *r_changed=sources_changed;
+}
+
+void EditorFileSystem::scan_changes() {
+
+ if (scanning || scanning_changes|| thread)
+ return;
+
+ _update_extensions();
+ sources_changed.clear();
+ scanning_changes=true;
+ scanning_changes_done=false;
+
+ abort_scan=false;
+
+ if (!use_threads) {
+ if (filesystem) {
+ EditorProgressBG pr("sources",TTR("ScanSources"),1000);
+ ScanProgress sp;
+ sp.progress=&pr;
+ sp.hi=1;
+ sp.low=0;
+ scan_total=0;
+ _scan_fs_changes(filesystem,sp);
+ if (_update_scan_actions())
+ emit_signal("filesystem_changed");
+ }
+ scanning_changes=false;
+ scanning_changes_done=true;
+ emit_signal("sources_changed",sources_changed.size()>0);
+ } else {
+
+ ERR_FAIL_COND(thread_sources);
+ set_process(true);
+ scan_total=0;
+ Thread::Settings s;
+ s.priority=Thread::PRIORITY_LOW;
+ thread_sources = Thread::create(_thread_func_sources,this,s);
+ //tree->hide();
+ //print_line("SCAN BEGIN!");
+ //progress->show();
+ }
+
+
+
+}
+
+void EditorFileSystem::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_ENTER_TREE: {
+
+
+ scan();
+ } break;
+ case NOTIFICATION_EXIT_TREE: {
+ if (use_threads && thread) {
+ //abort thread if in progress
+ abort_scan=true;
+ while(scanning) {
+ OS::get_singleton()->delay_usec(1000);
+ }
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ thread=NULL;
+ WARN_PRINTS("Scan thread aborted...");
+ set_process(false);
+
+ }
+
+ if (filesystem)
+ memdelete(filesystem);
+ if (new_filesystem)
+ memdelete(new_filesystem);
+ filesystem=NULL;
+ new_filesystem=NULL;
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+
+ if (use_threads) {
+
+ if (scanning_changes) {
+
+ if (scanning_changes_done) {
+
+ scanning_changes=false;
+
+ set_process(false);
+
+ Thread::wait_to_finish(thread_sources);
+ memdelete(thread_sources);
+ thread_sources=NULL;
+ if (_update_scan_actions())
+ emit_signal("filesystem_changed");
+ //print_line("sources changed: "+itos(sources_changed.size()));
+ emit_signal("sources_changed",sources_changed.size()>0);
+ }
+ } else if (!scanning) {
+
+ set_process(false);
+
+ if (filesystem)
+ memdelete(filesystem);
+ filesystem=new_filesystem;
+ new_filesystem=NULL;
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ thread=NULL;
+ _update_scan_actions();
+ emit_signal("filesystem_changed");
+ emit_signal("sources_changed",sources_changed.size()>0);
+ //print_line("initial sources changed: "+itos(sources_changed.size()));
+
+
+
+ } else {
+ //progress->set_text("Scanning...\n"+itos(total*100)+"%");
+ }
+ }
+ } break;
+ }
+
+}
+
+bool EditorFileSystem::is_scanning() const {
+
+ return scanning || scanning_changes;
+}
+float EditorFileSystem::get_scanning_progress() const {
+
+ return scan_total;
+}
+
+EditorFileSystemDirectory *EditorFileSystem::get_filesystem() {
+
+ return filesystem;
+}
+
+void EditorFileSystem::_save_filesystem_cache(EditorFileSystemDirectory*p_dir,FileAccess *p_file) {
+
+
+ if (!p_dir)
+ return; //none
+ p_file->store_line("::"+p_dir->get_path()+"::"+String::num(p_dir->modified_time));
+
+ for(int i=0;i<p_dir->files.size();i++) {
+
+ String s=p_dir->files[i]->file+"::"+p_dir->files[i]->type+"::"+itos(p_dir->files[i]->modified_time)+"::"+itos(p_dir->files[i]->import_modified_time);
+ s+="::";
+ for(int j=0;j<p_dir->files[i]->deps.size();j++) {
+
+ if (j>0)
+ s+="<>";
+ s+=p_dir->files[i]->deps[j];
+ }
+
+ p_file->store_line(s);
+ }
+
+ for(int i=0;i<p_dir->subdirs.size();i++) {
+
+ _save_filesystem_cache(p_dir->subdirs[i],p_file);
+ }
+
+}
+
+
+
+
+
+
+bool EditorFileSystem::_find_file(const String& p_file,EditorFileSystemDirectory ** r_d, int &r_file_pos) const {
+ //todo make faster
+
+ if (!filesystem || scanning)
+ return false;
+
+
+ String f = GlobalConfig::get_singleton()->localize_path(p_file);
+
+ if (!f.begins_with("res://"))
+ return false;
+ f=f.substr(6,f.length());
+ f=f.replace("\\","/");
+
+ Vector<String> path = f.split("/");
+
+ if (path.size()==0)
+ return false;
+ String file=path[path.size()-1];
+ path.resize(path.size()-1);
+
+ EditorFileSystemDirectory *fs=filesystem;
+
+ for(int i=0;i<path.size();i++) {
+
+ if (path[i].begins_with("."))
+ return false;
+
+ int idx=-1;
+ for(int j=0;j<fs->get_subdir_count();j++) {
+
+ if (fs->get_subdir(j)->get_name()==path[i]) {
+ idx=j;
+ break;
+ }
+ }
+
+ if (idx==-1) {
+ //does not exist, create i guess?
+ EditorFileSystemDirectory *efsd = memnew( EditorFileSystemDirectory );
+ efsd->name=path[i];
+ int idx2=0;
+ for(int j=0;j<fs->get_subdir_count();j++) {
+
+ if (efsd->name<fs->get_subdir(j)->get_name())
+ break;
+ idx2++;
+ }
+
+ if (idx2==fs->get_subdir_count())
+ fs->subdirs.push_back(efsd);
+ else
+ fs->subdirs.insert(idx2,efsd);
+ fs=efsd;
+ } else {
+
+ fs=fs->get_subdir(idx);
+ }
+ }
+
+
+ int cpos=-1;
+ for(int i=0;i<fs->files.size();i++) {
+
+ if (fs->files[i]->file==file) {
+ cpos=i;
+ break;
+ }
+ }
+
+ r_file_pos=cpos;
+ *r_d=fs;
+
+ if (cpos!=-1) {
+
+ return true;
+ } else {
+
+ return false;
+ }
+
+
+}
+
+String EditorFileSystem::get_file_type(const String& p_file) const {
+
+ EditorFileSystemDirectory *fs=NULL;
+ int cpos=-1;
+
+ if (!_find_file(p_file,&fs,cpos)) {
+
+ return "";
+ }
+
+
+ return fs->files[cpos]->type;
+
+}
+
+EditorFileSystemDirectory* EditorFileSystem::find_file(const String& p_file,int* r_index) const {
+
+ if (!filesystem || scanning)
+ return NULL;
+
+ EditorFileSystemDirectory *fs=NULL;
+ int cpos=-1;
+ if (!_find_file(p_file,&fs,cpos)) {
+
+ return NULL;
+ }
+
+
+ if (r_index)
+ *r_index=cpos;
+
+ return fs;
+}
+
+
+EditorFileSystemDirectory *EditorFileSystem::get_filesystem_path(const String& p_path) {
+
+ if (!filesystem || scanning)
+ return NULL;
+
+
+ String f = GlobalConfig::get_singleton()->localize_path(p_path);
+
+ if (!f.begins_with("res://"))
+ return NULL;
+
+
+ f=f.substr(6,f.length());
+ f=f.replace("\\","/");
+ if (f==String())
+ return filesystem;
+
+ if (f.ends_with("/"))
+ f=f.substr(0,f.length()-1);
+
+ Vector<String> path = f.split("/");
+
+ if (path.size()==0)
+ return NULL;
+
+ EditorFileSystemDirectory *fs=filesystem;
+
+ for(int i=0;i<path.size();i++) {
+
+
+ int idx=-1;
+ for(int j=0;j<fs->get_subdir_count();j++) {
+
+ if (fs->get_subdir(j)->get_name()==path[i]) {
+ idx=j;
+ break;
+ }
+ }
+
+ if (idx==-1) {
+ return NULL;
+ } else {
+
+ fs=fs->get_subdir(idx);
+ }
+ }
+
+ return fs;
+}
+
+void EditorFileSystem::_resource_saved(const String& p_path){
+
+
+ //print_line("resource saved: "+p_path);
+ EditorFileSystem::get_singleton()->update_file(p_path);
+
+}
+
+
+
+
+void EditorFileSystem::update_file(const String& p_file) {
+
+ EditorFileSystemDirectory *fs=NULL;
+ int cpos=-1;
+
+ if (!_find_file(p_file,&fs,cpos)) {
+
+ if (!fs)
+ return;
+ }
+
+ if (!FileAccess::exists(p_file)) {
+ //was removed
+ memdelete( fs->files[cpos] );
+ fs->files.remove(cpos);
+ call_deferred("emit_signal","filesystem_changed"); //update later
+ return;
+
+ }
+
+ String type = ResourceLoader::get_resource_type(p_file);
+
+ if (cpos==-1) {
+
+ int idx=0;
+
+ for(int i=0;i<fs->files.size();i++) {
+ if (p_file<fs->files[i]->file)
+ break;
+ idx++;
+ }
+
+ EditorFileSystemDirectory::FileInfo *fi = memnew( EditorFileSystemDirectory::FileInfo );
+ fi->file=p_file.get_file();
+ fi->import_modified_time=0;
+
+ if (idx==fs->files.size()) {
+ fs->files.push_back(fi);
+ } else {
+
+ fs->files.insert(idx,fi);
+ }
+ cpos=idx;
+
+
+ }
+
+ //print_line("UPDATING: "+p_file);
+ fs->files[cpos]->type=type;
+ fs->files[cpos]->modified_time=FileAccess::get_modified_time(p_file);
+ //if (FileAccess::exists(p_file+".import")) {
+ // fs->files[cpos]->import_modified_time=FileAccess::get_modified_time(p_file+".import");
+ //}
+
+ EditorResourcePreview::get_singleton()->call_deferred("check_for_invalidation",p_file);
+ call_deferred("emit_signal","filesystem_changed"); //update later
+
+}
+
+
+void EditorFileSystem::_reimport_file(const String& p_file) {
+
+ print_line("REIMPORTING: "+p_file);
+
+ EditorFileSystemDirectory *fs=NULL;
+ int cpos=-1;
+ bool found = _find_file(p_file,&fs,cpos);
+ ERR_FAIL_COND(!found);
+
+ //try to obtain existing params
+
+ Map<StringName,Variant> params;
+ String importer_name;
+
+ if (FileAccess::exists(p_file+".import")) {
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+ Error err = cf->load(p_file+".import");
+ if (err==OK) {
+ List<String> sk;
+ cf->get_section_keys("params",&sk);
+ for(List<String>::Element *E=sk.front();E;E=E->next()) {
+ params[E->get()]=cf->get_value("params",E->get());
+ }
+ importer_name = cf->get_value("remap","importer");
+ }
+ }
+
+ Ref<ResourceImporter> importer;
+ //find the importer
+ if (importer_name!="") {
+ importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name);
+ }
+
+ if (importer.is_null()) {
+ //not found by name, find by extension
+ importer = ResourceFormatImporter::get_singleton()->get_importer_by_extension(p_file.get_extension());
+ if (importer.is_null()) {
+ ERR_PRINT("BUG: File queued for import, but can't be imported!");
+ ERR_FAIL();
+
+ }
+ }
+
+ //mix with default params, in case a parameter is missing
+
+ List<ResourceImporter::ImportOption> opts;
+ importer->get_import_options(&opts);
+ for (List<ResourceImporter::ImportOption>::Element *E=opts.front();E;E=E->next()) {
+ if (!params.has(E->get().option.name)) { //this one is not present
+ params[E->get().option.name]=E->get().default_value;
+ }
+ }
+
+ //finally, perform import!!
+ String base_path = ResourceFormatImporter::get_singleton()->get_import_base_path(p_file);
+
+ List<String> import_variants;
+ List<String> gen_files;
+
+ Error err = importer->import(p_file,base_path,params,&import_variants,&gen_files);
+
+ if (err!=OK) {
+ ERR_PRINTS("Error importing: "+p_file);
+ }
+
+ //as import is complete, save the .import file
+
+ FileAccess *f = FileAccess::open(p_file+".import",FileAccess::WRITE);
+ ERR_FAIL_COND(!f);
+
+ //write manually, as order matters ([remap] has to go first for performance).
+ f->store_line("[remap]");
+ f->store_line("");
+ f->store_line("importer=\""+importer->get_importer_name()+"\"");
+ if (importer->get_resource_type()!="") {
+ f->store_line("type=\""+importer->get_resource_type()+"\"");
+ }
+
+
+ if (importer->get_save_extension()=="") {
+ //no path
+ } else if (import_variants.size()) {
+ //import with variants
+ for(List<String>::Element *E=import_variants.front();E;E=E->next()) {
+
+
+ String path = base_path.c_escape()+"."+E->get()+"."+importer->get_save_extension();
+
+ f->store_line("path."+E->get()+"=\""+path+"\"");
+
+ }
+ } else {
+
+ f->store_line("path=\""+base_path+"."+importer->get_save_extension()+"\"");
+ }
+
+ f->store_line("");
+ if (gen_files.size()) {
+ f->store_line("[gen]");
+ Array genf;
+ for (List<String>::Element *E=gen_files.front();E;E=E->next()) {
+ genf.push_back(E->get());
+ }
+
+ String value;
+ VariantWriter::write_to_string(genf,value);
+ f->store_line("files="+value);
+ f->store_line("");
+ }
+
+
+ f->store_line("[params]");
+ f->store_line("");
+
+ //store options in provided order, to avoid file changing
+
+
+ for (List<ResourceImporter::ImportOption>::Element *E=opts.front();E;E=E->next()) {
+
+ String base = E->get().option.name;
+ String value;
+ VariantWriter::write_to_string(params[base],value);
+ f->store_line(base+"="+value);
+
+
+ }
+
+ f->close();
+ memdelete(f);
+
+ //update modified times, to avoid reimport
+ fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file);
+ fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(p_file+".import");
+
+ //if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
+ //to reload properly
+ if (ResourceCache::has(p_file)) {
+
+ Resource *r = ResourceCache::get(p_file);
+
+ if (r->get_import_path()!=String()) {
+
+ String dst_path = ResourceFormatImporter::get_singleton()->get_internal_resource_path(p_file);
+ r->set_import_path(dst_path);
+ r->set_import_last_modified_time(0);
+ }
+ }
+}
+
+void EditorFileSystem::reimport_files(const Vector<String>& p_files) {
+
+ importing=true;
+ EditorProgress pr("reimport",TTR("(Re)Importing Assets"),p_files.size());
+ for(int i=0;i<p_files.size();i++) {
+ pr.step(p_files[i].get_file(),i);
+
+ _reimport_file(p_files[i]);
+ }
+
+ _save_filesystem_cache();
+ importing=false;
+ if (!is_scanning()) {
+ emit_signal("filesystem_changed");
+ }
+}
+
+void EditorFileSystem::_bind_methods() {
+
+
+ ClassDB::bind_method(D_METHOD("get_filesystem:EditorFileSystemDirectory"),&EditorFileSystem::get_filesystem);
+ ClassDB::bind_method(D_METHOD("is_scanning"),&EditorFileSystem::is_scanning);
+ ClassDB::bind_method(D_METHOD("get_scanning_progress"),&EditorFileSystem::get_scanning_progress);
+ ClassDB::bind_method(D_METHOD("scan"),&EditorFileSystem::scan);
+ ClassDB::bind_method(D_METHOD("scan_sources"),&EditorFileSystem::scan_changes);
+ ClassDB::bind_method(D_METHOD("update_file","path"),&EditorFileSystem::update_file);
+ ClassDB::bind_method(D_METHOD("get_filesystem_path:EditorFileSystemDirectory","path"),&EditorFileSystem::get_filesystem_path);
+ ClassDB::bind_method(D_METHOD("get_file_type","path"),&EditorFileSystem::get_file_type);
+
+ ADD_SIGNAL( MethodInfo("filesystem_changed") );
+ ADD_SIGNAL( MethodInfo("sources_changed",PropertyInfo(Variant::BOOL,"exist")) );
+
+}
+
+void EditorFileSystem::_update_extensions() {
+
+ valid_extensions.clear();
+ import_extensions.clear();
+
+ List<String> extensionsl;
+ ResourceLoader::get_recognized_extensions_for_type("",&extensionsl);
+ for(List<String>::Element *E = extensionsl.front();E;E=E->next()) {
+
+ valid_extensions.insert(E->get());
+ }
+
+ extensionsl.clear();
+ ResourceFormatImporter::get_singleton()->get_recognized_extensions(&extensionsl);
+ for(List<String>::Element *E = extensionsl.front();E;E=E->next()) {
+
+ import_extensions.insert(E->get());
+ }
+}
+
+EditorFileSystem::EditorFileSystem() {
+
+ reimport_on_missing_imported_files = GLOBAL_DEF("editor/reimport_missing_imported_files",true);
+
+ singleton=this;
+ filesystem=memnew( EditorFileSystemDirectory ); //like, empty
+
+ thread = NULL;
+ scanning=false;
+ importing=false;
+ use_threads=true;
+ thread_sources=NULL;
+ new_filesystem=NULL;
+
+ scanning_changes=false;
+ ResourceSaver::set_save_callback(_resource_saved);
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ if (da->change_dir("res://.import")!=OK) {
+ da->make_dir("res://.import");
+ }
+ memdelete(da);
+
+ scan_total=0;
+}
+
+EditorFileSystem::~EditorFileSystem() {
+
+
+}
diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h
new file mode 100644
index 0000000000..10d9b919fc
--- /dev/null
+++ b/editor/editor_file_system.h
@@ -0,0 +1,231 @@
+/*************************************************************************/
+/* editor_file_system.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_FILE_SYSTEM_H
+#define EDITOR_FILE_SYSTEM_H
+
+#include "scene/main/node.h"
+#include "os/thread.h"
+#include "os/dir_access.h"
+#include "set.h"
+#include "os/thread_safe.h"
+class FileAccess;
+
+struct EditorProgressBG;
+class EditorFileSystemDirectory : public Object {
+
+ GDCLASS( EditorFileSystemDirectory,Object );
+
+ String name;
+ uint64_t modified_time;
+ bool verified; //used for checking changes
+
+ EditorFileSystemDirectory *parent;
+ Vector<EditorFileSystemDirectory*> subdirs;
+
+
+ struct FileInfo {
+ String file;
+ StringName type;
+ uint64_t modified_time;
+ uint64_t import_modified_time;
+ Vector<String> deps;
+ bool verified; //used for checking changes
+
+ };
+
+ struct FileInfoSort {
+ bool operator()(const FileInfo *p_a,const FileInfo *p_b) const {
+ return p_a->file<p_b->file;
+ }
+ };
+
+ void sort_files();
+
+ Vector<FileInfo*> files;
+
+ static void _bind_methods();
+
+
+friend class EditorFileSystem;
+public:
+
+ String get_name();
+ String get_path() const;
+
+ int get_subdir_count() const;
+ EditorFileSystemDirectory *get_subdir(int p_idx);
+ int get_file_count() const;
+ String get_file(int p_idx) const;
+ String get_file_path(int p_idx) const;
+ StringName get_file_type(int p_idx) const;
+ Vector<String> get_file_deps(int p_idx) const;
+
+ EditorFileSystemDirectory *get_parent();
+
+ int find_file_index(const String& p_file) const;
+ int find_dir_index(const String& p_dir) const;
+
+
+ EditorFileSystemDirectory();
+ ~EditorFileSystemDirectory();
+};
+
+class EditorFileSystem : public Node {
+
+ GDCLASS( EditorFileSystem, Node );
+
+ _THREAD_SAFE_CLASS_
+
+
+
+ struct ItemAction {
+
+ enum Action {
+ ACTION_NONE,
+ ACTION_DIR_ADD,
+ ACTION_DIR_REMOVE,
+ ACTION_FILE_ADD,
+ ACTION_FILE_REMOVE,
+ ACTION_FILE_REIMPORT
+ };
+
+ Action action;
+ EditorFileSystemDirectory *dir;
+ String file;
+ EditorFileSystemDirectory *new_dir;
+ EditorFileSystemDirectory::FileInfo *new_file;
+
+ ItemAction() { action=ACTION_NONE; dir=NULL; new_dir=NULL; new_file=NULL; }
+
+ };
+
+ bool use_threads;
+ Thread *thread;
+ static void _thread_func(void *_userdata);
+
+ EditorFileSystemDirectory *new_filesystem;
+
+ bool abort_scan;
+ bool scanning;
+ bool importing;
+ float scan_total;
+
+
+ void _scan_filesystem();
+
+ EditorFileSystemDirectory *filesystem;
+
+ static EditorFileSystem *singleton;
+
+ /* Used for reading the filesystem cache file */
+ struct FileCache {
+
+ String type;
+ uint64_t modification_time;
+ uint64_t import_modification_time;
+ Vector<String> deps;
+ };
+
+ HashMap<String,FileCache> file_cache;
+
+ struct ScanProgress {
+
+ float low;
+ float hi;
+ mutable EditorProgressBG *progress;
+ void update(int p_current,int p_total) const;
+ ScanProgress get_sub(int p_current,int p_total) const;
+ };
+
+
+ void _save_filesystem_cache();
+ void _save_filesystem_cache(EditorFileSystemDirectory *p_dir,FileAccess *p_file);
+
+ bool _find_file(const String& p_file,EditorFileSystemDirectory ** r_d, int &r_file_pos) const;
+
+ void _scan_fs_changes(EditorFileSystemDirectory *p_dir, const ScanProgress &p_progress);
+
+
+ int md_count;
+
+ Set<String> valid_extensions;
+ Set<String> import_extensions;
+
+ void _scan_new_dir(EditorFileSystemDirectory *p_dir,DirAccess *da,const ScanProgress& p_progress);
+
+ Thread *thread_sources;
+ bool scanning_changes;
+ bool scanning_changes_done;
+
+ static void _thread_func_sources(void *_userdata);
+
+ List<String> sources_changed;
+ List<ItemAction> scan_actions;
+
+ bool _update_scan_actions();
+
+ static void _resource_saved(const String& p_path);
+
+ void _update_extensions();
+
+ void _reimport_file(const String &p_file);
+
+ bool _check_missing_imported_files(const String& p_path);
+
+ bool reimport_on_missing_imported_files;
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+
+ static EditorFileSystem* get_singleton() { return singleton; }
+
+ EditorFileSystemDirectory *get_filesystem();
+ bool is_scanning() const;
+ bool is_importing() const { return importing; }
+ float get_scanning_progress() const;
+ void scan();
+ void scan_changes();
+ void get_changed_sources(List<String> *r_changed);
+ void update_file(const String& p_file);
+
+ EditorFileSystemDirectory *get_filesystem_path(const String& p_path);
+ String get_file_type(const String& p_file) const;
+ EditorFileSystemDirectory* find_file(const String& p_file,int* r_index) const;
+
+ void reimport_files(const Vector<String>& p_files);
+
+ EditorFileSystem();
+ ~EditorFileSystem();
+};
+
+#endif // EDITOR_FILE_SYSTEM_H
diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp
new file mode 100644
index 0000000000..3652a59978
--- /dev/null
+++ b/editor/editor_fonts.cpp
@@ -0,0 +1,168 @@
+/*************************************************************************/
+/* editor_fonts.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_fonts.h"
+
+#include "doc_font.h"
+#include "doc_title_font.h"
+#include "doc_code_font.h"
+#include "builtin_fonts.h"
+#include "editor_settings.h"
+#include "scene/resources/dynamic_font.h"
+#include "editor_scale.h"
+#include "scene/resources/default_theme/default_theme.h"
+
+static Ref<BitmapFont> make_font(int p_height,int p_ascent, int p_valign, int p_charcount, const int *p_chars,const Ref<Texture> &p_texture) {
+
+
+ Ref<BitmapFont> font( memnew( BitmapFont ) );
+ font->add_texture( p_texture );
+
+ for (int i=0;i<p_charcount;i++) {
+
+ const int *c = &p_chars[i*8];
+
+ int chr=c[0];
+ Rect2 frect;
+ frect.pos.x=c[1];
+ frect.pos.y=c[2];
+ frect.size.x=c[3];
+ frect.size.y=c[4];
+ Point2 align( c[5], c[6]+p_valign);
+ int advance=c[7];
+
+
+ font->add_char( chr, 0, frect, align,advance );
+
+ }
+
+ font->set_height( p_height );
+ font->set_ascent( p_ascent );
+
+ return font;
+}
+
+#define MAKE_FALLBACKS(m_name)\
+ m_name->add_fallback(DroidSansFallback);\
+ m_name->add_fallback(DroidSansJapanese);\
+ m_name->add_fallback(DroidSansArabic);\
+ m_name->add_fallback(DroidSansHebrew);\
+ m_name->add_fallback(DroidSansThai);
+
+#define MAKE_DROID_SANS(m_name,m_size) \
+ Ref<DynamicFont> m_name;\
+ m_name.instance();\
+ m_name->set_size(m_size);\
+ m_name->set_font_data(DroidSans);\
+ MAKE_FALLBACKS(m_name);
+
+
+void editor_register_fonts(Ref<Theme> p_theme) {
+ /* Droid Sans */
+
+ Ref<DynamicFontData> DroidSans;
+ DroidSans.instance();
+ DroidSans->set_font_ptr(_font_DroidSans,_font_DroidSans_size);
+ DroidSans->set_force_autohinter(true); //just looks better..i think?
+
+ Ref<DynamicFontData> DroidSansFallback;
+ DroidSansFallback.instance();
+ DroidSansFallback->set_font_ptr(_font_DroidSansFallback,_font_DroidSansFallback_size);
+ DroidSansFallback->set_force_autohinter(true); //just looks better..i think?
+
+ Ref<DynamicFontData> DroidSansJapanese;
+ DroidSansJapanese.instance();
+ DroidSansJapanese->set_font_ptr(_font_DroidSansJapanese,_font_DroidSansJapanese_size);
+ DroidSansJapanese->set_force_autohinter(true); //just looks better..i think?
+
+ Ref<DynamicFontData> DroidSansArabic;
+ DroidSansArabic.instance();
+ DroidSansArabic->set_font_ptr(_font_DroidSansArabic,_font_DroidSansArabic_size);
+ DroidSansArabic->set_force_autohinter(true); //just looks better..i think?
+
+ Ref<DynamicFontData> DroidSansHebrew;
+ DroidSansHebrew.instance();
+ DroidSansHebrew->set_font_ptr(_font_DroidSansHebrew,_font_DroidSansHebrew_size);
+ DroidSansHebrew->set_force_autohinter(true); //just looks better..i think?
+
+ Ref<DynamicFontData> DroidSansThai;
+ DroidSansThai.instance();
+ DroidSansThai->set_font_ptr(_font_DroidSansThai,_font_DroidSansThai_size);
+ DroidSansThai->set_force_autohinter(true); //just looks better..i think?
+
+ /* Source Code Pro */
+
+
+ Ref<DynamicFontData> dfmono;
+ dfmono.instance();
+ dfmono->set_font_ptr(_font_source_code_pro,_font_source_code_pro_size);
+ //dfd->set_force_autohinter(true); //just looks better..i think?
+
+ MAKE_DROID_SANS(df,int(EditorSettings::get_singleton()->get("interface/font_size"))*EDSCALE);
+
+
+ p_theme->set_default_theme_font(df);
+
+ //Ref<BitmapFont> doc_font = make_font(_bi_font_doc_font_height,_bi_font_doc_font_ascent,0,_bi_font_doc_font_charcount,_bi_font_doc_font_characters,p_theme->get_icon("DocFont","EditorIcons"));
+ //Ref<BitmapFont> doc_title_font = make_font(_bi_font_doc_title_font_height,_bi_font_doc_title_font_ascent,0,_bi_font_doc_title_font_charcount,_bi_font_doc_title_font_characters,p_theme->get_icon("DocTitleFont","EditorIcons"));
+ //Ref<BitmapFont> doc_code_font = make_font(_bi_font_doc_code_font_height,_bi_font_doc_code_font_ascent,0,_bi_font_doc_code_font_charcount,_bi_font_doc_code_font_characters,p_theme->get_icon("DocCodeFont","EditorIcons"));
+
+ MAKE_DROID_SANS(df_title,int(EDITOR_DEF("text_editor/help/help_title_font_size",18))*EDSCALE);
+
+ MAKE_DROID_SANS(df_doc,int(EDITOR_DEF("text_editor/help/help_font_size",16))*EDSCALE);
+
+
+ p_theme->set_font("doc","EditorFonts",df_doc);
+ p_theme->set_font("doc_title","EditorFonts",df_title);
+
+
+ Ref<DynamicFont> df_code;
+ df_code.instance();
+ df_code->set_size(int(EditorSettings::get_singleton()->get("interface/source_font_size"))*EDSCALE);
+ df_code->set_font_data(dfmono);
+ MAKE_FALLBACKS(df_code);
+
+ p_theme->set_font("source","EditorFonts",df_code);
+
+ Ref<DynamicFont> df_doc_code;
+ df_doc_code.instance();
+ df_doc_code->set_size(int(EDITOR_DEF("text_editor/help/help_source_font_size",14))*EDSCALE);
+ df_doc_code->set_font_data(dfmono);
+ MAKE_FALLBACKS(df_doc_code);
+
+
+ p_theme->set_font("doc_source","EditorFonts",df_doc_code);
+
+
+ //replace default theme
+ Ref<Texture> di;
+ Ref<StyleBox> ds;
+ fill_default_theme(p_theme,df,df_doc,di,ds,EDSCALE);
+
+
+}
diff --git a/editor/editor_fonts.h b/editor/editor_fonts.h
new file mode 100644
index 0000000000..0e8ce20609
--- /dev/null
+++ b/editor/editor_fonts.h
@@ -0,0 +1,36 @@
+/*************************************************************************/
+/* editor_fonts.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_FONTS_H
+#define EDITOR_FONTS_H
+
+#include "scene/resources/theme.h"
+
+void editor_register_fonts(Ref<Theme> p_theme);
+
+#endif
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
new file mode 100644
index 0000000000..7ef7658132
--- /dev/null
+++ b/editor/editor_help.cpp
@@ -0,0 +1,1929 @@
+/*************************************************************************/
+/* editor_help.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_help.h"
+
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "os/keyboard.h"
+#include "doc_data_compressed.h"
+#include "editor/plugins/script_editor_plugin.h"
+
+void EditorHelpSearch::popup() {
+ popup_centered_ratio(0.6);
+ if (search_box->get_text()!="") {
+ search_box->select_all();
+ _update_search();
+ }
+ search_box->grab_focus();
+}
+
+void EditorHelpSearch::popup(const String& p_term) {
+
+ popup_centered_ratio(0.6);
+ if (p_term!="") {
+ search_box->set_text(p_term);
+ search_box->select_all();
+ _update_search();
+ } else
+ search_box->clear();
+ search_box->grab_focus();
+}
+
+
+void EditorHelpSearch::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void EditorHelpSearch::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ search_options->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+
+}
+
+void EditorHelpSearch::_update_search() {
+
+ search_options->clear();
+ search_options->set_hide_root(true);
+
+ /*
+ TreeItem *root = search_options->create_item();
+ _parse_fs(EditorFileSystem::get_singleton()->get_filesystem());
+*/
+
+ List<StringName> type_list;
+ ClassDB::get_class_list(&type_list);
+
+ DocData *doc=EditorHelp::get_doc_data();
+ String term = search_box->get_text();
+ if (term.length()<2)
+ return;
+
+ TreeItem *root = search_options->create_item();
+
+
+
+ Ref<Texture> def_icon = get_icon("Node","EditorIcons");
+ //classes first
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+ if (E->key().findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_name:"+E->key());
+ item->set_text(0,E->key()+" (Class)");
+ if (has_icon(E->key(),"EditorIcons"))
+ item->set_icon(0,get_icon(E->key(),"EditorIcons"));
+ else
+ item->set_icon(0,def_icon);
+
+
+ }
+
+ }
+
+ //class methods, etc second
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+
+ DocData::ClassDoc & c = E->get();
+
+ Ref<Texture> cicon;
+ if (has_icon(E->key(),"EditorIcons"))
+ cicon=get_icon(E->key(),"EditorIcons");
+ else
+ cicon=def_icon;
+
+
+ for(int i=0;i<c.methods.size();i++) {
+ if( (term.begins_with(".") && c.methods[i].name.begins_with(term.right(1)))
+ || (term.ends_with("(") && c.methods[i].name.ends_with(term.left(term.length()-1).strip_edges()))
+ || (term.begins_with(".") && term.ends_with("(") && c.methods[i].name==term.substr(1,term.length()-2).strip_edges())
+ || c.methods[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_method:"+E->key()+":"+c.methods[i].name);
+ item->set_text(0,E->key()+"."+c.methods[i].name+" (Method)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.signals.size();i++) {
+
+ if (c.signals[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_signal:"+E->key()+":"+c.signals[i].name);
+ item->set_text(0,E->key()+"."+c.signals[i].name+" (Signal)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ if (c.constants[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_constant:"+E->key()+":"+c.constants[i].name);
+ item->set_text(0,E->key()+"."+c.constants[i].name+" (Constant)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.properties.size();i++) {
+
+ if (c.properties[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_property:"+E->key()+":"+c.properties[i].name);
+ item->set_text(0,E->key()+"."+c.properties[i].name+" (Property)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.theme_properties.size();i++) {
+
+ if (c.theme_properties[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_theme_item:"+E->key()+":"+c.theme_properties[i].name);
+ item->set_text(0,E->key()+"."+c.theme_properties[i].name+" (Theme Item)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+
+ }
+
+ //same but descriptions
+
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+
+ DocData::ClassDoc & c = E->get();
+
+ Ref<Texture> cicon;
+ if (has_icon(E->key(),"EditorIcons"))
+ cicon=get_icon(E->key(),"EditorIcons");
+ else
+ cicon=def_icon;
+
+ if (c.description.findn(term)!=-1) {
+
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_desc:"+E->key());
+ item->set_text(0,E->key()+" (Class Description)");
+ item->set_icon(0,cicon);
+
+ }
+
+ for(int i=0;i<c.methods.size();i++) {
+
+ if (c.methods[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_method_desc:"+E->key()+":"+c.methods[i].name);
+ item->set_text(0,E->key()+"."+c.methods[i].name+" (Method Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.signals.size();i++) {
+
+ if (c.signals[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_signal:"+E->key()+":"+c.signals[i].name);
+ item->set_text(0,E->key()+"."+c.signals[i].name+" (Signal Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ if (c.constants[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_constant:"+E->key()+":"+c.constants[i].name);
+ item->set_text(0,E->key()+"."+c.constants[i].name+" (Constant Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.properties.size();i++) {
+
+ if (c.properties[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_property_desc:"+E->key()+":"+c.properties[i].name);
+ item->set_text(0,E->key()+"."+c.properties[i].name+" (Property Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+void EditorHelpSearch::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+
+ String mdata=ti->get_metadata(0);
+ emit_signal("go_to_help",mdata);
+ editor->call("_editor_select",EditorNode::EDITOR_SCRIPT); // in case EditorHelpSearch beeen invoked on top of other editor window
+ // go to that
+ hide();
+}
+
+void EditorHelpSearch::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+ _update_search();
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ if (is_visible_in_tree()) {
+
+ search_box->call_deferred("grab_focus"); // still not visible
+ search_box->select_all();
+ }
+ }
+
+}
+
+
+void EditorHelpSearch::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&EditorHelpSearch::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&EditorHelpSearch::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&EditorHelpSearch::_sbox_input);
+ ClassDB::bind_method(D_METHOD("_update_search"),&EditorHelpSearch::_update_search);
+
+ ADD_SIGNAL(MethodInfo("go_to_help"));
+
+}
+
+
+EditorHelpSearch::EditorHelpSearch() {
+
+ editor=EditorNode::get_singleton();
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ HBoxContainer *sb_hb = memnew( HBoxContainer);
+ search_box = memnew( LineEdit );
+ sb_hb->add_child(search_box);
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ Button *sb = memnew( Button(TTR("Search")));
+ sb->connect("pressed",this,"_update_search");
+ sb_hb->add_child(sb);
+ vbc->add_margin_child(TTR("Search:"),sb_hb);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("Open"));
+ get_ok()->set_disabled(true);
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
+ search_options->connect("item_activated",this,"_confirmed");
+ set_title(TTR("Search Help"));
+
+ //search_options->set_hide_root(true);
+
+}
+
+/////////////////////////////////
+
+////////////////////////////////////
+/// /////////////////////////////////
+
+
+
+void EditorHelpIndex::add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root) {
+
+ if (p_types.has(p_type))
+ return;
+ /*
+ if (!ClassDB::is_type(p_type,base) || p_type==base)
+ return;
+ */
+
+ String inherits=EditorHelp::get_doc_data()->class_list[p_type].inherits;
+
+ TreeItem *parent=p_root;
+
+
+ if (inherits.length()) {
+
+ if (!p_types.has(inherits)) {
+
+ add_type(inherits,p_types,p_root);
+ }
+
+ if (p_types.has(inherits) )
+ parent=p_types[inherits];
+ }
+
+ TreeItem *item = class_list->create_item(parent);
+ item->set_metadata(0,p_type);
+ item->set_tooltip(0,EditorHelp::get_doc_data()->class_list[p_type].brief_description);
+ item->set_text(0,p_type);
+
+
+ if (has_icon(p_type,"EditorIcons")) {
+
+ item->set_icon(0, get_icon(p_type,"EditorIcons"));
+ }
+
+ p_types[p_type]=item;
+}
+
+
+void EditorHelpIndex::_tree_item_selected() {
+
+
+ TreeItem *s=class_list->get_selected();
+ if (!s)
+ return;
+
+ emit_signal("open_class",s->get_text(0));
+
+ hide();
+
+ //_goto_desc(s->get_text(0));
+
+}
+
+void EditorHelpIndex::select_class(const String& p_class) {
+
+ if (!tree_item_map.has(p_class))
+ return;
+ tree_item_map[p_class]->select(0);
+ class_list->ensure_cursor_is_visible();
+}
+
+void EditorHelpIndex::popup() {
+
+ popup_centered_ratio(0.6);
+
+ search_box->set_text("");
+ _update_class_list();
+}
+
+void EditorHelpIndex::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ _update_class_list();
+
+ connect("confirmed",this,"_tree_item_selected");
+
+ } else if (p_what==NOTIFICATION_POST_POPUP) {
+
+ search_box->call_deferred("grab_focus");
+ }
+}
+
+void EditorHelpIndex::_text_changed(const String& p_text) {
+
+ _update_class_list();
+}
+
+void EditorHelpIndex::_update_class_list() {
+
+ class_list->clear();
+ tree_item_map.clear();
+ TreeItem *root = class_list->create_item();
+ class_list->set_hide_root(true);
+
+ String filter = search_box->get_text().strip_edges();
+ String to_select = "";
+
+ for(Map<String,DocData::ClassDoc>::Element *E=EditorHelp::get_doc_data()->class_list.front();E;E=E->next()) {
+
+ if (filter == "") {
+ add_type(E->key(),tree_item_map,root);
+ } else {
+
+ bool found = false;
+ String type = E->key();
+
+ while(type != "") {
+ if (filter.is_subsequence_ofi(type)) {
+
+ if (to_select.empty()) {
+ to_select = type;
+ }
+
+ found=true;
+ break;
+ }
+
+ type = EditorHelp::get_doc_data()->class_list[type].inherits;
+ }
+
+ if (found) {
+ add_type(E->key(),tree_item_map,root);
+ }
+ }
+ }
+
+ if (tree_item_map.has(filter)) {
+ select_class(filter);
+ } else if (to_select != "") {
+ select_class(to_select);
+ }
+}
+
+
+void EditorHelpIndex::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ class_list->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+}
+
+void EditorHelpIndex::_bind_methods() {
+
+ ClassDB::bind_method("_tree_item_selected",&EditorHelpIndex::_tree_item_selected);
+ ClassDB::bind_method("_text_changed",&EditorHelpIndex::_text_changed);
+ ClassDB::bind_method("_sbox_input",&EditorHelpIndex::_sbox_input);
+ ClassDB::bind_method("select_class",&EditorHelpIndex::select_class);
+ ADD_SIGNAL( MethodInfo("open_class"));
+}
+
+
+
+EditorHelpIndex::EditorHelpIndex() {
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ search_box = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Search:"), search_box);
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ register_text_enter(search_box);
+
+ search_box->connect("text_changed", this, "_text_changed");
+ search_box->connect("gui_input", this, "_sbox_input");
+
+ class_list = memnew( Tree );
+ vbc->add_margin_child(TTR("Class List:")+" ", class_list, true);
+ class_list->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ class_list->connect("item_activated",this,"_tree_item_selected");
+
+ get_ok()->set_text(TTR("Open"));
+ set_title(TTR("Search Classes"));
+}
+
+
+
+/////////////////////////////////
+
+////////////////////////////////////
+/// /////////////////////////////////
+DocData *EditorHelp::doc=NULL;
+
+void EditorHelp::_unhandled_key_input(const InputEvent& p_ev) {
+
+ if (!is_visible_in_tree())
+ return;
+ if ( p_ev.key.mod.control && p_ev.key.scancode==KEY_F) {
+
+ search->grab_focus();
+ search->select_all();
+ }
+}
+
+void EditorHelp::_search(const String&) {
+
+ if (search->get_text()=="")
+ return;
+
+
+ String stext=search->get_text();
+ bool keep = prev_search==stext;
+
+ bool ret = class_desc->search(stext, keep);
+ if (!ret) {
+ class_desc->search(stext, false);
+ }
+
+ prev_search=stext;
+
+
+}
+
+#if 0
+void EditorHelp::_button_pressed(int p_idx) {
+
+ if (p_idx==PAGE_CLASS_LIST) {
+
+ //edited_class->set_pressed(false);
+ //class_list_button->set_pressed(true);
+ //tabs->set_current_tab(PAGE_CLASS_LIST);
+
+ } else if (p_idx==PAGE_CLASS_DESC) {
+
+ //edited_class->set_pressed(true);
+ //class_list_button->set_pressed(false);
+ //tabs->set_current_tab(PAGE_CLASS_DESC);
+
+ } else if (p_idx==PAGE_CLASS_PREV) {
+
+ if (history_pos<2)
+ return;
+ history_pos--;
+ ERR_FAIL_INDEX(history_pos-1,history.size());
+ _goto_desc(history[history_pos-1].c,false,history[history_pos-1].scroll);
+ _update_history_buttons();
+
+
+ } else if (p_idx==PAGE_CLASS_NEXT) {
+
+ if (history_pos>=history.size())
+ return;
+
+ history_pos++;
+ ERR_FAIL_INDEX(history_pos-1,history.size());
+ _goto_desc(history[history_pos-1].c,false,history[history_pos-1].scroll);
+ _update_history_buttons();
+
+ } else if (p_idx==PAGE_SEARCH) {
+
+ _search("");
+ }
+}
+
+
+#endif
+
+void EditorHelp::_class_list_select(const String& p_select) {
+
+ _goto_desc(p_select);
+}
+
+void EditorHelp::_class_desc_select(const String& p_select) {
+
+
+
+ //print_line("LINK: "+p_select);
+ if (p_select.begins_with("#")) {
+ //_goto_desc(p_select.substr(1,p_select.length()));
+ emit_signal("go_to_help","class_name:"+p_select.substr(1,p_select.length()));
+ return;
+ } else if (p_select.begins_with("@")) {
+
+ String m = p_select.substr(1,p_select.length());
+
+ if (m.find(".")!=-1) {
+ //must go somewhere else
+
+ emit_signal("go_to_help","class_method:"+m.get_slice(".",0)+":"+m.get_slice(".",0));
+ } else {
+
+ if (!method_line.has(m))
+ return;
+ class_desc->scroll_to_line(method_line[m]);
+ }
+
+ }
+
+
+}
+
+void EditorHelp::_class_desc_input(const InputEvent& p_input) {
+ if (p_input.type==InputEvent::MOUSE_BUTTON && p_input.mouse_button.pressed && p_input.mouse_button.button_index==1) {
+ class_desc->set_selection_enabled(false);
+ class_desc->set_selection_enabled(true);
+ }
+ set_focused();
+}
+
+void EditorHelp::_add_type(const String& p_type) {
+
+ String t = p_type;
+ if (t=="")
+ t="void";
+ bool can_ref = (t!="int" && t!="real" && t!="bool" && t!="void");
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ if (can_ref)
+ class_desc->push_meta("#"+t); //class
+ class_desc->add_text(t);
+ if (can_ref)
+ class_desc->pop();
+ class_desc->pop();
+
+}
+
+void EditorHelp::_scroll_changed(double p_scroll) {
+
+ if (scroll_locked)
+ return;
+
+ if (!class_desc->get_v_scroll()->is_visible())
+ p_scroll=0;
+
+ //history[p].scroll=p_scroll;
+}
+
+Error EditorHelp::_goto_desc(const String& p_class,int p_vscr) {
+
+ //ERR_FAIL_COND(!doc->class_list.has(p_class));
+ if (!doc->class_list.has(p_class))
+ return ERR_DOES_NOT_EXIST;
+
+
+ //if (tree_item_map.has(p_class)) {
+ select_locked = true;
+ //}
+
+ class_desc->show();
+ //tabs->set_current_tab(PAGE_CLASS_DESC);
+ description_line=0;
+
+ if (p_class==edited_class)
+ return OK; //already there
+
+ scroll_locked=true;
+
+ class_desc->clear();
+ method_line.clear();
+ edited_class=p_class;
+ //edited_class->show();
+
+
+ DocData::ClassDoc cd=doc->class_list[p_class]; //make a copy, so we can sort without worrying
+
+ Color h_color;
+
+ Ref<Font> doc_font = get_font("doc","EditorFonts");
+ Ref<Font> doc_title_font = get_font("doc_title","EditorFonts");
+ Ref<Font> doc_code_font = get_font("doc_source","EditorFonts");
+
+
+ h_color=Color(1,1,1,1);
+
+ class_desc->push_font(doc_title_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(TTR("Class:")+" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ _add_text(p_class);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+
+ if (cd.inherits!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Inherits:")+" ");
+ class_desc->pop();
+ class_desc->pop();
+
+ String inherits = cd.inherits;
+
+ class_desc->push_font(doc_font);
+
+ while (inherits != "") {
+ _add_type(inherits);
+
+ inherits = doc->class_list[inherits].inherits;
+
+ if (inherits != "") {
+ class_desc->add_text(" , ");
+ }
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+ }
+
+ if (ClassDB::class_exists(cd.name)) {
+
+ bool found = false;
+ bool prev = false;
+
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+ if (E->get().inherits == cd.name) {
+
+ if (!found) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Inherited by:")+" ");
+ class_desc->pop();
+ class_desc->pop();
+
+ found = true;
+ class_desc->push_font(doc_font);
+ }
+
+ if (prev) {
+
+ class_desc->add_text(" , ");
+ prev = false;
+ }
+
+ _add_type(E->get().name);
+ prev = true;
+ }
+ }
+
+ if (found)
+ class_desc->pop();
+
+ class_desc->add_newline();
+ }
+
+ class_desc->add_newline();
+
+ if (cd.brief_description!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Brief Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ //class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.brief_description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+ Set<String> skip_methods;
+ bool property_descr=false;
+
+ if (cd.properties.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Members:"));
+ class_desc->pop();
+ class_desc->pop();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+ class_desc->push_table(2);
+ class_desc->set_table_column_expand(1,1);
+
+ for(int i=0;i<cd.properties.size();i++) {
+ property_line[cd.properties[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+
+ class_desc->push_cell();
+ class_desc->push_align(RichTextLabel::ALIGN_RIGHT);
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.properties[i].type);
+ class_desc->add_text(" ");
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+
+ bool describe=false;
+
+ if (cd.properties[i].setter!="") {
+ skip_methods.insert(cd.properties[i].setter);
+ describe=true;
+
+ }
+ if (cd.properties[i].getter!="") {
+ skip_methods.insert(cd.properties[i].getter);
+ describe=true;
+ }
+
+ if (cd.properties[i].description!="") {
+ describe=true;
+
+ }
+ class_desc->push_cell();
+ if (describe) {
+ class_desc->push_meta("@"+cd.properties[i].name);
+ }
+
+ class_desc->push_font(doc_code_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.properties[i].name);
+
+ if (describe) {
+ class_desc->pop();
+ }
+
+
+ if (cd.properties[i].brief_description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+ if (describe) {
+ property_descr=true;
+ }
+
+
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+
+ class_desc->pop(); //table
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+
+ bool method_descr=false;
+ bool sort_methods = EditorSettings::get_singleton()->get("text_editor/help/sort_functions_alphabetically");
+
+ Vector<DocData::MethodDoc> methods;
+
+ for(int i=0;i<cd.methods.size();i++) {
+ if (skip_methods.has(cd.methods[i].name))
+ continue;
+ methods.push_back(cd.methods[i]);
+ }
+
+ if (methods.size()) {
+
+ if (sort_methods)
+ methods.sort();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Public Methods:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ //class_desc->add_newline();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+ class_desc->push_table(2);
+ class_desc->set_table_column_expand(1,1);
+
+ for(int i=0;i<methods.size();i++) {
+
+ class_desc->push_cell();
+
+
+ method_line[methods[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_align(RichTextLabel::ALIGN_RIGHT);
+ class_desc->push_font(doc_code_font);
+ _add_type(methods[i].return_type);
+ //class_desc->add_text(" ");
+ class_desc->pop(); //align
+ class_desc->pop(); //font
+ class_desc->pop(); //cell
+ class_desc->push_cell();
+ class_desc->push_font(doc_code_font);
+
+ if (methods[i].description!="") {
+ method_descr=true;
+ class_desc->push_meta("@"+methods[i].name);
+ }
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(methods[i].name);
+ class_desc->pop();
+ if (methods[i].description!="")
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<methods[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(methods[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(methods[i].arguments[j].name);
+ if (methods[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(methods[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ if (methods[i].qualifiers.find("vararg")!=-1) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(",");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(" ... ");
+ class_desc->pop();
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?" )":")");
+ class_desc->pop();
+ if (methods[i].qualifiers!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(" ");
+ _add_text(methods[i].qualifiers);
+ class_desc->pop();
+
+ }
+ class_desc->pop();//monofont
+ //class_desc->add_newline();
+ class_desc->pop(); //cell
+
+ }
+ class_desc->pop(); //table
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+
+ if (cd.theme_properties.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("GUI Theme Items:"));
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+
+ class_desc->push_indent(1);
+
+ //class_desc->add_newline();
+
+ for(int i=0;i<cd.theme_properties.size();i++) {
+
+ theme_property_line[cd.theme_properties[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.theme_properties[i].type);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(" ");
+ _add_text(cd.theme_properties[i].name);
+ class_desc->pop();
+ class_desc->pop();
+
+ if (cd.theme_properties[i].description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.theme_properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+ class_desc->add_newline();
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+ }
+
+ if (cd.signals.size()) {
+
+ if (sort_methods) {
+ cd.signals.sort();
+ }
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Signals:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+
+ for(int i=0;i<cd.signals.size();i++) {
+
+ signal_line[cd.signals[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_font(doc_code_font); // monofont
+ //_add_type("void");
+ //class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.signals[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(cd.signals[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<cd.signals[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(cd.signals[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(cd.signals[i].arguments[j].name);
+ if (cd.signals[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(cd.signals[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(cd.signals[i].arguments.size()?" )":")");
+ class_desc->pop();
+ class_desc->pop(); // end monofont
+ if (cd.signals[i].description!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ class_desc->add_text(" ");
+ _add_text(cd.signals[i].description);
+ class_desc->pop();
+
+ }
+ class_desc->add_newline();
+
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+
+ }
+
+ if (cd.constants.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Constants:"));
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->push_indent(1);
+
+ class_desc->add_newline();
+ //class_desc->add_newline();
+
+ for(int i=0;i<cd.constants.size();i++) {
+
+ constant_line[cd.constants[i].name]=class_desc->get_line_count()-2;
+ class_desc->push_font(doc_code_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ _add_text(cd.constants[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(" = ");
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ _add_text(cd.constants[i].value);
+ class_desc->pop();
+ class_desc->pop();
+ if (cd.constants[i].description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.constants[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ }
+
+ class_desc->add_newline();
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+
+
+ }
+
+ if (cd.description!="") {
+
+ description_line=class_desc->get_line_count()-2;
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+ if (property_descr) {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Property Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+
+ for(int i=0;i<cd.properties.size();i++) {
+
+ method_line[cd.properties[i].name]=class_desc->get_line_count()-2;
+
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.properties[i].type);
+
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.properties[i].name);
+ class_desc->pop(); //color
+
+ class_desc->add_text(" ");
+
+ class_desc->pop(); //font
+
+ if (cd.properties[i].setter!="") {
+
+ class_desc->push_font( doc_font );
+
+ class_desc->push_indent(2);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text("Setter: ");
+ class_desc->pop();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(cd.properties[i].setter+"(value)");
+ class_desc->pop(); //color
+
+ class_desc->pop(); //indent
+
+ class_desc->pop(); //font
+
+ }
+
+ if (cd.properties[i].getter!="") {
+
+ class_desc->push_font( doc_font );
+
+ class_desc->push_indent(2);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text("Getter: ");
+ class_desc->pop();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(cd.properties[i].getter+"()");
+ class_desc->pop(); //color
+
+ class_desc->pop(); //indent
+
+ class_desc->pop(); //font
+
+ }
+
+ class_desc->add_newline();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+ }
+
+ if (method_descr) {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Method Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+
+ for(int i=0;i<methods.size();i++) {
+
+ method_line[methods[i].name]=class_desc->get_line_count()-2;
+
+ class_desc->push_font(doc_code_font);
+ _add_type(methods[i].return_type);
+
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(methods[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<methods[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(methods[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(methods[i].arguments[j].name);
+ if (methods[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(methods[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?" )":")");
+ class_desc->pop();
+ if (methods[i].qualifiers!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(" ");
+ _add_text(methods[i].qualifiers);
+ class_desc->pop();
+
+ }
+
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(methods[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+
+
+
+
+ }
+
+
+
+ scroll_locked=false;
+
+ return OK;
+}
+
+void EditorHelp::_request_help(const String& p_string) {
+ Error err = _goto_desc(p_string);
+ if (err==OK) {
+ editor->call("_editor_select",EditorNode::EDITOR_SCRIPT);
+ }
+ //100 palabras
+}
+
+
+void EditorHelp::_help_callback(const String& p_topic) {
+
+ String what = p_topic.get_slice(":",0);
+ String clss = p_topic.get_slice(":",1);
+ String name;
+ if (p_topic.get_slice_count(":")==3)
+ name=p_topic.get_slice(":",2);
+
+ _request_help(clss); //first go to class
+
+ int line=0;
+
+ if (what=="class_desc") {
+ line=description_line;
+ } else if (what=="class_signal") {
+ if (signal_line.has(name))
+ line=signal_line[name];
+ } else if (what=="class_method" || what=="class_method_desc") {
+ if (method_line.has(name))
+ line=method_line[name];
+ } else if (what=="class_property") {
+
+ if (property_line.has(name))
+ line=property_line[name];
+ } else if (what=="class_theme_item") {
+
+ if (theme_property_line.has(name))
+ line=theme_property_line[name];
+ } else if (what=="class_constant") {
+
+ if (constant_line.has(name))
+ line=constant_line[name];
+ }
+
+ class_desc->call_deferred("scroll_to_line", line);
+
+}
+
+
+
+static void _add_text_to_rt(const String& p_bbcode,RichTextLabel *p_rt) {
+
+ DocData *doc = EditorHelp::get_doc_data();
+ String base_path;
+
+ /*p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ p_rt->push_font( get_font("normal","Fonts") );
+ p_rt->push_indent(1);*/
+ int pos = 0;
+
+ Ref<Font> doc_font = p_rt->get_font("doc","EditorFonts");
+ Ref<Font> doc_code_font = p_rt->get_font("doc_source","EditorFonts");
+
+ String bbcode=p_bbcode.replace("\t"," ").replace("\r"," ").strip_edges();
+
+ //change newlines for double newlines
+ for(int i=0;i<bbcode.length();i++) {
+
+ //find valid newlines (double)
+ if (bbcode[i]=='\n') {
+ bool dnl=false;
+ int j=i+1;
+ for(;j<p_bbcode.length();j++) {
+ if (bbcode[j]==' ')
+ continue;
+ if (bbcode[j]=='\n') {
+ dnl=true;
+ break;
+ }
+ break;
+ }
+
+ if (dnl) {
+ bbcode[i]=0xFFFF;
+ //keep
+ i=j;
+ } else {
+ bbcode=bbcode.insert(i,"\n");
+ i++;
+ //bbcode[i]=' ';
+ //i=j-1;
+ }
+ }
+ }
+
+ //remove double spaces or spaces after newlines
+ for(int i=0;i<bbcode.length();i++) {
+
+ if (bbcode[i]==' ' || bbcode[i]=='\n' || bbcode[i]==0xFFFF) {
+
+ for(int j=i+1;j<p_bbcode.length();j++) {
+ if (bbcode[j]==' ') {
+ bbcode.remove(j);
+ j--;
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ //change newlines to double newlines
+
+ CharType dnls[2]={0xFFFF,0};
+ bbcode=bbcode.replace(dnls,"\n");
+
+
+ List<String> tag_stack;
+
+ while(pos < bbcode.length()) {
+
+
+ int brk_pos = bbcode.find("[",pos);
+
+ if (brk_pos<0)
+ brk_pos=bbcode.length();
+
+ if (brk_pos > pos) {
+ p_rt->add_text(bbcode.substr(pos,brk_pos-pos));
+
+ }
+
+ if (brk_pos==bbcode.length())
+ break; //nothing else o add
+
+ int brk_end = bbcode.find("]",brk_pos+1);
+
+ if (brk_end==-1) {
+ //no close, add the rest
+ p_rt->add_text(bbcode.substr(brk_pos,bbcode.length()-brk_pos));
+
+ break;
+ }
+
+
+ String tag = bbcode.substr(brk_pos+1,brk_end-brk_pos-1);
+
+
+ if (tag.begins_with("/")) {
+ bool tag_ok = tag_stack.size() && tag_stack.front()->get()==tag.substr(1,tag.length());
+ if (tag_stack.size()) {
+
+
+
+ }
+ if (!tag_ok) {
+
+ p_rt->add_text("[");
+ pos++;
+ continue;
+ }
+
+ tag_stack.pop_front();
+ pos=brk_end+1;
+ if (tag!="/img")
+ p_rt->pop();
+
+ } else if (tag.begins_with("method ")) {
+
+ String m = tag.substr(7,tag.length());
+ p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ p_rt->push_meta("@"+m);
+ p_rt->add_text(m+"()");
+ p_rt->pop();
+ p_rt->pop();
+ pos=brk_end+1;
+
+ } else if (doc->class_list.has(tag)) {
+
+
+ p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ p_rt->push_meta("#"+tag);
+ p_rt->add_text(tag);
+ p_rt->pop();
+ p_rt->pop();
+ pos=brk_end+1;
+
+ } else if (tag=="b") {
+
+ //use bold font
+ p_rt->push_font(doc_code_font);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="i") {
+
+ //use italics font
+ Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color");
+ //no italics so emphasize with color
+ text_color.r*=1.1;
+ text_color.g*=1.1;
+ text_color.b*=1.1;
+ p_rt->push_color(text_color);
+ //p_rt->push_font(get_font("italic","Fonts"));
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="code" || tag=="codeblock") {
+
+ //use monospace font
+ p_rt->push_font(doc_code_font);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="center") {
+
+ //use monospace font
+ p_rt->push_align(RichTextLabel::ALIGN_CENTER);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="br") {
+
+ //use monospace font
+ p_rt->add_newline();
+ pos=brk_end+1;
+ } else if (tag=="u") {
+
+ //use underline
+ p_rt->push_underline();
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="s") {
+
+ //use strikethrough (not supported underline instead)
+ p_rt->push_underline();
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+
+ } else if (tag=="url") {
+
+ //use strikethrough (not supported underline instead)
+ int end=bbcode.find("[",brk_end);
+ if (end==-1)
+ end=bbcode.length();
+ String url = bbcode.substr(brk_end+1,end-brk_end-1);
+ p_rt->push_meta(url);
+
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag.begins_with("url=")) {
+
+ String url = tag.substr(4,tag.length());
+ p_rt->push_meta(url);
+ pos=brk_end+1;
+ tag_stack.push_front("url");
+ } else if (tag=="img") {
+
+ //use strikethrough (not supported underline instead)
+ int end=bbcode.find("[",brk_end);
+ if (end==-1)
+ end=bbcode.length();
+ String image = bbcode.substr(brk_end+1,end-brk_end-1);
+
+ Ref<Texture> texture = ResourceLoader::load(base_path+"/"+image,"Texture");
+ if (texture.is_valid())
+ p_rt->add_image(texture);
+
+ pos=end;
+ tag_stack.push_front(tag);
+ } else if (tag.begins_with("color=")) {
+
+ String col = tag.substr(6,tag.length());
+ Color color;
+
+ if (col.begins_with("#"))
+ color=Color::html(col);
+ else if (col=="aqua")
+ color=Color::html("#00FFFF");
+ else if (col=="black")
+ color=Color::html("#000000");
+ else if (col=="blue")
+ color=Color::html("#0000FF");
+ else if (col=="fuchsia")
+ color=Color::html("#FF00FF");
+ else if (col=="gray" || col=="grey")
+ color=Color::html("#808080");
+ else if (col=="green")
+ color=Color::html("#008000");
+ else if (col=="lime")
+ color=Color::html("#00FF00");
+ else if (col=="maroon")
+ color=Color::html("#800000");
+ else if (col=="navy")
+ color=Color::html("#000080");
+ else if (col=="olive")
+ color=Color::html("#808000");
+ else if (col=="purple")
+ color=Color::html("#800080");
+ else if (col=="red")
+ color=Color::html("#FF0000");
+ else if (col=="silver")
+ color=Color::html("#C0C0C0");
+ else if (col=="teal")
+ color=Color::html("#008008");
+ else if (col=="white")
+ color=Color::html("#FFFFFF");
+ else if (col=="yellow")
+ color=Color::html("#FFFF00");
+ else
+ color=Color(0,0,0,1); //base_color;
+
+
+
+ p_rt->push_color(color);
+ pos=brk_end+1;
+ tag_stack.push_front("color");
+
+ } else if (tag.begins_with("font=")) {
+
+ String fnt = tag.substr(5,tag.length());
+
+
+ Ref<Font> font = ResourceLoader::load(base_path+"/"+fnt,"Font");
+ if (font.is_valid())
+ p_rt->push_font(font);
+ else {
+ p_rt->push_font(doc_font);
+ }
+
+ pos=brk_end+1;
+ tag_stack.push_front("font");
+
+
+ } else {
+
+ p_rt->add_text("["); //ignore
+ pos=brk_pos+1;
+
+ }
+ }
+
+ /*p_rt->pop();
+ p_rt->pop();
+ p_rt->pop();*/
+
+}
+
+
+void EditorHelp::_add_text(const String& p_bbcode) {
+
+
+ _add_text_to_rt(p_bbcode,class_desc);
+
+}
+
+
+
+
+void EditorHelp::_update_doc() {
+
+
+
+}
+
+
+void EditorHelp::generate_doc() {
+
+ doc = memnew( DocData );
+ doc->generate(true);
+ DocData compdoc;
+ compdoc.load_compressed(_doc_data_compressed,_doc_data_compressed_size,_doc_data_uncompressed_size);
+ doc->merge_from(compdoc); //ensure all is up to date
+
+
+}
+
+void EditorHelp::_notification(int p_what) {
+
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+
+ //forward->set_icon(get_icon("Forward","EditorIcons"));
+ //back->set_icon(get_icon("Back","EditorIcons"));
+ _update_doc();
+
+ } break;
+ }
+}
+
+void EditorHelp::go_to_help(const String& p_help) {
+
+ _help_callback(p_help);
+}
+
+void EditorHelp::go_to_class(const String& p_class,int p_scroll) {
+
+ _goto_desc(p_class,p_scroll);
+}
+
+void EditorHelp::popup_search() {
+
+
+ search_dialog->popup_centered(Size2(250,80));
+ search->grab_focus();
+}
+
+void EditorHelp::_search_cbk() {
+
+ _search(search->get_text());
+}
+
+String EditorHelp::get_class() {
+
+ return edited_class;
+}
+
+void EditorHelp::search_again() {
+ _search(prev_search);
+}
+
+int EditorHelp::get_scroll() const {
+
+ return class_desc->get_v_scroll()->get_value();
+}
+void EditorHelp::set_scroll(int p_scroll) {
+
+
+ class_desc->get_v_scroll()->set_value(p_scroll);
+
+}
+
+void EditorHelp::_bind_methods() {
+
+ ClassDB::bind_method("_class_list_select",&EditorHelp::_class_list_select);
+ ClassDB::bind_method("_class_desc_select",&EditorHelp::_class_desc_select);
+ ClassDB::bind_method("_class_desc_input",&EditorHelp::_class_desc_input);
+ //ClassDB::bind_method("_button_pressed",&EditorHelp::_button_pressed);
+ ClassDB::bind_method("_scroll_changed",&EditorHelp::_scroll_changed);
+ ClassDB::bind_method("_request_help",&EditorHelp::_request_help);
+ ClassDB::bind_method("_unhandled_key_input",&EditorHelp::_unhandled_key_input);
+ ClassDB::bind_method("_search",&EditorHelp::_search);
+ ClassDB::bind_method("_search_cbk",&EditorHelp::_search_cbk);
+ ClassDB::bind_method("_help_callback",&EditorHelp::_help_callback);
+
+ ADD_SIGNAL(MethodInfo("go_to_help"));
+
+}
+
+EditorHelp::EditorHelp() {
+
+ editor=EditorNode::get_singleton();
+
+ VBoxContainer *vbc = this;
+
+ EDITOR_DEF("text_editor/help/sort_functions_alphabetically",true);
+
+ //class_list->connect("meta_clicked",this,"_class_list_select");
+ //class_list->set_selection_enabled(true);
+
+ {
+ Panel *pc = memnew( Panel );
+ Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) );
+ style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/highlighting/background_color") );
+ pc->set_v_size_flags(SIZE_EXPAND_FILL);
+ pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit"));
+ vbc->add_child(pc);
+ class_desc = memnew( RichTextLabel );
+ pc->add_child(class_desc);
+ class_desc->set_area_as_parent_rect(8);
+ class_desc->connect("meta_clicked",this,"_class_desc_select");
+ class_desc->connect("gui_input",this,"_class_desc_input");
+ }
+
+ class_desc->get_v_scroll()->connect("value_changed",this,"_scroll_changed");
+ class_desc->set_selection_enabled(true);
+
+ scroll_locked=false;
+ select_locked=false;
+ set_process_unhandled_key_input(true);
+ class_desc->hide();
+
+ search_dialog = memnew( ConfirmationDialog );
+ add_child(search_dialog);
+ VBoxContainer *search_vb = memnew( VBoxContainer );
+ search_dialog->add_child(search_vb);
+
+ search = memnew( LineEdit );
+ search_dialog->register_text_enter(search);
+ search_vb->add_margin_child(TTR("Search Text"),search);
+ search_dialog->get_ok()->set_text(TTR("Find"));
+ search_dialog->connect("confirmed",this,"_search_cbk");
+ search_dialog->set_hide_on_ok(false);
+ search_dialog->set_self_modulate(Color(1,1,1,0.8));
+
+
+ /*class_search = memnew( EditorHelpSearch(editor) );
+ editor->get_gui_base()->add_child(class_search);
+ class_search->connect("go_to_help",this,"_help_callback");*/
+
+ //prev_search_page=-1;
+}
+
+EditorHelp::~EditorHelp() {
+
+}
+
+/////////////
+
+
+
+void EditorHelpBit::_go_to_help(String p_what) {
+
+ EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
+ ScriptEditor::get_singleton()->goto_help(p_what);
+ emit_signal("request_hide");
+}
+
+void EditorHelpBit::_meta_clicked(String p_select) {
+
+ //print_line("LINK: "+p_select);
+ if (p_select.begins_with("#")) {
+ //_goto_desc(p_select.substr(1,p_select.length()));
+ _go_to_help("class_name:"+p_select.substr(1,p_select.length()));
+ return;
+ } else if (p_select.begins_with("@")) {
+
+ String m = p_select.substr(1,p_select.length());
+
+ if (m.find(".")!=-1) {
+ //must go somewhere else
+
+ _go_to_help("class_method:"+m.get_slice(".",0)+":"+m.get_slice(".",0));
+ } else {
+ /*
+ if (!method_line.has(m))
+ return;
+ class_desc->scroll_to_line(method_line[m]);
+ */
+ }
+
+ }
+
+
+}
+
+void EditorHelpBit::_bind_methods() {
+
+ ClassDB::bind_method("_meta_clicked",&EditorHelpBit::_meta_clicked);
+ ADD_SIGNAL(MethodInfo("request_hide"));
+}
+
+void EditorHelpBit::_notification(int p_what){
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ add_style_override("panel",get_stylebox("normal","TextEdit"));
+ }
+}
+
+
+void EditorHelpBit::set_text(const String& p_text) {
+
+ rich_text->clear();
+ _add_text_to_rt(p_text,rich_text);
+}
+
+EditorHelpBit::EditorHelpBit() {
+
+ rich_text = memnew( RichTextLabel );
+ add_child(rich_text);
+ rich_text->set_area_as_parent_rect(8*EDSCALE);
+ rich_text->connect("meta_clicked",this,"_meta_clicked");
+ set_custom_minimum_size(Size2(0,70*EDSCALE));
+
+}
diff --git a/editor/editor_help.h b/editor/editor_help.h
new file mode 100644
index 0000000000..909226f403
--- /dev/null
+++ b/editor/editor_help.h
@@ -0,0 +1,222 @@
+/*************************************************************************/
+/* editor_help.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_HELP_H
+#define EDITOR_HELP_H
+
+#include "editor/editor_plugin.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/text_edit.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/tree.h"
+
+#include "scene/main/timer.h"
+#include "editor/code_editor.h"
+#include "editor/doc/doc_data.h"
+
+
+class EditorNode;
+
+class EditorHelpSearch : public ConfirmationDialog {
+
+ GDCLASS(EditorHelpSearch,ConfirmationDialog )
+
+ EditorNode *editor;
+ LineEdit *search_box;
+ Tree *search_options;
+ String base_type;
+
+ void _update_search();
+
+ void _sbox_input(const InputEvent& p_ie);
+
+ void _confirmed();
+ void _text_changed(const String& p_newtext);
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void popup();
+ void popup(const String& p_term);
+
+ EditorHelpSearch();
+};
+
+class EditorHelpIndex : public ConfirmationDialog {
+ GDCLASS( EditorHelpIndex, ConfirmationDialog );
+
+ LineEdit *search_box;
+ Tree *class_list;
+ HashMap<String,TreeItem*> tree_item_map;
+
+ void _tree_item_selected();
+ void _text_changed(const String& p_text);
+ void _sbox_input(const InputEvent& p_ie);
+
+ void _update_class_list();
+
+ void add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root);
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void select_class(const String& p_class);
+
+ void popup();
+
+ EditorHelpIndex();
+};
+
+
+class EditorHelp : public VBoxContainer {
+ GDCLASS( EditorHelp, VBoxContainer );
+
+
+ enum Page {
+
+ PAGE_CLASS_LIST,
+ PAGE_CLASS_DESC,
+ PAGE_CLASS_PREV,
+ PAGE_CLASS_NEXT,
+ PAGE_SEARCH,
+ CLASS_SEARCH,
+
+ };
+
+
+ bool select_locked;
+
+ String prev_search;
+
+ String edited_class;
+
+ EditorNode *editor;
+ Map<String,int> method_line;
+ Map<String,int> signal_line;
+ Map<String,int> property_line;
+ Map<String,int> theme_property_line;
+ Map<String,int> constant_line;
+ int description_line;
+
+
+ RichTextLabel *class_desc;
+ HSplitContainer *h_split;
+ static DocData *doc;
+
+
+ ConfirmationDialog *search_dialog;
+ LineEdit *search;
+
+
+ String base_path;
+
+
+ void _help_callback(const String& p_topic);
+
+ void _add_text(const String& p_text);
+ bool scroll_locked;
+
+ //void _button_pressed(int p_idx);
+ void _add_type(const String& p_type);
+
+ void _scroll_changed(double p_scroll);
+ void _class_list_select(const String& p_select);
+ void _class_desc_select(const String& p_select);
+ void _class_desc_input(const InputEvent& p_input);
+
+ Error _goto_desc(const String& p_class, int p_vscr=-1);
+ //void _update_history_buttons();
+ void _update_doc();
+
+ void _request_help(const String& p_string);
+ void _search(const String& p_str);
+ void _search_cbk();
+
+ void _unhandled_key_input(const InputEvent& p_ev);
+
+
+
+protected:
+
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ static void generate_doc();
+ static DocData *get_doc_data() { return doc; }
+
+ void go_to_help(const String& p_help);
+ void go_to_class(const String& p_class,int p_scroll=0);
+
+ void popup_search();
+ void search_again();
+
+ String get_class();
+
+ void set_focused() { class_desc->grab_focus(); }
+
+ int get_scroll() const;
+ void set_scroll(int p_scroll);
+
+ EditorHelp();
+ ~EditorHelp();
+};
+
+
+
+class EditorHelpBit : public Panel {
+
+ GDCLASS( EditorHelpBit, Panel);
+
+ RichTextLabel *rich_text;
+ void _go_to_help(String p_what);
+ void _meta_clicked(String p_what);
+
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void set_text(const String& p_text);
+ EditorHelpBit();
+};
+
+#endif // EDITOR_HELP_H
diff --git a/editor/editor_icons.h b/editor/editor_icons.h
new file mode 100644
index 0000000000..7e8d8c0828
--- /dev/null
+++ b/editor/editor_icons.h
@@ -0,0 +1,36 @@
+/*************************************************************************/
+/* editor_icons.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_ICONS_H
+#define EDITOR_ICONS_H
+
+#include "scene/resources/theme.h"
+
+void editor_register_icons(Ref<Theme> p_theme);
+
+#endif
diff --git a/editor/editor_initialize_ssl.cpp b/editor/editor_initialize_ssl.cpp
new file mode 100644
index 0000000000..c08dcc6656
--- /dev/null
+++ b/editor/editor_initialize_ssl.cpp
@@ -0,0 +1,51 @@
+/*************************************************************************/
+/* editor_initialize_ssl.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_initialize_ssl.h"
+
+#include "certs_compressed.h"
+#include "io/stream_peer_ssl.h"
+#include "io/compression.h"
+
+void editor_initialize_certificates() {
+
+
+ PoolByteArray data;
+ data.resize(_certs_uncompressed_size+1);
+ {
+ PoolByteArray::Write w = data.write();
+ Compression::decompress(w.ptr(),_certs_uncompressed_size,_certs_compressed,_certs_compressed_size,Compression::MODE_DEFLATE);
+ w[_certs_uncompressed_size]=0; //make sure it ends at zero
+ }
+
+ StreamPeerSSL::load_certs_from_memory(data);
+
+
+}
+
+
diff --git a/editor/editor_initialize_ssl.h b/editor/editor_initialize_ssl.h
new file mode 100644
index 0000000000..0b34ac1d7e
--- /dev/null
+++ b/editor/editor_initialize_ssl.h
@@ -0,0 +1,34 @@
+/*************************************************************************/
+/* editor_initialize_ssl.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_INITIALIZE_SSL_H
+#define EDITOR_INITIALIZE_SSL_H
+
+void editor_initialize_certificates();
+
+#endif // EDITOR_INITIALIZE_SSL_H
diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp
new file mode 100644
index 0000000000..850d9273f8
--- /dev/null
+++ b/editor/editor_log.cpp
@@ -0,0 +1,242 @@
+/*************************************************************************/
+/* editor_log.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_log.h"
+
+#include "version.h"
+#include "scene/gui/center_container.h"
+#include "editor_node.h"
+
+void EditorLog::_error_handler(void *p_self, const char*p_func, const char*p_file,int p_line, const char*p_error,const char*p_errorexp,ErrorHandlerType p_type ) {
+
+ EditorLog *self=(EditorLog *)p_self;
+ if (self->current!=Thread::get_caller_ID())
+ return;
+
+ String err_str;
+ if (p_errorexp && p_errorexp[0]) {
+ err_str=p_errorexp;
+ } else {
+ err_str=String(p_file)+":"+itos(p_line)+" - "+String(p_error);
+ }
+
+ /*
+ if (!self->is_visible_in_tree())
+ self->emit_signal("show_request");
+ */
+
+ err_str=" "+err_str;
+ self->log->add_newline();
+
+ Ref<Texture> icon;
+
+ switch(p_type) {
+ case ERR_HANDLER_ERROR: {
+
+ icon = self->get_icon("Error","EditorIcons");
+ return; // these are confusing
+ } break;
+ case ERR_HANDLER_WARNING: {
+
+ icon = self->get_icon("Error","EditorIcons");
+
+ } break;
+ case ERR_HANDLER_SCRIPT: {
+
+ icon = self->get_icon("ScriptError","EditorIcons");
+ } break;
+ case ERR_HANDLER_SHADER: {
+
+ icon = self->get_icon("Shader","EditorIcons");
+ } break;
+
+ }
+
+ self->add_message(err_str,true);
+
+}
+
+void EditorLog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ log->add_color_override("default_color",get_color("font_color","Tree"));
+ //button->set_icon(get_icon("Console","EditorIcons"));
+
+ }
+
+ /*if (p_what==NOTIFICATION_DRAW) {
+
+ RID ci = get_canvas_item();
+ get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ int top_ofs = 20;
+ int border_ofs=4;
+ Ref<StyleBox> style = get_stylebox("normal","TextEdit");
+
+ style->draw(ci,Rect2( Point2(border_ofs,top_ofs),get_size()-Size2(border_ofs*2,top_ofs+border_ofs)));
+ }*/
+}
+
+
+
+
+void EditorLog::_clear_request() {
+
+ log->clear();
+
+}
+
+void EditorLog::clear() {
+ _clear_request();
+}
+
+
+void EditorLog::add_message(const String& p_msg,bool p_error) {
+
+
+ if (p_error) {
+ Ref<Texture> icon = get_icon("Error","EditorIcons");
+ log->add_image( icon );
+ //button->set_icon(icon);
+ log->push_color(get_color("fg_error","Editor"));
+ } else {
+ //button->set_icon(Ref<Texture>());
+
+ }
+
+
+ log->add_newline();
+ log->add_text(p_msg);
+ //button->set_text(p_msg);
+
+ if (p_error)
+ log->pop();
+
+
+}
+
+/*
+void EditorLog::_dragged(const Point2& p_ofs) {
+
+ int ofs = ec->get_minsize().height;
+ ofs = ofs-p_ofs.y;
+ if (ofs<50)
+ ofs=50;
+ if (ofs>300)
+ ofs=300;
+ ec->set_minsize(Size2(ec->get_minsize().width,ofs));
+ minimum_size_changed();
+
+}
+*/
+
+
+
+
+void EditorLog::_undo_redo_cbk(void *p_self,const String& p_name) {
+
+ EditorLog *self=(EditorLog *)p_self;
+ self->add_message(p_name);
+
+}
+
+void EditorLog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_clear_request"),&EditorLog::_clear_request );
+ ClassDB::bind_method("_override_logger_styles",&EditorLog::_override_logger_styles );
+ //ClassDB::bind_method(D_METHOD("_dragged"),&EditorLog::_dragged );
+ ADD_SIGNAL( MethodInfo("clear_request"));
+}
+
+EditorLog::EditorLog() {
+
+ VBoxContainer *vb = this;
+ add_constant_override("separation",get_constant("separation","VBoxContainer"));
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ vb->add_child(hb);
+ title = memnew( Label );
+ title->set_text(TTR(" Output:"));
+ title->set_h_size_flags(SIZE_EXPAND_FILL);
+ hb->add_child(title);
+
+ //pd = memnew( PaneDrag );
+ //hb->add_child(pd);
+ //pd->connect("dragged",this,"_dragged");
+ //pd->set_default_cursor_shape(Control::CURSOR_MOVE);
+
+ clearbutton = memnew( Button );
+ hb->add_child(clearbutton);
+ clearbutton->set_text(TTR("Clear"));
+ clearbutton->connect("pressed", this,"_clear_request");
+
+ ec = memnew( Control);
+ vb->add_child(ec);
+ ec->set_custom_minimum_size(Size2(0,180));
+ ec->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ pc = memnew( PanelContainer );
+ ec->add_child(pc);
+ pc->set_area_as_parent_rect();
+ pc->connect("tree_entered", this, "_override_logger_styles");
+
+ log = memnew( RichTextLabel );
+ log->set_scroll_follow(true);
+ log->set_selection_enabled(true);
+ log->set_focus_mode(FOCUS_CLICK);
+ pc->add_child(log);
+ add_message(VERSION_FULL_NAME" (c) 2008-2017 Juan Linietsky, Ariel Manzur.");
+ //log->add_text("Initialization Complete.\n"); //because it looks cool.
+
+ eh.errfunc=_error_handler;
+ eh.userdata=this;
+ add_error_handler(&eh);
+
+ current=Thread::get_caller_ID();
+
+ EditorNode::get_undo_redo()->set_commit_notify_callback(_undo_redo_cbk,this);
+
+
+}
+
+void EditorLog::deinit() {
+
+ remove_error_handler(&eh);
+
+}
+
+void EditorLog::_override_logger_styles() {
+
+ pc->add_style_override("panel",get_stylebox("normal","TextEdit"));
+
+}
+
+EditorLog::~EditorLog() {
+
+
+}
diff --git a/editor/editor_log.h b/editor/editor_log.h
new file mode 100644
index 0000000000..965d8d6420
--- /dev/null
+++ b/editor/editor_log.h
@@ -0,0 +1,80 @@
+/*************************************************************************/
+/* editor_log.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_LOG_H
+#define EDITOR_LOG_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/label.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/texture_button.h"
+//#include "scene/gui/empty_control.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/tool_button.h"
+#include "pane_drag.h"
+#include "os/thread.h"
+class EditorLog : public VBoxContainer {
+
+ GDCLASS( EditorLog, VBoxContainer );
+
+ Button *clearbutton;
+ Label *title;
+ RichTextLabel *log;
+ HBoxContainer *title_hb;
+ //PaneDrag *pd;
+ Control *ec;
+ PanelContainer *pc;
+
+ static void _error_handler(void *p_self, const char*p_func, const char*p_file,int p_line, const char*p_error,const char*p_errorexp,ErrorHandlerType p_type);
+
+ ErrorHandlerList eh;
+
+ Thread::ID current;
+
+ //void _dragged(const Point2& p_ofs);
+ void _clear_request();
+ static void _undo_redo_cbk(void *p_self,const String& p_name);
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+ void _override_logger_styles();
+public:
+
+ void add_message(const String& p_msg, bool p_error=false);
+ void deinit();
+
+
+ void clear();
+ EditorLog();
+ ~EditorLog();
+};
+
+#endif // EDITOR_LOG_H
diff --git a/editor/editor_name_dialog.cpp b/editor/editor_name_dialog.cpp
new file mode 100644
index 0000000000..da9f25f1e3
--- /dev/null
+++ b/editor/editor_name_dialog.cpp
@@ -0,0 +1,89 @@
+/*************************************************************************/
+/* editor_name_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_name_dialog.h"
+
+#include "class_db.h"
+#include "os/keyboard.h"
+
+void EditorNameDialog::_line_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type == InputEvent::KEY) {
+
+ if (!p_event.key.pressed)
+ return;
+
+ switch (p_event.key.scancode) {
+ case KEY_ENTER:
+ case KEY_RETURN: {
+
+ if (get_hide_on_ok())
+ hide();
+ ok_pressed();
+ accept_event();
+ } break;
+ case KEY_ESCAPE: {
+
+ hide();
+ accept_event();
+ } break;
+ }
+ }
+}
+
+void EditorNameDialog::_post_popup() {
+
+ ConfirmationDialog::_post_popup();
+ name->clear();
+ name->grab_focus();
+}
+
+void EditorNameDialog::ok_pressed() {
+
+ if (name->get_text()!="") {
+ emit_signal("name_confirmed", name->get_text());
+ }
+}
+
+void EditorNameDialog::_bind_methods() {
+
+ ClassDB::bind_method("_line_gui_input",&EditorNameDialog::_line_gui_input);
+
+ ADD_SIGNAL(MethodInfo("name_confirmed",PropertyInfo( Variant::STRING,"name")));
+}
+
+EditorNameDialog::EditorNameDialog()
+{
+ name = memnew( LineEdit );
+ add_child(name);
+ move_child(name, get_label()->get_index()+1);
+ name->set_margin(MARGIN_TOP,5);
+ name->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
+ name->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
+ name->connect("gui_input", this, "_line_gui_input");
+}
diff --git a/editor/editor_name_dialog.h b/editor/editor_name_dialog.h
new file mode 100644
index 0000000000..d6bc7eca94
--- /dev/null
+++ b/editor/editor_name_dialog.h
@@ -0,0 +1,57 @@
+/*************************************************************************/
+/* editor_name_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#ifndef EDITOR_NAME_DIALOG_H
+#define EDITOR_NAME_DIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/line_edit.h"
+
+class EditorNameDialog : public ConfirmationDialog {
+
+ GDCLASS( EditorNameDialog, ConfirmationDialog );
+
+ LineEdit *name;
+
+ void _line_gui_input(const InputEvent& p_event);
+
+protected:
+
+ static void _bind_methods();
+ virtual void ok_pressed();
+ virtual void _post_popup();
+
+public:
+
+ LineEdit* get_line_edit() { return name; }
+
+ EditorNameDialog();
+};
+
+#endif // EDITOR_NAME_DIALOG_H
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
new file mode 100644
index 0000000000..7a85941b0d
--- /dev/null
+++ b/editor/editor_node.cpp
@@ -0,0 +1,6587 @@
+/*************************************************************************/
+/* editor_node.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_node.h"
+
+#include "version.h"
+#include "print_string.h"
+#include "editor_themes.h"
+#include "editor_help.h"
+#include "core/io/resource_saver.h"
+#include "core/io/resource_loader.h"
+#include "servers/physics_2d_server.h"
+#include "scene/resources/packed_scene.h"
+#include "editor_settings.h"
+#include "global_config.h"
+#include <stdio.h>
+#include "class_db.h"
+#include "os/keyboard.h"
+#include "os/os.h"
+#include "os/file_access.h"
+#include "message_queue.h"
+#include "path_remap.h"
+#include "translation.h"
+#include "pvrtc_compress.h"
+#include "editor_file_system.h"
+#include "register_exporters.h"
+#include "bind/core_bind.h"
+#include "io/zip_io.h"
+#include "io/config_file.h"
+#include "animation_editor.h"
+#include "io/stream_peer_ssl.h"
+#include "main/input_default.h"
+#include "os/input.h"
+// plugins
+#include "plugins/sprite_frames_editor_plugin.h"
+#include "plugins/texture_region_editor_plugin.h"
+#include "plugins/canvas_item_editor_plugin.h"
+#include "asset_library_editor_plugin.h"
+#include "plugins/spatial_editor_plugin.h"
+#include "plugins/sample_editor_plugin.h"
+#include "plugins/texture_editor_plugin.h"
+#include "plugins/material_editor_plugin.h"
+#include "plugins/sample_library_editor_plugin.h"
+#include "plugins/sample_player_editor_plugin.h"
+#include "plugins/camera_editor_plugin.h"
+#include "plugins/style_box_editor_plugin.h"
+#include "plugins/resource_preloader_editor_plugin.h"
+#include "plugins/item_list_editor_plugin.h"
+#include "plugins/stream_editor_plugin.h"
+#include "plugins/multimesh_editor_plugin.h"
+#include "plugins/mesh_instance_editor_plugin.h"
+#include "plugins/mesh_editor_plugin.h"
+#include "plugins/theme_editor_plugin.h"
+#include "plugins/tile_map_editor_plugin.h"
+#include "plugins/cube_grid_theme_editor_plugin.h"
+#include "plugins/shader_editor_plugin.h"
+#include "plugins/shader_graph_editor_plugin.h"
+#include "plugins/path_editor_plugin.h"
+#include "plugins/rich_text_editor_plugin.h"
+#include "plugins/collision_polygon_editor_plugin.h"
+#include "plugins/collision_polygon_2d_editor_plugin.h"
+#include "plugins/script_editor_plugin.h"
+#include "plugins/script_text_editor.h"
+#include "plugins/path_2d_editor_plugin.h"
+#include "plugins/line_2d_editor_plugin.h"
+#include "plugins/particles_editor_plugin.h"
+#include "plugins/particles_2d_editor_plugin.h"
+#include "plugins/animation_tree_editor_plugin.h"
+#include "plugins/tile_set_editor_plugin.h"
+#include "plugins/animation_player_editor_plugin.h"
+#include "plugins/baked_light_editor_plugin.h"
+#include "plugins/polygon_2d_editor_plugin.h"
+#include "plugins/navigation_polygon_editor_plugin.h"
+#include "plugins/light_occluder_2d_editor_plugin.h"
+#include "plugins/color_ramp_editor_plugin.h"
+#include "plugins/collision_shape_2d_editor_plugin.h"
+#include "plugins/gi_probe_editor_plugin.h"
+#include "import/resource_importer_texture.h"
+#include "import/resource_importer_csv_translation.h"
+#include "import/resource_importer_wav.h"
+#include "import/resource_importer_obj.h"
+#include "import/resource_importer_scene.h"
+// end
+#include "editor_settings.h"
+#include "io_plugins/editor_texture_import_plugin.h"
+#include "io_plugins/editor_scene_import_plugin.h"
+#include "io_plugins/editor_font_import_plugin.h"
+#include "io_plugins/editor_sample_import_plugin.h"
+#include "io_plugins/editor_translation_import_plugin.h"
+#include "io_plugins/editor_bitmask_import_plugin.h"
+#include "io_plugins/editor_mesh_import_plugin.h"
+#include "io_plugins/editor_export_scene.h"
+#include "import/editor_import_collada.h"
+#include "io_plugins/editor_scene_importer_fbxconv.h"
+
+#include "plugins/editor_preview_plugins.h"
+#include "editor_initialize_ssl.h"
+#include "editor_audio_buses.h"
+#include "script_editor_debugger.h"
+
+EditorNode *EditorNode::singleton=NULL;
+
+void EditorNode::_update_scene_tabs() {
+
+ bool show_rb = EditorSettings::get_singleton()->get("interface/show_script_in_scene_tabs");
+
+ scene_tabs->clear_tabs();
+ Ref<Texture> script_icon = gui_base->get_icon("Script","EditorIcons");
+ for(int i=0;i<editor_data.get_edited_scene_count();i++) {
+
+ String type=editor_data.get_scene_type(i);
+ Ref<Texture> icon;
+ if (type!=String()) {
+
+ if (!gui_base->has_icon(type,"EditorIcons")) {
+ type="Node";
+ }
+
+ icon=gui_base->get_icon(type,"EditorIcons");
+
+ }
+
+
+
+ int current = editor_data.get_edited_scene();
+ bool unsaved = (i==current)?saved_version!=editor_data.get_undo_redo().get_version():editor_data.get_scene_version(i)!=0;
+ scene_tabs->add_tab(editor_data.get_scene_title(i)+(unsaved?"(*)":""),icon);
+
+ if (show_rb && editor_data.get_scene_root_script(i).is_valid()) {
+ scene_tabs->set_tab_right_button(i,script_icon);
+ }
+
+ }
+
+ scene_tabs->set_current_tab(editor_data.get_edited_scene());
+ scene_tabs->ensure_tab_visible(editor_data.get_edited_scene());
+
+}
+
+void EditorNode::_update_title() {
+
+ String appname = GlobalConfig::get_singleton()->get("application/name");
+ String title = appname.empty()?String(VERSION_FULL_NAME):String(_MKSTR(VERSION_NAME) + String(" - ") + appname);
+ String edited = editor_data.get_edited_scene_root()?editor_data.get_edited_scene_root()->get_filename():String();
+ if (!edited.empty())
+ title+=" - " + String(edited.get_file());
+ if (unsaved_cache)
+ title+=" (*)";
+
+ OS::get_singleton()->set_window_title(title);
+
+}
+
+void EditorNode::_unhandled_input(const InputEvent& p_event) {
+
+ if (Node::get_viewport()->get_modal_stack_top())
+ return; //ignore because of modal window
+
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && !p_event.key.echo && !gui_base->get_viewport()->gui_has_modal_stack()) {
+
+
+ if (ED_IS_SHORTCUT("editor/next_tab", p_event)) {
+ int next_tab = editor_data.get_edited_scene() + 1;
+ next_tab %= editor_data.get_edited_scene_count();
+ _scene_tab_changed(next_tab);
+ }
+ if (ED_IS_SHORTCUT("editor/prev_tab", p_event)) {
+ int next_tab = editor_data.get_edited_scene() - 1;
+ next_tab = next_tab >= 0 ? next_tab : editor_data.get_edited_scene_count() - 1;
+ _scene_tab_changed(next_tab);
+ }
+ if (ED_IS_SHORTCUT("editor/filter_files", p_event)) {
+ filesystem_dock->focus_on_filter();
+ }
+
+ switch(p_event.key.scancode) {
+
+ /*case KEY_F1:
+ if (!p_event.key.mod.shift && !p_event.key.mod.command)
+ _editor_select(EDITOR_SCRIPT);
+ break;*/
+ case KEY_F1:
+ if (!p_event.key.mod.shift && !p_event.key.mod.command)
+ _editor_select(EDITOR_2D);
+ break;
+ case KEY_F2:
+ if (!p_event.key.mod.shift && !p_event.key.mod.command)
+ _editor_select(EDITOR_3D);
+ break;
+ case KEY_F3:
+ if (!p_event.key.mod.shift && !p_event.key.mod.command)
+ _editor_select(EDITOR_SCRIPT);
+ break;
+ /* case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break;
+ case KEY_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break;
+ //case KEY_F7: _menu_option_confirm(RUN_PAUSE,true); break;
+ case KEY_F8: _menu_option_confirm(RUN_STOP,true); break;*/
+
+ }
+
+ }
+}
+
+
+
+void EditorNode::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ editor_data.save_editor_external_data();
+ FileAccess::set_file_close_fail_notify_callback(NULL);
+ log->deinit(); // do not get messages anymore
+ }
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ //force the whole tree viewport
+#if 0
+ {
+ Rect2 grect = scene_root_base->get_global_rect();
+ Rect2 grectsrp = scene_root_parent->get_global_rect();
+ if (grect!=grectsrp) {
+ scene_root_parent->set_pos(grect.pos);
+ scene_root_parent->set_size(grect.size);
+ }
+ }
+
+#endif
+ if (opening_prev && !confirmation->is_visible())
+ opening_prev=false;
+
+ if (unsaved_cache != (saved_version!=editor_data.get_undo_redo().get_version())) {
+
+ unsaved_cache = (saved_version!=editor_data.get_undo_redo().get_version());
+ _update_title();
+ }
+
+ if (last_checked_version!=editor_data.get_undo_redo().get_version()) {
+ _update_scene_tabs();
+ last_checked_version=editor_data.get_undo_redo().get_version();
+ }
+
+ //get_root_node()->set_rect(viewport->get_global_rect());
+
+ //update the circle
+ uint64_t frame = Engine::get_singleton()->get_frames_drawn();
+ uint32_t tick = OS::get_singleton()->get_ticks_msec();
+
+ if (frame!=circle_step_frame && (tick-circle_step_msec)>(1000/8)) {
+
+ circle_step++;
+ if (circle_step>=8)
+ circle_step=0;
+
+ circle_step_msec=tick;
+ circle_step_frame=frame+1;
+
+ // update the circle itself only when its enabled
+ if (!update_menu->get_popup()->is_item_checked(3)){
+ update_menu->set_icon(gui_base->get_icon("Progress"+itos(circle_step+1),"EditorIcons"));
+ }
+ }
+
+ editor_selection->update();
+
+ {
+ uint32_t p32 = 0;//AudioServer::get_singleton()->read_output_peak()>>8;
+
+ float peak = p32==0? -80 : Math::linear2db(p32 / 65535.0);
+
+ if (peak<-80)
+ peak=-80;
+ float vu = audio_vu->get_value();
+
+ if (peak > vu) {
+ audio_vu->set_value(peak);
+ } else {
+ float new_vu = vu - get_process_delta_time()*70.0;
+ if (new_vu<-80)
+ new_vu=-80;
+ if (new_vu !=-80 && vu !=-80)
+ audio_vu->set_value(new_vu);
+ }
+
+ }
+
+ ResourceImporterTexture::get_singleton()->update_imports();
+
+ }
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ get_tree()->get_root()->set_disable_3d(true);
+ //MessageQueue::get_singleton()->push_call(this,"_get_scene_metadata");
+ get_tree()->set_editor_hint(true);
+ get_tree()->get_root()->set_as_audio_listener(false);
+ get_tree()->get_root()->set_as_audio_listener_2d(false);
+ get_tree()->set_auto_accept_quit(false);
+ get_tree()->connect("files_dropped",this,"_dropped_files");
+ //VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport(),false);
+
+ //import_monitor->scan_changes();
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+
+ editor_data.clear_edited_scenes();
+
+ }
+ if (p_what==NOTIFICATION_READY) {
+
+ VisualServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(),true);
+ VisualServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(),true);
+ VisualServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(),true);
+
+ _editor_select(EDITOR_3D);
+ _update_debug_options();
+
+/*
+ if (defer_optimize!="") {
+ Error ok = save_optimized_copy(defer_optimize,defer_optimize_preset);
+ defer_optimize_preset="";
+ if (ok!=OK)
+ OS::get_singleton()->set_exit_code(255);
+ get_scene()->quit();
+ }
+*/
+
+ /* // moved to "_sources_changed"
+ if (export_defer.platform!="") {
+
+ project_export_settings->export_platform(export_defer.platform,export_defer.path,export_defer.debug,export_defer.password,true);
+ export_defer.platform="";
+ }
+
+ */
+ }
+
+ if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN) {
+
+ EditorFileSystem::get_singleton()->scan_changes();
+ }
+
+ if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST) {
+
+ _menu_option_confirm(FILE_QUIT, false);
+ };
+
+ if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+ scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("interface/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) );
+ }
+
+}
+
+void EditorNode::_fs_changed() {
+
+ for(Set<FileDialog*>::Element *E=file_dialogs.front();E;E=E->next()) {
+
+ E->get()->invalidate();
+ }
+
+ for(Set<EditorFileDialog*>::Element *E=editor_file_dialogs.front();E;E=E->next()) {
+
+ E->get()->invalidate();
+ }
+
+ if (export_defer.platform!="") {
+
+ //project_export_settings->export_platform(export_defer.platform,export_defer.path,export_defer.debug,export_defer.password,true);
+ export_defer.platform="";
+ }
+
+ {
+
+ //reload changed resources
+ List<Ref<Resource> > changed;
+
+ List<Ref<Resource> > cached;
+ ResourceCache::get_cached_resources(&cached);
+ //this should probably be done in a thread..
+ for(List<Ref<Resource> >::Element *E=cached.front();E;E=E->next()) {
+
+ if (!E->get()->editor_can_reload_from_file())
+ continue;
+ if (!E->get()->get_path().is_resource_file() && !E->get()->get_path().is_abs_path())
+ continue;
+ if (!FileAccess::exists(E->get()->get_path()))
+ continue;
+
+ if (E->get()->get_import_path()!=String()) {
+ //imported resource
+ uint64_t mt = FileAccess::get_modified_time(E->get()->get_import_path());
+ print_line("testing modified: "+E->get()->get_import_path()+" "+itos(mt)+" vs "+itos(E->get()->get_import_last_modified_time()));
+
+ if (mt!=E->get()->get_import_last_modified_time()) {
+ print_line("success");
+ changed.push_back(E->get());
+ }
+
+ } else {
+ uint64_t mt = FileAccess::get_modified_time(E->get()->get_path());
+
+ if (mt!=E->get()->get_last_modified_time()) {
+ changed.push_back(E->get());
+ }
+ }
+ }
+
+ if (changed.size()) {
+ //EditorProgress ep("reload_res","Reload Modified Resources",changed.size());
+ int idx=0;
+ for(List<Ref<Resource> >::Element *E=changed.front();E;E=E->next()) {
+
+ //ep.step(E->get()->get_path(),idx++);
+ E->get()->reload_from_file();
+ }
+ }
+
+
+ }
+}
+
+
+void EditorNode::_sources_changed(bool p_exist) {
+
+ if (waiting_for_first_scan) {
+
+ if (defer_load_scene!="") {
+
+ print_line("loading scene DEFERED");
+ load_scene(defer_load_scene);
+ defer_load_scene="";
+ }
+
+ waiting_for_first_scan=false;
+ }
+
+
+}
+
+void EditorNode::_vp_resized() {
+
+
+}
+
+void EditorNode::_rebuild_import_menu()
+{
+ PopupMenu* p = import_menu->get_popup();
+ p->clear();
+ //p->add_item(TTR("Node From Scene"), FILE_IMPORT_SUBSCENE);
+ //p->add_separator();
+#if 0
+ for (int i = 0; i < editor_import_export->get_import_plugin_count(); i++) {
+ p->add_item(editor_import_export->get_import_plugin(i)->get_visible_name(), IMPORT_PLUGIN_BASE + i);
+ }
+#endif
+}
+
+void EditorNode::_node_renamed() {
+
+ if (property_editor)
+ property_editor->update_tree();
+}
+
+
+Error EditorNode::load_resource(const String& p_scene) {
+
+ RES res = ResourceLoader::load(p_scene);
+ ERR_FAIL_COND_V(!res.is_valid(),ERR_CANT_OPEN);
+
+ edit_resource(res);
+
+ return OK;
+}
+
+
+void EditorNode::edit_resource(const Ref<Resource>& p_resource) {
+
+ _resource_selected(p_resource,"");
+}
+
+void EditorNode::edit_node(Node *p_node) {
+
+ push_item(p_node);
+}
+
+void EditorNode::open_resource(const String& p_type) {
+
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type(p_type,&extensions);
+
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ //file->set_current_path(current_path);
+
+ file->popup_centered_ratio();
+ current_option=RESOURCE_LOAD;
+}
+
+
+void EditorNode::save_resource_in_path(const Ref<Resource>& p_resource,const String& p_path) {
+
+ editor_data.apply_changes_in_editors();
+ int flg=0;
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ flg|=ResourceSaver::FLAG_COMPRESS;
+ /*
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/save_paths_as_relative"))
+ flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
+ */
+
+ String path = GlobalConfig::get_singleton()->localize_path(p_path);
+ Error err = ResourceSaver::save(path,p_resource,flg|ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS);
+
+ if (err!=OK) {
+ accept->set_text(TTR("Error saving resource!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+ //EditorFileSystem::get_singleton()->update_file(path,p_resource->get_type());
+
+ ((Resource*)p_resource.ptr())->set_path(path);
+ emit_signal("resource_saved",p_resource);
+
+}
+
+void EditorNode::save_resource(const Ref<Resource>& p_resource) {
+
+ if (p_resource->get_path().is_resource_file()) {
+ save_resource_in_path(p_resource,p_resource->get_path());
+ } else {
+ save_resource_as(p_resource);
+ }
+}
+
+void EditorNode::save_resource_as(const Ref<Resource>& p_resource,const String& p_at_path) {
+
+ file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+
+ current_option=RESOURCE_SAVE_AS;
+ List<String> extensions;
+ Ref<PackedScene> sd = memnew( PackedScene );
+ ResourceSaver::get_recognized_extensions(p_resource,&extensions);
+ file->clear_filters();
+
+ List<String> preferred;
+ for(int i=0;i<extensions.size();i++) {
+
+ if (p_resource->is_class("Script") && (extensions[i]=="tres" || extensions[i]=="res" || extensions[i]=="xml")) {
+ //this serves no purpose and confused people
+ continue;
+ }
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ preferred.push_back(extensions[i]);
+ }
+
+ //file->set_current_path(current_path);
+
+ if (p_at_path!=String()) {
+
+ file->set_current_dir(p_at_path);
+ if (p_resource->get_path().is_resource_file()) {
+ file->set_current_file(p_resource->get_path().get_file());
+ } else {
+ if (extensions.size()) {
+ file->set_current_file("new_"+p_resource->get_class().to_lower()+"."+preferred.front()->get().to_lower());
+ } else {
+ file->set_current_file(String());
+ }
+ }
+ } else if (p_resource->get_path()!="") {
+
+ file->set_current_path(p_resource->get_path());
+ if (extensions.size()) {
+ String ext=p_resource->get_path().get_extension().to_lower();
+ if (extensions.find(ext)==NULL) {
+ file->set_current_path(p_resource->get_path().replacen("."+ext,"."+extensions.front()->get()));
+ }
+ }
+ } else if (preferred.size()) {
+
+ String existing;
+ if (extensions.size()) {
+ existing="new_"+p_resource->get_class().to_lower()+"."+preferred.front()->get().to_lower();
+ }
+ file->set_current_path(existing);
+
+ }
+ file->popup_centered_ratio();
+ file->set_title(TTR("Save Resource As.."));
+}
+
+
+void EditorNode::_menu_option(int p_option) {
+
+ _menu_option_confirm(p_option,false);
+}
+
+void EditorNode::_menu_confirm_current() {
+
+ _menu_option_confirm(current_option,true);
+}
+
+
+void EditorNode::_dialog_display_file_error(String p_file,Error p_error) {
+
+
+ if (p_error) {
+
+ current_option=-1;
+ //accept->"()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+
+ switch(p_error) {
+
+ case ERR_FILE_CANT_WRITE: {
+
+ accept->set_text(TTR("Can't open file for writing:")+" "+p_file.get_extension());
+ } break;
+ case ERR_FILE_UNRECOGNIZED: {
+
+ accept->set_text(TTR("Requested file format unknown:")+" "+p_file.get_extension());
+ } break;
+ default: {
+
+ accept->set_text(TTR("Error while saving."));
+ }break;
+ }
+
+ accept->popup_centered_minsize();
+ }
+
+}
+
+void EditorNode::_get_scene_metadata(const String& p_file) {
+
+ Node *scene = editor_data.get_edited_scene_root();
+
+ if (!scene)
+ return;
+
+ String path = EditorSettings::get_singleton()->get_project_settings_path().plus_file(p_file.get_file()+"-editstate-"+p_file.md5_text()+".cfg");
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+
+ Error err = cf->load(path);
+ if (err!=OK || !cf->has_section("editor_states"))
+ return; //must not exist
+
+ List<String> esl;
+ cf->get_section_keys("editor_states",&esl);
+
+ Dictionary md;
+ for (List<String>::Element *E=esl.front();E;E=E->next()) {
+
+ Variant st=cf->get_value("editor_states",E->get());
+ if (st.get_type()) {
+ md[E->get()]=st;
+ }
+ }
+
+
+
+ editor_data.set_editor_states(md);
+
+}
+
+void EditorNode::_set_scene_metadata(const String& p_file, int p_idx) {
+
+ Node *scene = editor_data.get_edited_scene_root(p_idx);
+
+ if (!scene)
+ return;
+
+ scene->set_meta("__editor_run_settings__",Variant()); //clear it (no point in keeping it)
+ scene->set_meta("__editor_plugin_states__",Variant());
+
+ String path = EditorSettings::get_singleton()->get_project_settings_path().plus_file(p_file.get_file()+"-editstate-"+p_file.md5_text()+".cfg");
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+
+ Dictionary md;
+
+ if (p_idx<0 || editor_data.get_edited_scene()==p_idx) {
+ md = editor_data.get_editor_states();
+ } else {
+ md = editor_data.get_scene_editor_states(p_idx);
+ }
+
+ List<Variant> keys;
+ md.get_key_list(&keys);
+
+ for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
+
+ cf->set_value("editor_states",E->get(),md[E->get()]);
+ }
+
+ Error err = cf->save(path);
+ ERR_FAIL_COND(err!=OK);
+
+}
+
+
+bool EditorNode::_find_and_save_resource(RES res,Map<RES,bool>& processed,int32_t flags) {
+
+ if (res.is_null())
+ return false;
+
+ if (processed.has(res)) {
+
+ return processed[res];
+ }
+
+
+ bool changed = res->is_edited();
+ res->set_edited(false);
+
+ bool subchanged = _find_and_save_edited_subresources(res.ptr(),processed,flags);
+
+ //print_line("checking if edited: "+res->get_type()+" :: "+res->get_name()+" :: "+res->get_path()+" :: "+itos(changed)+" :: SR "+itos(subchanged));
+
+ if (res->get_path().is_resource_file()) {
+ if (changed || subchanged) {
+ //save
+ print_line("Also saving modified external resource: "+res->get_path());
+ ResourceSaver::save(res->get_path(),res,flags);
+
+ }
+ processed[res]=false; //because it's a file
+ return false;
+ } else {
+
+
+ processed[res]=changed;
+ return changed;
+ }
+}
+
+bool EditorNode::_find_and_save_edited_subresources(Object *obj,Map<RES,bool>& processed,int32_t flags) {
+
+ bool ret_changed=false;
+ List<PropertyInfo> pi;
+ obj->get_property_list(&pi);
+ for (List<PropertyInfo>::Element *E=pi.front();E;E=E->next()) {
+
+ if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
+ continue;
+
+
+
+ switch(E->get().type) {
+ case Variant::OBJECT: {
+
+ RES res = obj->get(E->get().name);
+
+ if (_find_and_save_resource(res,processed,flags))
+ ret_changed=true;
+
+ } break;
+ case Variant::ARRAY: {
+
+ Array varray= obj->get(E->get().name);
+ int len=varray.size();
+ for(int i=0;i<len;i++) {
+
+ Variant v=varray.get(i);
+ RES res=v;
+ if (_find_and_save_resource(res,processed,flags))
+ ret_changed=true;
+
+ //_find_resources(v);
+ }
+
+ } break;
+ case Variant::DICTIONARY: {
+
+
+ Dictionary d=obj->get(E->get().name);
+ List<Variant> keys;
+ d.get_key_list(&keys);
+ for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
+
+ Variant v = d[E->get()];
+ RES res=v;
+ if (_find_and_save_resource(res,processed,flags))
+ ret_changed=true;
+ }
+ } break;
+ default: {}
+ }
+
+ }
+
+ return ret_changed;
+
+}
+
+void EditorNode::_save_edited_subresources(Node* scene,Map<RES,bool>& processed,int32_t flags) {
+
+ _find_and_save_edited_subresources(scene,processed,flags);
+
+ for(int i=0;i<scene->get_child_count();i++) {
+
+ Node *n = scene->get_child(i);
+ if (n->get_owner()!=editor_data.get_edited_scene_root())
+ continue;
+ _save_edited_subresources(n,processed,flags);
+ }
+
+}
+
+void EditorNode::_find_node_types(Node* p_node, int&count_2d, int&count_3d) {
+
+ if (p_node->is_class("Viewport") || (p_node!=editor_data.get_edited_scene_root() && p_node->get_owner()!=editor_data.get_edited_scene_root()))
+ return;
+
+ if (p_node->is_class("CanvasItem"))
+ count_2d++;
+ else if (p_node->is_class("Spatial"))
+ count_3d++;
+
+ for(int i=0;i<p_node->get_child_count();i++)
+ _find_node_types(p_node->get_child(i),count_2d,count_3d);
+
+}
+
+
+void EditorNode::_save_scene_with_preview(String p_file) {
+
+ int c2d=0;
+ int c3d=0;
+
+ EditorProgress save("save",TTR("Saving Scene"),4);
+ save.step(TTR("Analyzing"),0);
+ _find_node_types(editor_data.get_edited_scene_root(),c2d,c3d);
+
+ RID viewport;
+ bool is2d;
+ if (c3d<c2d) {
+ viewport=scene_root->get_viewport_rid();
+ is2d=true;
+ } else {
+ viewport=SpatialEditor::get_singleton()->get_editor_viewport(0)->get_viewport_node()->get_viewport_rid();
+ is2d=false;
+
+ }
+ save.step(TTR("Creating Thumbnail"),1);
+ //current view?
+ int screen =-1;
+ for(int i=0;i<editor_table.size();i++) {
+ if (editor_plugin_screen==editor_table[i]) {
+ screen=i;
+ break;
+ }
+ }
+
+ _editor_select(is2d?EDITOR_2D:EDITOR_3D);
+
+
+ save.step(TTR("Creating Thumbnail"),2);
+ save.step(TTR("Creating Thumbnail"),3);
+#if 0
+ Image img = VS::get_singleton()->viewport_texture(scree_capture(viewport);
+ int preview_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ preview_size*=EDSCALE;
+ int width,height;
+ if (img.get_width() > preview_size && img.get_width() >= img.get_height()) {
+
+ width=preview_size;
+ height = img.get_height() * preview_size / img.get_width();
+ } else if (img.get_height() > preview_size && img.get_height() >= img.get_width()) {
+
+ height=preview_size;
+ width = img.get_width() * preview_size / img.get_height();
+ } else {
+
+ width=img.get_width();
+ height=img.get_height();
+ }
+
+ img.convert(Image::FORMAT_RGB8);
+ img.resize(width,height);
+
+ String pfile = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp/last_scene_preview.png");
+ img.save_png(pfile);
+ Vector<uint8_t> imgdata = FileAccess::get_file_as_array(pfile);
+
+ //print_line("img data is "+itos(imgdata.size()));
+
+ if (editor_data.get_edited_scene_import_metadata().is_null())
+ editor_data.set_edited_scene_import_metadata(Ref<ResourceImportMetadata>( memnew( ResourceImportMetadata ) ) );
+ editor_data.get_edited_scene_import_metadata()->set_option("thumbnail",imgdata);
+#endif
+ //tamanio tel thumbnail
+ if (screen!=-1) {
+ _editor_select(screen);
+ }
+ save.step(TTR("Saving Scene"),4);
+ _save_scene(p_file);
+
+}
+
+
+void EditorNode::_save_scene(String p_file, int idx) {
+
+ Node *scene = editor_data.get_edited_scene_root(idx);
+
+ if (!scene) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text("This operation can't be done without a tree root.");
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ editor_data.apply_changes_in_editors();
+
+ _set_scene_metadata(p_file,idx);
+
+
+ Ref<PackedScene> sdata;
+
+ if (ResourceCache::has(p_file)) {
+ // something may be referencing this resource and we are good with that.
+ // we must update it, but also let the previous scene state go, as
+ // old version still work for referencing changes in instanced or inherited scenes
+
+ sdata = Ref<PackedScene>( ResourceCache::get(p_file)->cast_to<PackedScene>() );
+ if (sdata.is_valid())
+ sdata->recreate_state();
+ else
+ sdata.instance();
+ } else {
+ sdata.instance();
+ }
+ Error err = sdata->pack(scene);
+
+
+ if (err!=OK) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ int flg=0;
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ flg|=ResourceSaver::FLAG_COMPRESS;
+ /*
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/save_paths_as_relative"))
+ flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
+ */
+ flg|=ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS;
+
+
+ err = ResourceSaver::save(p_file,sdata,flg);
+ Map<RES,bool> processed;
+ _save_edited_subresources(scene,processed,flg);
+ editor_data.save_editor_external_data();
+ if (err==OK) {
+ scene->set_filename( GlobalConfig::get_singleton()->localize_path(p_file) );
+ //EditorFileSystem::get_singleton()->update_file(p_file,sdata->get_type());
+ if (idx < 0 || idx == editor_data.get_edited_scene())
+ set_current_version(editor_data.get_undo_redo().get_version());
+ else
+ editor_data.set_edited_scene_version(0,idx);
+ _update_title();
+ _update_scene_tabs();
+ } else {
+
+ _dialog_display_file_error(p_file,err);
+ }
+
+
+};
+
+
+
+
+void EditorNode::_import_action(const String& p_action) {
+#if 0
+ import_confirmation->hide();
+
+ if (p_action=="re-import") {
+ _import(_tmp_import_path);
+ }
+ if (p_action=="update") {
+
+ Node *src = EditorImport::import_scene(_tmp_import_path);
+
+ if (!src) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("Ugh");
+ accept->set_text("Error importing scene.");
+ accept->popup_centered(Size2(300,70));
+ return;
+ }
+
+ //as soon as the scene is imported, version hashes must be generated for comparison against saved scene
+ EditorImport::generate_version_hashes(src);
+
+
+ Node *dst = SceneLoader::load(editor_data.get_imported_scene(GlobalConfig::get_singleton()->localize_path(_tmp_import_path)));
+
+ if (!dst) {
+
+ memdelete(src);
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("Ugh");
+ accept->set_text("Error load scene to update.");
+ accept->popup_centered(Size2(300,70));
+ return;
+ }
+
+ List<EditorImport::Conflict> conflicts;
+ EditorImport::check_conflicts(src,dst,&conflicts);
+
+ bool conflicted=false;
+ for (List<EditorImport::Conflict>::Element *E=conflicts.front();E;E=E->next()) {
+
+
+ if (E->get().status==EditorImport::Conflict::STATUS_CONFLICT) {
+
+ conflicted=true;
+ break;
+ }
+ }
+
+ if (conflicted) {
+ import_conflicts_dialog->popup(src,dst,conflicts);
+ return;
+ }
+
+ _import_with_conflicts(src,dst,conflicts);
+ //not conflicted, just reimport!
+
+ }
+#endif
+}
+
+void EditorNode::_import(const String &p_file) {
+
+#if 0
+ Node *new_scene = EditorImport::import_scene(p_file);
+
+ if (!new_scene) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("Ugh");
+ accept->set_text("Error importing scene.");
+ accept->popup_centered(Size2(300,70));
+ return;
+ }
+
+ //as soon as the scene is imported, version hashes must be generated for comparison against saved scene
+ EditorImport::generate_version_hashes(new_scene);
+
+ Node *old_scene = edited_scene;
+ _hide_top_editors();
+ set_edited_scene(NULL);
+ editor_data.clear_editor_states();
+ if (old_scene) {
+ memdelete(old_scene);
+ }
+
+ set_edited_scene(new_scene);
+ scene_tree_dock->set_selected(new_scene);
+ //_get_scene_metadata();
+
+ editor_data.get_undo_redo().clear_history();
+ saved_version=editor_data.get_undo_redo().get_version();
+ _update_title();
+
+
+#endif
+}
+
+void EditorNode::_dialog_action(String p_file) {
+
+
+ switch(current_option) {
+
+ case RESOURCE_LOAD: {
+
+ RES res = ResourceLoader::load(p_file);
+ if (res.is_null()) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("ok :(");
+ accept->set_text(TTR("Failed to load resource."));
+ return;
+ };
+
+
+ push_item(res.operator->() );
+ } break;
+ case FILE_NEW_INHERITED_SCENE: {
+
+
+ load_scene(p_file,false,true);
+ } break;
+ case FILE_OPEN_SCENE: {
+
+
+ load_scene(p_file);
+ } break;
+ case SETTINGS_PICK_MAIN_SCENE: {
+
+ GlobalConfig::get_singleton()->set("application/main_scene",p_file);
+ GlobalConfig::get_singleton()->save();
+ //would be nice to show the project manager opened with the hilighted field..
+ } break;
+ case FILE_SAVE_OPTIMIZED: {
+
+
+
+ } break;
+ case FILE_RUN_SCRIPT: {
+
+ Ref<Script> scr = ResourceLoader::load(p_file,"Script",true);
+ if (scr.is_null()) {
+ add_io_error("Script Failed to Load:\n"+p_file);
+ return;
+ }
+ if (!scr->is_tool()) {
+
+ add_io_error("Script is not tool, will not be able to run:\n"+p_file);
+ return;
+ }
+
+ Ref<EditorScript> es = memnew( EditorScript );
+ es->set_script(scr.get_ref_ptr());
+ es->set_editor(this);
+ es->_run();
+
+ get_undo_redo()->clear_history();
+ } break;
+ case FILE_SAVE_SCENE:
+ case FILE_SAVE_AS_SCENE: {
+
+ if (file->get_mode()==EditorFileDialog::MODE_SAVE_FILE) {
+
+ //_save_scene(p_file);
+ _save_scene_with_preview(p_file);
+
+ }
+
+ } break;
+
+ case FILE_SAVE_AND_RUN: {
+ if (file->get_mode()==EditorFileDialog::MODE_SAVE_FILE) {
+
+ //_save_scene(p_file);
+ _save_scene_with_preview(p_file);
+ _call_build();
+ _run(true);
+ }
+ } break;
+
+ case FILE_EXPORT_MESH_LIBRARY: {
+
+ Ref<MeshLibrary> ml;
+ if (file_export_lib_merge->is_pressed() && FileAccess::exists(p_file)) {
+ ml=ResourceLoader::load(p_file,"MeshLibrary");
+
+ if (ml.is_null()) {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Can't load MeshLibrary for merging!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ }
+
+ if (ml.is_null()) {
+ ml = Ref<MeshLibrary>( memnew( MeshLibrary ));
+ }
+
+ //MeshLibraryEditor::update_library_file(editor_data.get_edited_scene_root(),ml,true);
+
+ Error err = ResourceSaver::save(p_file,ml);
+ if (err) {
+
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Error saving MeshLibrary!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+
+ } break;
+ case FILE_EXPORT_TILESET: {
+
+ Ref<TileSet> ml;
+ if (FileAccess::exists(p_file)) {
+ ml=ResourceLoader::load(p_file,"TileSet");
+
+ if (ml.is_null()) {
+ if (file_export_lib_merge->is_pressed()) {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Can't load TileSet for merging!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+ } else if (!file_export_lib_merge->is_pressed()) {
+ ml->clear();
+ }
+
+ } else {
+ ml = Ref<TileSet>( memnew( TileSet ));
+ }
+
+ TileSetEditor::update_library_file(editor_data.get_edited_scene_root(),ml,true);
+
+ Error err = ResourceSaver::save(p_file,ml);
+ if (err) {
+
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Error saving TileSet!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+ } break;
+
+ case SETTINGS_LOAD_EXPORT_TEMPLATES: {
+
+ FileAccess *fa=NULL;
+ zlib_filefunc_def io = zipio_create_io_from_file(&fa);
+
+ unzFile pkg = unzOpen2(p_file.utf8().get_data(), &io);
+ if (!pkg) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Can't open export templates zip."));
+ accept->popup_centered_minsize();
+ return;
+
+ }
+ int ret = unzGoToFirstFile(pkg);
+
+ int fc=0; //count them
+
+ while(ret==UNZ_OK) {
+ fc++;
+ ret = unzGoToNextFile(pkg);
+
+ }
+
+ ret = unzGoToFirstFile(pkg);
+
+ EditorProgress p("ltask",TTR("Loading Export Templates"),fc);
+
+ fc=0;
+
+ while(ret==UNZ_OK) {
+
+ //get filename
+ unz_file_info info;
+ char fname[16384];
+ ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0);
+
+
+ String file=fname;
+
+ Vector<uint8_t> data;
+ data.resize(info.uncompressed_size);
+
+ //read
+ ret = unzOpenCurrentFile(pkg);
+ ret = unzReadCurrentFile(pkg,data.ptr(),data.size());
+ unzCloseCurrentFile(pkg);
+
+ print_line(fname);
+ /*
+ for(int i=0;i<512;i++) {
+ print_line(itos(data[i]));
+ }
+ */
+
+ file=file.get_file();
+
+ p.step(TTR("Importing:")+" "+file,fc);
+
+ FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_settings_path()+"/templates/"+file,FileAccess::WRITE);
+
+ ERR_CONTINUE(!f);
+ f->store_buffer(data.ptr(),data.size());
+
+ memdelete(f);
+
+ ret = unzGoToNextFile(pkg);
+ fc++;
+ }
+
+ unzClose(pkg);
+
+ } break;
+
+ case RESOURCE_SAVE:
+ case RESOURCE_SAVE_AS: {
+
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ ERR_FAIL_COND(!current_obj->cast_to<Resource>())
+
+ RES current_res = RES(current_obj->cast_to<Resource>());
+
+ save_resource_in_path(current_res,p_file);
+
+ } break;
+ case SETTINGS_LAYOUT_SAVE: {
+
+ if (p_file.empty())
+ return;
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+
+ if (err==ERR_CANT_OPEN) {
+ config.instance(); // new config
+ } else if (err!=OK) {
+ show_warning(TTR("Error trying to save layout!"));
+ return;
+ }
+
+ _save_docks_to_config(config, p_file);
+
+ config->save(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+
+ layout_dialog->hide();
+ _update_layouts_menu();
+
+ if (p_file=="Default") {
+ show_warning(TTR("Default editor layout overridden."));
+ }
+
+ } break;
+ case SETTINGS_LAYOUT_DELETE: {
+
+ if (p_file.empty())
+ return;
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+
+ if (err!=OK || !config->has_section(p_file)) {
+ show_warning(TTR("Layout name not found!"));
+ return;
+ }
+
+ // erase
+ List<String> keys;
+ config->get_section_keys(p_file, &keys);
+ for (List<String>::Element *E=keys.front();E;E=E->next()) {
+ config->set_value(p_file, E->get(), Variant());
+ }
+
+ config->save(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+
+ layout_dialog->hide();
+ _update_layouts_menu();
+
+ if (p_file=="Default") {
+ show_warning(TTR("Restored default layout to base settings."));
+ }
+
+ } break;
+ default: { //save scene?
+
+ if (file->get_mode()==EditorFileDialog::MODE_SAVE_FILE) {
+
+ //_save_scene(p_file);
+ _save_scene_with_preview(p_file);
+ }
+
+ } break;
+ }
+}
+
+
+
+void EditorNode::push_item(Object *p_object,const String& p_property) {
+
+
+ if (!p_object) {
+ property_editor->edit(NULL);
+ node_dock->set_node(NULL);
+ scene_tree_dock->set_selected(NULL);
+ return;
+ }
+
+ uint32_t id = p_object->get_instance_ID();
+ if (id!=editor_history.get_current()) {
+
+ if (p_property=="")
+ editor_history.add_object(id);
+ else
+ editor_history.add_object(id,p_property);
+ }
+
+ _edit_current();
+
+}
+
+void EditorNode::_select_history(int p_idx) {
+
+ //push it to the top, it is not correct, but it's more useful
+ ObjectID id=editor_history.get_history_obj(p_idx);
+ Object* obj=ObjectDB::get_instance(id);
+ if (!obj)
+ return;
+ push_item(obj);
+}
+
+void EditorNode::_prepare_history() {
+
+ int history_to = MAX(0,editor_history.get_history_len()-25);
+
+ editor_history_menu->get_popup()->clear();
+
+ Ref<Texture> base_icon = gui_base->get_icon("Object","EditorIcons");
+ Set<ObjectID> already;
+ for(int i=editor_history.get_history_len()-1;i>=history_to;i--) {
+
+
+ ObjectID id=editor_history.get_history_obj(i);
+ Object* obj=ObjectDB::get_instance(id);
+ if (!obj || already.has(id)) {
+ if (history_to>0) {
+ history_to--;
+ }
+ continue;
+ }
+
+ already.insert(id);
+
+ Ref<Texture> icon = gui_base->get_icon("Object","EditorIcons");
+ if (gui_base->has_icon(obj->get_class(),"EditorIcons"))
+ icon=gui_base->get_icon(obj->get_class(),"EditorIcons");
+ else
+ icon=base_icon;
+
+ String text;
+ if (obj->cast_to<Resource>()) {
+ Resource *r=obj->cast_to<Resource>();
+ if (r->get_path().is_resource_file())
+ text=r->get_path().get_file();
+ else if (r->get_name()!=String()) {
+ text=r->get_name();
+ } else {
+ text=r->get_class();
+ }
+ } else if (obj->cast_to<Node>()) {
+ text=obj->cast_to<Node>()->get_name();
+ } else {
+ text=obj->get_class();
+ }
+
+ if (i==editor_history.get_history_pos()) {
+ text="["+text+"]";
+ }
+ editor_history_menu->get_popup()->add_icon_item(icon,text,i);
+ }
+}
+
+void EditorNode::_property_editor_forward() {
+
+ if (editor_history.next())
+ _edit_current();
+
+}
+void EditorNode::_property_editor_back() {
+
+ if (editor_history.previous())
+ _edit_current();
+
+}
+
+
+void EditorNode::_imported(Node *p_node) {
+
+/*
+ Node *scene = editor_data.get_edited_scene_root();
+ add_edited_scene(p_node);
+
+ if (scene) {
+ String path = scene->get_filename();
+ p_node->set_filename(path);
+ memdelete(scene);
+ }
+*/
+
+
+}
+
+
+void EditorNode::_hide_top_editors() {
+
+ _display_top_editors(false);
+
+ editor_plugins_over->clear();
+}
+
+void EditorNode::_display_top_editors(bool p_display) {
+ editor_plugins_over->make_visible(p_display);
+}
+
+void EditorNode::_set_top_editors(Vector<EditorPlugin*> p_editor_plugins_over) {
+ editor_plugins_over->set_plugins_list(p_editor_plugins_over);
+}
+
+void EditorNode::_set_editing_top_editors(Object* p_current_object) {
+ editor_plugins_over->edit(p_current_object);
+}
+
+
+
+void EditorNode::_edit_current() {
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ property_back->set_disabled( editor_history.is_at_begining() );
+ property_forward->set_disabled( editor_history.is_at_end() );
+
+ this->current=current_obj;
+ editor_path->update_path();
+
+
+ if (!current_obj) {
+
+ scene_tree_dock->set_selected(NULL);
+ property_editor->edit( NULL );
+ node_dock->set_node(NULL);
+ object_menu->set_disabled(true);
+
+ _display_top_editors(false);
+
+ return;
+ }
+
+ object_menu->set_disabled(true);
+
+ bool is_resource = current_obj->is_class("Resource");
+ bool is_node = current_obj->is_class("Node");
+ resource_save_button->set_disabled(!is_resource);
+
+ if (is_resource) {
+
+
+ Resource *current_res = current_obj->cast_to<Resource>();
+ ERR_FAIL_COND(!current_res);
+ scene_tree_dock->set_selected(NULL);
+ property_editor->edit( current_res );
+ node_dock->set_node(NULL);
+ object_menu->set_disabled(false);
+
+ //resources_dock->add_resource(Ref<Resource>(current_res));
+
+
+ //top_pallete->set_current_tab(1);
+ } else if (is_node) {
+
+ Node * current_node = current_obj->cast_to<Node>();
+ ERR_FAIL_COND(!current_node);
+ ERR_FAIL_COND(!current_node->is_inside_tree());
+
+
+
+
+ property_editor->edit( current_node );
+ node_dock->set_node( current_node );
+ scene_tree_dock->set_selected(current_node);
+ object_menu->get_popup()->clear();
+
+ //top_pallete->set_current_tab(0);
+
+ } else {
+
+ property_editor->edit( current_obj );
+ node_dock->set_node(NULL);
+ //scene_tree_dock->set_selected(current_node);
+ //object_menu->get_popup()->clear();
+
+ }
+
+ /* Take care of PLUGIN EDITOR */
+
+
+ EditorPlugin *main_plugin = editor_data.get_editor(current_obj);
+
+ if (main_plugin) {
+
+ // special case if use of external editor is true
+ if (main_plugin->get_name() == "Script" && bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))){
+ main_plugin->edit(current_obj);
+ }
+
+ else if (main_plugin!=editor_plugin_screen && (!ScriptEditor::get_singleton() || !ScriptEditor::get_singleton()->is_visible_in_tree() || ScriptEditor::get_singleton()->can_take_away_focus())) {
+ // update screen main_plugin
+
+ if (!changing_scene) {
+ if (editor_plugin_screen)
+ editor_plugin_screen->make_visible(false);
+ editor_plugin_screen=main_plugin;
+ editor_plugin_screen->edit(current_obj);
+
+ editor_plugin_screen->make_visible(true);
+
+
+ for(int i=0;i<editor_table.size();i++) {
+
+ main_editor_buttons[i]->set_pressed(editor_table[i]==main_plugin);
+ }
+ }
+
+ } else {
+
+ editor_plugin_screen->edit(current_obj);
+ }
+
+ }
+
+ Vector<EditorPlugin*> sub_plugins = editor_data.get_subeditors(current_obj);
+
+ if (!sub_plugins.empty()) {
+ _display_top_editors(false);
+
+ _set_top_editors(sub_plugins);
+ _set_editing_top_editors(current_obj);
+ _display_top_editors(true);
+
+ } else if (!editor_plugins_over->get_plugins_list().empty()) {
+
+ _hide_top_editors();
+
+ }
+/*
+ if (!plugin || plugin->has_main_screen()) {
+ // remove the OVER plugin if exists
+ if (editor_plugin_over)
+ editor_plugin_over->make_visible(false);
+ editor_plugin_over=NULL;
+ }
+*/
+ /* Take care of OBJECT MENU */
+
+ object_menu->set_disabled(false);
+
+ PopupMenu *p=object_menu->get_popup();
+
+ p->clear();
+ p->add_shortcut(ED_SHORTCUT("property_editor/copy_params",TTR("Copy Params")),OBJECT_COPY_PARAMS);
+ p->add_shortcut(ED_SHORTCUT("property_editor/paste_params",TTR("Paste Params")),OBJECT_PASTE_PARAMS);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("property_editor/paste_resource",TTR("Paste Resource")),RESOURCE_PASTE);
+ if (is_resource) {
+ p->add_shortcut(ED_SHORTCUT("property_editor/copy_resource",TTR("Copy Resource")),RESOURCE_COPY);
+ p->add_shortcut(ED_SHORTCUT("property_editor/unref_resource",TTR("Make Built-In")),RESOURCE_UNREF);
+ }
+
+ if (is_resource || is_node) {
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique",TTR("Make Sub-Resources Unique")),OBJECT_UNIQUE_RESOURCES);
+ p->add_separator();
+ p->add_icon_shortcut(gui_base->get_icon("Help","EditorIcons"),ED_SHORTCUT("property_editor/open_help",TTR("Open in Help")),OBJECT_REQUEST_HELP);
+ }
+
+ List<MethodInfo> methods;
+ current_obj->get_method_list(&methods);
+
+
+ if (!methods.empty()) {
+
+ bool found=false;
+ List<MethodInfo>::Element *I=methods.front();
+ int i=0;
+ while(I) {
+
+ if (I->get().flags&METHOD_FLAG_EDITOR) {
+ if (!found) {
+ p->add_separator();
+ found=true;
+ }
+ p->add_item(I->get().name.capitalize(),OBJECT_METHOD_BASE+i);
+ }
+ i++;
+ I=I->next();
+ }
+ }
+
+ //p->add_separator();
+ //p->add_item("All Methods",OBJECT_CALL_METHOD);
+
+
+ update_keying();
+}
+
+void EditorNode::_resource_created() {
+
+ Object *c = create_dialog->instance_selected();
+
+ ERR_FAIL_COND(!c);
+ Resource *r = c->cast_to<Resource>();
+ ERR_FAIL_COND(!r);
+
+ REF res( r );
+
+ push_item(c);
+
+}
+
+void EditorNode::_resource_selected(const RES& p_res,const String& p_property) {
+
+
+ if (p_res.is_null())
+ return;
+
+ RES r=p_res;
+ push_item(r.operator->(),p_property);
+
+}
+
+
+void EditorNode::_run(bool p_current,const String& p_custom) {
+
+ if (editor_run.get_status()==EditorRun::STATUS_PLAY) {
+
+ play_button->set_pressed(!_playing_edited);
+ play_scene_button->set_pressed(_playing_edited);
+ return;
+ }
+
+ play_button->set_pressed(false);
+ play_button->set_icon(gui_base->get_icon("MainPlay","EditorIcons"));
+ //pause_button->set_pressed(false);
+ play_scene_button->set_pressed(false);
+ play_scene_button->set_icon(gui_base->get_icon("PlayScene","EditorIcons"));
+ play_custom_scene_button->set_pressed(false);
+ play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom","EditorIcons"));
+
+ String main_scene;
+ String run_filename;
+ String args;
+
+
+ if (p_current || (editor_data.get_edited_scene_root() && p_custom==editor_data.get_edited_scene_root()->get_filename())) {
+
+ Node *scene = editor_data.get_edited_scene_root();
+
+ if (!scene) {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("There is no defined scene to run."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ if (scene->get_filename()=="") {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ /**/
+ _menu_option_confirm(FILE_SAVE_BEFORE_RUN, false);
+ return;
+
+ }
+
+ run_filename=scene->get_filename();
+ } else if (p_custom!="") {
+ run_filename = p_custom;
+ }
+
+ if (run_filename=="") {
+
+ //evidently, run the scene
+ main_scene=GLOBAL_DEF("application/main_scene","");
+ if (main_scene=="") {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in later in \"Project Settings\" under the 'application' category."));
+ pick_main_scene->popup_centered_minsize();
+ return;
+ }
+
+ if (!FileAccess::exists(main_scene)) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ pick_main_scene->set_text(vformat(TTR("Selected scene '%s' does not exist, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
+ pick_main_scene->popup_centered_minsize();
+ return;
+
+ }
+
+ if (ResourceLoader::get_resource_type(main_scene)!="PackedScene") {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ pick_main_scene->set_text(vformat(TTR("Selected scene '%s' is not a scene file, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
+ pick_main_scene->popup_centered_minsize();
+ return;
+
+ }
+
+ }
+
+
+ if (bool(EDITOR_DEF("run/auto_save/save_before_running",true))) {
+
+ if (unsaved_cache) {
+
+ Node *scene = editor_data.get_edited_scene_root();
+
+ if (scene) { //only autosave if there is a scene obviously
+
+ if (scene->get_filename()=="") {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Current scene was never saved, please save it prior to running."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ //_save_scene(scene->get_filename());
+ _save_scene_with_preview(scene->get_filename());
+ }
+ }
+ _menu_option(FILE_SAVE_ALL_SCENES);
+ editor_data.save_editor_external_data();
+ }
+
+ if (bool(EDITOR_DEF("run/output/always_clear_output_on_play", true))) {
+ log->clear();
+ }
+
+ if (bool(EDITOR_DEF("run/output/always_open_output_on_play", true))) {
+ make_bottom_panel_item_visible(log);
+ }
+
+ List<String> breakpoints;
+ editor_data.get_editor_breakpoints(&breakpoints);
+
+ args = GlobalConfig::get_singleton()->get("editor/main_run_args");
+
+ Error error = editor_run.run(run_filename,args,breakpoints);
+
+ if (error!=OK) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Could not start subprocess!"));
+ accept->popup_centered_minsize();
+ return;
+
+ }
+
+ emit_signal("play_pressed");
+ if (p_current) {
+ play_scene_button->set_pressed(true);
+ play_scene_button->set_icon(gui_base->get_icon("Reload","EditorIcons"));
+ } else if (p_custom!="") {
+ run_custom_filename=p_custom;
+ play_custom_scene_button->set_pressed(true);
+ play_custom_scene_button->set_icon(gui_base->get_icon("Reload","EditorIcons"));
+ } else {
+ play_button->set_pressed(true);
+ play_button->set_icon(gui_base->get_icon("Reload","EditorIcons"));
+ }
+
+ _playing_edited=p_current;
+
+}
+
+void EditorNode::_cleanup_scene() {
+
+#if 0
+ Node *scene = editor_data.get_edited_scene_root();
+ editor_selection->clear();
+ editor_data.clear_editor_states();
+ editor_history.clear();
+ _hide_top_editors();
+ animation_editor->cleanup();
+ property_editor->edit(NULL);
+ resources_dock->cleanup();
+ scene_import_metadata.unref();
+ //set_edited_scene(NULL);
+ if (scene) {
+ if (scene->get_filename()!="") {
+ previous_scenes.push_back(scene->get_filename());
+ }
+
+ memdelete(scene);
+ }
+ editor_data.get_undo_redo().clear_history();
+ saved_version=editor_data.get_undo_redo().get_version();
+ run_settings_dialog->set_run_mode(0);
+ run_settings_dialog->set_custom_arguments("-l $scene");
+
+ List<Ref<Resource> > cached;
+ ResourceCache::get_cached_resources(&cached);
+
+ for(List<Ref<Resource> >::Element *E=cached.front();E;E=E->next()) {
+
+ String path = E->get()->get_path();
+ if (path.is_resource_file()) {
+ ERR_PRINT(("Stray resource not cleaned:"+path).utf8().get_data());
+ }
+
+ }
+
+ _update_title();
+#endif
+}
+
+void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
+
+ //print_line("option "+itos(p_option)+" confirm "+itos(p_confirmed));
+ if (!p_confirmed) //this may be a hack..
+ current_option=(MenuOptions)p_option;
+
+
+ switch( p_option ) {
+ case FILE_NEW_SCENE: {
+
+ // TODO: Drop such obsolete commented code
+ /*
+ if (!p_confirmed) {
+ confirmation->get_ok()->set_text("Yes");
+ //confirmation->get_cancel()->show();
+ confirmation->set_text("Start a New Scene? (Current will be lost)");
+ confirmation->popup_centered_minsize();
+ break;
+ }*/
+
+
+ int idx = editor_data.add_edited_scene(-1);
+ _scene_tab_changed(idx);
+ editor_data.clear_editor_states();
+
+ //_cleanup_scene();
+
+
+ } break;
+ case FILE_NEW_INHERITED_SCENE:
+ case FILE_OPEN_SCENE: {
+
+
+ //print_tree();
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ //not for now?
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+
+ //file->set_current_path(current_path);
+ Node *scene = editor_data.get_edited_scene_root();
+ if (scene) {
+ file->set_current_path(scene->get_filename());
+ };
+ file->set_title(p_option==FILE_OPEN_SCENE?TTR("Open Scene"):TTR("Open Base Scene"));
+ file->popup_centered_ratio();
+
+ } break;
+ case FILE_QUICK_OPEN_SCENE: {
+
+ quick_open->popup("PackedScene", true);
+ quick_open->set_title(TTR("Quick Open Scene.."));
+
+ } break;
+ case FILE_QUICK_OPEN_SCRIPT: {
+
+
+ quick_open->popup("Script", true);
+ quick_open->set_title(TTR("Quick Open Script.."));
+
+ } break;
+ case FILE_RUN_SCRIPT: {
+
+ file_script->popup_centered_ratio();
+ } break;
+ case FILE_OPEN_PREV: {
+
+ if (previous_scenes.empty())
+ break;
+ opening_prev=true;
+ open_request(previous_scenes.back()->get());
+
+ } break;
+ case FILE_CLOSE: {
+
+ if (!p_confirmed && unsaved_cache) {
+ confirmation->get_ok()->set_text(TTR("Yes"));
+ //confirmation->get_cancel()->show();
+ confirmation->set_text(TTR("Close scene? (Unsaved changes will be lost)"));
+ confirmation->popup_centered_minsize();
+ break;
+ }
+
+ _remove_edited_scene();
+
+
+
+ } break;
+ case SCENE_TAB_CLOSE: {
+ _remove_scene(tab_closing);
+ _update_scene_tabs();
+ current_option = -1;
+ } break;
+ case FILE_SAVE_SCENE: {
+
+
+ Node *scene = editor_data.get_edited_scene_root();
+ if (scene && scene->get_filename()!="") {
+
+ // save in background if in the script editor
+ if (_get_current_main_editor() == EDITOR_SCRIPT) {
+ _save_scene(scene->get_filename());
+ } else {
+ _save_scene_with_preview(scene->get_filename());
+ }
+ return;
+ };
+ // fallthrough to save_as
+ };
+ case FILE_SAVE_AS_SCENE: {
+
+ Node *scene = editor_data.get_edited_scene_root();
+
+ if (!scene) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text("This operation can't be done without a tree root.");
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+
+
+ List<String> extensions;
+ Ref<PackedScene> sd = memnew( PackedScene );
+ ResourceSaver::get_recognized_extensions(sd,&extensions);
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ //file->set_current_path(current_path);
+ if (scene->get_filename()!="") {
+ file->set_current_path(scene->get_filename());
+ if (extensions.size()) {
+ String ext=scene->get_filename().get_extension().to_lower();
+ if (extensions.find(ext)==NULL) {
+ file->set_current_path(scene->get_filename().replacen("."+ext,"."+extensions.front()->get()));
+ }
+ }
+ } else {
+
+ String existing;
+ if (extensions.size()) {
+ String root_name(get_edited_scene()->get_name());
+ existing=root_name+"."+extensions.front()->get().to_lower();
+ }
+ file->set_current_path(existing);
+
+ }
+ file->popup_centered_ratio();
+ file->set_title(TTR("Save Scene As.."));
+
+ } break;
+
+ case FILE_SAVE_ALL_SCENES: {
+ for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
+ Node *scene = editor_data.get_edited_scene_root(i);
+ if (scene && scene->get_filename()!="") {
+ // save in background if in the script editor
+ if (i != editor_data.get_edited_scene() || _get_current_main_editor() == EDITOR_SCRIPT) {
+ _save_scene(scene->get_filename(), i);
+ } else {
+ _save_scene_with_preview(scene->get_filename());
+ }
+ }// else: ignore new scenes
+ }
+ } break;
+ case FILE_SAVE_BEFORE_RUN: {
+ if (!p_confirmed) {
+ accept->get_ok()->set_text(TTR("Yes"));
+ accept->set_text(TTR("This scene has never been saved. Save before running?"));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ _menu_option(FILE_SAVE_AS_SCENE);
+ _menu_option_confirm(FILE_SAVE_AND_RUN, true);
+ } break;
+
+ case FILE_SAVE_OPTIMIZED: {
+#if 0
+ Node *scene = editor_data.get_edited_scene_root();
+ if (!scene) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("This operation can't be done without a tree root.");
+ accept->popup_centered(Size2(300,70));
+ break;
+ }
+
+
+
+ //file->set_current_path(current_path);
+
+ String cpath;
+ if (scene->get_filename()!="") {
+ cpath = scene->get_filename();
+
+ String fn = cpath.substr(0,cpath.length() - cpath.extension().size());
+ String ext=cpath.extension();
+ cpath=fn+".optimized.scn";
+ optimized_save->set_optimized_scene(cpath);
+ optimized_save->popup_centered(Size2(500,143));
+ } else {
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("Please save the scene first.");
+ accept->popup_centered(Size2(300,70));
+ break;
+
+ }
+#endif
+ } break;
+
+ case FILE_EXPORT_PROJECT: {
+
+ project_export->popup_export();
+ } break;
+
+ case FILE_EXPORT_MESH_LIBRARY: {
+
+ if (!editor_data.get_edited_scene_root()) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text("This operation can't be done without a scene.");
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ List<String> extensions;
+ Ref<MeshLibrary> ml( memnew( MeshLibrary) );
+ ResourceSaver::get_recognized_extensions(ml,&extensions);
+ file_export_lib->clear_filters();
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+ file_export_lib->add_filter("*."+E->get());
+ }
+
+ file_export_lib->popup_centered_ratio();
+ file_export_lib->set_title(TTR("Export Mesh Library"));
+
+ } break;
+ case FILE_EXPORT_TILESET: {
+
+ List<String> extensions;
+ Ref<TileSet> ml( memnew( TileSet) );
+ ResourceSaver::get_recognized_extensions(ml,&extensions);
+ file_export_lib->clear_filters();
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+ file_export_lib->add_filter("*."+E->get());
+ }
+
+ file_export_lib->popup_centered_ratio();
+ file_export_lib->set_title(TTR("Export Tile Set"));
+
+ } break;
+
+ case SETTINGS_EXPORT_PREFERENCES: {
+
+ //project_export_settings->popup_centered_ratio();
+ } break;
+ case FILE_IMPORT_SUBSCENE: {
+
+ //import_subscene->popup_centered_ratio();
+
+ if (!editor_data.get_edited_scene_root()) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text("This operation can't be done without a selected node.");
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ scene_tree_dock->import_subscene();
+
+ } break;
+
+ case FILE_QUIT: {
+
+
+ if (!p_confirmed) {
+
+ confirmation->get_ok()->set_text(TTR("Quit"));
+ //confirmation->get_cancel()->show();
+ confirmation->set_text(TTR("Exit the editor?"));
+ confirmation->popup_centered(Size2(180,70)*EDSCALE);
+ break;
+ }
+
+
+ _menu_option_confirm(RUN_STOP,true);
+ exiting=true;
+ get_tree()->quit();
+
+ } break;
+ case FILE_EXTERNAL_OPEN_SCENE: {
+
+ if (unsaved_cache && !p_confirmed) {
+
+ confirmation->get_ok()->set_text(TTR("Open"));
+ //confirmation->get_cancel()->show();
+ confirmation->set_text(TTR("Current scene not saved. Open anyway?"));
+ confirmation->popup_centered_minsize();
+ break;
+
+ }
+
+ bool oprev=opening_prev;
+ Error err = load_scene(external_file);
+ if (err == OK && oprev) {
+ previous_scenes.pop_back();
+ opening_prev=false;
+ }
+
+ } break;
+
+ case EDIT_UNDO: {
+
+
+
+ if (Input::get_singleton()->get_mouse_button_mask()&0x7) {
+ print_line("no because state");
+ break; // can't undo while mouse buttons are pressed
+ }
+
+ String action = editor_data.get_undo_redo().get_current_action_name();
+ if (action!="")
+ log->add_message("UNDO: "+action);
+
+ editor_data.get_undo_redo().undo();
+ } break;
+ case EDIT_REDO: {
+
+ if (Input::get_singleton()->get_mouse_button_mask()&0x7)
+ break; // can't redo while mouse buttons are pressed
+
+ editor_data.get_undo_redo().redo();
+ String action = editor_data.get_undo_redo().get_current_action_name();
+ if (action!="")
+ log->add_message("REDO: "+action);
+
+ } break;
+ case TOOLS_ORPHAN_RESOURCES: {
+
+ orphan_resources->show();
+ } break;
+
+ case EDIT_REVERT: {
+
+ Node *scene = get_edited_scene();
+
+ if (!scene)
+ break;
+
+ String filename = scene->get_filename();
+
+ if (filename==String()) {
+ show_warning(TTR("Can't reload a scene that was never saved."));
+ break;
+ }
+
+ if (unsaved_cache && !p_confirmed) {
+ confirmation->get_ok()->set_text(TTR("Revert"));
+ confirmation->set_text(TTR("This action cannot be undone. Revert anyway?"));
+ confirmation->popup_centered_minsize();
+ break;
+ }
+
+
+ int cur_idx = editor_data.get_edited_scene();
+ _remove_edited_scene();
+ Error err = load_scene(filename);
+ editor_data.move_edited_scene_to_index(cur_idx);
+ get_undo_redo()->clear_history();
+ scene_tabs->set_current_tab(cur_idx);
+
+ } break;
+
+#if 0
+ case NODE_EXTERNAL_INSTANCE: {
+
+
+ if (!edited_scene) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("This operation can't be done without a selected node.");
+ accept->popup_centered(Size2(300,70));
+ break;
+ }
+
+ Node *parent = scene_tree_editor->get_selected();
+
+ if (!parent) {
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("This operation can't be done without a selected node.");
+ accept->popup_centered(Size2(300,70));
+ break;
+ }
+
+ Node*instanced_scene=SceneLoader::load(external_file,true);
+
+ if (!instanced_scene) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("Ugh");
+ accept->set_text("Error loading scene from "+external_file);
+ accept->popup_centered(Size2(300,70));
+ return;
+ }
+
+ instanced_scene->generate_instance_state();
+ instanced_scene->set_filename( GlobalConfig::get_singleton()->localize_path(external_file) );
+
+ editor_data.get_undo_redo().create_action("Instance Scene");
+ editor_data.get_undo_redo().add_do_method(parent,"add_child",instanced_scene);
+ editor_data.get_undo_redo().add_do_method(instanced_scene,"set_owner",edited_scene);
+ editor_data.get_undo_redo().add_do_reference(instanced_scene);
+ editor_data.get_undo_redo().add_undo_method(parent,"remove_child",instanced_scene);
+ editor_data.get_undo_redo().commit_action();
+
+ //parent->add_child(instanced_scene);
+ //instanced_scene->set_owner(edited_scene);
+ _last_instanced_scene=instanced_scene;
+
+ } break;
+#endif
+ case RESOURCE_NEW: {
+
+ create_dialog->popup(true);
+ } break;
+ case RESOURCE_LOAD: {
+
+ open_resource();
+ } break;
+ case RESOURCE_SAVE: {
+
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ ERR_FAIL_COND(!current_obj->cast_to<Resource>())
+
+ RES current_res = RES(current_obj->cast_to<Resource>());
+
+ save_resource(current_res);
+
+ } break;
+ case RESOURCE_SAVE_AS: {
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ ERR_FAIL_COND(!current_obj->cast_to<Resource>())
+
+ RES current_res = RES(current_obj->cast_to<Resource>());
+
+ save_resource_as(current_res);
+
+ } break;
+ case RESOURCE_UNREF: {
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ ERR_FAIL_COND(!current_obj->cast_to<Resource>())
+
+ RES current_res = RES(current_obj->cast_to<Resource>());
+ current_res->set_path("");
+ _edit_current();
+ } break;
+ case RESOURCE_COPY: {
+
+ uint32_t current = editor_history.get_current();
+ Object *current_obj = current>0 ? ObjectDB::get_instance(current) : NULL;
+
+ ERR_FAIL_COND(!current_obj->cast_to<Resource>())
+
+ RES current_res = RES(current_obj->cast_to<Resource>());
+
+ EditorSettings::get_singleton()->set_resource_clipboard(current_res);
+
+ } break;
+ case RESOURCE_PASTE: {
+
+ RES r = EditorSettings::get_singleton()->get_resource_clipboard();
+ if (r.is_valid()) {
+ push_item(EditorSettings::get_singleton()->get_resource_clipboard().ptr(),String());
+ }
+
+ } break;
+ case OBJECT_REQUEST_HELP: {
+
+ if (current) {
+ _editor_select(EDITOR_SCRIPT);
+ emit_signal("request_help",current->get_class());
+ }
+
+
+ } break;
+ case OBJECT_COPY_PARAMS: {
+
+ editor_data.apply_changes_in_editors();
+ if (current)
+ editor_data.copy_object_params(current);
+ } break;
+ case OBJECT_PASTE_PARAMS: {
+
+ editor_data.apply_changes_in_editors();
+ if (current)
+ editor_data.paste_object_params(current);
+ editor_data.get_undo_redo().clear_history();
+ } break;
+ case OBJECT_UNIQUE_RESOURCES: {
+
+ editor_data.apply_changes_in_editors();
+ if (current) {
+ List<PropertyInfo> props;
+ current->get_property_list(&props);
+ Map<RES,RES> duplicates;
+ for (List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
+
+ if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
+ continue;
+
+ Variant v = current->get(E->get().name);
+ if (v.is_ref()) {
+ REF ref = v;
+ if (ref.is_valid()) {
+
+ RES res = ref;
+ if (res.is_valid()) {
+
+ if (!duplicates.has(res)) {
+ duplicates[res]=res->duplicate();
+ }
+ res=duplicates[res];
+
+ current->set(E->get().name,res);
+ }
+
+ }
+ }
+
+ }
+ }
+
+ editor_data.get_undo_redo().clear_history();
+
+ _set_editing_top_editors(NULL);
+ _set_editing_top_editors(current);
+
+ } break;
+ case RUN_PLAY: {
+ _menu_option_confirm(RUN_STOP,true);
+ _call_build();
+ _run(false);
+
+ } break;
+ case RUN_PLAY_CUSTOM_SCENE: {
+ if (run_custom_filename.empty() || editor_run.get_status()==EditorRun::STATUS_STOP) {
+ _menu_option_confirm(RUN_STOP,true);
+ quick_run->popup("PackedScene",true);
+ quick_run->set_title(TTR("Quick Run Scene.."));
+ play_custom_scene_button->set_pressed(false);
+ } else {
+ String last_custom_scene=run_custom_filename;
+ _menu_option_confirm(RUN_STOP,true);
+ _run(false,last_custom_scene);
+ }
+
+ } break;
+ case RUN_STOP: {
+
+ if (editor_run.get_status()==EditorRun::STATUS_STOP)
+ break;
+
+ editor_run.stop();
+ run_custom_filename.clear();
+ play_button->set_pressed(false);
+ play_button->set_icon(gui_base->get_icon("MainPlay","EditorIcons"));
+ play_scene_button->set_pressed(false);
+ play_scene_button->set_icon(gui_base->get_icon("PlayScene","EditorIcons"));
+ play_custom_scene_button->set_pressed(false);
+ play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom","EditorIcons"));
+ //pause_button->set_pressed(false);
+ if (bool(EDITOR_DEF("run/output/always_close_output_on_stop", true))) {
+ for(int i=0;i<bottom_panel_items.size();i++) {
+ if (bottom_panel_items[i].control==log) {
+ _bottom_panel_switch(false,i);
+ break;
+ }
+ }
+ }
+ emit_signal("stop_pressed");
+
+ } break;
+ case RUN_PLAY_SCENE: {
+ _menu_option_confirm(RUN_STOP,true);
+ _call_build();
+ _run(true);
+
+ } break;
+ case RUN_PLAY_NATIVE: {
+
+ bool autosave = EDITOR_DEF("run/auto_save/save_before_running",true);
+ if (autosave) {
+ _menu_option_confirm(FILE_SAVE_ALL_SCENES, false);
+ }
+ if (run_native->is_deploy_debug_remote_enabled()){
+ _menu_option_confirm(RUN_STOP,true);
+ _call_build();
+ emit_signal("play_pressed");
+ editor_run.run_native_notify();
+ }
+ } break;
+ case RUN_SCENE_SETTINGS: {
+
+ run_settings_dialog->popup_run_settings();
+ } break;
+ case RUN_SETTINGS: {
+
+ project_settings->popup_project_settings();
+ } break;
+ case RUN_PROJECT_MANAGER: {
+
+ if (!p_confirmed) {
+ confirmation->get_ok()->set_text(TTR("Yes"));
+ confirmation->set_text(TTR("Open Project Manager? \n(Unsaved changes will be lost)"));
+ confirmation->popup_centered_minsize();
+ break;
+ }
+
+ _menu_option_confirm(RUN_STOP,true);
+ exiting=true;
+ get_tree()->quit();
+ String exec = OS::get_singleton()->get_executable_path();
+
+ List<String> args;
+ args.push_back("-path");
+ args.push_back(exec.get_base_dir());
+ args.push_back("-pm");
+
+ OS::ProcessID pid=0;
+ Error err = OS::get_singleton()->execute(exec,args,false,&pid);
+ ERR_FAIL_COND(err);
+ } break;
+ case RUN_FILE_SERVER: {
+
+ //file_server
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER));
+
+ if (ischecked) {
+ file_server->stop();
+ run_native->set_deploy_dumb(false);
+ //debug_button->set_icon(gui_base->get_icon("FileServer","EditorIcons"));
+ //debug_button->get_popup()->set_item_text( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER),"Enable File Server");
+ } else {
+ file_server->start();
+ run_native->set_deploy_dumb(true);
+ //debug_button->set_icon(gui_base->get_icon("FileServerActive","EditorIcons"));
+ //debug_button->get_popup()->set_item_text( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER),"Disable File Server");
+ }
+
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER),!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_file_server", !ischecked);
+ } break;
+ case RUN_LIVE_DEBUG: {
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_LIVE_DEBUG));
+
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_LIVE_DEBUG),!ischecked);
+ ScriptEditor::get_singleton()->get_debugger()->set_live_debugging(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_live_debug", !ischecked);
+
+ } break;
+
+ /*case RUN_DEPLOY_DUMB_CLIENTS: {
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_DEPLOY_DUMB_CLIENTS));
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_DEPLOY_DUMB_CLIENTS),!ischecked);
+ run_native->set_deploy_dumb(!ischecked);
+
+ } break;*/
+ case RUN_DEPLOY_REMOTE_DEBUG: {
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG));
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG),!ischecked);
+ run_native->set_deploy_debug_remote(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_deploy_remote_debug", !ischecked);
+
+ } break;
+ case RUN_DEBUG_COLLISONS: {
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_DEBUG_COLLISONS));
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_DEBUG_COLLISONS),!ischecked);
+ run_native->set_debug_collisions(!ischecked);
+ editor_run.set_debug_collisions(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisons", !ischecked);
+
+ } break;
+ case RUN_DEBUG_NAVIGATION: {
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION));
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION),!ischecked);
+ run_native->set_debug_navigation(!ischecked);
+ editor_run.set_debug_navigation(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_navigation", !ischecked);
+
+ } break;
+ case RUN_RELOAD_SCRIPTS: {
+
+
+ bool ischecked = debug_button->get_popup()->is_item_checked( debug_button->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS));
+ debug_button->get_popup()->set_item_checked( debug_button->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS),!ischecked);
+
+ ScriptEditor::get_singleton()->set_live_auto_reload_running_scripts(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_reload_scripts", !ischecked);
+
+ } break;
+ case SETTINGS_UPDATE_ALWAYS: {
+
+ update_menu->get_popup()->set_item_checked(0,true);
+ update_menu->get_popup()->set_item_checked(1,false);
+ OS::get_singleton()->set_low_processor_usage_mode(false);
+ } break;
+ case SETTINGS_UPDATE_CHANGES: {
+
+ update_menu->get_popup()->set_item_checked(0,false);
+ update_menu->get_popup()->set_item_checked(1,true);
+ OS::get_singleton()->set_low_processor_usage_mode(true);
+ } break;
+ case SETTINGS_UPDATE_SPINNER_HIDE: {
+ update_menu->set_icon(gui_base->get_icon("Collapse","EditorIcons"));
+ update_menu->get_popup()->toggle_item_checked(3);
+ } break;
+ case SETTINGS_PREFERENCES: {
+
+ settings_config_dialog->popup_edit_settings();
+ } break;
+ case SETTINGS_OPTIMIZED_PRESETS: {
+
+ //optimized_presets->popup_centered_ratio();
+ } break;
+ case SETTINGS_LOAD_EXPORT_TEMPLATES: {
+
+
+ file_templates->popup_centered_ratio();
+
+ } break;
+ case SETTINGS_TOGGLE_FULLSCREN: {
+
+ OS::get_singleton()->set_window_fullscreen( !OS::get_singleton()->is_window_fullscreen() );
+
+
+ } break;
+ case SETTINGS_PICK_MAIN_SCENE: {
+
+
+ //print_tree();
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ //not for now?
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+
+ //file->set_current_path(current_path);
+ Node *scene = editor_data.get_edited_scene_root();
+ if (scene) {
+ file->set_current_path(scene->get_filename());
+ };
+ file->set_title(TTR("Pick a Main Scene"));
+ file->popup_centered_ratio();
+
+ } break;
+ case SETTINGS_ABOUT: {
+
+ about->popup_centered_minsize(Size2(500,130)*EDSCALE);
+ } break;
+ case SOURCES_REIMPORT: {
+
+ //reimport_dialog->popup_reimport();
+ } break;
+ case DEPENDENCY_LOAD_CHANGED_IMAGES: {
+
+
+
+ } break;
+ case DEPENDENCY_UPDATE_IMPORTED: {
+
+/*
+ bool editing_changed = _find_editing_changed_scene(get_edited_scene());
+
+ import_reload_fn="";
+
+ if (editing_changed) {
+ if (unsaved_cache && !bool(EDITOR_DEF("import/ask_save_before_reimport",false))) {
+ if (!p_confirmed) {
+
+
+ confirmation->get_ok()->set_text("Open");
+ //confirmation->get_cancel()->show();
+ confirmation->set_text("Current scene changed, save and re-import ?");
+ confirmation->popup_centered(Size2(300,70));
+ break;
+
+ }
+ }
+
+ Node *scene = get_edited_scene();
+
+ if (scene->get_filename()=="") {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("Can't import if edited scene was not saved."); //i dont think this code will ever run
+ accept->popup_centered(Size2(300,70));
+ break;
+
+ }
+
+
+ import_reload_fn = scene->get_filename();
+ _save_scene(import_reload_fn);
+ _cleanup_scene();
+
+
+ }
+
+*/
+
+
+ } break;
+
+ default: {
+
+ if (p_option>=OBJECT_METHOD_BASE) {
+
+ ERR_FAIL_COND(!current);
+
+ int idx=p_option-OBJECT_METHOD_BASE;
+
+ List<MethodInfo> methods;
+ current->get_method_list(&methods);
+
+ ERR_FAIL_INDEX( idx, methods.size() );
+ String name=methods[idx].name;
+
+ if (current)
+ current->call(name);
+ } else if (p_option>=IMPORT_PLUGIN_BASE) {
+
+
+ }
+ }
+ }
+}
+
+void EditorNode::_update_debug_options() {
+
+ bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false);
+ bool check_file_server = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false);
+ bool check_debug_collisons = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false);
+ bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
+ bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", false);
+ bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", false);
+
+ if (check_deploy_remote) _menu_option_confirm(RUN_DEPLOY_REMOTE_DEBUG, true);
+ if (check_file_server) _menu_option_confirm(RUN_FILE_SERVER, true);
+ if (check_debug_collisons) _menu_option_confirm(RUN_DEBUG_COLLISONS, true);
+ if (check_debug_navigation) _menu_option_confirm(RUN_DEBUG_NAVIGATION, true);
+ if (check_live_debug) _menu_option_confirm(RUN_LIVE_DEBUG, true);
+ if (check_reload_scripts) _menu_option_confirm(RUN_RELOAD_SCRIPTS, true);
+
+}
+
+Control* EditorNode::get_viewport() {
+
+ return viewport;
+}
+
+
+
+void EditorNode::_editor_select(int p_which) {
+
+ static bool selecting=false;
+ if (selecting || changing_scene)
+ return;
+
+ selecting=true;
+
+
+ ERR_FAIL_INDEX(p_which,editor_table.size());
+
+ for(int i=0;i<main_editor_buttons.size();i++) {
+ main_editor_buttons[i]->set_pressed(i==p_which);
+ }
+
+ selecting=false;
+
+
+ EditorPlugin *new_editor = editor_table[p_which];
+ ERR_FAIL_COND(!new_editor);
+
+ if (editor_plugin_screen==new_editor)
+ return;
+
+ if (editor_plugin_screen) {
+ editor_plugin_screen->make_visible(false);
+ }
+
+ editor_plugin_screen=new_editor;
+ editor_plugin_screen->make_visible(true);
+ editor_plugin_screen->selected_notify();
+
+
+}
+
+void EditorNode::add_editor_plugin(EditorPlugin *p_editor) {
+
+
+ if (p_editor->has_main_screen()) {
+
+ ToolButton *tb = memnew( ToolButton );
+ tb->set_toggle_mode(true);
+ tb->connect("pressed",singleton,"_editor_select",varray(singleton->main_editor_buttons.size()));
+ tb->set_text(p_editor->get_name());
+ singleton->main_editor_buttons.push_back(tb);
+ singleton->main_editor_button_vb->add_child(tb);
+ singleton->editor_table.push_back(p_editor);
+
+ singleton->distraction_free->raise();
+ }
+ singleton->editor_data.add_editor_plugin( p_editor );
+ singleton->add_child(p_editor);
+}
+
+
+void EditorNode::remove_editor_plugin(EditorPlugin *p_editor) {
+
+ if (p_editor->has_main_screen()) {
+
+ for(int i=0;i<singleton->main_editor_buttons.size();i++) {
+
+ if (p_editor->get_name()==singleton->main_editor_buttons[i]->get_text()) {
+
+ if (singleton->main_editor_buttons[i]->is_pressed()) {
+ singleton->_editor_select(EDITOR_SCRIPT);
+ }
+
+ memdelete( singleton->main_editor_buttons[i] );
+ singleton->main_editor_buttons.remove(i);
+
+ break;
+ }
+ }
+
+ //singleton->main_editor_tabs->add_tab(p_editor->get_name());
+ singleton->editor_table.erase(p_editor);
+ }
+ p_editor->make_visible(false);
+ p_editor->clear();
+ singleton->editor_plugins_over->get_plugins_list().erase(p_editor);
+ singleton->remove_child(p_editor);
+ singleton->editor_data.remove_editor_plugin( p_editor );
+
+}
+
+
+
+void EditorNode::_update_addon_config() {
+
+ if (_initializing_addons)
+ return;
+
+ Vector<String> enabled_addons;
+
+ for(Map<String,EditorPlugin*>::Element *E=plugin_addons.front();E;E=E->next()) {
+ enabled_addons.push_back(E->key());
+ }
+
+ if (enabled_addons.size()==0) {
+ GlobalConfig::get_singleton()->set("editor_plugins/enabled",Variant());
+ } else {
+ GlobalConfig::get_singleton()->set("editor_plugins/enabled",enabled_addons);
+ }
+
+ project_settings->queue_save();
+
+}
+
+void EditorNode::set_addon_plugin_enabled(const String& p_addon,bool p_enabled) {
+
+ ERR_FAIL_COND(p_enabled && plugin_addons.has(p_addon));
+ ERR_FAIL_COND(!p_enabled && !plugin_addons.has(p_addon));
+
+ if (!p_enabled) {
+
+ EditorPlugin *addon = plugin_addons[p_addon];
+ remove_editor_plugin(addon);
+ memdelete(addon); //bye
+ plugin_addons.erase(p_addon);
+ _update_addon_config();
+ return;
+ }
+
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+ String addon_path = "res://addons/"+p_addon+"/plugin.cfg";
+ Error err = cf->load(addon_path);
+ if (err!=OK) {
+ show_warning("Unable to enable addon plugin at: '"+addon_path+"' parsing of config failed.");
+ return;
+ }
+
+ if (!cf->has_section_key("plugin","script")) {
+ show_warning("Unable to find script field for addon plugin at: 'res://addons/"+p_addon+"''.");
+ return;
+ }
+
+ String path = cf->get_value("plugin","script");
+ path="res://addons/"+p_addon+"/"+path;
+
+ Ref<Script> script = ResourceLoader::load(path);
+
+
+ if (script.is_null()) {
+ show_warning("Unable to load addon script from path: '"+path+"'.");
+ return;
+ }
+
+ //could check inheritance..
+ if (String(script->get_instance_base_type())!="EditorPlugin") {
+ show_warning("Unable to load addon script from path: '"+path+"' Base type is not EditorPlugin.");
+ return;
+ }
+
+ if (!script->is_tool()) {
+ show_warning("Unable to load addon script from path: '"+path+"' Script is does not support tool mode.");
+ return;
+ }
+
+ EditorPlugin *ep = memnew( EditorPlugin );
+ ep->set_script(script.get_ref_ptr());
+ plugin_addons[p_addon]=ep;
+ add_editor_plugin(ep);
+
+ _update_addon_config();
+
+
+}
+
+bool EditorNode::is_addon_plugin_enabled(const String& p_addon) const {
+
+ return plugin_addons.has(p_addon);
+}
+
+
+void EditorNode::_remove_edited_scene() {
+ int new_index = editor_data.get_edited_scene();
+ int old_index=new_index;
+
+ if (new_index>0) {
+ new_index=new_index-1;
+ } else if (editor_data.get_edited_scene_count()>1) {
+ new_index=1;
+ } else {
+ editor_data.add_edited_scene(-1);
+ new_index=1;
+ }
+
+
+
+ if (editor_data.get_scene_path(old_index)!=String()) {
+ ScriptEditor::get_singleton()->close_builtin_scripts_from_scene(editor_data.get_scene_path(old_index));
+ }
+ _scene_tab_changed(new_index);
+ editor_data.remove_scene(old_index);
+ editor_data.get_undo_redo().clear_history();
+ _update_title();
+ _update_scene_tabs();
+
+ /*
+ if (editor_data.get_edited_scene_count()==1) {
+ //make new scene appear saved
+ set_current_version(editor_data.get_undo_redo().get_version());
+ unsaved_cache=false;
+ }
+ */
+}
+
+void EditorNode::_remove_scene(int index) {
+ //printf("Attempting to remove scene %d (current is %d)\n", index, editor_data.get_edited_scene());
+
+ if (editor_data.get_edited_scene() == index) {
+ //Scene to remove is current scene
+ _remove_edited_scene();
+ }
+ else {
+ // Scene to remove is not active scene
+ editor_data.remove_scene(index);
+ }
+}
+
+void EditorNode::set_edited_scene(Node *p_scene) {
+
+ if (get_editor_data().get_edited_scene_root()) {
+ if (get_editor_data().get_edited_scene_root()->get_parent()==scene_root)
+ scene_root->remove_child(get_editor_data().get_edited_scene_root());
+
+ }
+ get_editor_data().set_edited_scene_root(p_scene);
+
+ if (p_scene && p_scene->cast_to<Popup>())
+ p_scene->cast_to<Popup>()->show(); //show popups
+ scene_tree_dock->set_edited_scene(p_scene);
+ if (get_tree())
+ get_tree()->set_edited_scene_root(p_scene);
+
+ if (p_scene) {
+ if (p_scene->get_parent()!=scene_root)
+ scene_root->add_child(p_scene);
+
+ }
+}
+
+
+
+
+int EditorNode::_get_current_main_editor() {
+
+ for(int i=0;i<editor_table.size();i++) {
+ if (editor_table[i]==editor_plugin_screen)
+ return i;
+ }
+
+ return 0;
+}
+
+Dictionary EditorNode::_get_main_scene_state() {
+
+ Dictionary state;
+ state["main_tab"]=_get_current_main_editor();
+ state["scene_tree_offset"]=scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->get_value();
+ state["property_edit_offset"]=get_property_editor()->get_scene_tree()->get_vscroll_bar()->get_value();
+ state["saved_version"]=saved_version;
+ state["node_filter"]=scene_tree_dock->get_filter();
+ //print_line(" getting main tab: "+itos(state["main_tab"]));
+ return state;
+}
+
+void EditorNode::_set_main_scene_state(Dictionary p_state,Node* p_for_scene) {
+
+ if (get_edited_scene()!=p_for_scene && p_for_scene!=NULL)
+ return; //not for this scene
+
+ //print_line("set current 7 ");
+ changing_scene=false;
+
+#if 0
+ if (p_state.has("main_tab")) {
+ int idx = p_state["main_tab"];
+
+
+ print_line("comes with tab: "+itos(idx));
+ int current=-1;
+ for(int i=0;i<editor_table.size();i++) {
+ if (editor_plugin_screen==editor_table[i]) {
+ current=i;
+ break;
+ }
+ }
+
+
+ if (idx<2 && current<2) {
+ //only set tab for 2D and 3D
+ _editor_select(idx);
+ //print_line(" setting main tab: "+itos(p_state["main_tab"]));
+ }
+ }
+#else
+
+ if (get_edited_scene()) {
+
+ int current=-1;
+ for(int i=0;i<editor_table.size();i++) {
+ if (editor_plugin_screen==editor_table[i]) {
+ current=i;
+ break;
+ }
+ }
+
+ if (current<2) {
+ //use heuristic instead
+
+ int n2d=0,n3d=0;
+ _find_node_types(get_edited_scene(),n2d,n3d);
+ if (n2d>n3d) {
+ _editor_select(EDITOR_2D);
+ } else if (n3d>n2d) {
+ _editor_select(EDITOR_3D);
+
+ }
+ }
+
+ }
+#endif
+
+
+ if (p_state.has("scene_tree_offset"))
+ scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->set_value(p_state["scene_tree_offset"]);
+ if (p_state.has("property_edit_offset"))
+ get_property_editor()->get_scene_tree()->get_vscroll_bar()->set_value(p_state["property_edit_offset"]);
+
+ if (p_state.has("node_filter"))
+ scene_tree_dock->set_filter(p_state["node_filter"]);
+ //print_line("set current 8 ");
+
+ //this should only happen at the very end
+
+ //changing_scene=true; //avoid script change from opening editor
+ ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
+ ScriptEditor::get_singleton()->set_scene_root_script( editor_data.get_scene_root_script(editor_data.get_edited_scene()) );
+ editor_data.notify_edited_scene_changed();
+
+ //changing_scene=false;
+
+}
+
+void EditorNode::set_current_version(uint64_t p_version) {
+
+ saved_version=p_version;
+ editor_data.set_edited_scene_version(p_version);
+}
+
+bool EditorNode::is_changing_scene() const {
+ return changing_scene;
+}
+
+void EditorNode::_clear_undo_history() {
+
+ get_undo_redo()->clear_history();
+}
+
+void EditorNode::set_current_scene(int p_idx) {
+
+ if (editor_data.check_and_update_scene(p_idx)) {
+ call_deferred("_clear_undo_history");
+ }
+
+ changing_scene=true;
+ editor_data.save_edited_scene_state(editor_selection,&editor_history,_get_main_scene_state());
+
+ if (get_editor_data().get_edited_scene_root()) {
+ if (get_editor_data().get_edited_scene_root()->get_parent()==scene_root)
+ scene_root->remove_child(get_editor_data().get_edited_scene_root());
+
+ }
+
+ //print_line("set current 2 ");
+
+ editor_selection->clear();
+ editor_data.set_edited_scene(p_idx);
+
+ Node* new_scene = editor_data.get_edited_scene_root();
+
+ if (new_scene && new_scene->cast_to<Popup>())
+ new_scene->cast_to<Popup>()->show(); //show popups
+
+ //print_line("set current 3 ");
+
+ scene_tree_dock->set_edited_scene(new_scene);
+ if (get_tree())
+ get_tree()->set_edited_scene_root(new_scene);
+
+ if (new_scene) {
+ if (new_scene->get_parent()!=scene_root)
+ scene_root->add_child(new_scene);
+
+ }
+ //print_line("set current 4 ");
+
+
+ Dictionary state = editor_data.restore_edited_scene_state(editor_selection,&editor_history);
+ _edit_current();
+
+ /*if (!unsaved) {
+ saved_version=editor_data.get_undo_redo().get_version();
+ if (p_backwards)
+ saved_version--;
+ else
+ saved_version++;
+ print_line("was saved, updating version");
+ } else {
+ saved_version=state["saved_version"];
+ }*/
+ //_set_main_scene_state(state);
+
+ call_deferred("_set_main_scene_state",state,get_edited_scene()); //do after everything else is done setting up
+ //print_line("set current 6 ");
+
+
+}
+
+bool EditorNode::is_scene_open(const String& p_path) {
+
+ for(int i=0;i<editor_data.get_edited_scene_count();i++) {
+ if (editor_data.get_scene_path(i)==p_path)
+ return true;
+ }
+
+ return false;
+}
+
+void EditorNode::fix_dependencies(const String& p_for_file) {
+ dependency_fixer->edit(p_for_file);
+}
+
+
+
+
+Error EditorNode::load_scene(const String& p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported) {
+
+ if (!is_inside_tree()) {
+ defer_load_scene = p_scene;
+ return OK;
+ }
+
+
+ if(!p_set_inherited) {
+
+
+ for(int i=0;i<editor_data.get_edited_scene_count();i++) {
+
+ if (editor_data.get_scene_path(i)==p_scene) {
+ _scene_tab_changed(i);
+ return OK;
+ }
+ }
+
+ if (!p_force_open_imported && FileAccess::exists(p_scene+".import")) {
+ open_imported->set_text(vformat(TTR("Scene '%s' was automatically imported, so it can't be modified.\nTo make changes to it, a new inherited scene can be created."),p_scene.get_file()));
+ open_imported->popup_centered_minsize();
+ new_inherited_button->grab_focus();
+ open_import_request=p_scene;
+ return OK;
+ }
+
+ }
+
+
+
+ if (p_clear_errors)
+ load_errors->clear();
+
+ String lpath = GlobalConfig::get_singleton()->localize_path(p_scene);
+
+ if (!lpath.begins_with("res://")) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(TTR("Error loading scene, it must be inside the project path. Use 'Import' to open the scene, then save it inside the project path."));
+ accept->popup_centered_minsize();
+ opening_prev=false;
+ return ERR_FILE_NOT_FOUND;
+ }
+
+ int prev = editor_data.get_edited_scene();
+ int idx = editor_data.add_edited_scene(-1);
+ //print_line("load scene callback");
+ //set_current_scene(idx);
+
+ if (!editor_data.get_edited_scene_root() && editor_data.get_edited_scene_count()==2) {
+ _remove_edited_scene();
+ } else {
+ _scene_tab_changed(idx);
+ }
+
+
+
+ //_cleanup_scene(); // i'm sorry but this MUST happen to avoid modified resources to not be reloaded.
+
+ dependency_errors.clear();
+
+ Ref<PackedScene> sdata = ResourceLoader::load(lpath,"",true);
+ if (!sdata.is_valid()) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(TTR("Error loading scene."));
+ accept->popup_centered_minsize();
+ opening_prev=false;
+
+ if (prev!=-1) {
+ set_current_scene(prev);
+ editor_data.remove_scene(idx);
+ }
+ return ERR_FILE_NOT_FOUND;
+ }
+
+ if (!p_ignore_broken_deps && dependency_errors.has(lpath)) {
+
+ current_option=-1;
+ Vector<String> errors;
+ for(Set<String>::Element *E=dependency_errors[lpath].front();E;E=E->next()) {
+
+ errors.push_back(E->get());
+ }
+ dependency_error->show(lpath,errors);
+ opening_prev=false;
+
+ if (prev!=-1) {
+ set_current_scene(prev);
+ editor_data.remove_scene(idx);
+ }
+ return ERR_FILE_MISSING_DEPENDENCIES;
+ }
+
+ dependency_errors.erase(lpath); //at least not self path
+
+ for (Map<String,Set<String> >::Element *E=dependency_errors.front();E;E=E->next()) {
+
+ String txt=vformat(TTR("Scene '%s' has broken dependencies:"),E->key())+"\n";
+ for(Set<String>::Element *F=E->get().front();F;F=F->next()) {
+ txt+="\t"+F->get()+"\n";
+ }
+ add_io_error(txt);
+ }
+
+ if (ResourceCache::has(lpath)) {
+ //used from somewhere else? no problem! update state and replace sdata
+ Ref<PackedScene> ps = Ref<PackedScene>( ResourceCache::get(lpath)->cast_to<PackedScene>() );
+ if (ps.is_valid()) {
+ ps->replace_state( sdata->get_state() );
+ ps->set_last_modified_time( sdata->get_last_modified_time() );
+ sdata=ps;
+ }
+
+ } else {
+ sdata->set_path(lpath,true); //take over path
+ }
+
+ Node*new_scene=sdata->instance(PackedScene::GEN_EDIT_STATE_MAIN);
+
+ if (!new_scene) {
+
+ sdata.unref();
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(TTR("Error loading scene."));
+ accept->popup_centered_minsize();
+ opening_prev=false;
+ if (prev!=-1) {
+ set_current_scene(prev);
+ editor_data.remove_scene(idx);
+ }
+ return ERR_FILE_NOT_FOUND;
+ }
+
+ //guess not needed in the end?
+ //new_scene->clear_internal_tree_resource_paths(); //make sure no internal tree paths to internal resources exist
+
+ /*
+ Node *old_scene = edited_scene;
+ _hide_top_editors();
+ set_edited_scene(NULL);
+ editor_data.clear_editor_states();
+ if (old_scene) {
+ if (!opening_prev && old_scene->get_filename()!="") {
+ previous_scenes.push_back(old_scene->get_filename());
+ }
+ memdelete(old_scene);
+ }
+*/
+
+ if (p_set_inherited) {
+ Ref<SceneState> state = sdata->get_state();
+ state->set_path(lpath);
+ new_scene->set_scene_inherited_state(state);
+ new_scene->set_filename(String());
+ /*
+ if (new_scene->get_scene_instance_state().is_valid())
+ new_scene->get_scene_instance_state()->set_path(String());
+ */
+ }
+
+ new_scene->set_scene_instance_state(Ref<SceneState>());
+
+ set_edited_scene(new_scene);
+ _get_scene_metadata(p_scene);
+ /*
+ editor_data.set_edited_scene_root(new_scene);
+
+ scene_tree_dock->set_selected(new_scene, true);
+ property_editor->edit(new_scene);
+ editor_data.set_edited_scene_root(new_scene);
+*/
+
+ //editor_data.get_undo_redo().clear_history();
+ saved_version=editor_data.get_undo_redo().get_version();
+ _update_title();
+ _update_scene_tabs();
+ _add_to_recent_scenes(lpath);
+
+ prev_scene->set_disabled(previous_scenes.size()==0);
+ opening_prev=false;
+
+ ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
+
+ //top_pallete->set_current_tab(0); //always go to scene
+
+ push_item(new_scene);
+
+ return OK;
+}
+
+
+
+void EditorNode::open_request(const String& p_path) {
+
+ load_scene(p_path); // as it will be opened in separate tab
+ //external_file=p_path;
+ //_menu_option_confirm(FILE_EXTERNAL_OPEN_SCENE,false);
+}
+
+void EditorNode::request_instance_scene(const String &p_path) {
+
+ scene_tree_dock->instance(p_path);
+
+}
+
+void EditorNode::request_instance_scenes(const Vector<String>& p_files) {
+
+ scene_tree_dock->instance_scenes(p_files);
+}
+
+ImportDock *EditorNode::get_import_dock() {
+ return import_dock;
+}
+
+FileSystemDock *EditorNode::get_filesystem_dock() {
+
+ return filesystem_dock;
+}
+SceneTreeDock *EditorNode::get_scene_tree_dock() {
+
+ return scene_tree_dock;
+}
+
+void EditorNode::_instance_request(const Vector<String>& p_files) {
+
+ request_instance_scenes(p_files);
+}
+
+void EditorNode::_property_keyed(const String& p_keyed,const Variant& p_value,bool p_advance) {
+
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_value_key(p_keyed,p_value,p_advance);
+}
+
+void EditorNode::_transform_keyed(Object *sp,const String& p_sub,const Transform& p_key) {
+
+ Spatial *s=sp->cast_to<Spatial>();
+ if (!s)
+ return;
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_transform_key(s,p_sub,p_key);
+}
+
+void EditorNode::update_keying() {
+
+ //print_line("KR: "+itos(p_enabled));
+
+ bool valid=false;
+
+ if (AnimationPlayerEditor::singleton->get_key_editor()->has_keying()) {
+
+ if (editor_history.get_path_size()>=1) {
+
+ Object *obj = ObjectDB::get_instance(editor_history.get_path_object(0));
+ if (obj && obj->cast_to<Node>()) {
+
+ valid=true;
+ }
+ }
+
+ }
+
+ property_editor->set_keying(valid);
+
+ AnimationPlayerEditor::singleton->get_key_editor()->update_keying();
+}
+
+
+void EditorNode::_close_messages() {
+
+ //left_split->set_dragger_visible(false);
+ old_split_ofs = center_split->get_split_offset();
+ center_split->set_split_offset(0);
+ //scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,0);
+}
+
+void EditorNode::_show_messages() {
+
+ //left_split->set_dragger_visible(true);
+ center_split->set_split_offset(old_split_ofs);
+ //scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,log->get_margin(MARGIN_TOP));
+
+}
+
+#if 0
+void EditorNode::animation_panel_make_visible(bool p_visible) {
+
+ if (!p_visible) {
+ animation_panel->hide();
+ } else {
+ animation_panel->show();
+ }
+
+ int idx = settings_menu->get_popup()->get_item_index(SETTINGS_SHOW_ANIMATION);
+ settings_menu->get_popup()->set_item_checked(idx,p_visible);
+}
+
+
+void EditorNode::animation_editor_make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ animation_editor->show();
+ animation_vb->get_parent_control()->minimum_size_changed();
+ //pd_anim->show();
+ top_split->set_collapsed(false);
+
+ //scene_root_parent->set_margin(MARGIN_TOP,animation_editor->get_margin(MARGIN_BOTTOM));
+ } else {
+ //pd_anim->hide();
+ animation_editor->hide();
+ //scene_root_parent->set_margin(MARGIN_TOP,0);
+ if (!animation_vb->get_parent_control())
+ return;
+ animation_vb->get_parent_control()->minimum_size_changed();
+ top_split->set_collapsed(true);
+ }
+
+ animation_editor->set_keying(p_visible);
+
+}
+#endif
+void EditorNode::_add_to_recent_scenes(const String& p_scene) {
+
+ String base="_"+GlobalConfig::get_singleton()->get_resource_path().replace("\\","::").replace("/","::");
+ Vector<String> rc = EDITOR_DEF(base+"/_recent_scenes",Array());
+ String name = p_scene;
+ name=name.replace("res://","");
+ if (rc.find(name)!=-1)
+ rc.erase(name);
+ rc.insert(0,name);
+ if (rc.size()>10)
+ rc.resize(10);
+
+ EditorSettings::get_singleton()->set(base+"/_recent_scenes",rc);
+ EditorSettings::get_singleton()->save();
+ _update_recent_scenes();
+
+}
+
+void EditorNode::_open_recent_scene(int p_idx) {
+
+ String base="_"+GlobalConfig::get_singleton()->get_resource_path().replace("\\","::").replace("/","::");
+ Vector<String> rc = EDITOR_DEF(base+"/_recent_scenes",Array());
+
+ ERR_FAIL_INDEX(p_idx,rc.size());
+
+ String path = "res://"+rc[p_idx];
+
+
+ /*if (unsaved_cache) {
+ _recent_scene=rc[p_idx];
+ open_recent_confirmation->set_text("Discard current scene and open:\n'"+rc[p_idx]+"'");
+ open_recent_confirmation->get_label()->set_align(Label::ALIGN_CENTER);
+ open_recent_confirmation->popup_centered(Size2(400,100));
+ return;
+ }*/
+
+ load_scene(path);
+
+
+}
+
+void EditorNode::_save_optimized() {
+
+
+ //save_optimized_copy(optimized_save->get_optimized_scene(),optimized_save->get_preset());
+#if 0
+ String path = optimized_save->get_optimized_scene();
+
+ uint32_t flags=0;
+
+ String platform="all";
+ Ref<EditorOptimizedSaver> saver=editor_data.get_optimized_saver(optimized_save->get_preset());
+
+ if (saver->is_bundle_scenes_enabled())
+ flags|=SceneSaver::FLAG_BUNDLE_INSTANCED_SCENES;
+ if (saver->is_bundle_resources_enabled())
+ flags|=SceneSaver::FLAG_BUNDLE_RESOURCES;
+ if (saver->is_remove_editor_data_enabled())
+ flags|=SceneSaver::FLAG_OMIT_EDITOR_PROPERTIES;
+ if (saver->is_big_endian_data_enabled())
+ flags|=SceneSaver::FLAG_SAVE_BIG_ENDIAN;
+
+ platform=saver->get_target_platform();
+
+ Error err = SceneSaver::save(path,get_edited_scene(),flags,saver);
+
+ if (err) {
+
+ //accept->"()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("Error saving optimized scene: "+path);
+ accept->popup_centered(Size2(300,70));
+ return;
+
+ }
+
+ project_settings->add_remapped_path(GlobalConfig::get_singleton()->localize_path(get_edited_scene()->get_filename()),GlobalConfig::get_singleton()->localize_path(path),platform);
+#endif
+}
+
+void EditorNode::_update_recent_scenes() {
+
+ String base="_"+GlobalConfig::get_singleton()->get_resource_path().replace("\\","::").replace("/","::");
+ Vector<String> rc = EDITOR_DEF(base+"/_recent_scenes",Array());
+ recent_scenes->clear();
+ for(int i=0;i<rc.size();i++) {
+
+ recent_scenes->add_item(rc[i],i);
+ }
+
+}
+
+void EditorNode::_quick_opened() {
+
+
+ Vector<String> files = quick_open->get_selected_files();
+
+ for (int i = 0; i < files.size(); i++) {
+ String res_path = files[i];
+
+ if (quick_open->get_base_type()=="PackedScene") {
+ open_request(res_path);
+ } else {
+ load_resource(res_path);
+ }
+ }
+}
+
+void EditorNode::_quick_run() {
+
+ _call_build();
+ _run(false,quick_run->get_selected());
+}
+
+
+void EditorNode::notify_child_process_exited() {
+
+ _menu_option_confirm(RUN_STOP,false);
+ stop_button->set_pressed(false);
+ editor_run.stop();
+
+}
+
+
+bool EditorNode::_find_editing_changed_scene(Node *p_from) {
+/*
+ if (!p_from)
+ return false;
+
+ if (p_from->get_filename()!="") {
+
+ StringName fn = p_from->get_filename();
+ for(int i=0;i<import_monitor->get_changes().size();i++) {
+
+ if (fn==import_monitor->get_changes()[i])
+ return true;
+ }
+ }
+
+ for(int i=0;i<p_from->get_child_count();i++) {
+
+ if (_find_editing_changed_scene(p_from->get_child(i)))
+ return true;
+ }
+*/
+ return false;
+}
+
+
+
+
+void EditorNode::add_io_error(const String& p_error) {
+ //CharString err_ut = p_error.utf8();
+ //ERR_PRINT(!err_ut.get_data());
+ _load_error_notify(singleton,p_error);
+}
+
+void EditorNode::_load_error_notify(void* p_ud,const String& p_text) {
+
+
+ EditorNode*en=(EditorNode*)p_ud;
+ en->load_errors->add_image(en->gui_base->get_icon("Error","EditorIcons"));
+ en->load_errors->add_text(p_text+"\n");
+ en->load_error_dialog->popup_centered_ratio(0.5);
+
+}
+
+
+bool EditorNode::_find_scene_in_use(Node* p_node,const String& p_path) const {
+
+ if (p_node->get_filename()==p_path) {
+ return true;
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ if (_find_scene_in_use(p_node->get_child(i),p_path)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+bool EditorNode::is_scene_in_use(const String& p_path) {
+
+ Node *es = get_edited_scene();
+ if (es)
+ return _find_scene_in_use(es,p_path);
+ return false;
+
+}
+
+void EditorNode::register_editor_types() {
+
+ ClassDB::register_class<EditorPlugin>();
+// ClassDB::register_class<EditorImportPlugin>();
+// ClassDB::register_class<EditorExportPlugin>();
+// ClassDB::register_class<EditorScenePostImport>();
+ ClassDB::register_class<EditorScript>();
+ ClassDB::register_class<EditorSelection>();
+ ClassDB::register_class<EditorFileDialog>();
+ //ClassDB::register_type<EditorImportExport>();
+ ClassDB::register_class<EditorSettings>();
+ ClassDB::register_class<EditorSpatialGizmo>();
+ ClassDB::register_class<EditorResourcePreview>();
+ ClassDB::register_class<EditorResourcePreviewGenerator>();
+ ClassDB::register_class<EditorFileSystem>();
+ ClassDB::register_class<EditorFileSystemDirectory>();
+
+
+
+ //ClassDB::register_type<EditorImporter>();
+ //ClassDB::register_type<EditorPostImport>();
+}
+
+void EditorNode::unregister_editor_types() {
+
+ _init_callbacks.clear();
+}
+
+
+void EditorNode::stop_child_process() {
+
+ _menu_option_confirm(RUN_STOP,false);
+}
+
+
+
+
+
+void EditorNode::progress_add_task(const String& p_task,const String& p_label, int p_steps) {
+
+ singleton->progress_dialog->add_task(p_task,p_label,p_steps);
+}
+
+void EditorNode::progress_task_step(const String& p_task, const String& p_state, int p_step,bool p_force_redraw) {
+
+ singleton->progress_dialog->task_step(p_task,p_state,p_step,p_force_redraw);
+
+}
+
+void EditorNode::progress_end_task(const String& p_task) {
+
+ singleton->progress_dialog->end_task(p_task);
+
+}
+
+
+void EditorNode::progress_add_task_bg(const String& p_task,const String& p_label, int p_steps) {
+
+ singleton->progress_hb->add_task(p_task,p_label,p_steps);
+}
+
+void EditorNode::progress_task_step_bg(const String& p_task, int p_step) {
+
+ singleton->progress_hb->task_step(p_task,p_step);
+
+}
+
+void EditorNode::progress_end_task_bg(const String& p_task) {
+
+ singleton->progress_hb->end_task(p_task);
+
+}
+
+
+
+Ref<Texture> EditorNode::_file_dialog_get_icon(const String& p_path) {
+
+
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem_path(p_path.get_base_dir());
+ if (efsd) {
+
+ String file = p_path.get_file();
+ for(int i=0;i<efsd->get_file_count();i++) {
+ if (efsd->get_file(i)==file) {
+
+ String type = efsd->get_file_type(i);
+
+ if (singleton->icon_type_cache.has(type)) {
+ return singleton->icon_type_cache[type];
+ } else {
+ return singleton->icon_type_cache["Object"];
+ }
+
+ }
+ }
+ }
+
+ return singleton->icon_type_cache["Object"];
+}
+
+void EditorNode::_file_dialog_register(FileDialog *p_dialog) {
+
+ singleton->file_dialogs.insert(p_dialog);
+}
+
+void EditorNode::_file_dialog_unregister(FileDialog *p_dialog){
+
+ singleton->file_dialogs.erase(p_dialog);
+}
+
+void EditorNode::_editor_file_dialog_register(EditorFileDialog *p_dialog) {
+
+ singleton->editor_file_dialogs.insert(p_dialog);
+}
+
+void EditorNode::_editor_file_dialog_unregister(EditorFileDialog *p_dialog){
+
+ singleton->editor_file_dialogs.erase(p_dialog);
+}
+
+Vector<EditorNodeInitCallback> EditorNode::_init_callbacks;
+
+Error EditorNode::export_platform(const String& p_platform, const String& p_path, bool p_debug,const String& p_password,bool p_quit_after) {
+
+ export_defer.platform=p_platform;
+ export_defer.path=p_path;
+ export_defer.debug=p_debug;
+ export_defer.password=p_password;
+
+ return OK;
+}
+
+void EditorNode::show_warning(const String& p_text, const String &p_title) {
+
+ warning->set_text(p_text);
+ warning->set_title(p_title);
+ warning->popup_centered_minsize();
+}
+
+void EditorNode::_dock_select_input(const InputEvent& p_input) {
+
+ if (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION) {
+
+ Vector2 point(p_input.mouse_motion.x,p_input.mouse_motion.y);
+
+ int nrect = -1;
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+ if (dock_select_rect[i].has_point(point)) {
+ nrect=i;
+ break;
+ }
+ }
+
+
+ if (nrect!=dock_select_rect_over) {
+ dock_select->update();
+ dock_select_rect_over=nrect;
+
+ }
+
+
+ if (nrect==-1)
+ return;
+
+ if (p_input.type==InputEvent::MOUSE_BUTTON && p_input.mouse_button.button_index==1 && p_input.mouse_button.pressed && dock_popup_selected!=nrect) {
+ Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control();
+ if (dock) {
+ dock_slot[dock_popup_selected]->remove_child(dock);
+ }
+ if (dock_slot[dock_popup_selected]->get_tab_count()==0) {
+ dock_slot[dock_popup_selected]->hide();
+
+ } else {
+
+ dock_slot[dock_popup_selected]->set_current_tab(0);
+ }
+
+ dock_slot[nrect]->add_child(dock);
+ dock_popup_selected=nrect;
+ dock_slot[nrect]->set_current_tab(dock_slot[nrect]->get_tab_count()-1);
+ dock_slot[nrect]->show();
+ dock_select->update();
+
+ VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+ left_l_vsplit,
+ left_r_vsplit,
+ right_l_vsplit,
+ right_r_vsplit,
+ };
+
+ for(int i=0;i<4;i++) {
+ bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count();
+ if (in_use)
+ splits[i]->show();
+ else
+ splits[i]->hide();
+ }
+
+ _save_docks();
+ }
+ }
+}
+
+void EditorNode::_dock_popup_exit() {
+
+ dock_select_rect_over=-1;
+ dock_select->update();
+}
+
+void EditorNode::_dock_pre_popup(int p_which) {
+
+
+ dock_popup_selected=p_which;
+}
+
+void EditorNode::_dock_move_left() {
+
+ if (dock_popup_selected<0 || dock_popup_selected>=DOCK_SLOT_MAX)
+ return;
+ Control *current = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab() );
+ Control *prev = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab()-1 );
+ if (!current || !prev)
+ return;
+ dock_slot[dock_popup_selected]->move_child(current,prev->get_index());
+ dock_slot[dock_popup_selected]->set_current_tab( dock_slot[dock_popup_selected]->get_current_tab()-1 );
+ dock_select->update();
+ _save_docks();
+
+
+}
+
+void EditorNode::_dock_move_right() {
+
+ Control *current = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab() );
+ Control *next = dock_slot[dock_popup_selected]->get_tab_control( dock_slot[dock_popup_selected]->get_current_tab()+1 );
+ if (!current || !next)
+ return;
+ dock_slot[dock_popup_selected]->move_child(next,current->get_index());
+ dock_slot[dock_popup_selected]->set_current_tab( dock_slot[dock_popup_selected]->get_current_tab()+1 );
+ dock_select->update();
+ _save_docks();
+}
+
+void EditorNode::_dock_select_draw(){
+ Size2 s = dock_select->get_size();
+ s.y/=2.0;
+ s.x/=6.0;
+
+ Color used=Color(0.6,0.6,0.6,0.8);
+ Color used_selected=Color(0.8,0.8,0.8,0.8);
+ Color tab_selected=Color(1,1,1,1);
+ Color unused=used;
+ unused.a=0.4;
+ Color unusable=unused;
+ unusable.a=0.1;
+
+ Rect2 unr(s.x*2,0,s.x*2,s.y*2);
+ unr.pos+=Vector2(2,5);
+ unr.size-=Vector2(4,7);
+
+ dock_select->draw_rect(unr,unusable);
+
+ dock_tab_move_left->set_disabled(true);
+ dock_tab_move_right->set_disabled(true);
+
+ if (dock_popup_selected!=-1 && dock_slot[dock_popup_selected]->get_tab_count()) {
+
+ dock_tab_move_left->set_disabled(dock_slot[dock_popup_selected]->get_current_tab()==0);
+ dock_tab_move_right->set_disabled(dock_slot[dock_popup_selected]->get_current_tab()>=dock_slot[dock_popup_selected]->get_tab_count()-1);
+ }
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+ Vector2 ofs;
+
+ switch(i) {
+ case DOCK_SLOT_LEFT_UL: {
+
+ } break;
+ case DOCK_SLOT_LEFT_BL: {
+ ofs.y+=s.y;
+ } break;
+ case DOCK_SLOT_LEFT_UR: {
+ ofs.x+=s.x;
+ } break;
+ case DOCK_SLOT_LEFT_BR: {
+ ofs+=s;
+ } break;
+ case DOCK_SLOT_RIGHT_UL: {
+ ofs.x+=s.x*4;
+ } break;
+ case DOCK_SLOT_RIGHT_BL: {
+ ofs.x+=s.x*4;
+ ofs.y+=s.y;
+
+ } break;
+ case DOCK_SLOT_RIGHT_UR: {
+ ofs.x+=s.x*4;
+ ofs.x+=s.x;
+
+ } break;
+ case DOCK_SLOT_RIGHT_BR: {
+ ofs.x+=s.x*4;
+ ofs+=s;
+
+ } break;
+ }
+
+ Rect2 r(ofs,s);
+ dock_select_rect[i]=r;
+ r.pos+=Vector2(2,5);
+ r.size-=Vector2(4,7);
+
+
+ if (i==dock_select_rect_over) {
+ dock_select->draw_rect(r,used_selected);
+ } else if (dock_slot[i]->get_child_count()==0) {
+ dock_select->draw_rect(r,unused);
+ } else {
+
+ dock_select->draw_rect(r,used);
+ }
+
+ for(int j=0;j<MIN(3,dock_slot[i]->get_child_count());j++) {
+ int xofs = (r.size.width/3)*j;
+ Color c = used;
+ if (i==dock_popup_selected && (dock_slot[i]->get_current_tab()>3 || dock_slot[i]->get_current_tab()==j))
+ c=tab_selected;
+ dock_select->draw_rect(Rect2(2+ofs.x+xofs,ofs.y,r.size.width/3-1,3),c);
+ }
+
+ }
+}
+
+void EditorNode::_save_docks() {
+
+ Ref<ConfigFile> config;
+ config.instance();
+
+ _save_docks_to_config(config, "docks");
+ editor_data.get_plugin_window_layout(config);
+
+ config->save(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
+
+}
+
+void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String& p_section) {
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+ String names;
+ for(int j=0;j<dock_slot[i]->get_tab_count();j++) {
+ String name = dock_slot[i]->get_tab_control(j)->get_name();
+ if (names!="")
+ names+=",";
+ names+=name;
+ }
+
+ if (names!="") {
+ p_layout->set_value(p_section,"dock_"+itos(i+1),names);
+ }
+ }
+
+ p_layout->set_value(p_section,"dock_filesystem_split",filesystem_dock->get_split_offset());
+
+ VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+ left_l_vsplit,
+ left_r_vsplit,
+ right_l_vsplit,
+ right_r_vsplit,
+ };
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+
+ if (splits[i]->is_visible_in_tree()) {
+ p_layout->set_value(p_section,"dock_split_"+itos(i+1),splits[i]->get_split_offset());
+ }
+ }
+
+
+ HSplitContainer *h_splits[4]={
+ left_l_hsplit,
+ left_r_hsplit,
+ main_hsplit,
+ right_hsplit,
+ };
+
+ for(int i=0;i<4;i++) {
+
+ p_layout->set_value(p_section,"dock_hsplit_"+itos(i+1),h_splits[i]->get_split_offset());
+ }
+
+}
+
+void EditorNode::save_layout() {
+
+ dock_drag_timer->start();
+}
+
+void EditorNode::_dock_split_dragged(int ofs) {
+
+ dock_drag_timer->start();
+}
+
+void EditorNode::_load_docks() {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_project_settings_path().plus_file("editor_layout.cfg"));
+ if (err!=OK) {
+ //no config
+ if (overridden_default_layout>=0) {
+ _layout_menu_option(overridden_default_layout);
+ }
+ return;
+ }
+
+ _load_docks_from_config(config, "docks");
+ editor_data.set_plugin_window_layout(config);
+
+}
+
+
+void EditorNode::_update_dock_slots_visibility() {
+
+ VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+ left_l_vsplit,
+ left_r_vsplit,
+ right_l_vsplit,
+ right_r_vsplit,
+ };
+
+
+ HSplitContainer*h_splits[4]={
+ left_l_hsplit,
+ left_r_hsplit,
+ main_hsplit,
+ right_hsplit,
+ };
+
+ if (!docks_visible) {
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+ dock_slot[i]->hide();
+ }
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+ splits[i]->hide();
+ }
+
+ right_hsplit->hide();
+ bottom_panel->hide();
+ } else {
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+ if (dock_slot[i]->get_tab_count())
+ dock_slot[i]->show();
+ else
+ dock_slot[i]->hide();
+
+ }
+
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+ bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count();
+ if (in_use)
+ splits[i]->show();
+ else
+ splits[i]->hide();
+ }
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+ if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) {
+ dock_slot[i]->set_current_tab(0);
+ }
+ }
+ bottom_panel->show();
+ right_hsplit->show();
+ }
+}
+
+void EditorNode::_update_top_menu_visibility() {
+
+ return; // I think removing top menu is too much
+ /*
+ if (distraction_free->is_pressed()) {
+ play_cc->hide();
+ menu_hb->hide();
+ scene_tabs->hide();
+ } else {
+ play_cc->show();
+ menu_hb->show();
+ scene_tabs->show();
+ }*/
+}
+
+void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section) {
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+ if (!p_layout->has_section_key(p_section,"dock_"+itos(i+1)))
+ continue;
+
+ Vector<String> names = String(p_layout->get_value(p_section,"dock_"+itos(i+1))).split(",");
+
+ for(int j=0;j<names.size();j++) {
+
+ String name=names[j];
+ //find it, in a horribly inefficient way
+ int atidx=-1;
+ Control *node=NULL;
+ for(int k=0;k<DOCK_SLOT_MAX;k++) {
+ if (!dock_slot[k]->has_node(name))
+ continue;
+ node=dock_slot[k]->get_node(name)->cast_to<Control>();
+ if (!node)
+ continue;
+ atidx=k;
+ break;
+ }
+ if (atidx==-1) //well, it's not anywhere
+ continue;
+
+ if (atidx==i) {
+ node->raise();
+ continue;
+ }
+
+
+ dock_slot[atidx]->remove_child(node);
+
+ if (dock_slot[atidx]->get_tab_count()==0) {
+ dock_slot[atidx]->hide();
+
+ }
+ dock_slot[i]->add_child(node);
+ dock_slot[i]->show();
+ }
+ }
+
+ int fs_split_ofs = 0;
+ if (p_layout->has_section_key(p_section,"dock_filesystem_split")) {
+ fs_split_ofs = p_layout->get_value(p_section,"dock_filesystem_split");
+ }
+ filesystem_dock->set_split_offset(fs_split_ofs);
+
+ VSplitContainer*splits[DOCK_SLOT_MAX/2]={
+ left_l_vsplit,
+ left_r_vsplit,
+ right_l_vsplit,
+ right_r_vsplit,
+ };
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+
+ if (!p_layout->has_section_key(p_section,"dock_split_"+itos(i+1)))
+ continue;
+
+ int ofs = p_layout->get_value(p_section,"dock_split_"+itos(i+1));
+ splits[i]->set_split_offset(ofs);
+ }
+
+ HSplitContainer*h_splits[4]={
+ left_l_hsplit,
+ left_r_hsplit,
+ main_hsplit,
+ right_hsplit,
+ };
+
+ for(int i=0;i<4;i++) {
+ if (!p_layout->has_section_key(p_section,"dock_hsplit_"+itos(i+1)))
+ continue;
+ int ofs = p_layout->get_value(p_section,"dock_hsplit_"+itos(i+1));
+ h_splits[i]->set_split_offset(ofs);
+ }
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++) {
+ bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count();
+ if (in_use)
+ splits[i]->show();
+ else
+ splits[i]->hide();
+ }
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+
+ if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) {
+ dock_slot[i]->set_current_tab(0);
+ }
+ }
+}
+
+
+void EditorNode::_update_layouts_menu() {
+
+ editor_layouts->clear();
+ overridden_default_layout=-1;
+
+ editor_layouts->set_size(Vector2());
+ editor_layouts->add_shortcut(ED_SHORTCUT("layout/save",TTR("Save Layout")), SETTINGS_LAYOUT_SAVE);
+ editor_layouts->add_shortcut(ED_SHORTCUT("layout/delete",TTR("Delete Layout")), SETTINGS_LAYOUT_DELETE);
+ editor_layouts->add_separator();
+ editor_layouts->add_shortcut(ED_SHORTCUT("layout/default",TTR("Default")), SETTINGS_LAYOUT_DEFAULT);
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+ if (err!=OK) {
+ return; //no config
+ }
+
+ List<String> layouts;
+ config.ptr()->get_sections(&layouts);
+
+ for (List<String>::Element *E=layouts.front();E;E=E->next()) {
+
+ String layout=E->get();
+
+ if (layout==TTR("Default")) {
+ editor_layouts->remove_item(editor_layouts->get_item_index(SETTINGS_LAYOUT_DEFAULT));
+ overridden_default_layout=editor_layouts->get_item_count();
+ }
+
+ editor_layouts->add_item(layout);
+ }
+
+}
+
+void EditorNode::_layout_menu_option(int p_id) {
+
+ switch (p_id) {
+
+ case SETTINGS_LAYOUT_SAVE: {
+
+ current_option=p_id;
+ layout_dialog->set_title(TTR("Save Layout"));
+ layout_dialog->get_ok()->set_text(TTR("Save"));
+ layout_dialog->popup_centered();
+ } break;
+ case SETTINGS_LAYOUT_DELETE: {
+
+ current_option=p_id;
+ layout_dialog->set_title(TTR("Delete Layout"));
+ layout_dialog->get_ok()->set_text(TTR("Delete"));
+ layout_dialog->popup_centered();
+ } break;
+ case SETTINGS_LAYOUT_DEFAULT: {
+
+ _load_docks_from_config(default_layout, "docks");
+ _save_docks();
+ } break;
+ default: {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_settings_path().plus_file("editor_layouts.cfg"));
+ if (err!=OK) {
+ return; //no config
+ }
+
+ _load_docks_from_config(config, editor_layouts->get_item_text(p_id));
+ _save_docks();
+ }
+ }
+
+}
+
+
+void EditorNode::_scene_tab_script_edited(int p_tab) {
+
+ Ref<Script> script = editor_data.get_scene_root_script(p_tab);
+ if (script.is_valid())
+ edit_resource(script);
+}
+
+void EditorNode::_scene_tab_closed(int p_tab) {
+ current_option = SCENE_TAB_CLOSE;
+ tab_closing = p_tab;
+
+ bool unsaved = (p_tab==editor_data.get_edited_scene()) ?
+ saved_version!=editor_data.get_undo_redo().get_version() :
+ editor_data.get_scene_version(p_tab)!=0;
+ if (unsaved) {
+ confirmation->get_ok()->set_text(TTR("Yes"));
+
+ //confirmation->get_cancel()->show();
+ confirmation->set_text(TTR("Close scene? (Unsaved changes will be lost)"));
+ confirmation->popup_centered_minsize();
+ }
+ else {
+ _remove_scene(p_tab);
+ _update_scene_tabs();
+ }
+
+}
+
+
+void EditorNode::_scene_tab_changed(int p_tab) {
+
+
+ //print_line("set current 1 ");
+ bool unsaved = (saved_version!=editor_data.get_undo_redo().get_version());
+ //print_line("version: "+itos(editor_data.get_undo_redo().get_version())+", saved "+itos(saved_version));
+
+ if (p_tab==editor_data.get_edited_scene())
+ return; //pointless
+
+ uint64_t next_scene_version = editor_data.get_scene_version(p_tab);
+
+
+
+ //print_line("scene tab changed???");
+ editor_data.get_undo_redo().create_action(TTR("Switch Scene Tab"));
+ editor_data.get_undo_redo().add_do_method(this,"set_current_version",unsaved?saved_version:0);
+ editor_data.get_undo_redo().add_do_method(this,"set_current_scene",p_tab);
+ //editor_data.get_undo_redo().add_do_method(scene_tabs,"set_current_tab",p_tab);
+ //editor_data.get_undo_redo().add_do_method(scene_tabs,"ensure_tab_visible",p_tab);
+ editor_data.get_undo_redo().add_do_method(this,"set_current_version",next_scene_version==0?editor_data.get_undo_redo().get_version()+1:next_scene_version);
+
+ editor_data.get_undo_redo().add_undo_method(this,"set_current_version",next_scene_version);
+ editor_data.get_undo_redo().add_undo_method(this,"set_current_scene",editor_data.get_edited_scene());
+ //editor_data.get_undo_redo().add_undo_method(scene_tabs,"set_current_tab",editor_data.get_edited_scene());
+ //editor_data.get_undo_redo().add_undo_method(scene_tabs,"ensure_tab_visible",p_tab,editor_data.get_edited_scene());
+ editor_data.get_undo_redo().add_undo_method(this,"set_current_version",saved_version);
+ editor_data.get_undo_redo().commit_action();
+
+}
+
+void EditorNode::_toggle_search_bar(bool p_pressed) {
+
+ property_editor->set_use_filter(p_pressed);
+
+ if (p_pressed) {
+
+ search_bar->show();
+ search_box->grab_focus();
+ search_box->select_all();
+ } else {
+
+ search_bar->hide();
+ }
+}
+
+void EditorNode::_clear_search_box() {
+
+ if (search_box->get_text()=="")
+ return;
+
+ search_box->clear();
+ property_editor->update_tree();
+}
+
+ToolButton *EditorNode::add_bottom_panel_item(String p_text,Control *p_item) {
+
+ ToolButton *tb = memnew( ToolButton );
+ tb->connect("toggled",this,"_bottom_panel_switch",varray(bottom_panel_items.size()));
+ tb->set_text(p_text);
+ tb->set_toggle_mode(true);
+ tb->set_focus_mode(Control::FOCUS_NONE);
+ bottom_panel_vb->add_child(p_item);
+ bottom_panel_hb->raise();
+ bottom_panel_hb->add_child(tb);
+ p_item->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ p_item->hide();
+ BottomPanelItem bpi;
+ bpi.button=tb;
+ bpi.control=p_item;
+ bpi.name=p_text;
+ bottom_panel_items.push_back(bpi);
+
+ return tb;
+
+}
+
+bool EditorNode::are_bottom_panels_hidden() const {
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+ if (bottom_panel_items[i].button->is_pressed())
+ return false;
+ }
+
+ return true;
+}
+
+void EditorNode::hide_bottom_panel() {
+
+ _bottom_panel_switch(false,0);
+
+}
+
+void EditorNode::make_bottom_panel_item_visible(Control *p_item) {
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+
+ if (bottom_panel_items[i].control==p_item) {
+ _bottom_panel_switch(true,i);
+ break;
+ }
+ }
+}
+
+void EditorNode::raise_bottom_panel_item(Control *p_item) {
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+
+ if (bottom_panel_items[i].control==p_item) {
+ bottom_panel_items[i].button->raise();
+ SWAP( bottom_panel_items[i], bottom_panel_items[bottom_panel_items.size()-1]);
+ break;
+ }
+ }
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+ bottom_panel_items[i].button->disconnect("toggled",this,"_bottom_panel_switch");
+ bottom_panel_items[i].button->connect("toggled",this,"_bottom_panel_switch",varray(i));
+ }
+
+}
+
+void EditorNode::remove_bottom_panel_item(Control *p_item) {
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+
+ if (bottom_panel_items[i].control==p_item) {
+ if (p_item->is_visible_in_tree()) {
+ _bottom_panel_switch(false,0);
+ }
+ bottom_panel_vb->remove_child(bottom_panel_items[i].control);
+ bottom_panel_hb->remove_child(bottom_panel_items[i].button);
+ memdelete( bottom_panel_items[i].button );
+ bottom_panel_items.remove(i);
+ break;
+ }
+ }
+
+ for(int i=0;i<bottom_panel_items.size();i++) {
+ bottom_panel_items[i].button->disconnect("toggled",this,"_bottom_panel_switch");
+ bottom_panel_items[i].button->connect("toggled",this,"_bottom_panel_switch",varray(i));
+ }
+}
+
+void EditorNode::_bottom_panel_switch(bool p_enable,int p_idx) {
+
+ ERR_FAIL_INDEX(p_idx,bottom_panel_items.size());
+
+
+
+ if (p_enable) {
+ for(int i=0;i<bottom_panel_items.size();i++) {
+
+ bottom_panel_items[i].button->set_pressed(i==p_idx);
+ bottom_panel_items[i].control->set_visible(i==p_idx);
+ }
+ center_split->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE);
+ center_split->set_collapsed(false);
+ } else {
+ for(int i=0;i<bottom_panel_items.size();i++) {
+
+ bottom_panel_items[i].button->set_pressed(false);
+ bottom_panel_items[i].control->set_visible(false);
+ }
+ center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);
+ center_split->set_collapsed(true);
+ }
+}
+
+void EditorNode::set_docks_visible(bool p_show) {
+ docks_visible = p_show;
+ _update_dock_slots_visibility();
+}
+
+bool EditorNode::get_docks_visible() const {
+ return docks_visible;
+}
+
+void EditorNode::_toggle_distraction_free_mode() {
+
+ set_distraction_free_mode( distraction_free->is_pressed() );
+}
+
+void EditorNode::set_distraction_free_mode(bool p_enter) {
+
+ distraction_free->set_pressed(p_enter);
+
+ if (p_enter) {
+ if (docks_visible) {
+ set_docks_visible(false);
+ }
+ } else {
+ set_docks_visible(true);
+ }
+ _update_top_menu_visibility();
+}
+
+bool EditorNode::get_distraction_free_mode() const {
+ return distraction_free->is_pressed();
+}
+
+void EditorNode::add_control_to_dock(DockSlot p_slot,Control* p_control) {
+ ERR_FAIL_INDEX(p_slot,DOCK_SLOT_MAX);
+ dock_slot[p_slot]->add_child(p_control);
+ _update_dock_slots_visibility();
+
+}
+
+void EditorNode::remove_control_from_dock(Control* p_control) {
+
+ Control *dock=NULL;
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+ if (p_control->get_parent()==dock_slot[i]) {
+ dock=dock_slot[i];
+ break;
+ }
+ }
+
+ ERR_EXPLAIN("Control was not in dock");
+ ERR_FAIL_COND(!dock);
+
+ dock->remove_child(p_control);
+ _update_dock_slots_visibility();
+}
+
+Variant EditorNode::drag_resource(const Ref<Resource>& p_res,Control* p_from) {
+
+
+ Control *drag_control = memnew( Control );
+ TextureRect *drag_preview = memnew( TextureRect );
+ Label* label=memnew( Label );
+
+ Ref<Texture> preview;
+
+ {
+ //todo make proper previews
+ Ref<ImageTexture> pic = gui_base->get_icon("FileBig","EditorIcons");
+ Image img = pic->get_data();
+ img.resize(48,48); //meh
+ Ref<ImageTexture> resized_pic = Ref<ImageTexture>( memnew( ImageTexture) );
+ resized_pic->create_from_image(img);
+ preview=resized_pic;
+ }
+
+ drag_preview->set_texture(preview);
+ drag_control->add_child(drag_preview);
+ if (p_res->get_path().is_resource_file()) {
+ label->set_text(p_res->get_path().get_file());
+ } else if (p_res->get_name()!="") {
+ label->set_text(p_res->get_name());
+ } else {
+ label->set_text(p_res->get_class());
+
+ }
+
+ drag_control->add_child(label);
+
+ p_from->set_drag_preview(drag_control); //wait until it enters scene
+
+ label->set_pos( Point2((preview->get_width()-label->get_minimum_size().width)/2,preview->get_height()) );
+
+ Dictionary drag_data;
+ drag_data["type"]="resource";
+ drag_data["resource"]=p_res;
+ drag_data["from"]=p_from;
+
+
+ return drag_data;
+
+}
+
+Variant EditorNode::drag_files(const Vector<String>& p_files, Control *p_from){
+
+ VBoxContainer *files = memnew( VBoxContainer );
+
+ int max_files=6;
+
+ for(int i=0;i<MIN(max_files,p_files.size());i++) {
+
+ Label* label=memnew( Label );
+ label->set_text(p_files[i].get_file());
+ files->add_child(label);
+ }
+
+ if (p_files.size()>max_files) {
+
+ Label* label=memnew( Label );
+ label->set_text(vformat(TTR("%d more file(s)"), p_files.size()-max_files));
+ files->add_child(label);
+
+ }
+ Dictionary drag_data;
+ drag_data["type"]="files";
+ drag_data["files"]=p_files;
+ drag_data["from"]=p_from;
+
+ p_from->set_drag_preview(files); //wait until it enters scene
+
+ return drag_data;
+
+}
+
+Variant EditorNode::drag_files_and_dirs(const Vector<String>& p_files, Control *p_from){
+
+ VBoxContainer *files = memnew( VBoxContainer );
+
+ int max_files=6;
+
+ for(int i=0;i<MIN(max_files,p_files.size());i++) {
+
+ Label* label=memnew( Label );
+ label->set_text(p_files[i].get_file());
+ files->add_child(label);
+ }
+
+ if (p_files.size()>max_files) {
+
+ Label* label=memnew( Label );
+ label->set_text(vformat(TTR("%d more file(s) or folder(s)"), p_files.size()-max_files));
+ files->add_child(label);
+
+ }
+ Dictionary drag_data;
+ drag_data["type"]="files_and_dirs";
+ drag_data["files"]=p_files;
+ drag_data["from"]=p_from;
+
+ p_from->set_drag_preview(files); //wait until it enters scene
+
+ return drag_data;
+
+}
+
+
+void EditorNode::_dropped_files(const Vector<String>& p_files,int p_screen) {
+
+ String cur_path = filesystem_dock->get_current_path();
+// for(int i=0;i<EditorImportExport::get_singleton()->get_import_plugin_count();i++) {
+// EditorImportExport::get_singleton()->get_import_plugin(i)->import_from_drop(p_files,cur_path);
+// }
+}
+void EditorNode::_file_access_close_error_notify(const String& p_str) {
+
+ add_io_error("Unable to write to file '"+p_str+"', file in use, locked or lacking permissions.");
+}
+
+
+void EditorNode::reload_scene(const String& p_path) {
+
+
+ //first of all, reload textures as they might have changed on disk
+
+ List<Ref<Resource> > cached;
+ ResourceCache::get_cached_resources(&cached);
+ List<Ref<Resource> > to_clear; //clear internal resources from previous scene from being used
+ for(List<Ref<Resource> >::Element *E=cached.front();E;E=E->next()) {
+
+ if (E->get()->get_path().begins_with(p_path+"::")) //subresources of existing scene
+ to_clear.push_back(E->get());
+
+ if (!E->get()->cast_to<Texture>())
+ continue;
+ if (!E->get()->get_path().is_resource_file() && !E->get()->get_path().is_abs_path())
+ continue;
+ if (!FileAccess::exists(E->get()->get_path()))
+ continue;
+ uint64_t mt = FileAccess::get_modified_time(E->get()->get_path());
+ if (mt!=E->get()->get_last_modified_time()) {
+ E->get()->reload_from_file();
+ }
+ }
+
+ //so reload reloads everything, clear subresources of previous scene
+ while(to_clear.front()) {
+ to_clear.front()->get()->set_path("");
+ to_clear.pop_front();
+ }
+
+ int scene_idx=-1;
+ for(int i=0;i<editor_data.get_edited_scene_count();i++) {
+
+ if (editor_data.get_scene_path(i)==p_path) {
+ scene_idx=i;
+ break;
+ }
+ }
+
+ int current_tab = editor_data.get_edited_scene();
+
+
+ if (scene_idx==-1) {
+ if (get_edited_scene()) {
+ //scene is not open, so at it might be instanced, just refresh, set tab to itself and it will reload
+ set_current_scene(current_tab);
+ editor_data.get_undo_redo().clear_history();
+ }
+ return;
+ }
+
+
+ if (current_tab==scene_idx) {
+ editor_data.apply_changes_in_editors();
+ _set_scene_metadata(p_path);
+
+ }
+ //remove scene
+ _remove_scene(scene_idx);
+ //reload scene
+ load_scene(p_path);
+ //adjust index so tab is back a the previous position
+ editor_data.move_edited_scene_to_index(scene_idx);
+ get_undo_redo()->clear_history();
+ //recover the tab
+ scene_tabs->set_current_tab(current_tab);
+ _scene_tab_changed(current_tab);
+}
+
+int EditorNode::plugin_init_callback_count=0;
+
+void EditorNode::add_plugin_init_callback(EditorPluginInitializeCallback p_callback) {
+
+ ERR_FAIL_COND(plugin_init_callback_count==MAX_INIT_CALLBACKS);
+
+ plugin_init_callbacks[plugin_init_callback_count++]=p_callback;
+}
+
+EditorPluginInitializeCallback EditorNode::plugin_init_callbacks[EditorNode::MAX_INIT_CALLBACKS];
+
+
+int EditorNode::build_callback_count=0;
+
+void EditorNode::add_build_callback(EditorBuildCallback p_callback) {
+
+ ERR_FAIL_COND(build_callback_count==MAX_INIT_CALLBACKS);
+
+ build_callbacks[build_callback_count++]=p_callback;
+}
+
+EditorPluginInitializeCallback EditorNode::build_callbacks[EditorNode::MAX_BUILD_CALLBACKS];
+
+void EditorNode::_call_build() {
+
+ for(int i=0;i<build_callback_count;i++) {
+ build_callbacks[i]();
+ }
+}
+
+
+void EditorNode::_inherit_imported(const String& p_action) {
+
+ open_imported->hide();
+ load_scene(open_import_request,true,true);
+
+}
+
+void EditorNode::_open_imported() {
+
+ load_scene(open_import_request,true,false,true,true);
+}
+
+void EditorNode::_bind_methods() {
+
+
+ ClassDB::bind_method("_menu_option",&EditorNode::_menu_option);
+ ClassDB::bind_method("_menu_confirm_current",&EditorNode::_menu_confirm_current);
+ ClassDB::bind_method("_dialog_action",&EditorNode::_dialog_action);
+ ClassDB::bind_method("_resource_selected",&EditorNode::_resource_selected,DEFVAL(""));
+ ClassDB::bind_method("_property_editor_forward",&EditorNode::_property_editor_forward);
+ ClassDB::bind_method("_property_editor_back",&EditorNode::_property_editor_back);
+ ClassDB::bind_method("_editor_select",&EditorNode::_editor_select);
+ ClassDB::bind_method("_node_renamed",&EditorNode::_node_renamed);
+ ClassDB::bind_method("edit_node",&EditorNode::edit_node);
+ ClassDB::bind_method("_imported",&EditorNode::_imported);
+ ClassDB::bind_method("_unhandled_input",&EditorNode::_unhandled_input);
+
+ ClassDB::bind_method("_get_scene_metadata",&EditorNode::_get_scene_metadata);
+ ClassDB::bind_method("set_edited_scene",&EditorNode::set_edited_scene);
+ ClassDB::bind_method("open_request",&EditorNode::open_request);
+ ClassDB::bind_method("_instance_request",&EditorNode::_instance_request);
+ ClassDB::bind_method("update_keying",&EditorNode::update_keying);
+ ClassDB::bind_method("_property_keyed",&EditorNode::_property_keyed);
+ ClassDB::bind_method("_transform_keyed",&EditorNode::_transform_keyed);
+ ClassDB::bind_method("_close_messages",&EditorNode::_close_messages);
+ ClassDB::bind_method("_show_messages",&EditorNode::_show_messages);
+ ClassDB::bind_method("_vp_resized",&EditorNode::_vp_resized);
+ ClassDB::bind_method("_quick_opened",&EditorNode::_quick_opened);
+ ClassDB::bind_method("_quick_run",&EditorNode::_quick_run);
+
+ ClassDB::bind_method("_resource_created",&EditorNode::_resource_created);
+
+ ClassDB::bind_method("_import_action",&EditorNode::_import_action);
+ //ClassDB::bind_method("_import",&EditorNode::_import);
+ //ClassDB::bind_method("_import_conflicts_solved",&EditorNode::_import_conflicts_solved);
+ ClassDB::bind_method("_open_recent_scene",&EditorNode::_open_recent_scene);
+ //ClassDB::bind_method("_open_recent_scene_confirm",&EditorNode::_open_recent_scene_confirm);
+
+ ClassDB::bind_method("_save_optimized",&EditorNode::_save_optimized);
+
+ ClassDB::bind_method("stop_child_process",&EditorNode::stop_child_process);
+
+ ClassDB::bind_method("_sources_changed",&EditorNode::_sources_changed);
+ ClassDB::bind_method("_fs_changed",&EditorNode::_fs_changed);
+ ClassDB::bind_method("_dock_select_draw",&EditorNode::_dock_select_draw);
+ ClassDB::bind_method("_dock_select_input",&EditorNode::_dock_select_input);
+ ClassDB::bind_method("_dock_pre_popup",&EditorNode::_dock_pre_popup);
+ ClassDB::bind_method("_dock_split_dragged",&EditorNode::_dock_split_dragged);
+ ClassDB::bind_method("_save_docks",&EditorNode::_save_docks);
+ ClassDB::bind_method("_dock_popup_exit",&EditorNode::_dock_popup_exit);
+ ClassDB::bind_method("_dock_move_left",&EditorNode::_dock_move_left);
+ ClassDB::bind_method("_dock_move_right",&EditorNode::_dock_move_right);
+
+ ClassDB::bind_method("_layout_menu_option",&EditorNode::_layout_menu_option);
+
+ ClassDB::bind_method("set_current_scene",&EditorNode::set_current_scene);
+ ClassDB::bind_method("set_current_version",&EditorNode::set_current_version);
+ ClassDB::bind_method("_scene_tab_changed",&EditorNode::_scene_tab_changed);
+ ClassDB::bind_method("_scene_tab_closed",&EditorNode::_scene_tab_closed);
+ ClassDB::bind_method("_scene_tab_script_edited",&EditorNode::_scene_tab_script_edited);
+ ClassDB::bind_method("_set_main_scene_state",&EditorNode::_set_main_scene_state);
+ ClassDB::bind_method("_update_scene_tabs",&EditorNode::_update_scene_tabs);
+
+ ClassDB::bind_method("_prepare_history",&EditorNode::_prepare_history);
+ ClassDB::bind_method("_select_history",&EditorNode::_select_history);
+
+ ClassDB::bind_method("_toggle_search_bar",&EditorNode::_toggle_search_bar);
+ ClassDB::bind_method("_clear_search_box",&EditorNode::_clear_search_box);
+ ClassDB::bind_method("_clear_undo_history",&EditorNode::_clear_undo_history);
+ ClassDB::bind_method("_dropped_files",&EditorNode::_dropped_files);
+ ClassDB::bind_method("_toggle_distraction_free_mode",&EditorNode::_toggle_distraction_free_mode);
+
+
+
+// ClassDB::bind_method(D_METHOD("add_editor_import_plugin", "plugin"), &EditorNode::add_editor_import_plugin);
+ //ClassDB::bind_method(D_METHOD("remove_editor_import_plugin", "plugin"), &EditorNode::remove_editor_import_plugin);
+ ClassDB::bind_method(D_METHOD("get_gui_base"), &EditorNode::get_gui_base);
+ ClassDB::bind_method(D_METHOD("_bottom_panel_switch"), &EditorNode::_bottom_panel_switch);
+
+ ClassDB::bind_method(D_METHOD("_open_imported"), &EditorNode::_open_imported);
+ ClassDB::bind_method(D_METHOD("_inherit_imported"), &EditorNode::_inherit_imported);
+
+ ADD_SIGNAL( MethodInfo("play_pressed") );
+ ADD_SIGNAL( MethodInfo("pause_pressed") );
+ ADD_SIGNAL( MethodInfo("stop_pressed") );
+ ADD_SIGNAL( MethodInfo("request_help") );
+ ADD_SIGNAL( MethodInfo("script_add_function_request",PropertyInfo(Variant::OBJECT,"obj"),PropertyInfo(Variant::STRING,"function"),PropertyInfo(Variant::POOL_STRING_ARRAY,"args")) );
+ ADD_SIGNAL( MethodInfo("resource_saved",PropertyInfo(Variant::OBJECT,"obj")) );
+
+
+
+}
+
+static Node* _resource_get_edited_scene() {
+
+ return EditorNode::get_singleton()->get_edited_scene();
+}
+
+EditorNode::EditorNode() {
+
+ Resource::_get_local_scene_func=_resource_get_edited_scene;
+
+ VisualServer::get_singleton()->textures_keep_original(true);
+
+ EditorHelp::generate_doc(); //before any editor classes are crated
+ SceneState::set_disable_placeholders(true);
+ editor_initialize_certificates(); //for asset sharing
+
+ InputDefault *id = Input::get_singleton()->cast_to<InputDefault>();
+
+ if (id) {
+
+ if (!OS::get_singleton()->has_touchscreen_ui_hint() && Input::get_singleton()) {
+ //only if no touchscreen ui hint, set emulation
+ id->set_emulate_touch(false); //just disable just in case
+ }
+ id->set_custom_mouse_cursor(RES());
+ }
+
+
+ singleton=this;
+ exiting=false;
+ last_checked_version=0;
+ changing_scene=false;
+ _initializing_addons=false;
+ docks_visible = true;
+
+
+ FileAccess::set_backup_save(true);
+
+ TranslationServer::get_singleton()->set_enabled(false);
+ // load settings
+ if (!EditorSettings::get_singleton())
+ EditorSettings::create();
+
+ bool use_single_dock_column = false;
+ {
+ int dpi_mode = EditorSettings::get_singleton()->get("interface/hidpi_mode");
+ if (dpi_mode==0) {
+ editor_set_scale( OS::get_singleton()->get_screen_dpi(0) > 150 && OS::get_singleton()->get_screen_size(OS::get_singleton()->get_current_screen()).x>2000 ? 2.0 : 1.0 );
+
+ use_single_dock_column = OS::get_singleton()->get_screen_size(OS::get_singleton()->get_current_screen()).x<1200;
+
+ } else if (dpi_mode==1) {
+ editor_set_scale(0.75);
+ } else if (dpi_mode==2) {
+ editor_set_scale(1.0);
+ } else if (dpi_mode==3) {
+ editor_set_scale(1.5);
+ } else if (dpi_mode==4) {
+ editor_set_scale(2.0);
+ }
+ }
+
+
+ ResourceLoader::set_abort_on_missing_resources(false);
+ FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
+ EditorFileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
+ EditorFileDialog::set_default_display_mode((EditorFileDialog::DisplayMode)EditorSettings::get_singleton()->get("filesystem/file_dialog/display_mode").operator int());
+ ResourceLoader::set_error_notify_func(this,_load_error_notify);
+ ResourceLoader::set_dependency_error_notify_func(this,_dependency_error_report);
+
+ ResourceLoader::set_timestamp_on_load(true);
+ ResourceSaver::set_timestamp_on_save(true);
+
+
+ { //register importers at the begining, so dialogs are created with the right extensions
+ Ref<ResourceImporterTexture> import_texture;
+ import_texture.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_texture);
+
+ Ref<ResourceImporterCSVTranslation> import_csv_translation;
+ import_csv_translation.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_csv_translation);
+
+ Ref<ResourceImporterWAV> import_wav;
+ import_wav.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_wav);
+
+
+ Ref<ResourceImporterOBJ> import_obj;
+ import_obj.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_obj);
+
+ Ref<ResourceImporterScene> import_scene;
+ import_scene.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_scene);
+
+ {
+ Ref<EditorSceneImporterCollada> import_collada;
+ import_collada.instance();
+ import_scene->add_importer(import_collada);
+ }
+
+ }
+
+ _pvrtc_register_compressors();
+
+ editor_selection = memnew( EditorSelection );
+
+ EditorFileSystem *efs = memnew( EditorFileSystem );
+ add_child(efs);
+
+ //used for previews
+ FileDialog::get_icon_func=_file_dialog_get_icon;
+ FileDialog::register_func=_file_dialog_register;
+ FileDialog::unregister_func=_file_dialog_unregister;
+
+ EditorFileDialog::get_icon_func=_file_dialog_get_icon;
+ EditorFileDialog::register_func=_editor_file_dialog_register;
+ EditorFileDialog::unregister_func=_editor_file_dialog_unregister;
+
+ editor_export = memnew( EditorExport );
+ add_child(editor_export);
+
+
+ register_exporters();
+
+ GLOBAL_DEF("editor/main_run_args","");
+
+ ClassDB::set_class_enabled("CollisionShape",true);
+ ClassDB::set_class_enabled("CollisionShape2D",true);
+ ClassDB::set_class_enabled("CollisionPolygon2D",true);
+
+ Control *theme_base = memnew( Control );
+ add_child(theme_base);
+ theme_base->set_area_as_parent_rect();
+
+ gui_base = memnew( Panel );
+ theme_base->add_child(gui_base);
+ gui_base->set_area_as_parent_rect();
+
+ Ref<Theme> theme = create_editor_theme();
+ theme_base->set_theme( theme );
+ gui_base->set_theme(create_custom_theme());
+
+ resource_preview = memnew( EditorResourcePreview );
+ add_child(resource_preview);
+ progress_dialog = memnew( ProgressDialog );
+ gui_base->add_child(progress_dialog);
+
+ // take up all screen
+ gui_base->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
+ gui_base->set_anchor( MARGIN_BOTTOM, Control::ANCHOR_END );
+ gui_base->set_end( Point2(0,0) );
+
+ main_vbox = memnew( VBoxContainer );
+ gui_base->add_child(main_vbox);
+ main_vbox->set_area_as_parent_rect(8);
+
+#if 0
+ PanelContainer *top_dark_panel = memnew( PanelContainer );
+ Ref<StyleBoxTexture> top_dark_sb;
+ top_dark_sb.instance();
+ top_dark_sb->set_texture(theme->get_icon("PanelTop","EditorIcons"));
+ for(int i=0;i<4;i++) {
+ top_dark_sb->set_margin_size(Margin(i),3);
+ top_dark_sb->set_default_margin(Margin(i),0);
+ }
+ top_dark_sb->set_expand_margin_size(MARGIN_LEFT,20);
+ top_dark_sb->set_expand_margin_size(MARGIN_RIGHT,20);
+
+ top_dark_panel->add_style_override("panel",top_dark_sb);
+ VBoxContainer *top_dark_vb = memnew( VBoxContainer );
+ main_vbox->add_child(top_dark_panel);
+ top_dark_panel->add_child(top_dark_vb);
+#endif
+
+
+
+ menu_hb = memnew( HBoxContainer );
+ main_vbox->add_child(menu_hb);
+
+ //top_dark_vb->add_child(scene_tabs);
+ //left
+ left_l_hsplit = memnew( HSplitContainer );
+ main_vbox->add_child(left_l_hsplit);
+
+ left_l_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+ left_l_vsplit = memnew( VSplitContainer );
+ left_l_hsplit->add_child(left_l_vsplit);
+ dock_slot[DOCK_SLOT_LEFT_UL]=memnew( TabContainer );
+ left_l_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_UL]);
+ dock_slot[DOCK_SLOT_LEFT_BL]=memnew( TabContainer );
+ left_l_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_BL]);
+ left_l_vsplit->hide();
+ dock_slot[DOCK_SLOT_LEFT_UL]->hide();
+ dock_slot[DOCK_SLOT_LEFT_BL]->hide();
+
+ left_r_hsplit = memnew( HSplitContainer );
+ left_l_hsplit->add_child(left_r_hsplit);
+ left_r_vsplit = memnew( VSplitContainer );
+ left_r_hsplit->add_child(left_r_vsplit);
+ dock_slot[DOCK_SLOT_LEFT_UR]=memnew( TabContainer );
+ left_r_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_UR]);
+ dock_slot[DOCK_SLOT_LEFT_BR]=memnew( TabContainer );
+ left_r_vsplit->add_child(dock_slot[DOCK_SLOT_LEFT_BR]);
+ //left_r_vsplit->hide();
+ //dock_slot[DOCK_SLOT_LEFT_UR]->hide();
+ //dock_slot[DOCK_SLOT_LEFT_BR]->hide();
+
+
+ main_hsplit = memnew( HSplitContainer );
+ left_r_hsplit->add_child(main_hsplit);
+ //main_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ VBoxContainer * center_vb = memnew( VBoxContainer);
+ main_hsplit->add_child(center_vb);
+ center_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+
+ center_split = memnew( VSplitContainer );
+ //main_hsplit->add_child(center_split);
+ center_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ center_split->set_collapsed(false);
+ center_vb->add_child(center_split);
+
+ right_hsplit = memnew( HSplitContainer );
+ main_hsplit->add_child(right_hsplit);
+
+ right_l_vsplit = memnew( VSplitContainer );
+ right_hsplit->add_child(right_l_vsplit);
+ dock_slot[DOCK_SLOT_RIGHT_UL]=memnew( TabContainer );
+ right_l_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_UL]);
+ dock_slot[DOCK_SLOT_RIGHT_BL]=memnew( TabContainer );
+ right_l_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_BL]);
+ //right_l_vsplit->hide();
+ //dock_slot[DOCK_SLOT_RIGHT_UL]->hide();
+ //dock_slot[DOCK_SLOT_RIGHT_BL]->hide();
+
+ right_r_vsplit = memnew( VSplitContainer );
+ right_hsplit->add_child(right_r_vsplit);
+ dock_slot[DOCK_SLOT_RIGHT_UR]=memnew( TabContainer );
+ right_r_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_UR]);
+ dock_slot[DOCK_SLOT_RIGHT_BR]=memnew( TabContainer );
+ right_r_vsplit->add_child(dock_slot[DOCK_SLOT_RIGHT_BR]);
+ right_r_vsplit->hide();
+ dock_slot[DOCK_SLOT_RIGHT_UR]->hide();
+ dock_slot[DOCK_SLOT_RIGHT_BR]->hide();
+
+ left_l_vsplit->connect("dragged",this,"_dock_split_dragged");
+ left_r_vsplit->connect("dragged",this,"_dock_split_dragged");
+ right_l_vsplit->connect("dragged",this,"_dock_split_dragged");
+ right_r_vsplit->connect("dragged",this,"_dock_split_dragged");
+
+ left_l_hsplit->connect("dragged",this,"_dock_split_dragged");
+ left_r_hsplit->connect("dragged",this,"_dock_split_dragged");
+ main_hsplit->connect("dragged",this,"_dock_split_dragged");
+ right_hsplit->connect("dragged",this,"_dock_split_dragged");
+
+
+
+ dock_select_popoup = memnew( PopupPanel );
+ gui_base->add_child(dock_select_popoup);
+ VBoxContainer *dock_vb = memnew( VBoxContainer );
+ dock_select_popoup->add_child(dock_vb);
+
+ HBoxContainer *dock_hb = memnew( HBoxContainer);
+ dock_tab_move_left = memnew( ToolButton );
+ dock_tab_move_left->set_icon(theme->get_icon("Back","EditorIcons"));
+ dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE);
+ dock_tab_move_left->connect("pressed",this,"_dock_move_left");
+ //dock_tab_move_left->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ dock_hb->add_child(dock_tab_move_left);
+ dock_hb->add_spacer();
+ dock_tab_move_right = memnew( ToolButton );
+ dock_tab_move_right->set_icon(theme->get_icon("Forward","EditorIcons"));
+ dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE);
+ dock_tab_move_right->connect("pressed",this,"_dock_move_right");
+
+ //dock_tab_move_right->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ dock_hb->add_child(dock_tab_move_right);
+ dock_vb->add_child(dock_hb);
+
+ dock_select = memnew( Control );
+ dock_select->set_custom_minimum_size(Size2(128,64)*EDSCALE);
+ dock_select->connect("gui_input",this,"_dock_select_input");
+ dock_select->connect("draw",this,"_dock_select_draw");
+ dock_select->connect("mouse_exited",this,"_dock_popup_exit");
+ dock_select->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ dock_vb->add_child(dock_select);
+
+
+
+ dock_select_popoup->set_as_minsize();
+ dock_select_rect_over=-1;
+ dock_popup_selected=-1;
+ //dock_select_popoup->set_(Size2(20,20));
+
+ for(int i=0;i<DOCK_SLOT_MAX;i++) {
+ dock_slot[i]->set_custom_minimum_size(Size2(230,220)*EDSCALE);
+ dock_slot[i]->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ dock_slot[i]->set_popup(dock_select_popoup);
+ dock_slot[i]->connect("pre_popup_pressed",this,"_dock_pre_popup",varray(i));
+
+ //dock_slot[i]->set_tab_align(TabContainer::ALIGN_LEFT);
+ }
+
+ dock_drag_timer = memnew( Timer );
+ add_child(dock_drag_timer);
+ dock_drag_timer->set_wait_time(0.5);
+ dock_drag_timer->set_one_shot(true);
+ dock_drag_timer->connect("timeout",this,"_save_docks");
+
+ top_split = memnew( VSplitContainer );
+ center_split->add_child(top_split);
+ top_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ top_split->set_collapsed(true);
+
+ VBoxContainer *srt = memnew( VBoxContainer );
+ srt->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ top_split->add_child(srt);
+ srt->add_constant_override("separation",0);
+
+
+/* main_editor_tabs = memnew( Tabs );
+ main_editor_tabs->connect("tab_changed",this,"_editor_select");
+ main_editor_tabs->set_tab_close_display_policy(Tabs::SHOW_NEVER);
+*/
+ scene_tabs=memnew( Tabs );
+ scene_tabs->add_tab("unsaved");
+ scene_tabs->set_tab_align(Tabs::ALIGN_CENTER);
+ scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("interface/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) );
+ scene_tabs->connect("tab_changed",this,"_scene_tab_changed");
+ scene_tabs->connect("right_button_pressed",this,"_scene_tab_script_edited");
+ scene_tabs->connect("tab_close", this, "_scene_tab_closed");
+
+ srt->add_child(scene_tabs);
+
+ scene_root_parent = memnew( PanelContainer );
+ scene_root_parent->set_custom_minimum_size(Size2(0,80)*EDSCALE);
+
+
+
+ //Ref<StyleBox> sp = scene_root_parent->get_stylebox("panel","TabContainer");
+ //scene_root_parent->add_style_override("panel",sp);
+
+
+ /*scene_root_parent->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
+ scene_root_parent->set_anchor( MARGIN_BOTTOM, Control::ANCHOR_END );
+ scene_root_parent->set_begin( Point2( 0, 0) );
+ scene_root_parent->set_end( Point2( 0,80 ) );*/
+ srt->add_child(scene_root_parent);
+ scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+
+ scene_root = memnew( Viewport );
+ scene_root->set_disable_3d(true);
+
+
+
+ //scene_root_base->add_child(scene_root);
+ //scene_root->set_meta("_editor_disable_input",true);
+ VisualServer::get_singleton()->viewport_set_hide_scenario(scene_root->get_viewport_rid(),true);
+ scene_root->set_disable_input(true);
+ scene_root->set_as_audio_listener_2d(true);
+ //scene_root->set_size_override(true,Size2(GlobalConfig::get_singleton()->get("display/width"),GlobalConfig::get_singleton()->get("display/height")));
+
+ //scene_root->set_world_2d( Ref<World2D>( memnew( World2D )) );
+
+
+ viewport = memnew( VBoxContainer );
+ viewport->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ /*for(int i=0;i<4;i++) {
+ viewport->set_margin(Margin(i),sp->get_margin(Margin(i)));
+ }*/
+ scene_root_parent->add_child(viewport);
+
+
+
+ PanelContainer *top_region = memnew( PanelContainer );
+ top_region->add_style_override("panel",gui_base->get_stylebox("hover","Button"));
+ HBoxContainer *left_menu_hb = memnew( HBoxContainer );
+ top_region->add_child(left_menu_hb);
+ menu_hb->add_child(top_region);
+
+ PopupMenu *p;
+
+
+
+ file_menu = memnew( MenuButton );
+ file_menu->set_text(TTR("Scene"));
+ //file_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
+ left_menu_hb->add_child( file_menu );
+
+ prev_scene = memnew( ToolButton );
+ prev_scene->set_icon(gui_base->get_icon("PrevScene","EditorIcons"));
+ prev_scene->set_tooltip(TTR("Go to previously opened scene."));
+ prev_scene->set_disabled(true);
+ //left_menu_hb->add_child( prev_scene );
+ prev_scene->connect("pressed",this,"_menu_option",make_binds(FILE_OPEN_PREV));
+ gui_base->add_child(prev_scene);
+ prev_scene->set_pos(Point2(3,24));
+ prev_scene->hide();
+
+
+
+ ED_SHORTCUT("editor/next_tab", TTR("Next tab"), KEY_MASK_CMD+KEY_TAB);
+ ED_SHORTCUT("editor/prev_tab", TTR("Previous tab"), KEY_MASK_CMD+KEY_MASK_SHIFT+KEY_TAB);
+ ED_SHORTCUT("editor/filter_files", TTR("Filter Files.."), KEY_MASK_ALT+KEY_MASK_CMD+KEY_P);
+
+
+ file_menu->set_tooltip(TTR("Operations with scene files."));
+ p=file_menu->get_popup();
+ p->add_shortcut(ED_SHORTCUT("editor/new_scene",TTR("New Scene")),FILE_NEW_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/new_inherited_scene",TTR("New Inherited Scene..")),FILE_NEW_INHERITED_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/open_scene",TTR("Open Scene.."),KEY_MASK_CMD+KEY_O),FILE_OPEN_SCENE);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/save_scene",TTR("Save Scene"),KEY_MASK_CMD+KEY_S),FILE_SAVE_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/save_scene_as",TTR("Save Scene As.."),KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_S),FILE_SAVE_AS_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/save_all_scenes",TTR("Save all Scenes"),KEY_MASK_ALT+KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_S),FILE_SAVE_ALL_SCENES);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/close_scene",TTR("Close Scene"),KEY_MASK_SHIFT+KEY_MASK_CTRL+KEY_W),FILE_CLOSE);
+ p->add_separator();
+ //p->add_shortcut(ED_SHORTCUT("editor/save_scene",TTR("Close Goto Prev. Scene")),FILE_OPEN_PREV,KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_P);
+ p->add_submenu_item(TTR("Open Recent"),"RecentScenes",FILE_OPEN_RECENT);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene",TTR("Quick Open Scene.."),KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_O),FILE_QUICK_OPEN_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/quick_open_script",TTR("Quick Open Script.."),KEY_MASK_ALT+KEY_MASK_CMD+KEY_O),FILE_QUICK_OPEN_SCRIPT);
+ p->add_separator();
+
+ PopupMenu *pm_export = memnew(PopupMenu );
+ pm_export->set_name("Export");
+ p->add_child(pm_export);
+ p->add_submenu_item(TTR("Convert To.."),"Export");
+ pm_export->add_separator();
+ pm_export->add_shortcut(ED_SHORTCUT("editor/convert_to_MeshLibrary", TTR("MeshLibrary..")), FILE_EXPORT_MESH_LIBRARY);
+ pm_export->add_shortcut(ED_SHORTCUT("editor/convert_to_TileSet", TTR("TileSet..")), FILE_EXPORT_TILESET);
+ pm_export->connect("id_pressed",this,"_menu_option");
+
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"),KEY_MASK_CMD+KEY_Z),EDIT_UNDO,true);
+ p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"),KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_Z),EDIT_REDO,true);
+ p->add_separator();
+ p->add_item(TTR("Run Script"),FILE_RUN_SCRIPT,KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_R);
+ p->add_separator();
+ p->add_item(TTR("Project Settings"),RUN_SETTINGS);
+ p->add_separator();
+ p->add_item(TTR("Revert Scene"),EDIT_REVERT);
+ p->add_separator();
+#ifdef OSX_ENABLED
+ p->add_item(TTR("Quit to Project List"),RUN_PROJECT_MANAGER,KEY_MASK_SHIFT+KEY_MASK_ALT+KEY_Q);
+#else
+ p->add_item(TTR("Quit to Project List"),RUN_PROJECT_MANAGER,KEY_MASK_SHIFT+KEY_MASK_CTRL+KEY_Q);
+#endif
+ p->add_item(TTR("Quit"),FILE_QUIT,KEY_MASK_CMD+KEY_Q);
+
+ recent_scenes = memnew( PopupMenu );
+ recent_scenes->set_name("RecentScenes");
+ p->add_child(recent_scenes);
+ recent_scenes->connect("id_pressed",this,"_open_recent_scene");
+
+ {
+ Control *sp = memnew( Control );
+ sp->set_custom_minimum_size(Size2(30,0)*EDSCALE);
+ menu_hb->add_child(sp);
+ }
+
+ PanelContainer *editor_region = memnew( PanelContainer );
+ editor_region->add_style_override("panel",gui_base->get_stylebox("hover","Button"));
+ main_editor_button_vb = memnew( HBoxContainer );
+ editor_region->add_child(main_editor_button_vb);
+ menu_hb->add_child(editor_region);
+
+ distraction_free = memnew( ToolButton );
+ main_editor_button_vb->add_child(distraction_free);
+ distraction_free->set_shortcut( ED_SHORTCUT("editor/distraction_free_mode",TTR("Distraction Free Mode"),KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_F11) );
+ distraction_free->connect("pressed",this,"_toggle_distraction_free_mode");
+ distraction_free->set_icon(gui_base->get_icon("DistractionFree","EditorIcons"));
+ distraction_free->set_toggle_mode(true);
+
+ //menu_hb->add_spacer();
+#if 0
+ node_menu = memnew( MenuButton );
+ node_menu->set_text("Node");
+ node_menu->set_pos( Point2( 50,0) );
+ menu_panel->add_child( node_menu );
+
+ p=node_menu->get_popup();
+ p->add_item("Create",NODE_CREATE);
+ p->add_item("Instance",NODE_INSTANCE);
+ p->add_separator();
+ p->add_item("Reparent",NODE_REPARENT);
+ p->add_item("Move Up",NODE_MOVE_UP);
+ p->add_item("Move Down",NODE_MOVE_DOWN);
+ p->add_separator();
+ p->add_item("Duplicate",NODE_DUPLICATE);
+ p->add_separator();
+ p->add_item("Remove (Branch)",NODE_REMOVE_BRANCH);
+ p->add_item("Remove (Element)",NODE_REMOVE_ELEMENT);
+ p->add_separator();
+ p->add_item("Edit Subscriptions..",NODE_CONNECTIONS);
+ p->add_item("Edit Groups..",NODE_GROUPS);
+
+ resource_menu = memnew( MenuButton );
+ resource_menu->set_text("Resource");
+ resource_menu->set_pos( Point2( 90,0) );
+ menu_panel->add_child( resource_menu );
+#endif
+
+ import_menu = memnew( MenuButton );
+ import_menu->set_tooltip(TTR("Import assets to the project."));
+ import_menu->set_text(TTR("Import"));
+ //import_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
+ left_menu_hb->add_child( import_menu );
+
+ p=import_menu->get_popup();
+ p->connect("id_pressed",this,"_menu_option");
+
+ tool_menu = memnew( MenuButton );
+ tool_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools."));
+ tool_menu->set_text(TTR("Tools"));
+
+ //tool_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
+ left_menu_hb->add_child( tool_menu );
+
+ p=tool_menu->get_popup();
+ p->connect("id_pressed",this,"_menu_option");
+ p->add_item(TTR("Orphan Resource Explorer"),TOOLS_ORPHAN_RESOURCES);
+
+ export_button = memnew( ToolButton );
+ export_button->set_tooltip(TTR("Export the project to many platforms."));
+ export_button->set_text(TTR("Export"));
+ export_button->connect("pressed",this,"_menu_option",varray(FILE_EXPORT_PROJECT));
+ export_button->set_focus_mode(Control::FOCUS_NONE);
+ left_menu_hb->add_child(export_button);
+
+ menu_hb->add_spacer();
+
+ //Separator *s1 = memnew( VSeparator );
+ //menu_panel->add_child(s1);
+ //s1->set_pos(Point2(210,4));
+ //s1->set_size(Point2(10,15));
+
+
+ play_cc = memnew( CenterContainer );
+ play_cc->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+ gui_base->add_child( play_cc );
+ play_cc->set_area_as_parent_rect();
+ play_cc->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,10);
+ play_cc->set_margin(MARGIN_TOP,5);
+
+ top_region = memnew( PanelContainer );
+ top_region->add_style_override("panel",gui_base->get_stylebox("hover","Button"));
+ play_cc->add_child(top_region);
+
+ HBoxContainer *play_hb = memnew( HBoxContainer );
+ top_region->add_child(play_hb);
+
+ play_button = memnew( ToolButton );
+ play_hb->add_child(play_button);
+ play_button->set_toggle_mode(true);
+ play_button->set_icon(gui_base->get_icon("MainPlay","EditorIcons"));
+ play_button->set_focus_mode(Control::FOCUS_NONE);
+ play_button->connect("pressed", this,"_menu_option",make_binds(RUN_PLAY));
+ play_button->set_tooltip(TTR("Play the project."));
+ play_button->set_shortcut(ED_SHORTCUT("editor/play",TTR("Play"),KEY_F5));
+
+
+
+ pause_button = memnew( ToolButton );
+ //menu_panel->add_child(pause_button); - not needed for now?
+ pause_button->set_toggle_mode(true);
+ pause_button->set_icon(gui_base->get_icon("Pause","EditorIcons"));
+ pause_button->set_focus_mode(Control::FOCUS_NONE);
+ //pause_button->connect("pressed", this,"_menu_option",make_binds(RUN_PAUSE));
+ pause_button->set_tooltip(TTR("Pause the scene"));
+ pause_button->set_disabled(true);
+ play_hb->add_child(pause_button);
+ pause_button->set_shortcut(ED_SHORTCUT("editor/pause_scene",TTR("Pause Scene"),KEY_F7));
+
+
+ stop_button = memnew( ToolButton );
+ play_hb->add_child(stop_button);
+ //stop_button->set_toggle_mode(true);
+ stop_button->set_focus_mode(Control::FOCUS_NONE);
+ stop_button->set_icon(gui_base->get_icon("MainStop","EditorIcons"));
+ stop_button->connect("pressed", this,"_menu_option",make_binds(RUN_STOP));
+ stop_button->set_tooltip(TTR("Stop the scene."));
+ stop_button->set_shortcut(ED_SHORTCUT("editor/stop",TTR("Stop"),KEY_F8));
+
+ run_native = memnew( EditorRunNative);
+ play_hb->add_child(run_native);
+ native_play_button = memnew( MenuButton );
+ native_play_button->set_text("NTV");
+ menu_hb->add_child(native_play_button);
+ native_play_button->hide();
+ native_play_button->get_popup()->connect("id_pressed",this,"_run_in_device");
+ run_native->connect("native_run",this,"_menu_option",varray(RUN_PLAY_NATIVE));
+
+ //VSeparator *s1 = memnew( VSeparator );
+ //play_hb->add_child(s1);
+
+ play_scene_button = memnew( ToolButton );
+ play_hb->add_child(play_scene_button);
+ play_scene_button->set_toggle_mode(true);
+ play_scene_button->set_focus_mode(Control::FOCUS_NONE);
+ play_scene_button->set_icon(gui_base->get_icon("PlayScene","EditorIcons"));
+ play_scene_button->connect("pressed", this,"_menu_option",make_binds(RUN_PLAY_SCENE));
+ play_scene_button->set_tooltip(TTR("Play the edited scene."));
+ play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene",TTR("Play Scene"),KEY_F6));
+
+ play_custom_scene_button = memnew( ToolButton );
+ play_hb->add_child(play_custom_scene_button);
+ play_custom_scene_button->set_toggle_mode(true);
+ play_custom_scene_button->set_focus_mode(Control::FOCUS_NONE);
+ play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom","EditorIcons"));
+ play_custom_scene_button->connect("pressed", this,"_menu_option",make_binds(RUN_PLAY_CUSTOM_SCENE));
+ play_custom_scene_button->set_tooltip(TTR("Play custom scene"));
+ play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene",TTR("Play Custom Scene"),KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_F5));
+
+ debug_button = memnew( MenuButton );
+ debug_button->set_flat(true);
+ play_hb->add_child(debug_button);
+ //debug_button->set_toggle_mode(true);
+ debug_button->set_focus_mode(Control::FOCUS_NONE);
+ debug_button->set_icon(gui_base->get_icon("Remote","EditorIcons"));
+ //debug_button->connect("pressed", this,"_menu_option",make_binds(RUN_LIVE_DEBUG));
+ debug_button->set_tooltip(TTR("Debug options"));
+
+ p=debug_button->get_popup();
+ p->set_hide_on_item_selection(false);
+ p->add_check_item(TTR("Deploy with Remote Debug"),RUN_DEPLOY_REMOTE_DEBUG);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged."));
+ p->add_check_item(TTR("Small Deploy with Network FS"),RUN_FILE_SERVER);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("When this option is enabled, export or deploy will produce a minimal executable.\nThe filesystem will be provided from the project by the editor over the network.\nOn Android, deploy will use the USB cable for faster performance. This option speeds up testing for games with a large footprint."));
+ p->add_separator();
+ p->add_check_item(TTR("Visible Collision Shapes"),RUN_DEBUG_COLLISONS);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("Collision shapes and raycast nodes (for 2D and 3D) will be visible on the running game if this option is turned on."));
+ p->add_check_item(TTR("Visible Navigation"),RUN_DEBUG_NAVIGATION);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("Navigation meshes and polygons will be visible on the running game if this option is turned on."));
+ p->add_separator();
+ p->add_check_item(TTR("Sync Scene Changes"),RUN_LIVE_DEBUG);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("When this option is turned on, any changes made to the scene in the editor will be replicated in the running game.\nWhen used remotely on a device, this is more efficient with network filesystem."));
+ p->add_check_item(TTR("Sync Script Changes"),RUN_RELOAD_SCRIPTS);
+ p->set_item_tooltip(p->get_item_count()-1,TTR("When this option is turned on, any script that is saved will be reloaded on the running game.\nWhen used remotely on a device, this is more efficient with network filesystem."));
+ p->connect("id_pressed",this,"_menu_option");
+
+ /*
+ run_settings_button = memnew( ToolButton );
+ //menu_hb->add_child(run_settings_button);
+ //run_settings_button->set_toggle_mode(true);
+ run_settings_button->set_focus_mode(Control::FOCUS_NONE);
+ run_settings_button->set_icon(gui_base->get_icon("Run","EditorIcons"));
+ run_settings_button->connect("pressed", this,"_menu_option",make_binds(RUN_SCENE_SETTINGS));
+*/
+
+ /*
+ run_settings_button = memnew( ToolButton );
+ menu_panel->add_child(run_settings_button);
+ run_settings_button->set_pos(Point2(305,0));
+ run_settings_button->set_focus_mode(Control::FOCUS_NONE);
+ run_settings_button->set_icon(gui_base->get_icon("Run","EditorIcons"));
+ run_settings_button->connect("pressed", this,"_menu_option",make_binds(RUN_SETTINGS));
+*/
+
+
+ progress_hb = memnew( BackgroundProgress );
+ menu_hb->add_child(progress_hb);
+
+ {
+ Control *sp = memnew( Control );
+ sp->set_custom_minimum_size(Size2(30,0)*EDSCALE);
+ menu_hb->add_child(sp);
+ }
+
+
+ PanelContainer *vu_cont = memnew( PanelContainer );
+ vu_cont->add_style_override("panel",gui_base->get_stylebox("hover","Button"));
+ menu_hb->add_child(vu_cont);
+
+ audio_vu = memnew( TextureProgress );
+ CenterContainer *vu_cc = memnew( CenterContainer );
+ vu_cc->add_child(audio_vu);
+ vu_cont->add_child(vu_cc);
+ audio_vu->set_under_texture(gui_base->get_icon("VuEmpty","EditorIcons"));
+ audio_vu->set_progress_texture(gui_base->get_icon("VuFull","EditorIcons"));
+ audio_vu->set_max(24);
+ audio_vu->set_min(-80);
+ audio_vu->set_step(0.01);
+ audio_vu->set_value(0);
+
+ {
+ Control *sp = memnew( Control );
+ sp->set_custom_minimum_size(Size2(30,0)*EDSCALE);
+ menu_hb->add_child(sp);
+ }
+
+
+
+ top_region = memnew( PanelContainer );
+ top_region->add_style_override("panel",gui_base->get_stylebox("hover","Button"));
+ HBoxContainer *right_menu_hb = memnew( HBoxContainer );
+ top_region->add_child(right_menu_hb);
+ menu_hb->add_child(top_region);
+
+
+ settings_menu = memnew( MenuButton );
+ settings_menu->set_text(TTR("Settings"));
+ //settings_menu->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ right_menu_hb->add_child( settings_menu );
+ p=settings_menu->get_popup();
+
+ //p->add_item("Export Settings",SETTINGS_EXPORT_PREFERENCES);
+ p->add_item(TTR("Editor Settings"),SETTINGS_PREFERENCES);
+ //p->add_item("Optimization Presets",SETTINGS_OPTIMIZED_PRESETS);
+ p->add_separator();
+ editor_layouts = memnew( PopupMenu );
+ editor_layouts->set_name("Layouts");
+ p->add_child(editor_layouts);
+ editor_layouts->connect("id_pressed",this,"_layout_menu_option");
+ p->add_submenu_item(TTR("Editor Layout"), "Layouts");
+
+ p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode",TTR("Toggle Fullscreen"),KEY_MASK_SHIFT|KEY_F11),SETTINGS_TOGGLE_FULLSCREN);
+
+ p->add_separator();
+ p->add_item(TTR("Install Export Templates"),SETTINGS_LOAD_EXPORT_TEMPLATES);
+ p->add_separator();
+ p->add_item(TTR("About"),SETTINGS_ABOUT);
+
+ layout_dialog = memnew( EditorNameDialog );
+ gui_base->add_child(layout_dialog);
+ layout_dialog->set_hide_on_ok(false);
+ layout_dialog->set_size(Size2(175, 70)*EDSCALE);
+ layout_dialog->connect("name_confirmed", this,"_dialog_action");
+
+ sources_button = memnew( ToolButton );
+ right_menu_hb->add_child(sources_button);
+ sources_button->set_icon(gui_base->get_icon("DependencyOk","EditorIcons"));
+ sources_button->connect("pressed",this,"_menu_option",varray(SOURCES_REIMPORT));
+ sources_button->set_tooltip(TTR("Alerts when an external resource has changed."));
+
+ update_menu = memnew( MenuButton );
+ update_menu->set_tooltip(TTR("Spins when the editor window repaints!"));
+ right_menu_hb->add_child(update_menu);
+ update_menu->set_icon(gui_base->get_icon("Progress1","EditorIcons"));
+ p=update_menu->get_popup();
+ p->add_check_item(TTR("Update Always"),SETTINGS_UPDATE_ALWAYS);
+ p->add_check_item(TTR("Update Changes"),SETTINGS_UPDATE_CHANGES);
+ p->add_separator();
+ p->add_check_item(TTR("Disable Update Spinner"),SETTINGS_UPDATE_SPINNER_HIDE);
+ p->set_item_checked(1,true);
+
+ //sources_button->connect();
+
+/*
+ Separator *s2 = memnew( VSeparator );
+ menu_panel->add_child(s2);
+ s2->set_pos(Point2(338,4));
+ s2->set_size(Point2(10,15));
+*/
+
+
+
+ //editor_hsplit = memnew( HSplitContainer );
+ //main_split->add_child(editor_hsplit);
+ //editor_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+ //editor_vsplit = memnew( VSplitContainer );
+ //editor_hsplit->add_child(editor_vsplit);
+
+ //top_pallete = memnew( TabContainer );
+ scene_tree_dock = memnew( SceneTreeDock(this,scene_root,editor_selection,editor_data) );
+ scene_tree_dock->set_name(TTR("Scene"));
+ //top_pallete->add_child(scene_tree_dock);
+ dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(scene_tree_dock);
+#if 0
+ resources_dock = memnew( ResourcesDock(this) );
+ resources_dock->set_name("Resources");
+ //top_pallete->add_child(resources_dock);
+ dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(resources_dock);
+ //top_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+#endif
+ dock_slot[DOCK_SLOT_LEFT_BR]->hide();
+ /*Control *editor_spacer = memnew( Control );
+ editor_spacer->set_custom_minimum_size(Size2(260,200));
+ editor_spacer->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor_vsplit->add_child( editor_spacer );
+ editor_spacer->add_child( top_pallete );
+ top_pallete->set_area_as_parent_rect();*/
+
+
+ //prop_pallete = memnew( TabContainer );
+
+ //prop_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+ /*editor_spacer = memnew( Control );
+ editor_spacer->set_custom_minimum_size(Size2(260,200));
+ editor_spacer->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor_vsplit->add_child( editor_spacer );
+ editor_spacer->add_child( prop_pallete );
+ prop_pallete->set_area_as_parent_rect();*/
+
+ VBoxContainer *prop_editor_base = memnew( VBoxContainer );
+ prop_editor_base->set_name(TTR("Inspector")); // Properties?
+ dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(prop_editor_base);
+
+ HBoxContainer *prop_editor_hb = memnew( HBoxContainer );
+
+ prop_editor_base->add_child(prop_editor_hb);
+ prop_editor_vb=prop_editor_base;
+
+ resource_new_button = memnew( ToolButton );
+ resource_new_button->set_tooltip(TTR("Create a new resource in memory and edit it."));
+ resource_new_button->set_icon(gui_base->get_icon("New","EditorIcons"));
+ prop_editor_hb->add_child(resource_new_button);
+ resource_new_button->connect("pressed",this,"_menu_option",varray(RESOURCE_NEW));
+ resource_new_button->set_focus_mode(Control::FOCUS_NONE);
+
+ resource_load_button = memnew( ToolButton );
+ resource_load_button->set_tooltip(TTR("Load an existing resource from disk and edit it."));
+ resource_load_button->set_icon(gui_base->get_icon("Load","EditorIcons"));
+ prop_editor_hb->add_child(resource_load_button);
+ resource_load_button->connect("pressed",this,"_menu_option",varray(RESOURCE_LOAD));
+ resource_load_button->set_focus_mode(Control::FOCUS_NONE);
+
+ resource_save_button = memnew( MenuButton );
+ resource_save_button->set_tooltip(TTR("Save the currently edited resource."));
+ resource_save_button->set_icon(gui_base->get_icon("Save","EditorIcons"));
+ prop_editor_hb->add_child(resource_save_button);
+ resource_save_button->get_popup()->add_item(TTR("Save"),RESOURCE_SAVE);
+ resource_save_button->get_popup()->add_item(TTR("Save As.."),RESOURCE_SAVE_AS);
+ resource_save_button->get_popup()->connect("id_pressed",this,"_menu_option");
+ resource_save_button->set_focus_mode(Control::FOCUS_NONE);
+ resource_save_button->set_disabled(true);
+
+ prop_editor_hb->add_spacer();
+
+ property_back = memnew( ToolButton );
+ property_back->set_icon( gui_base->get_icon("Back","EditorIcons") );
+ property_back->set_flat(true);
+ property_back->set_tooltip(TTR("Go to the previous edited object in history."));
+ property_back->set_disabled(true);
+
+ prop_editor_hb->add_child( property_back );
+
+ property_forward = memnew( ToolButton );
+ property_forward->set_icon( gui_base->get_icon("Forward","EditorIcons") );
+ property_forward->set_flat(true);
+ property_forward->set_tooltip(TTR("Go to the next edited object in history."));
+ property_forward->set_disabled(true);
+
+ prop_editor_hb->add_child( property_forward );
+
+
+ editor_history_menu = memnew( MenuButton );
+ editor_history_menu->set_tooltip(TTR("History of recently edited objects."));
+ editor_history_menu->set_icon( gui_base->get_icon("History","EditorIcons"));
+ prop_editor_hb->add_child(editor_history_menu);
+ editor_history_menu->connect("about_to_show",this,"_prepare_history");
+ editor_history_menu->get_popup()->connect("id_pressed",this,"_select_history");
+
+
+ prop_editor_hb = memnew( HBoxContainer ); //again...
+
+ prop_editor_base->add_child(prop_editor_hb);
+ editor_path = memnew( EditorPath(&editor_history) );
+ editor_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ prop_editor_hb->add_child(editor_path);
+
+ search_button = memnew( ToolButton );
+ search_button->set_toggle_mode(true);
+ search_button->set_pressed(false);
+ search_button->set_icon(gui_base->get_icon("Zoom","EditorIcons"));
+ prop_editor_hb->add_child(search_button);
+ search_button->connect("toggled",this,"_toggle_search_bar");
+
+ object_menu = memnew( MenuButton );
+ object_menu->set_icon(gui_base->get_icon("Tools","EditorIcons"));
+ prop_editor_hb->add_child( object_menu );
+ object_menu->set_tooltip(TTR("Object properties."));
+
+ create_dialog = memnew( CreateDialog );
+ gui_base->add_child(create_dialog);
+ create_dialog->set_base_type("Resource");
+ create_dialog->connect("create",this,"_resource_created");
+
+ search_bar = memnew( HBoxContainer );
+ search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ prop_editor_base->add_child(search_bar);
+ search_bar->hide();
+
+ Label *l = memnew( Label(TTR("Search:")+" ") );
+ search_bar->add_child(l);
+
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_bar->add_child(search_box);
+
+ ToolButton *clear_button = memnew( ToolButton );
+ clear_button->set_icon(gui_base->get_icon("Close","EditorIcons"));
+ search_bar->add_child(clear_button);
+ clear_button->connect("pressed",this,"_clear_search_box");
+
+ property_editor = memnew( PropertyEditor );
+ property_editor->set_autoclear(true);
+ property_editor->set_show_categories(true);
+ property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ property_editor->set_use_doc_hints(true);
+
+ property_editor->hide_top_label();
+ property_editor->register_text_enter(search_box);
+
+ prop_editor_base->add_child( property_editor );
+ property_editor->set_undo_redo(&editor_data.get_undo_redo());
+
+
+ import_dock = memnew( ImportDock );
+ dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(import_dock);
+ import_dock->set_name(TTR("Import"));
+
+
+ node_dock = memnew( NodeDock );
+ //node_dock->set_undoredo(&editor_data.get_undo_redo());
+ if (use_single_dock_column) {
+ dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(node_dock);
+ } else {
+ dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(node_dock);
+ }
+
+ filesystem_dock = memnew( FileSystemDock(this) );
+ filesystem_dock->set_name(TTR("FileSystem"));
+ filesystem_dock->set_display_mode(int(EditorSettings::get_singleton()->get("docks/filesystem/display_mode")));
+
+ if (use_single_dock_column) {
+ dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(filesystem_dock);
+ left_r_vsplit->hide();
+ dock_slot[DOCK_SLOT_LEFT_UR]->hide();
+ dock_slot[DOCK_SLOT_LEFT_BR]->hide();
+ } else {
+ dock_slot[DOCK_SLOT_LEFT_UR]->add_child(filesystem_dock);
+ }
+ //prop_pallete->add_child(filesystem_dock);
+ filesystem_dock->connect("open",this,"open_request");
+ filesystem_dock->connect("instance",this,"_instance_request");
+
+ const String docks_section = "docks";
+
+ overridden_default_layout=-1;
+ default_layout.instance();
+ default_layout->set_value(docks_section, "dock_3", TTR("FileSystem"));
+ default_layout->set_value(docks_section, "dock_5", TTR("Scene"));
+ default_layout->set_value(docks_section, "dock_6", TTR("Inspector")+","+TTR("Node"));
+
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++)
+ default_layout->set_value(docks_section, "dock_hsplit_"+itos(i+1), 0);
+ for(int i=0;i<DOCK_SLOT_MAX/2;i++)
+ default_layout->set_value(docks_section, "dock_split_"+itos(i+1), 0);
+
+ _update_layouts_menu();
+
+ bottom_panel = memnew( PanelContainer );
+ bottom_panel->add_style_override("panel",gui_base->get_stylebox("panelf","Panel"));
+ center_split->add_child(bottom_panel);
+ center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);
+
+ bottom_panel_vb = memnew( VBoxContainer );
+ bottom_panel->add_child(bottom_panel_vb);
+ //bottom_panel_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+ bottom_panel_hb = memnew( HBoxContainer );
+ bottom_panel_vb->add_child(bottom_panel_hb);
+
+
+
+ log = memnew( EditorLog );
+
+ add_bottom_panel_item(TTR("Output"),log);
+
+ //left_split->set_dragger_visible(false);
+
+
+ old_split_ofs=0;
+
+ center_split->connect("resized",this,"_vp_resized");
+
+
+ /*PanelContainer *bottom_pc = memnew( PanelContainer );
+ srt->add_child(bottom_pc);
+ bottom_hb = memnew( HBoxContainer );
+ bottom_pc->add_child(bottom_hb);*/
+
+
+ //center_vb->add_child( log->get_button() );
+ //log->get_button()->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+
+
+ //progress_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+
+
+
+ /*
+ animation_menu = memnew( ToolButton );
+ animation_menu->set_pos(Point2(500,0));
+ animation_menu->set_size(Size2(20,20));
+ animation_menu->set_toggle_mode(true);
+ animation_menu->set_focus_mode(Control::FOCUS_NONE);
+ menu_panel->add_child(animation_menu);
+ animation_menu->set_icon(gui_base->get_icon("Animation","EditorIcons"));
+ animation_menu->connect("pressed",this,"_animation_visibility_toggle");
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+ orphan_resources = memnew( OrphanResourcesDialog );
+ gui_base->add_child(orphan_resources);
+
+
+
+
+
+ confirmation = memnew( ConfirmationDialog );
+ gui_base->add_child(confirmation);
+ confirmation->connect("confirmed", this,"_menu_confirm_current");
+
+ accept = memnew( AcceptDialog );
+ gui_base->add_child(accept);
+ accept->connect("confirmed", this,"_menu_confirm_current");
+
+
+
+
+
+ //optimized_save = memnew( OptimizedSaveDialog(&editor_data) );
+ //gui_base->add_child(optimized_save);
+ //optimized_save->connect("confirmed",this,"_save_optimized");
+
+ project_export = memnew( ProjectExportDialog );
+ gui_base->add_child(project_export);
+
+ //project_export_settings = memnew( ProjectExportDialog(this) );
+ //gui_base->add_child(project_export_settings);
+
+ //optimized_presets = memnew( OptimizedPresetsDialog(&editor_data) );
+ //gui_base->add_child(optimized_presets);
+ //optimized_presets->connect("confirmed",this,"_presets_optimized");
+
+
+
+ //import_subscene = memnew( EditorSubScene );
+ //gui_base->add_child(import_subscene);
+
+
+
+ dependency_error = memnew( DependencyErrorDialog );
+ gui_base->add_child(dependency_error);
+
+ dependency_fixer = memnew( DependencyEditor );
+ gui_base->add_child( dependency_fixer );
+
+ settings_config_dialog = memnew( EditorSettingsDialog );
+ gui_base->add_child(settings_config_dialog);
+
+ project_settings = memnew( ProjectSettings(&editor_data) );
+ gui_base->add_child(project_settings);
+
+ import_confirmation = memnew( ConfirmationDialog );
+ import_confirmation->get_ok()->set_text(TTR("Re-Import"));
+ import_confirmation->add_button(TTR("Update"),!OS::get_singleton()->get_swap_ok_cancel(),"update");
+ import_confirmation->get_label()->set_align(Label::ALIGN_CENTER);
+ import_confirmation->connect("confirmed",this,"_import_action",make_binds("re-import"));
+ import_confirmation->connect("custom_action",this,"_import_action");
+ gui_base->add_child(import_confirmation);
+
+ open_recent_confirmation = memnew( ConfirmationDialog );
+ add_child(open_recent_confirmation);
+ open_recent_confirmation->connect("confirmed",this,"_open_recent_scene_confirm");
+
+
+ run_settings_dialog = memnew( RunSettingsDialog );
+ gui_base->add_child( run_settings_dialog );
+
+
+
+ about = memnew( AcceptDialog );
+ about->set_title(TTR("Thanks from the Godot community!"));
+ //about->get_cancel()->hide();
+ about->get_ok()->set_text(TTR("Thanks!"));
+ about->set_hide_on_ok(true);
+ Label *about_text = memnew( Label );
+ about_text->set_text(VERSION_FULL_NAME"\n(c) 2008-2017 Juan Linietsky, Ariel Manzur.\n");
+ about_text->set_pos(Point2(gui_base->get_icon("Logo","EditorIcons")->get_size().width+30,20));
+ gui_base->add_child(about);
+ about->add_child(about_text);
+ TextureRect *logo = memnew( TextureRect );
+ about->add_child(logo);
+ logo->set_pos(Point2(20,20));
+ logo->set_texture(gui_base->get_icon("Logo","EditorIcons") );
+
+ warning = memnew( AcceptDialog );
+ gui_base->add_child(warning);
+
+
+
+ file_templates = memnew( FileDialog );
+ file_templates->set_title(TTR("Import Templates From ZIP File"));
+
+ gui_base->add_child( file_templates );
+ file_templates->set_mode(FileDialog::MODE_OPEN_FILE);
+ file_templates->set_access(FileDialog::ACCESS_FILESYSTEM);
+ file_templates->clear_filters();
+ file_templates->add_filter("*.tpz ; Template Package");
+
+
+ file = memnew( EditorFileDialog );
+ gui_base->add_child(file);
+ file->set_current_dir("res://");
+
+ file_export = memnew( FileDialog );
+ file_export->set_access(FileDialog::ACCESS_FILESYSTEM);
+ gui_base->add_child(file_export);
+ file_export->set_title(TTR("Export Project"));
+ file_export->connect("file_selected", this,"_dialog_action");
+
+ file_export_lib = memnew( FileDialog );
+ file_export_lib->set_title(TTR("Export Library"));
+ file_export_lib->set_mode(FileDialog::MODE_SAVE_FILE);
+ file_export_lib->connect("file_selected", this,"_dialog_action");
+ file_export_lib_merge = memnew( CheckButton );
+ file_export_lib_merge->set_text(TTR("Merge With Existing"));
+ file_export_lib_merge->set_pressed(true);
+ file_export_lib->get_vbox()->add_child(file_export_lib_merge);
+ gui_base->add_child(file_export_lib);
+
+
+
+
+ file_export_password = memnew( LineEdit );
+ file_export_password->set_secret(true);
+ file_export_password->set_editable(false);
+ file_export->get_vbox()->add_margin_child(TTR("Password:"),file_export_password);
+
+
+ file_script = memnew( FileDialog );
+ file_script->set_title(TTR("Open & Run a Script"));
+ file_script->set_access(FileDialog::ACCESS_FILESYSTEM);
+ file_script->set_mode(FileDialog::MODE_OPEN_FILE);
+ List<String> sexts;
+ ResourceLoader::get_recognized_extensions_for_type("Script",&sexts);
+ for (List<String>::Element*E=sexts.front();E;E=E->next()) {
+ file_script->add_filter("*."+E->get());
+ }
+ gui_base->add_child(file_script);
+ file_script->connect("file_selected",this,"_dialog_action");
+
+ //reimport_dialog = memnew( EditorReImportDialog );
+ //gui_base->add_child(reimport_dialog);
+
+
+
+ property_forward->connect("pressed", this,"_property_editor_forward");
+ property_back->connect("pressed", this,"_property_editor_back");
+
+
+
+ file_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+ object_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+ update_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+ settings_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+
+ file->connect("file_selected", this,"_dialog_action");
+ file_templates->connect("file_selected", this,"_dialog_action");
+ property_editor->connect("resource_selected", this,"_resource_selected");
+ property_editor->connect("property_keyed", this,"_property_keyed");
+
+ //plugin stuff
+
+ file_server = memnew( EditorFileServer );
+
+
+
+
+ add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) );
+ add_editor_plugin( memnew( CanvasItemEditorPlugin(this) ) );
+ add_editor_plugin( memnew( SpatialEditorPlugin(this) ) );
+ add_editor_plugin( memnew( ScriptEditorPlugin(this) ) );
+
+
+ EditorAudioBuses *audio_bus_editor = EditorAudioBuses::register_editor();
+
+ ScriptTextEditor::register_editor(); //register one for text scripts
+
+ if (StreamPeerSSL::is_available()) {
+ add_editor_plugin( memnew( AssetLibraryEditorPlugin(this) ) );
+ } else {
+ WARN_PRINT("Asset Library not available, as it requires SSL to work.");
+ }
+ //more visually meaningful to have this later
+ raise_bottom_panel_item(AnimationPlayerEditor::singleton);
+
+ add_editor_plugin( memnew( ShaderEditorPlugin(this) ) );
+/* add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,true) ) );
+ add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,false) ) );
+
+ add_editor_plugin( memnew( ShaderEditorPlugin(this,false) ) );*/
+ add_editor_plugin( memnew( CameraEditorPlugin(this) ) );
+// add_editor_plugin( memnew( SampleEditorPlugin(this) ) );
+// add_editor_plugin( memnew( SampleLibraryEditorPlugin(this) ) );
+ add_editor_plugin( memnew( ThemeEditorPlugin(this) ) );
+ add_editor_plugin( memnew( MultiMeshEditorPlugin(this) ) );
+ add_editor_plugin( memnew( MeshInstanceEditorPlugin(this) ) );
+ add_editor_plugin( memnew( AnimationTreeEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( SamplePlayerEditorPlugin(this) ) ); - this is kind of useless at this point
+ //add_editor_plugin( memnew( MeshLibraryEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( StreamEditorPlugin(this) ) );
+ add_editor_plugin( memnew( StyleBoxEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( ParticlesEditorPlugin(this) ) );
+ add_editor_plugin( memnew( ResourcePreloaderEditorPlugin(this) ) );
+ add_editor_plugin( memnew( ItemListEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( RichTextEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( CollisionPolygonEditorPlugin(this) ) );
+ add_editor_plugin( memnew( CollisionPolygon2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( TileSetEditorPlugin(this) ) );
+ add_editor_plugin( memnew( TileMapEditorPlugin(this) ) );
+ add_editor_plugin( memnew( SpriteFramesEditorPlugin(this) ) );
+ add_editor_plugin( memnew( TextureRegionEditorPlugin(this) ) );
+ add_editor_plugin( memnew( Particles2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( GIProbeEditorPlugin(this) ) );
+ add_editor_plugin( memnew( Path2DEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( PathEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( BakedLightEditorPlugin(this) ) );
+ add_editor_plugin( memnew( Line2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( Polygon2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( LightOccluder2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( NavigationPolygonEditorPlugin(this) ) );
+ add_editor_plugin( memnew( ColorRampEditorPlugin(this) ) );
+ add_editor_plugin( memnew( CollisionShape2DEditorPlugin(this) ) );
+ add_editor_plugin( memnew( TextureEditorPlugin(this) ) );
+ add_editor_plugin( memnew( AudioBusesEditorPlugin(audio_bus_editor) ) );
+ //add_editor_plugin( memnew( MaterialEditorPlugin(this) ) );
+ //add_editor_plugin( memnew( MeshEditorPlugin(this) ) );
+
+ for(int i=0;i<EditorPlugins::get_plugin_count();i++)
+ add_editor_plugin( EditorPlugins::create(i,this) );
+
+ for(int i=0;i<plugin_init_callback_count;i++) {
+ plugin_init_callbacks[i]();
+ }
+
+
+
+
+ /*resource_preview->add_preview_generator( Ref<EditorTexturePreviewPlugin>( memnew(EditorTexturePreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorPackedScenePreviewPlugin>( memnew(EditorPackedScenePreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorMaterialPreviewPlugin>( memnew(EditorMaterialPreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorScriptPreviewPlugin>( memnew(EditorScriptPreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorSamplePreviewPlugin>( memnew(EditorSamplePreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorMeshPreviewPlugin>( memnew(EditorMeshPreviewPlugin )));
+ resource_preview->add_preview_generator( Ref<EditorBitmapPreviewPlugin>( memnew(EditorBitmapPreviewPlugin )));
+*/
+
+
+ circle_step_msec=OS::get_singleton()->get_ticks_msec();
+ circle_step_frame=Engine::get_singleton()->get_frames_drawn();
+ circle_step=0;
+
+ _rebuild_import_menu();
+
+ editor_plugin_screen=NULL;
+ editor_plugins_over = memnew(EditorPluginList);
+
+ //force_top_viewport(true);
+ _edit_current();
+ current=NULL;
+
+ PhysicsServer::get_singleton()->set_active(false); // no physics by default if editor
+ Physics2DServer::get_singleton()->set_active(false); // no physics by default if editor
+ ScriptServer::set_scripting_enabled(false); // no scripting by default if editor
+
+
+ //GlobalConfig::get_singleton()->set("render/room_cull_enabled",false);
+
+ reference_resource_mem=true;
+ save_external_resources_mem=true;
+
+ set_process(true);
+ OS::get_singleton()->set_low_processor_usage_mode(true);
+
+
+ if (0) { //not sure if i want this to happen after all
+
+ //store project name in ssettings
+ String project_name;
+ //figure it out from path
+ project_name=GlobalConfig::get_singleton()->get_resource_path().replace("\\","/");
+ print_line("path: "+project_name);
+ if (project_name.length() && project_name[project_name.length()-1]=='/')
+ project_name=project_name.substr(0,project_name.length()-1);
+
+ project_name=project_name.replace("/","::");
+
+ if (project_name!="") {
+ EditorSettings::get_singleton()->set("projects/"+project_name,GlobalConfig::get_singleton()->get_resource_path());
+ EditorSettings::get_singleton()->raise_order("projects/"+project_name);
+ EditorSettings::get_singleton()->save();
+ }
+ }
+
+ open_imported = memnew( ConfirmationDialog );
+ open_imported->get_ok()->set_text(TTR("Open Anyway"));
+ new_inherited_button=open_imported->add_button("New Inherited",!OS::get_singleton()->get_swap_ok_cancel(),"inherit");
+ open_imported->connect("confirmed",this,"_open_imported");
+ open_imported->connect("custom_action",this,"_inherit_imported");
+ gui_base->add_child(open_imported);
+
+
+
+ //edited_scene=NULL;
+ saved_version=1;
+ unsaved_cache=true;
+ _last_instanced_scene=NULL;
+
+
+ quick_open = memnew( EditorQuickOpen );
+ gui_base->add_child(quick_open);
+ quick_open->connect("quick_open",this,"_quick_opened");
+
+ quick_run = memnew( EditorQuickOpen );
+ gui_base->add_child(quick_run);
+ quick_run->connect("quick_open",this,"_quick_run");
+
+
+ _update_recent_scenes();
+
+
+ editor_data.restore_editor_global_states();
+ convert_old=false;
+ opening_prev=false;
+ set_process_unhandled_input(true);
+ _playing_edited=false;
+
+ //Panel *errors = memnew( Panel );
+ load_errors = memnew( RichTextLabel );
+ //load_errors->set_readonly(true);
+ load_error_dialog = memnew( AcceptDialog );
+ load_error_dialog->add_child(load_errors);
+ load_error_dialog->set_title(TTR("Load Errors"));
+ //load_error_dialog->set_child_rect(load_errors);
+ gui_base->add_child(load_error_dialog);
+
+
+ //EditorImport::add_importer( Ref<EditorImporterCollada>( memnew(EditorImporterCollada )));
+
+ EditorFileSystem::get_singleton()->connect("sources_changed",this,"_sources_changed");
+ EditorFileSystem::get_singleton()->connect("filesystem_changed",this,"_fs_changed");
+
+
+ {
+ List<StringName> tl;
+ StringName ei = "EditorIcons";
+ theme_base->get_theme()->get_icon_list(ei,&tl);
+ for(List<StringName>::Element *E=tl.front();E;E=E->next()) {
+
+ if (!ClassDB::class_exists(E->get()))
+ continue;
+ icon_type_cache[E->get()]=theme_base->get_theme()->get_icon(E->get(),ei);
+ }
+ }
+
+
+
+ Node::set_human_readable_collision_renaming(true);
+
+
+ pick_main_scene = memnew( ConfirmationDialog );
+ gui_base->add_child(pick_main_scene);
+ pick_main_scene->get_ok()->set_text("Select");
+ pick_main_scene->connect("confirmed",this,"_menu_option",varray(SETTINGS_PICK_MAIN_SCENE));
+
+ //Ref<ImageTexture> it = gui_base->get_icon("logo","Icons");
+ //OS::get_singleton()->set_icon( it->get_data() );
+
+ for(int i=0;i<_init_callbacks.size();i++)
+ _init_callbacks[i]();
+
+ editor_data.add_edited_scene(-1);
+ editor_data.set_edited_scene(0);
+ _update_scene_tabs();
+
+ {
+
+ _initializing_addons=true;
+ Vector<String> addons = GlobalConfig::get_singleton()->get("editor_plugins/enabled");
+
+ for(int i=0;i<addons.size();i++) {
+ set_addon_plugin_enabled(addons[i],true);
+ }
+ _initializing_addons=false;
+ }
+
+
+
+ _load_docks();
+
+ FileAccess::set_file_close_fail_notify_callback(_file_access_close_error_notify);
+
+ waiting_for_first_scan=true;
+
+}
+
+
+EditorNode::~EditorNode() {
+
+
+ memdelete( EditorHelp::get_doc_data() );
+ memdelete(editor_selection);
+ memdelete(editor_plugins_over);
+ memdelete(file_server);
+ EditorSettings::destroy();
+}
+
+/*
+ * EDITOR PLUGIN LIST
+ */
+
+
+void EditorPluginList::make_visible(bool p_visible) {
+
+ for (int i = 0; i < plugins_list.size(); i++) {
+ plugins_list[i]->make_visible(p_visible);
+ }
+
+}
+
+void EditorPluginList::edit(Object* p_object) {
+
+ for (int i = 0; i < plugins_list.size(); i++) {
+ plugins_list[i]->edit(p_object);
+ }
+
+}
+
+bool EditorPluginList::forward_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) {
+
+ bool discard = false;
+
+ for (int i = 0; i < plugins_list.size(); i++) {
+ if (plugins_list[i]->forward_canvas_gui_input(p_canvas_xform,p_event)) {
+ discard = true;
+ }
+ }
+
+ return discard;
+}
+
+bool EditorPluginList::forward_spatial_gui_input(Camera* p_camera, const InputEvent& p_event) {
+ bool discard = false;
+
+ for (int i = 0; i < plugins_list.size(); i++) {
+ if (plugins_list[i]->forward_spatial_gui_input(p_camera, p_event)) {
+ discard = true;
+ }
+ }
+
+ return discard;
+}
+
+void EditorPluginList::forward_draw_over_canvas(const Transform2D& p_canvas_xform,Control* p_canvas) {
+
+ for (int i = 0; i < plugins_list.size(); i++) {
+ plugins_list[i]->forward_draw_over_canvas(p_canvas_xform,p_canvas);
+ }
+
+}
+
+bool EditorPluginList::empty() {
+ return plugins_list.empty();
+}
+
+void EditorPluginList::clear() {
+ plugins_list.clear();
+}
+
+EditorPluginList::EditorPluginList() {
+}
+
+EditorPluginList::~EditorPluginList() {
+}
diff --git a/editor/editor_node.h b/editor/editor_node.h
new file mode 100644
index 0000000000..fb0b5c4c25
--- /dev/null
+++ b/editor/editor_node.h
@@ -0,0 +1,833 @@
+/*************************************************************************/
+/* editor_node.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_NODE_H
+#define EDITOR_NODE_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/panel.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/separator.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/center_container.h"
+#include "scene/gui/texture_progress.h"
+#include "editor/filesystem_dock.h"
+#include "editor/scene_tree_editor.h"
+#include "editor/property_editor.h"
+#include "editor/create_dialog.h"
+#include "editor/call_dialog.h"
+#include "editor/reparent_dialog.h"
+#include "editor/connections_dialog.h"
+#include "editor/node_dock.h"
+#include "editor/import_dock.h"
+#include "editor/settings_config_dialog.h"
+#include "editor/groups_editor.h"
+#include "editor/editor_data.h"
+#include "editor/editor_path.h"
+#include "editor/editor_run.h"
+
+#include "editor/pane_drag.h"
+
+#include "editor/script_create_dialog.h"
+#include "editor/run_settings_dialog.h"
+#include "editor/project_settings.h"
+#include "editor/project_export.h"
+#include "editor/editor_log.h"
+#include "editor/scene_tree_dock.h"
+#include "editor/resources_dock.h"
+#include "editor/editor_run_script.h"
+
+#include "editor/editor_run_native.h"
+#include "scene/gui/tabs.h"
+#include "editor/quick_open.h"
+#include "editor/project_export.h"
+#include "editor/editor_sub_scene.h"
+#include "editor_export.h"
+#include "editor_reimport_dialog.h"
+#include "editor/editor_plugin.h"
+#include "editor/editor_name_dialog.h"
+
+#include "fileserver/editor_file_server.h"
+#include "editor_resource_preview.h"
+#include "scene/gui/viewport_container.h"
+
+
+#include "progress_dialog.h"
+
+#include "editor_scale.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+
+
+
+
+typedef void (*EditorNodeInitCallback)();
+typedef void (*EditorPluginInitializeCallback)();
+typedef void (*EditorBuildCallback)();
+
+class EditorPluginList;
+
+class EditorNode : public Node {
+
+ GDCLASS( EditorNode, Node );
+
+public:
+ enum DockSlot {
+ DOCK_SLOT_LEFT_UL,
+ DOCK_SLOT_LEFT_BL,
+ DOCK_SLOT_LEFT_UR,
+ DOCK_SLOT_LEFT_BR,
+ DOCK_SLOT_RIGHT_UL,
+ DOCK_SLOT_RIGHT_BL,
+ DOCK_SLOT_RIGHT_UR,
+ DOCK_SLOT_RIGHT_BR,
+ DOCK_SLOT_MAX
+ };
+private:
+ enum {
+ HISTORY_SIZE=64
+ };
+
+ enum MenuOptions {
+ FILE_NEW_SCENE,
+ FILE_NEW_INHERITED_SCENE,
+ FILE_OPEN_SCENE,
+ FILE_SAVE_SCENE,
+ FILE_SAVE_AS_SCENE,
+ FILE_SAVE_ALL_SCENES,
+ FILE_SAVE_BEFORE_RUN,
+ FILE_SAVE_AND_RUN,
+ FILE_IMPORT_SUBSCENE,
+ FILE_EXPORT_PROJECT,
+ FILE_EXPORT_MESH_LIBRARY,
+ FILE_EXPORT_TILESET,
+ FILE_SAVE_OPTIMIZED,
+ FILE_OPEN_RECENT,
+ FILE_OPEN_OLD_SCENE,
+ FILE_QUICK_OPEN_SCENE,
+ FILE_QUICK_OPEN_SCRIPT,
+ FILE_RUN_SCRIPT,
+ FILE_OPEN_PREV,
+ FILE_CLOSE,
+ FILE_QUIT,
+ FILE_EXTERNAL_OPEN_SCENE,
+ EDIT_UNDO,
+ EDIT_REDO,
+ EDIT_REVERT,
+ TOOLS_ORPHAN_RESOURCES,
+ RESOURCE_NEW,
+ RESOURCE_LOAD,
+ RESOURCE_SAVE,
+ RESOURCE_SAVE_AS,
+ RESOURCE_UNREF,
+ RESOURCE_COPY,
+ RESOURCE_PASTE,
+ OBJECT_COPY_PARAMS,
+ OBJECT_PASTE_PARAMS,
+ OBJECT_UNIQUE_RESOURCES,
+ OBJECT_REQUEST_HELP,
+ RUN_PLAY,
+
+ RUN_STOP,
+ RUN_PLAY_SCENE,
+ RUN_PLAY_NATIVE,
+ RUN_PLAY_CUSTOM_SCENE,
+ RUN_SCENE_SETTINGS,
+ RUN_SETTINGS,
+ RUN_PROJECT_MANAGER,
+ RUN_FILE_SERVER,
+ //RUN_DEPLOY_DUMB_CLIENTS,
+ RUN_LIVE_DEBUG,
+ RUN_DEBUG_COLLISONS,
+ RUN_DEBUG_NAVIGATION,
+ RUN_DEPLOY_REMOTE_DEBUG,
+ RUN_RELOAD_SCRIPTS,
+ SETTINGS_UPDATE_ALWAYS,
+ SETTINGS_UPDATE_CHANGES,
+ SETTINGS_UPDATE_SPINNER_HIDE,
+ SETTINGS_EXPORT_PREFERENCES,
+ SETTINGS_PREFERENCES,
+ SETTINGS_OPTIMIZED_PRESETS,
+ SETTINGS_LAYOUT_SAVE,
+ SETTINGS_LAYOUT_DELETE,
+ SETTINGS_LAYOUT_DEFAULT,
+ SETTINGS_LOAD_EXPORT_TEMPLATES,
+ SETTINGS_PICK_MAIN_SCENE,
+ SETTINGS_TOGGLE_FULLSCREN,
+ SETTINGS_HELP,
+ SETTINGS_ABOUT,
+ SOURCES_REIMPORT,
+ DEPENDENCY_LOAD_CHANGED_IMAGES,
+ DEPENDENCY_UPDATE_IMPORTED,
+ SCENE_TAB_CLOSE,
+
+ IMPORT_PLUGIN_BASE=100,
+
+ OBJECT_METHOD_BASE=500,
+
+ TOOL_MENU_BASE=1000
+ };
+
+
+
+ //Node *edited_scene; //scene being edited
+ Viewport *scene_root; //root of the scene being edited
+
+ //Ref<ResourceImportMetadata> scene_import_metadata;
+
+ PanelContainer* scene_root_parent;
+ Control *gui_base;
+ VBoxContainer *main_vbox;
+
+ //split
+
+ HSplitContainer *left_l_hsplit;
+ VSplitContainer *left_l_vsplit;
+ HSplitContainer *left_r_hsplit;
+ VSplitContainer *left_r_vsplit;
+ HSplitContainer *main_hsplit;
+ HSplitContainer *right_hsplit;
+ VSplitContainer *right_l_vsplit;
+ VSplitContainer *right_r_vsplit;
+
+ VSplitContainer *center_split;
+
+ //main tabs
+
+ Tabs *scene_tabs;
+ int tab_closing;
+
+ bool exiting;
+
+ int old_split_ofs;
+ VSplitContainer *top_split;
+ HBoxContainer *bottom_hb;
+ Control *vp_base;
+ PaneDrag *pd;
+ //PaneDrag *pd_anim;
+ Panel *menu_panel;
+
+
+ //HSplitContainer *editor_hsplit;
+ //VSplitContainer *editor_vsplit;
+ CenterContainer *play_cc;
+ HBoxContainer *menu_hb;
+ Control *viewport;
+ MenuButton *file_menu;
+ MenuButton *import_menu;
+ MenuButton *tool_menu;
+ ToolButton *export_button;
+ ToolButton *prev_scene;
+ MenuButton *object_menu;
+ MenuButton *settings_menu;
+ ToolButton *play_button;
+ MenuButton *native_play_button;
+ ToolButton *pause_button;
+ ToolButton *stop_button;
+ ToolButton *run_settings_button;
+ ToolButton *play_scene_button;
+ ToolButton *play_custom_scene_button;
+ MenuButton *debug_button;
+ ToolButton *search_button;
+ TextureProgress *audio_vu;
+ //MenuButton *fileserver_menu;
+
+ RichTextLabel *load_errors;
+ AcceptDialog *load_error_dialog;
+
+ //Control *scene_root_base;
+ Ref<Theme> theme;
+
+ PopupMenu *recent_scenes;
+ Button *property_back;
+ Button *property_forward;
+ SceneTreeDock *scene_tree_dock;
+ //ResourcesDock *resources_dock;
+ PropertyEditor *property_editor;
+ NodeDock *node_dock;
+ ImportDock *import_dock;
+ VBoxContainer *prop_editor_vb;
+ FileSystemDock *filesystem_dock;
+ EditorRunNative *run_native;
+
+ HBoxContainer *search_bar;
+ LineEdit *search_box;
+
+ CreateDialog *create_dialog;
+
+ //CallDialog *call_dialog;
+ ConfirmationDialog *confirmation;
+ ConfirmationDialog *import_confirmation;
+ ConfirmationDialog *open_recent_confirmation;
+ ConfirmationDialog *pick_main_scene;
+ AcceptDialog *accept;
+ AcceptDialog *about;
+ AcceptDialog *warning;
+
+ int overridden_default_layout;
+ Ref<ConfigFile> default_layout;
+ PopupMenu *editor_layouts;
+ EditorNameDialog *layout_dialog;
+
+ //OptimizedPresetsDialog *optimized_presets;
+ EditorSettingsDialog *settings_config_dialog;
+ RunSettingsDialog *run_settings_dialog;
+ ProjectSettings *project_settings;
+ EditorFileDialog *file;
+ FileDialog *file_templates;
+ FileDialog *file_export;
+ FileDialog *file_export_lib;
+ FileDialog *file_script;
+ CheckButton *file_export_lib_merge;
+ LineEdit *file_export_password;
+ String current_path;
+ MenuButton *update_menu;
+ ToolButton *sources_button;
+ //TabContainer *prop_pallete;
+ //TabContainer *top_pallete;
+ String defer_load_scene;
+ String defer_export;
+ String defer_export_platform;
+ bool defer_export_debug;
+ Node *_last_instanced_scene;
+ EditorPath *editor_path;
+ ToolButton *resource_new_button;
+ ToolButton *resource_load_button;
+ MenuButton *resource_save_button;
+ MenuButton *editor_history_menu;
+
+ EditorLog *log;
+ CenterContainer *tabs_center;
+ EditorQuickOpen *quick_open;
+ EditorQuickOpen *quick_run;
+
+ HBoxContainer *main_editor_button_vb;
+ Vector<ToolButton*> main_editor_buttons;
+ Vector<EditorPlugin*> editor_table;
+
+// EditorReImportDialog *reimport_dialog;
+
+ ProgressDialog *progress_dialog;
+ BackgroundProgress *progress_hb;
+
+ DependencyErrorDialog *dependency_error;
+ DependencyEditor *dependency_fixer;
+ OrphanResourcesDialog *orphan_resources;
+ ConfirmationDialog *open_imported;
+ Button *new_inherited_button;
+ String open_import_request;
+
+
+ TabContainer *dock_slot[DOCK_SLOT_MAX];
+ Rect2 dock_select_rect[DOCK_SLOT_MAX];
+ int dock_select_rect_over;
+ PopupPanel *dock_select_popoup;
+ Control *dock_select;
+ ToolButton *dock_tab_move_left;
+ ToolButton *dock_tab_move_right;
+ int dock_popup_selected;
+ Timer *dock_drag_timer;
+ bool docks_visible;
+ ToolButton *distraction_free;
+
+ String _tmp_import_path;
+
+ EditorExport *editor_export;
+
+ Object *current;
+
+ bool _playing_edited;
+ String run_custom_filename;
+ bool reference_resource_mem;
+ bool save_external_resources_mem;
+ uint64_t saved_version;
+ uint64_t last_checked_version;
+ bool unsaved_cache;
+ String open_navigate;
+ bool changing_scene;
+ bool waiting_for_first_scan;
+
+ bool waiting_for_sources_changed;
+
+ uint32_t circle_step_msec;
+ uint64_t circle_step_frame;
+ int circle_step;
+
+ Vector<EditorPlugin*> editor_plugins;
+ EditorPlugin *editor_plugin_screen;
+ EditorPluginList *editor_plugins_over;
+
+ EditorHistory editor_history;
+ EditorData editor_data;
+ EditorRun editor_run;
+ EditorSelection *editor_selection;
+// ProjectExport *project_export;
+ ProjectExportDialog *project_export;
+ EditorResourcePreview *resource_preview;
+
+ EditorFileServer *file_server;
+
+
+ struct BottomPanelItem {
+ String name;
+ Control *control;
+ ToolButton *button;
+ };
+
+ Vector<BottomPanelItem> bottom_panel_items;
+
+ PanelContainer *bottom_panel;
+ HBoxContainer *bottom_panel_hb;
+ VBoxContainer *bottom_panel_vb;
+
+ void _bottom_panel_switch(bool p_enable, int p_idx);
+
+ String external_file;
+ List<String> previous_scenes;
+ bool opening_prev;
+
+ void _dialog_action(String p_file);
+
+
+ void _edit_current();
+ void _dialog_display_file_error(String p_file,Error p_error);
+
+ int current_option;
+ //void _animation_visibility_toggle();
+ void _resource_created();
+ void _resource_selected(const RES& p_res,const String& p_property="");
+ void _menu_option(int p_option);
+ void _menu_confirm_current();
+ void _menu_option_confirm(int p_option,bool p_confirmed);
+ void _update_debug_options();
+
+ void _property_editor_forward();
+ void _property_editor_back();
+
+ void _select_history(int p_idx);
+ void _prepare_history();
+
+
+ void _fs_changed();
+ void _sources_changed(bool p_exist);
+ void _imported(Node *p_node);
+
+ void _node_renamed();
+ void _editor_select(int p_which);
+ void _set_scene_metadata(const String &p_file, int p_idx=-1);
+ void _get_scene_metadata(const String& p_file);
+ void _update_title();
+ void _update_scene_tabs();
+ void _close_messages();
+ void _show_messages();
+ void _vp_resized();
+
+ void _rebuild_import_menu();
+
+ void _save_scene(String p_file, int idx = -1);
+
+
+ void _instance_request(const Vector<String>& p_files);
+
+ void _property_keyed(const String& p_keyed, const Variant& p_value, bool p_advance);
+ void _transform_keyed(Object *sp,const String& p_sub,const Transform& p_key);
+
+ void _hide_top_editors();
+ void _display_top_editors(bool p_display);
+ void _set_top_editors(Vector<EditorPlugin*> p_editor_plugins_over);
+ void _set_editing_top_editors(Object * p_current_object);
+
+ void _quick_opened();
+ void _quick_run();
+
+ void _run(bool p_current=false, const String &p_custom="");
+
+ void _save_optimized();
+ void _import_action(const String& p_action);
+ void _import(const String &p_file);
+ void _add_to_recent_scenes(const String& p_scene);
+ void _update_recent_scenes();
+ void _open_recent_scene(int p_idx);
+ void _dropped_files(const Vector<String>& p_files,int p_screen);
+ //void _open_recent_scene_confirm();
+ String _recent_scene;
+
+ bool convert_old;
+
+ void _unhandled_input(const InputEvent& p_event);
+
+ static void _load_error_notify(void* p_ud,const String& p_text);
+
+ bool has_main_screen() const { return true; }
+
+ bool _find_editing_changed_scene(Node *p_from);
+
+ String import_reload_fn;
+
+ Set<FileDialog*> file_dialogs;
+ Set<EditorFileDialog*> editor_file_dialogs;
+
+ Map<String,Ref<Texture> > icon_type_cache;
+
+ bool _initializing_addons;
+ Map<String,EditorPlugin*> plugin_addons;
+
+
+ static Ref<Texture> _file_dialog_get_icon(const String& p_path);
+ static void _file_dialog_register(FileDialog *p_dialog);
+ static void _file_dialog_unregister(FileDialog *p_dialog);
+ static void _editor_file_dialog_register(EditorFileDialog *p_dialog);
+ static void _editor_file_dialog_unregister(EditorFileDialog *p_dialog);
+
+
+ void _cleanup_scene();
+ void _remove_edited_scene();
+ void _remove_scene(int index);
+ bool _find_and_save_resource(RES p_res,Map<RES,bool>& processed,int32_t flags);
+ bool _find_and_save_edited_subresources(Object *obj,Map<RES,bool>& processed,int32_t flags);
+ void _save_edited_subresources(Node* scene,Map<RES,bool>& processed,int32_t flags);
+
+ void _find_node_types(Node* p_node, int&count_2d, int&count_3d);
+ void _save_scene_with_preview(String p_file);
+
+
+ Map<String,Set<String> > dependency_errors;
+
+ static void _dependency_error_report(void *ud,const String& p_path,const String& p_dep,const String& p_type) {
+ EditorNode*en=(EditorNode*)ud;
+ if (!en->dependency_errors.has(p_path))
+ en->dependency_errors[p_path]=Set<String>();
+ en->dependency_errors[p_path].insert(p_dep+"::"+p_type);
+
+ }
+
+ struct ExportDefer {
+ String platform;
+ String path;
+ bool debug;
+ String password;
+
+ } export_defer;
+
+ static EditorNode *singleton;
+
+ static Vector<EditorNodeInitCallback> _init_callbacks;
+
+ bool _find_scene_in_use(Node* p_node,const String& p_path) const;
+
+ void _dock_select_input(const InputEvent& p_input);
+ void _dock_move_left();
+ void _dock_move_right();
+ void _dock_select_draw();
+ void _dock_pre_popup(int p_which);
+ void _dock_split_dragged(int ofs);
+ void _dock_popup_exit();
+ void _scene_tab_changed(int p_tab);
+ void _scene_tab_closed(int p_tab);
+ void _scene_tab_script_edited(int p_tab);
+
+ Dictionary _get_main_scene_state();
+ void _set_main_scene_state(Dictionary p_state,Node* p_for_scene);
+
+ int _get_current_main_editor();
+
+ void _save_docks();
+ void _load_docks();
+ void _save_docks_to_config(Ref<ConfigFile> p_layout, const String& p_section);
+ void _load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section);
+ void _update_dock_slots_visibility();
+ void _update_top_menu_visibility();
+
+ void _update_layouts_menu();
+ void _layout_menu_option(int p_idx);
+
+ void _toggle_search_bar(bool p_pressed);
+ void _clear_search_box();
+ void _clear_undo_history();
+
+ void _update_addon_config();
+
+ static void _file_access_close_error_notify(const String& p_str);
+
+ void _toggle_distraction_free_mode();
+
+ enum {
+ MAX_INIT_CALLBACKS=128,
+ MAX_BUILD_CALLBACKS=128
+ };
+
+ void _inherit_imported(const String &p_action);
+ void _open_imported();
+
+
+ static int plugin_init_callback_count;
+ static EditorPluginInitializeCallback plugin_init_callbacks[MAX_INIT_CALLBACKS];
+
+ void _call_build();
+ static int build_callback_count;
+ static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS];
+
+ bool _initializing_tool_menu;
+
+ struct ToolMenuItem {
+ String name;
+ String submenu;
+ Variant ud;
+ ObjectID handler;
+ String callback;
+ };
+
+ Vector<ToolMenuItem> tool_menu_items;
+
+ void _tool_menu_insert_item(const ToolMenuItem& p_item);
+ void _rebuild_tool_menu() const;
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ static void add_plugin_init_callback(EditorPluginInitializeCallback p_callback);
+
+ enum EditorTable {
+ EDITOR_2D = 0,
+ EDITOR_3D,
+ EDITOR_SCRIPT
+ };
+
+ void set_visible_editor(EditorTable p_table) { _editor_select(p_table); }
+ static EditorNode* get_singleton() { return singleton; }
+
+
+ EditorPlugin *get_editor_plugin_screen() { return editor_plugin_screen; }
+ EditorPluginList *get_editor_plugins_over() { return editor_plugins_over; }
+ PropertyEditor *get_property_editor() { return property_editor; }
+ VBoxContainer *get_property_editor_vb() { return prop_editor_vb; }
+
+ static void add_editor_plugin(EditorPlugin *p_editor);
+ static void remove_editor_plugin(EditorPlugin *p_editor);
+
+ void new_inherited_scene() { _menu_option_confirm(FILE_NEW_INHERITED_SCENE,false); }
+
+
+ void set_docks_visible(bool p_show);
+ bool get_docks_visible() const;
+
+ void set_distraction_free_mode(bool p_enter);
+ bool get_distraction_free_mode() const;
+
+ void add_control_to_dock(DockSlot p_slot,Control* p_control);
+ void remove_control_from_dock(Control* p_control);
+
+ void set_addon_plugin_enabled(const String& p_addon,bool p_enabled);
+ bool is_addon_plugin_enabled(const String &p_addon) const;
+
+ void edit_node(Node *p_node);
+ void edit_resource(const Ref<Resource>& p_resource);
+ void open_resource(const String& p_type="");
+
+ void save_resource_in_path(const Ref<Resource>& p_resource,const String& p_path);
+ void save_resource(const Ref<Resource>& p_resource);
+ void save_resource_as(const Ref<Resource>& p_resource, const String &p_at_path=String());
+
+ void merge_from_scene() { _menu_option_confirm(FILE_IMPORT_SUBSCENE,false); }
+
+ static bool has_unsaved_changes() { return singleton->unsaved_cache; }
+
+ static HBoxContainer *get_menu_hb() { return singleton->menu_hb; }
+
+ void push_item(Object *p_object,const String& p_property="");
+
+ void open_request(const String& p_path);
+
+ bool is_changing_scene() const;
+
+
+ static EditorLog *get_log() { return singleton->log; }
+ Control* get_viewport();
+
+ //void animation_editor_make_visible(bool p_visible);
+ //void hide_animation_player_editors();
+ //void animation_panel_make_visible(bool p_visible);
+
+ void set_edited_scene(Node *p_scene);
+
+ Node *get_edited_scene() { return editor_data.get_edited_scene_root(); }
+
+ Viewport *get_scene_root() { return scene_root; } //root of the scene being edited
+
+ void fix_dependencies(const String& p_for_file);
+ void clear_scene() { _cleanup_scene(); }
+ Error load_scene(const String& p_scene, bool p_ignore_broken_deps=false, bool p_set_inherited=false, bool p_clear_errors=true,bool p_force_open_imported=false);
+ Error load_resource(const String& p_scene);
+
+ bool is_scene_open(const String& p_path);
+
+ void set_current_version(uint64_t p_version);
+ void set_current_scene(int p_idx);
+
+ static EditorData& get_editor_data() { return singleton->editor_data; }
+ EditorHistory * get_editor_history() { return &editor_history; }
+
+ static VSplitContainer *get_top_split() { return singleton->top_split; }
+
+ void request_instance_scene(const String &p_path);
+ void request_instance_scenes(const Vector<String>& p_files);
+ FileSystemDock *get_filesystem_dock();
+ ImportDock *get_import_dock();
+ SceneTreeDock *get_scene_tree_dock();
+ static UndoRedo* get_undo_redo() { return &singleton->editor_data.get_undo_redo(); }
+
+ EditorSelection *get_editor_selection() { return editor_selection; }
+
+ void set_convert_old_scene(bool p_old) { convert_old=p_old; }
+
+ void notify_child_process_exited();
+
+ OS::ProcessID get_child_process_id() const { return editor_run.get_pid(); }
+ void stop_child_process();
+
+ Ref<Theme> get_editor_theme() const { return theme; }
+
+
+ void show_warning(const String& p_text,const String& p_title="Warning!");
+
+
+ Error export_platform(const String& p_platform, const String& p_path, bool p_debug,const String& p_password,bool p_quit_after=false);
+
+ static void register_editor_types();
+ static void unregister_editor_types();
+
+ Control *get_gui_base() { return gui_base; }
+ Control *get_theme_base() { return gui_base->get_parent_control(); }
+
+ static void add_io_error(const String& p_error);
+
+ static void progress_add_task(const String& p_task,const String& p_label, int p_steps);
+ static void progress_task_step(const String& p_task,const String& p_state, int p_step=-1,bool p_force_refresh=true);
+ static void progress_end_task(const String& p_task);
+
+ static void progress_add_task_bg(const String& p_task,const String& p_label, int p_steps);
+ static void progress_task_step_bg(const String& p_task,int p_step=-1);
+ static void progress_end_task_bg(const String& p_task);
+
+ void save_scene(String p_file) { _save_scene(p_file); }
+
+ bool is_scene_in_use(const String& p_path);
+
+ void scan_import_changes();
+
+ void save_layout();
+
+ void update_keying();
+
+ void reload_scene(const String& p_path);
+
+ bool is_exiting() const { return exiting; }
+
+ ToolButton *get_pause_button() { return pause_button; }
+
+
+ ToolButton* add_bottom_panel_item(String p_text,Control *p_item);
+ bool are_bottom_panels_hidden() const;
+ void make_bottom_panel_item_visible(Control *p_item);
+ void raise_bottom_panel_item(Control *p_item);
+ void hide_bottom_panel();
+ void remove_bottom_panel_item(Control *p_item);
+
+ Variant drag_resource(const Ref<Resource>& p_res,Control* p_from);
+ Variant drag_files(const Vector<String>& p_files,Control* p_from);
+ Variant drag_files_and_dirs(const Vector<String>& p_files,Control* p_from);
+
+ void add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud = Variant());
+ void add_tool_submenu_item(const String& p_name, PopupMenu *p_submenu);
+ void remove_tool_menu_item(const String& p_name);
+
+ EditorNode();
+ ~EditorNode();
+ void get_singleton(const char* arg1, bool arg2);
+
+ static void add_init_callback(EditorNodeInitCallback p_callback) { _init_callbacks.push_back(p_callback); }
+ static void add_build_callback(EditorBuildCallback p_callback);
+
+
+
+};
+
+struct EditorProgress {
+
+ String task;
+ void step(const String& p_state, int p_step=-1,bool p_force_refresh=true) { EditorNode::progress_task_step(task,p_state,p_step,p_force_refresh); }
+ EditorProgress(const String& p_task,const String& p_label,int p_amount) { EditorNode::progress_add_task(p_task,p_label,p_amount); task=p_task; }
+ ~EditorProgress() { EditorNode::progress_end_task(task); }
+};
+
+class EditorPluginList : public Object {
+private:
+ Vector<EditorPlugin*> plugins_list;
+
+public:
+
+ void set_plugins_list(Vector<EditorPlugin*> p_plugins_list) {
+ plugins_list = p_plugins_list;
+ }
+
+ Vector<EditorPlugin*>& get_plugins_list() {
+ return plugins_list;
+ }
+
+ void make_visible(bool p_visible);
+ void edit(Object *p_object);
+ bool forward_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event);
+ bool forward_spatial_gui_input(Camera* p_camera, const InputEvent& p_event);
+ void forward_draw_over_canvas(const Transform2D& p_canvas_xform,Control* p_canvas);
+ void clear();
+ bool empty();
+
+ EditorPluginList();
+ ~EditorPluginList();
+
+} ;
+
+struct EditorProgressBG {
+
+ String task;
+ void step(int p_step=-1) { EditorNode::progress_task_step_bg(task,p_step); }
+ EditorProgressBG(const String& p_task,const String& p_label,int p_amount) { EditorNode::progress_add_task_bg(p_task,p_label,p_amount); task=p_task; }
+ ~EditorProgressBG() { EditorNode::progress_end_task_bg(task); }
+};
+
+#endif
diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp
new file mode 100644
index 0000000000..8cd31c4bcc
--- /dev/null
+++ b/editor/editor_path.cpp
@@ -0,0 +1,215 @@
+/*************************************************************************/
+/* editor_path.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_path.h"
+
+#include "editor_scale.h"
+#include "editor_node.h"
+
+void EditorPath::_add_children_to_popup(Object* p_obj,int p_depth) {
+
+ if (p_depth>8)
+ return;
+
+ List<PropertyInfo> pinfo;
+ p_obj->get_property_list(&pinfo);
+ for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ if (!(E->get().usage&PROPERTY_USAGE_EDITOR))
+ continue;
+ if (E->get().hint!=PROPERTY_HINT_RESOURCE_TYPE)
+ continue;
+
+ Variant value = p_obj->get(E->get().name);
+ if (value.get_type()!=Variant::OBJECT)
+ continue;
+ Object *obj = value;
+ if (!obj)
+ continue;
+
+ Ref<Texture> icon;
+
+ if (has_icon(obj->get_class(),"EditorIcons"))
+ icon=get_icon(obj->get_class(),"EditorIcons");
+ else
+ icon=get_icon("Object","EditorIcons");
+
+ int index = popup->get_item_count();
+ popup->add_icon_item(icon,E->get().name.capitalize(),objects.size());
+ popup->set_item_h_offset(index,p_depth*10*EDSCALE);
+ objects.push_back(obj->get_instance_ID());
+
+ _add_children_to_popup(obj,p_depth+1);
+ }
+}
+
+void EditorPath::_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && p_event.mouse_button.pressed) {
+
+
+ Object *obj = ObjectDB::get_instance(history->get_path_object( history->get_path_size()-1));
+ if (!obj)
+ return;
+
+
+
+ objects.clear();
+ popup->clear();
+ _add_children_to_popup(obj);
+ popup->set_pos( get_global_pos() + Vector2(0,get_size().height));
+ popup->set_size( Size2(get_size().width,1));
+ popup->popup();
+ }
+}
+
+void EditorPath::_notification(int p_what) {
+
+
+ switch(p_what) {
+
+ case NOTIFICATION_MOUSE_ENTER: {
+ mouse_over=true;
+ update();
+ } break;
+ case NOTIFICATION_MOUSE_EXIT: {
+ mouse_over=false;
+ update();
+ } break;
+ case NOTIFICATION_DRAW: {
+
+ RID ci=get_canvas_item();
+ Ref<Font> label_font = get_font("font","Label");
+ Size2i size = get_size();
+ Ref<Texture> sn = get_icon("SmallNext","EditorIcons");
+ Ref<StyleBox> sb = get_stylebox("pressed","Button");
+
+
+ int ofs=sb->get_margin(MARGIN_LEFT);
+
+ if (mouse_over) {
+ draw_style_box(sb,Rect2(Point2(),get_size()));
+ }
+
+ for(int i=0;i<history->get_path_size();i++) {
+
+ Object *obj = ObjectDB::get_instance(history->get_path_object(i));
+ if (!obj)
+ continue;
+
+ String type = obj->get_class();
+
+ Ref<Texture> icon;
+
+ if (has_icon(obj->get_class(),"EditorIcons"))
+ icon=get_icon(obj->get_class(),"EditorIcons");
+ else
+ icon=get_icon("Object","EditorIcons");
+
+
+ icon->draw(ci,Point2i(ofs,(size.height-icon->get_height())/2));
+
+ ofs+=icon->get_width();
+
+ if (i==history->get_path_size()-1) {
+ //add name
+ ofs+=4;
+ int left = size.width - ofs;
+ if (left<0)
+ continue;
+ String name;
+ if (obj->cast_to<Resource>()) {
+
+ Resource *r = obj->cast_to<Resource>();
+ if (r->get_path().is_resource_file())
+ name=r->get_path().get_file();
+ else
+ name=r->get_name();
+
+ if (name=="")
+ name=r->get_class();
+ } else if (obj->cast_to<Node>()) {
+
+ name=obj->cast_to<Node>()->get_name();
+ } else if (obj->cast_to<Resource>() && obj->cast_to<Resource>()->get_name()!="") {
+ name=obj->cast_to<Resource>()->get_name();
+ } else {
+ name=obj->get_class();
+ }
+
+ set_tooltip(obj->get_class());
+
+
+ label_font->draw(ci,Point2i(ofs,(size.height-label_font->get_height())/2+label_font->get_ascent()),name,Color(1,1,1),left);
+ } else {
+ //add arrow
+
+ //sn->draw(ci,Point2i(ofs,(size.height-sn->get_height())/2));
+ //ofs+=sn->get_width();
+ ofs+=5; //just looks better! somehow
+
+ }
+ }
+
+ } break;
+ }
+}
+
+void EditorPath::update_path() {
+
+
+ update();
+}
+
+void EditorPath::_popup_select(int p_idx) {
+
+ ERR_FAIL_INDEX(p_idx,objects.size());
+
+ Object* obj = ObjectDB::get_instance(objects[p_idx]);
+ if (!obj)
+ return;
+
+ EditorNode::get_singleton()->push_item(obj);
+}
+
+void EditorPath::_bind_methods() {
+
+ ClassDB::bind_method("_gui_input",&EditorPath::_gui_input);
+ ClassDB::bind_method("_popup_select",&EditorPath::_popup_select);
+}
+
+EditorPath::EditorPath(EditorHistory *p_history) {
+
+ history=p_history;
+ mouse_over=false;
+ popup = memnew( PopupMenu );
+ popup->connect("id_pressed",this,"_popup_select");
+ add_child(popup);
+
+
+}
diff --git a/editor/editor_path.h b/editor/editor_path.h
new file mode 100644
index 0000000000..fd5b469d07
--- /dev/null
+++ b/editor/editor_path.h
@@ -0,0 +1,63 @@
+/*************************************************************************/
+/* editor_path.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_PATH_H
+#define EDITOR_PATH_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/popup_menu.h"
+#include "editor_data.h"
+
+class EditorPath : public Control {
+
+ GDCLASS(EditorPath,Control);
+
+ EditorHistory *history;
+
+
+ Vector<ObjectID> objects;
+ PopupMenu *popup;
+ bool mouse_over;
+ EditorPath();
+
+ void _popup_select(int p_idx);
+ void _gui_input(const InputEvent& p_event);
+ void _add_children_to_popup(Object* p_obj,int p_depth=0);
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+
+ void update_path();
+
+ EditorPath(EditorHistory *p_history);
+};
+
+#endif // EDITOR_PATH_H
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
new file mode 100644
index 0000000000..85ef96fcc3
--- /dev/null
+++ b/editor/editor_plugin.cpp
@@ -0,0 +1,432 @@
+/*************************************************************************/
+/* editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_plugin.h"
+
+#include "scene/gui/popup_menu.h"
+#include "scene/3d/camera.h"
+#include "plugins/canvas_item_editor_plugin.h"
+#include "plugins/spatial_editor_plugin.h"
+#include "editor/editor_node.h"
+#include "editor/editor_settings.h"
+#include "editor_resource_preview.h"
+
+void EditorPlugin::add_custom_type(const String& p_type, const String& p_base,const Ref<Script>& p_script, const Ref<Texture>& p_icon) {
+
+ EditorNode::get_editor_data().add_custom_type(p_type,p_base,p_script,p_icon);
+}
+
+void EditorPlugin::remove_custom_type(const String& p_type){
+
+ EditorNode::get_editor_data().remove_custom_type(p_type);
+}
+
+
+ToolButton * EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
+
+ return EditorNode::get_singleton()->add_bottom_panel_item(p_title,p_control);
+}
+
+void EditorPlugin::add_control_to_dock(DockSlot p_slot,Control *p_control) {
+
+ ERR_FAIL_NULL(p_control);
+ EditorNode::get_singleton()->add_control_to_dock(EditorNode::DockSlot(p_slot),p_control);
+
+}
+
+void EditorPlugin::remove_control_from_docks(Control *p_control) {
+
+ ERR_FAIL_NULL(p_control);
+ EditorNode::get_singleton()->remove_control_from_dock(p_control);
+
+}
+
+void EditorPlugin::remove_control_from_bottom_panel(Control *p_control) {
+
+ ERR_FAIL_NULL(p_control);
+ EditorNode::get_singleton()->remove_bottom_panel_item(p_control);
+
+}
+
+Control * EditorPlugin::get_editor_viewport() {
+
+ return EditorNode::get_singleton()->get_viewport();
+}
+
+void EditorPlugin::edit_resource(const Ref<Resource>& p_resource){
+
+ EditorNode::get_singleton()->edit_resource(p_resource);
+}
+
+void EditorPlugin::add_control_to_container(CustomControlContainer p_location,Control *p_control) {
+
+ switch(p_location) {
+
+ case CONTAINER_TOOLBAR: {
+
+ EditorNode::get_menu_hb()->add_child(p_control);
+ } break;
+
+ case CONTAINER_SPATIAL_EDITOR_MENU: {
+
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(p_control);
+
+ } break;
+ case CONTAINER_SPATIAL_EDITOR_SIDE: {
+
+ SpatialEditor::get_singleton()->get_palette_split()->add_child(p_control);
+ SpatialEditor::get_singleton()->get_palette_split()->move_child(p_control,0);
+
+ } break;
+ case CONTAINER_SPATIAL_EDITOR_BOTTOM: {
+
+ SpatialEditor::get_singleton()->get_shader_split()->add_child(p_control);
+
+ } break;
+ case CONTAINER_CANVAS_EDITOR_MENU: {
+
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(p_control);
+
+ } break;
+ case CONTAINER_CANVAS_EDITOR_SIDE: {
+
+ CanvasItemEditor::get_singleton()->get_palette_split()->add_child(p_control);
+ CanvasItemEditor::get_singleton()->get_palette_split()->move_child(p_control,0);
+
+ } break;
+ case CONTAINER_CANVAS_EDITOR_BOTTOM: {
+
+ CanvasItemEditor::get_singleton()->get_bottom_split()->add_child(p_control);
+
+ } break;
+ case CONTAINER_PROPERTY_EDITOR_BOTTOM: {
+
+ EditorNode::get_singleton()->get_property_editor_vb()->add_child(p_control);
+
+ } break;
+
+
+ }
+}
+
+void EditorPlugin::add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud) {
+
+ //EditorNode::get_singleton()->add_tool_menu_item(p_name, p_handler, p_callback, p_ud);
+}
+
+void EditorPlugin::add_tool_submenu_item(const String& p_name, Object *p_submenu) {
+
+ ERR_FAIL_NULL(p_submenu);
+ PopupMenu *submenu = p_submenu->cast_to<PopupMenu>();
+ ERR_FAIL_NULL(submenu);
+ //EditorNode::get_singleton()->add_tool_submenu_item(p_name, submenu);
+}
+
+void EditorPlugin::remove_tool_menu_item(const String& p_name) {
+
+ //EditorNode::get_singleton()->remove_tool_menu_item(p_name);
+}
+
+Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial* p_spatial) {
+ //??
+ if (get_script_instance() && get_script_instance()->has_method("create_spatial_gizmo")) {
+ return get_script_instance()->call("create_spatial_gizmo",p_spatial);
+ }
+
+ return Ref<SpatialEditorGizmo>();
+}
+
+bool EditorPlugin::forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) {
+
+ if (get_script_instance() && get_script_instance()->has_method("forward_canvas_gui_input")) {
+ return get_script_instance()->call("forward_canvas_gui_input",p_canvas_xform,p_event);
+ }
+ return false;
+}
+
+void EditorPlugin::forward_draw_over_canvas(const Transform2D& p_canvas_xform,Control *p_canvas) {
+
+ if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_canvas")) {
+ get_script_instance()->call("forward_draw_over_canvas",p_canvas_xform,p_canvas);
+ }
+}
+
+void EditorPlugin::update_canvas() {
+ CanvasItemEditor::get_singleton()->get_viewport_control()->update();
+}
+
+bool EditorPlugin::forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event) {
+
+ if (get_script_instance() && get_script_instance()->has_method("forward_spatial_gui_input")) {
+ return get_script_instance()->call("forward_spatial_gui_input",p_camera,p_event);
+ }
+
+ return false;
+}
+String EditorPlugin::get_name() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_name")) {
+ return get_script_instance()->call("get_name");
+ }
+
+ return String();
+
+}
+bool EditorPlugin::has_main_screen() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("has_main_screen")) {
+ return get_script_instance()->call("has_main_screen");
+ }
+
+ return false;
+
+}
+void EditorPlugin::make_visible(bool p_visible) {
+
+ if (get_script_instance() && get_script_instance()->has_method("make_visible")) {
+ get_script_instance()->call("make_visible",p_visible);
+ }
+}
+
+
+void EditorPlugin::edit(Object *p_object) {
+
+ if (get_script_instance() && get_script_instance()->has_method("edit")) {
+ get_script_instance()->call("edit",p_object);
+ }
+
+}
+
+bool EditorPlugin::handles(Object *p_object) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("handles")) {
+ return get_script_instance()->call("handles",p_object);
+ }
+
+ return false;
+}
+Dictionary EditorPlugin::get_state() const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_state")) {
+ return get_script_instance()->call("get_state");
+ }
+
+ return Dictionary();
+}
+
+void EditorPlugin::set_state(const Dictionary& p_state) {
+
+ if (get_script_instance() && get_script_instance()->has_method("set_state")) {
+ get_script_instance()->call("set_state",p_state);
+ }
+}
+
+void EditorPlugin::clear() {
+
+ if (get_script_instance() && get_script_instance()->has_method("clear")) {
+ get_script_instance()->call("clear");
+ }
+
+}
+
+// if editor references external resources/scenes, save them
+void EditorPlugin::save_external_data() {
+
+ if (get_script_instance() && get_script_instance()->has_method("save_external_data")) {
+ get_script_instance()->call("save_external_data");
+ }
+}
+
+// if changes are pending in editor, apply them
+void EditorPlugin::apply_changes() {
+
+ if (get_script_instance() && get_script_instance()->has_method("apply_changes")) {
+ get_script_instance()->call("apply_changes");
+ }
+}
+
+void EditorPlugin::get_breakpoints(List<String> *p_breakpoints) {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_breakpoints")) {
+ PoolStringArray arr = get_script_instance()->call("get_breakpoints");
+ for(int i=0;i<arr.size();i++)
+ p_breakpoints->push_back(arr[i]);
+ }
+
+}
+bool EditorPlugin::get_remove_list(List<Node*> *p_list) {
+
+ return false;
+}
+
+void EditorPlugin::restore_global_state() {}
+void EditorPlugin::save_global_state() {}
+
+void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
+
+ if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) {
+ get_script_instance()->call("set_window_layout", p_layout);
+ }
+}
+
+void EditorPlugin::get_window_layout(Ref<ConfigFile> p_layout){
+
+ if (get_script_instance() && get_script_instance()->has_method("get_window_layout")) {
+ get_script_instance()->call("get_window_layout", p_layout);
+ }
+}
+
+void EditorPlugin::queue_save_layout() const {
+
+ EditorNode::get_singleton()->save_layout();
+}
+
+EditorSelection* EditorPlugin::get_selection() {
+ return EditorNode::get_singleton()->get_editor_selection();
+}
+
+
+EditorSettings *EditorPlugin::get_editor_settings() {
+ return EditorSettings::get_singleton();
+}
+
+EditorResourcePreview *EditorPlugin::get_resource_previewer() {
+ return EditorResourcePreview::get_singleton();
+}
+
+Control *EditorPlugin::get_base_control() {
+
+ return EditorNode::get_singleton()->get_gui_base();
+}
+
+void EditorPlugin::make_bottom_panel_item_visible(Control * p_item) {
+
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(p_item);
+}
+
+void EditorPlugin::hide_bottom_panel() {
+
+ EditorNode::get_singleton()->hide_bottom_panel();
+}
+
+void EditorPlugin::inspect_object(Object *p_obj,const String& p_for_property) {
+
+ EditorNode::get_singleton()->push_item(p_obj,p_for_property);
+}
+
+EditorFileSystem *EditorPlugin::get_resource_file_system() {
+ return EditorFileSystem::get_singleton();
+}
+
+void EditorPlugin::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("add_control_to_container","container","control:Control"),&EditorPlugin::add_control_to_container);
+ ClassDB::bind_method(D_METHOD("add_control_to_bottom_panel:ToolButton","control:Control","title"),&EditorPlugin::add_control_to_bottom_panel);
+ ClassDB::bind_method(D_METHOD("add_control_to_dock","slot","control:Control"),&EditorPlugin::add_control_to_dock);
+ ClassDB::bind_method(D_METHOD("remove_control_from_docks","control:Control"),&EditorPlugin::remove_control_from_docks);
+ ClassDB::bind_method(D_METHOD("remove_control_from_bottom_panel","control:Control"),&EditorPlugin::remove_control_from_bottom_panel);
+ //ClassDB::bind_method(D_METHOD("add_tool_menu_item", "name", "handler", "callback", "ud"),&EditorPlugin::add_tool_menu_item,DEFVAL(Variant()));
+ ClassDB::bind_method(D_METHOD("add_tool_submenu_item", "name", "submenu:PopupMenu"),&EditorPlugin::add_tool_submenu_item);
+ //ClassDB::bind_method(D_METHOD("remove_tool_menu_item", "name"),&EditorPlugin::remove_tool_menu_item);
+ ClassDB::bind_method(D_METHOD("add_custom_type","type","base","script:Script","icon:Texture"),&EditorPlugin::add_custom_type);
+ ClassDB::bind_method(D_METHOD("remove_custom_type","type"),&EditorPlugin::remove_custom_type);
+ ClassDB::bind_method(D_METHOD("get_editor_viewport:Control"), &EditorPlugin::get_editor_viewport);
+
+ ClassDB::bind_method(D_METHOD("get_resource_previewer:EditorResourcePreview"),&EditorPlugin::get_resource_previewer);
+ ClassDB::bind_method(D_METHOD("get_resource_filesystem:EditorFileSystem"),&EditorPlugin::get_resource_file_system);
+
+ ClassDB::bind_method(D_METHOD("inspect_object","object","for_property"),&EditorPlugin::inspect_object,DEFVAL(String()));
+ ClassDB::bind_method(D_METHOD("update_canvas"),&EditorPlugin::update_canvas);
+
+ ClassDB::bind_method(D_METHOD("make_bottom_panel_item_visible","item:Control"), &EditorPlugin::make_bottom_panel_item_visible);
+ ClassDB::bind_method(D_METHOD("hide_bottom_panel"), &EditorPlugin::hide_bottom_panel);
+
+ ClassDB::bind_method(D_METHOD("get_base_control:Control"),&EditorPlugin::get_base_control);
+ ClassDB::bind_method(D_METHOD("get_undo_redo:UndoRedo"),&EditorPlugin::_get_undo_redo);
+ ClassDB::bind_method(D_METHOD("get_selection:EditorSelection"),&EditorPlugin::get_selection);
+ ClassDB::bind_method(D_METHOD("get_editor_settings:EditorSettings"),&EditorPlugin::get_editor_settings);
+ ClassDB::bind_method(D_METHOD("queue_save_layout"),&EditorPlugin::queue_save_layout);
+ ClassDB::bind_method(D_METHOD("edit_resource"),&EditorPlugin::edit_resource);
+
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"forward_canvas_gui_input",PropertyInfo(Variant::TRANSFORM2D,"canvas_xform"),PropertyInfo(Variant::INPUT_EVENT,"event")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("forward_draw_over_canvas",PropertyInfo(Variant::TRANSFORM2D,"canvas_xform"),PropertyInfo(Variant::OBJECT,"canvas:Control")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"forward_spatial_gui_input",PropertyInfo(Variant::OBJECT,"camera",PROPERTY_HINT_RESOURCE_TYPE,"Camera"),PropertyInfo(Variant::INPUT_EVENT,"event")));
+ MethodInfo gizmo = MethodInfo(Variant::OBJECT,"create_spatial_gizmo",PropertyInfo(Variant::OBJECT,"for_spatial:Spatial"));
+ gizmo.return_val.hint=PROPERTY_HINT_RESOURCE_TYPE;
+ gizmo.return_val.hint_string="EditorSpatialGizmo";
+ ClassDB::add_virtual_method(get_class_static(),gizmo);
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::STRING,"get_name"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"has_main_screen"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("make_visible",PropertyInfo(Variant::BOOL,"visible")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("edit",PropertyInfo(Variant::OBJECT,"object")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"handles",PropertyInfo(Variant::OBJECT,"object")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::DICTIONARY,"get_state"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("set_state",PropertyInfo(Variant::DICTIONARY,"state")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("clear"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("save_external_data"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("apply_changes"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::POOL_STRING_ARRAY,"get_breakpoints"));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("set_window_layout",PropertyInfo(Variant::OBJECT,"layout",PROPERTY_HINT_RESOURCE_TYPE,"ConfigFile")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo("get_window_layout",PropertyInfo(Variant::OBJECT,"layout",PROPERTY_HINT_RESOURCE_TYPE,"ConfigFile")));
+
+ BIND_CONSTANT( CONTAINER_TOOLBAR );
+ BIND_CONSTANT( CONTAINER_SPATIAL_EDITOR_MENU );
+ BIND_CONSTANT( CONTAINER_SPATIAL_EDITOR_SIDE );
+ BIND_CONSTANT( CONTAINER_SPATIAL_EDITOR_BOTTOM );
+ BIND_CONSTANT( CONTAINER_CANVAS_EDITOR_MENU );
+ BIND_CONSTANT( CONTAINER_CANVAS_EDITOR_SIDE );
+ BIND_CONSTANT( CONTAINER_PROPERTY_EDITOR_BOTTOM );
+
+
+ BIND_CONSTANT( DOCK_SLOT_LEFT_UL );
+ BIND_CONSTANT( DOCK_SLOT_LEFT_BL );
+ BIND_CONSTANT( DOCK_SLOT_LEFT_UR );
+ BIND_CONSTANT( DOCK_SLOT_LEFT_BR );
+ BIND_CONSTANT( DOCK_SLOT_RIGHT_UL );
+ BIND_CONSTANT( DOCK_SLOT_RIGHT_BL );
+ BIND_CONSTANT( DOCK_SLOT_RIGHT_UR );
+ BIND_CONSTANT( DOCK_SLOT_RIGHT_BR );
+ BIND_CONSTANT( DOCK_SLOT_MAX );
+
+}
+
+EditorPlugin::EditorPlugin()
+{
+ undo_redo=NULL;
+}
+
+
+EditorPlugin::~EditorPlugin()
+{
+}
+
+
+
+EditorPluginCreateFunc EditorPlugins::creation_funcs[MAX_CREATE_FUNCS];
+
+int EditorPlugins::creation_func_count=0;
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
new file mode 100644
index 0000000000..13d8ab0343
--- /dev/null
+++ b/editor/editor_plugin.h
@@ -0,0 +1,201 @@
+/*************************************************************************/
+/* editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_PLUGIN_H
+#define EDITOR_PLUGIN_H
+
+#include "scene/gui/tool_button.h"
+#include "scene/main/node.h"
+#include "scene/resources/texture.h"
+#include "undo_redo.h"
+#include "io/config_file.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class EditorNode;
+class Spatial;
+class Camera;
+class EditorSelection;
+class EditorExport;
+class EditorSettings;
+class SpatialEditorGizmo;
+class EditorImportPlugin;
+class EditorExportPlugin;
+class EditorResourcePreview;
+class EditorFileSystem;
+
+class EditorPlugin : public Node {
+
+ GDCLASS( EditorPlugin, Node );
+friend class EditorData;
+ UndoRedo *undo_redo;
+
+ UndoRedo* _get_undo_redo() { return undo_redo; }
+
+protected:
+
+ static void _bind_methods();
+ UndoRedo& get_undo_redo() { return *undo_redo; }
+
+ void add_custom_type(const String& p_type, const String& p_base,const Ref<Script>& p_script, const Ref<Texture>& p_icon);
+ void remove_custom_type(const String& p_type);
+
+
+public:
+
+ enum CustomControlContainer {
+ CONTAINER_TOOLBAR,
+ CONTAINER_SPATIAL_EDITOR_MENU,
+ CONTAINER_SPATIAL_EDITOR_SIDE,
+ CONTAINER_SPATIAL_EDITOR_BOTTOM,
+ CONTAINER_CANVAS_EDITOR_MENU,
+ CONTAINER_CANVAS_EDITOR_SIDE,
+ CONTAINER_CANVAS_EDITOR_BOTTOM,
+ CONTAINER_PROPERTY_EDITOR_BOTTOM
+ };
+
+ enum DockSlot {
+ DOCK_SLOT_LEFT_UL,
+ DOCK_SLOT_LEFT_BL,
+ DOCK_SLOT_LEFT_UR,
+ DOCK_SLOT_LEFT_BR,
+ DOCK_SLOT_RIGHT_UL,
+ DOCK_SLOT_RIGHT_BL,
+ DOCK_SLOT_RIGHT_UR,
+ DOCK_SLOT_RIGHT_BR,
+ DOCK_SLOT_MAX
+ };
+
+ //TODO: send a resoucre for editing to the editor node?
+
+ void add_control_to_container(CustomControlContainer p_location, Control *p_control);
+ ToolButton *add_control_to_bottom_panel(Control *p_control, const String &p_title);
+ void add_control_to_dock(DockSlot p_slot,Control *p_control);
+ void remove_control_from_docks(Control *p_control);
+ void remove_control_from_bottom_panel(Control *p_control);
+ Control* get_editor_viewport();
+ void edit_resource(const Ref<Resource>& p_resource);
+
+ void add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud = Variant());
+ void add_tool_submenu_item(const String& p_name, Object *p_submenu);
+ void remove_tool_menu_item(const String& p_name);
+
+ virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial* p_spatial);
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform, const InputEvent& p_event);
+ virtual void forward_draw_over_canvas(const Transform2D& p_canvas_xform,Control *p_canvas);
+ virtual bool forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event);
+ virtual String get_name() const;
+ virtual bool has_main_screen() const;
+ virtual void make_visible(bool p_visible);
+ virtual void selected_notify() {}//notify that it was raised by the user, not the editor
+ virtual void edit(Object *p_object);
+ virtual bool handles(Object *p_node) const;
+ virtual Dictionary get_state() const; //save editor state so it can't be reloaded when reloading scene
+ virtual void set_state(const Dictionary& p_state) ; //restore editor state (likely was saved with the scene)
+ virtual void clear() ; // clear any temporary data in te editor, reset it (likely new scene or load another scene)
+ virtual void save_external_data() ; // if editor references external resources/scenes, save them
+ virtual void apply_changes() ; // if changes are pending in editor, apply them
+ virtual void get_breakpoints(List<String> *p_breakpoints);
+ virtual bool get_remove_list(List<Node*> *p_list);
+ virtual void set_window_layout(Ref<ConfigFile> p_layout);
+ virtual void get_window_layout(Ref<ConfigFile> p_layout);
+ virtual void edited_scene_changed(){} // if changes are pending in editor, apply them
+
+ void update_canvas();
+
+ virtual void inspect_object(Object *p_obj,const String& p_for_property=String());
+
+ void queue_save_layout() const;
+
+ Control *get_base_control();
+
+ void make_bottom_panel_item_visible(Control *p_item);
+ void hide_bottom_panel();
+
+ EditorSelection* get_selection();
+ //EditorImportExport *get_import_export();
+ EditorSettings *get_editor_settings();
+ EditorResourcePreview *get_resource_previewer();
+ EditorFileSystem *get_resource_file_system();
+
+ virtual void restore_global_state();
+ virtual void save_global_state();
+
+ EditorPlugin();
+ virtual ~EditorPlugin();
+
+};
+
+VARIANT_ENUM_CAST( EditorPlugin::CustomControlContainer );
+VARIANT_ENUM_CAST( EditorPlugin::DockSlot );
+
+
+typedef EditorPlugin* (*EditorPluginCreateFunc)(EditorNode *);
+
+class EditorPlugins {
+
+ enum {
+ MAX_CREATE_FUNCS=64
+ };
+
+ static EditorPluginCreateFunc creation_funcs[MAX_CREATE_FUNCS];
+ static int creation_func_count;
+
+ template<class T>
+ static EditorPlugin *creator(EditorNode *p_node) {
+ return memnew( T(p_node) );
+ }
+
+public:
+
+ static int get_plugin_count() { return creation_func_count; }
+ static EditorPlugin* create(int p_idx,EditorNode* p_editor) { ERR_FAIL_INDEX_V(p_idx,creation_func_count,NULL); return creation_funcs[p_idx](p_editor); }
+
+ template<class T>
+ static void add_by_type() {
+ add_create_func(creator<T>);
+ }
+
+ static void add_create_func(EditorPluginCreateFunc p_func) {
+
+ ERR_FAIL_COND(creation_func_count>=MAX_CREATE_FUNCS);
+ creation_funcs[creation_func_count++]=p_func;
+ }
+
+};
+
+
+
+
+
+
+
+
+#endif
diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp
new file mode 100644
index 0000000000..2d879e38cf
--- /dev/null
+++ b/editor/editor_plugin_settings.cpp
@@ -0,0 +1,216 @@
+/*************************************************************************/
+/* editor_plugin_settings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_plugin_settings.h"
+
+#include "scene/gui/margin_container.h"
+#include "io/config_file.h"
+#include "os/file_access.h"
+#include "os/main_loop.h"
+#include "global_config.h"
+#include "editor_node.h"
+
+void EditorPluginSettings::_notification(int p_what) {
+
+ if (p_what==MainLoop::NOTIFICATION_WM_FOCUS_IN) {
+ update_plugins();
+ }
+}
+
+void EditorPluginSettings::update_plugins() {
+
+
+ plugin_list->clear();
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ Error err = da->change_dir("res://addons");
+ if (err!=OK) {
+ memdelete(da);
+ return;
+ }
+
+ updating=true;
+
+ TreeItem *root = plugin_list->create_item();
+
+ da->list_dir_begin();
+
+ String d = da->get_next();
+
+ Vector<String> plugins;
+
+ while(d!=String()) {
+
+ bool dir = da->current_is_dir();
+ String path = "res://addons/"+d+"/plugin.cfg";
+
+ if (dir && FileAccess::exists(path)) {
+
+ plugins.push_back(d);
+ }
+
+ d = da->get_next();
+ }
+
+ da->list_dir_end();
+ memdelete(da);
+
+ plugins.sort();
+
+ Vector<String> active_plugins = GlobalConfig::get_singleton()->get("plugins/active");
+
+ for(int i=0;i<plugins.size();i++) {
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+ String path = "res://addons/"+plugins[i]+"/plugin.cfg";
+
+ Error err = cf->load(path);
+
+ if (err!=OK) {
+ WARN_PRINTS("Can't load plugin config: "+path);
+ } else if (!cf->has_section_key("plugin","name")) {
+ WARN_PRINTS("Plugin misses plugin/name: "+path);
+ } else if (!cf->has_section_key("plugin","author")) {
+ WARN_PRINTS("Plugin misses plugin/author: "+path);
+ } else if (!cf->has_section_key("plugin","version")) {
+ WARN_PRINTS("Plugin misses plugin/version: "+path);
+ } else if (!cf->has_section_key("plugin","description")) {
+ WARN_PRINTS("Plugin misses plugin/description: "+path);
+ } else if (!cf->has_section_key("plugin","script")) {
+ WARN_PRINTS("Plugin misses plugin/script: "+path);
+ } else {
+
+ String d = plugins[i];
+ String name = cf->get_value("plugin","name");
+ String author = cf->get_value("plugin","author");
+ String version = cf->get_value("plugin","version");
+ String description = cf->get_value("plugin","description");
+ String script = cf->get_value("plugin","script");
+
+ TreeItem *item = plugin_list->create_item(root);
+ item->set_text(0,name);
+ item->set_tooltip(0,"Name: "+name+"\nPath: "+path+"\nMain Script: "+script);
+ item->set_metadata(0,d);
+ item->set_text(1,version);
+ item->set_metadata(1,script);
+ item->set_text(2,author);
+ item->set_metadata(2,description);
+ item->set_cell_mode(3,TreeItem::CELL_MODE_RANGE);
+ item->set_range_config(3,0,1,1);
+ item->set_text(3,"Inactive,Active");
+ item->set_editable(3,true);
+
+ if (EditorNode::get_singleton()->is_addon_plugin_enabled(d)) {
+ item->set_custom_color(3,Color(0.2,1,0.2));
+ item->set_range(3,1);
+ } else {
+ item->set_custom_color(3,Color(1,0.2,0.2));
+ item->set_range(3,0);
+ }
+ }
+
+ }
+
+ updating=false;
+
+}
+
+
+void EditorPluginSettings::_plugin_activity_changed() {
+
+ if (updating)
+ return;
+
+ TreeItem *ti=plugin_list->get_edited();
+ ERR_FAIL_COND(!ti);
+ bool active = ti->get_range(3);
+ String name = ti->get_metadata(0);
+
+ EditorNode::get_singleton()->set_addon_plugin_enabled(name,active);
+
+ bool is_active = EditorNode::get_singleton()->is_addon_plugin_enabled(name);
+
+ if (is_active!=active) {
+ updating=true;
+ ti->set_range(3,is_active?1:0);
+ updating=false;
+ }
+
+ if (is_active)
+ ti->set_custom_color(3,Color(0.2,1,0.2));
+ else
+ ti->set_custom_color(3,Color(1,0.2,0.2));
+
+
+}
+
+void EditorPluginSettings::_bind_methods() {
+
+ ClassDB::bind_method("update_plugins",&EditorPluginSettings::update_plugins);
+ ClassDB::bind_method("_plugin_activity_changed",&EditorPluginSettings::_plugin_activity_changed);
+}
+
+EditorPluginSettings::EditorPluginSettings() {
+
+ HBoxContainer *title_hb = memnew( HBoxContainer );
+ title_hb->add_child(memnew( Label(TTR("Installed Plugins:"))));
+ title_hb->add_spacer();
+ update_list = memnew( Button(TTR("Update")) );
+ update_list->connect("pressed",this,"update_plugins");
+ title_hb->add_child(update_list);
+ add_child(title_hb);
+
+ plugin_list = memnew( Tree );
+ plugin_list->set_v_size_flags(SIZE_EXPAND_FILL);
+ plugin_list->set_columns(4);
+ plugin_list->set_column_titles_visible(true);
+ plugin_list->set_column_title(0,TTR("Name:"));
+ plugin_list->set_column_title(1,TTR("Version:"));
+ plugin_list->set_column_title(2,TTR("Author:"));
+ plugin_list->set_column_title(3,TTR("Status:"));
+ plugin_list->set_column_expand(0,true);
+ plugin_list->set_column_expand(1,false);
+ plugin_list->set_column_expand(2,false);
+ plugin_list->set_column_expand(3,false);
+ plugin_list->set_column_min_width(1,100);
+ plugin_list->set_column_min_width(2,250);
+ plugin_list->set_column_min_width(3,80);
+ plugin_list->set_hide_root(true);
+ plugin_list->connect("item_edited",this,"_plugin_activity_changed");
+
+
+ MarginContainer *mc = memnew( MarginContainer );
+ mc->add_child(plugin_list);
+ mc->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ add_child(mc);
+
+ updating=false;
+
+}
diff --git a/editor/editor_plugin_settings.h b/editor/editor_plugin_settings.h
new file mode 100644
index 0000000000..e24880a21d
--- /dev/null
+++ b/editor/editor_plugin_settings.h
@@ -0,0 +1,62 @@
+/*************************************************************************/
+/* editor_plugin_settings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORPLUGINSETTINGS_H
+#define EDITORPLUGINSETTINGS_H
+
+
+#include "scene/gui/dialogs.h"
+#include "property_editor.h"
+#include "undo_redo.h"
+#include "editor_data.h"
+
+class EditorPluginSettings : public VBoxContainer {
+
+ GDCLASS(EditorPluginSettings,VBoxContainer);
+
+ Button* update_list;
+ Tree *plugin_list;
+ bool updating;
+
+
+ void _plugin_activity_changed();
+protected:
+
+ void _notification(int p_what);
+
+ static void _bind_methods();
+
+
+public:
+
+ void update_plugins();
+
+ EditorPluginSettings();
+};
+
+#endif // EDITORPLUGINSETTINGS_H
diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp
new file mode 100644
index 0000000000..d9a4174246
--- /dev/null
+++ b/editor/editor_profiler.cpp
@@ -0,0 +1,784 @@
+/*************************************************************************/
+/* editor_profiler.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_profiler.h"
+
+#include "editor_settings.h"
+#include "os/os.h"
+
+void EditorProfiler::_make_metric_ptrs(Metric& m) {
+
+ for(int i=0;i<m.categories.size();i++) {
+ m.category_ptrs[m.categories[i].signature]=&m.categories[i];
+ for(int j=0;j<m.categories[i].items.size();j++) {
+ m.item_ptrs[m.categories[i].items[j].signature]=&m.categories[i].items[j];
+ }
+ }
+}
+
+void EditorProfiler::add_frame_metric(const Metric& p_metric,bool p_final) {
+
+ ++last_metric;
+ if (last_metric>=frame_metrics.size())
+ last_metric=0;
+
+
+ frame_metrics[last_metric]=p_metric;
+ _make_metric_ptrs(frame_metrics[last_metric]);
+
+ updating_frame=true;
+ cursor_metric_edit->set_max(frame_metrics[last_metric].frame_number);
+ cursor_metric_edit->set_min(MAX(frame_metrics[last_metric].frame_number-frame_metrics.size(),0));
+
+
+ if (!seeking) {
+ cursor_metric_edit->set_value(frame_metrics[last_metric].frame_number);
+ if (hover_metric!=-1) {
+ hover_metric++;
+ if (hover_metric>=frame_metrics.size()) {
+ hover_metric=0;
+ }
+ }
+
+ }
+ updating_frame=false;
+
+ if (!frame_delay->is_processing()) {
+
+ frame_delay->set_wait_time(p_final?0.1:1);
+ frame_delay->start();
+ }
+
+ if (!plot_delay->is_processing()) {
+ plot_delay->set_wait_time(0.1);
+ plot_delay->start();
+ }
+
+}
+
+
+
+void EditorProfiler::clear() {
+
+ int metric_size=EditorSettings::get_singleton()->get("debugger/profiler_frame_history_size");
+ metric_size = CLAMP(metric_size,60,1024);
+ frame_metrics.clear();
+ frame_metrics.resize(metric_size);
+ last_metric=-1;
+ variables->clear();
+ //activate->set_pressed(false);
+ plot_sigs.clear();
+ plot_sigs.insert("fixed_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ updating_frame=true;
+ cursor_metric_edit->set_min(0);
+ cursor_metric_edit->set_max(0);
+ cursor_metric_edit->set_value(0);
+ updating_frame=false;
+ hover_metric=-1;
+ seeking=false;
+}
+
+static String _get_percent_txt(float p_value,float p_total) {
+ if (p_total==0)
+ p_total=0.00001;
+ return String::num((p_value/p_total)*100,1)+"%";
+}
+
+
+String EditorProfiler::_get_time_as_text(Metric &m,float p_time,int p_calls) {
+
+ int dmode = display_mode->get_selected();
+
+
+ if (dmode==DISPLAY_FRAME_TIME) {
+ return rtos(p_time);
+ } else if (dmode==DISPLAY_AVERAGE_TIME) {
+ if (p_calls==0)
+ return "0";
+ else
+ return rtos(p_time/p_calls);
+ } else if (dmode==DISPLAY_FRAME_PERCENT) {
+ return _get_percent_txt(p_time,m.frame_time);
+ } else if (dmode==DISPLAY_FIXED_FRAME_PERCENT) {
+
+ return _get_percent_txt(p_time,m.fixed_frame_time);
+ }
+
+ return "err";
+}
+
+Color EditorProfiler::_get_color_from_signature(const StringName& p_signature) const {
+
+ double rot = ABS(double(p_signature.hash())/double(0x7FFFFFFF));
+ Color c;
+ c.set_hsv(rot,1,1);
+ return c;
+
+}
+
+void EditorProfiler::_item_edited() {
+
+ if (updating_frame)
+ return;
+
+ TreeItem *item=variables->get_edited();
+ if (!item)
+ return;
+ StringName signature=item->get_metadata(0);
+ bool checked=item->is_checked(0);
+
+
+ if (checked)
+ plot_sigs.insert(signature);
+ else
+ plot_sigs.erase(signature);
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+
+ _update_plot();
+}
+
+void EditorProfiler::_update_plot() {
+
+ int w = graph->get_size().width;
+ int h = graph->get_size().height;
+
+ bool reset_texture=false;
+
+ int desired_len = w * h * 4;
+
+ if (graph_image.size()!=desired_len) {
+ reset_texture=true;
+ graph_image.resize(desired_len);
+ }
+
+
+ PoolVector<uint8_t>::Write wr = graph_image.write();
+
+
+
+ //clear
+ for(int i=0;i<desired_len;i+=4) {
+ wr[i+0]=0;
+ wr[i+1]=0;
+ wr[i+2]=0;
+ wr[i+3]=255;
+ }
+
+
+ //find highest value
+
+ bool use_self = display_time->get_selected()==DISPLAY_SELF_TIME;
+ float highest=0;
+
+ for(int i=0;i<frame_metrics.size();i++) {
+ Metric &m = frame_metrics[i];
+ if (!m.valid)
+ continue;
+
+ for (Set<StringName>::Element *E=plot_sigs.front();E;E=E->next()) {
+
+ Map<StringName,Metric::Category*>::Element *F=m.category_ptrs.find(E->get());
+ if (F) {
+ highest=MAX(F->get()->total_time,highest);
+ }
+
+ Map<StringName,Metric::Category::Item*>::Element *G=m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ highest=MAX(G->get()->self,highest);
+ } else {
+ highest=MAX(G->get()->total,highest);
+ }
+ }
+ }
+ }
+
+ if (highest>0) {
+ //means some data exists..
+ highest*=1.2; //leave some upper room
+ graph_height=highest;
+
+ Vector<int> columnv;
+ columnv.resize(h*4);
+
+ int *column = columnv.ptr();
+
+ Map<StringName,int> plot_prev;
+ //Map<StringName,int> plot_max;
+
+ uint64_t time = OS::get_singleton()->get_ticks_usec();
+
+ for(int i=0;i<w;i++) {
+
+
+ for(int j=0;j<h*4;j++) {
+ column[j]=0;
+ }
+
+ int current = i*frame_metrics.size()/w;
+ int next = (i+1)*frame_metrics.size()/w;
+ if (next>frame_metrics.size()) {
+ next=frame_metrics.size();
+ }
+ if (next==current)
+ next=current+1; //just because for loop must work
+
+ for (Set<StringName>::Element *E=plot_sigs.front();E;E=E->next()) {
+
+ int plot_pos=-1;
+
+ for(int j=current;j<next;j++) {
+
+ //wrap
+ int idx = last_metric+1+j;
+ while( idx >= frame_metrics.size() ) {
+ idx-=frame_metrics.size();
+ }
+
+ //get
+ Metric &m = frame_metrics[idx];
+ if (m.valid==false)
+ continue; //skip because invalid
+
+
+ float value=0;
+
+ Map<StringName,Metric::Category*>::Element *F=m.category_ptrs.find(E->get());
+ if (F) {
+ value=F->get()->total_time;
+ }
+
+ Map<StringName,Metric::Category::Item*>::Element *G=m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ value=G->get()->self;
+ } else {
+ value=G->get()->total;
+ }
+ }
+
+
+ plot_pos = MAX( CLAMP(int(value*h/highest),0,h-1), plot_pos );
+
+
+ }
+
+ int prev_plot=plot_pos;
+ Map<StringName,int>::Element *H=plot_prev.find(E->get());
+ if (H) {
+ prev_plot=H->get();
+ H->get()=plot_pos;
+ } else {
+ plot_prev[E->get()]=plot_pos;
+ }
+
+ if (plot_pos==-1 && prev_plot==-1) {
+ //don't bother drawing
+ continue;
+ }
+
+ if (prev_plot!=-1 && plot_pos==-1) {
+
+ plot_pos=prev_plot;
+ }
+
+ if (prev_plot==-1 && plot_pos!=-1) {
+ prev_plot=plot_pos;
+ }
+
+ plot_pos = h- plot_pos -1;
+ prev_plot = h- prev_plot -1;
+
+ if (prev_plot > plot_pos) {
+ SWAP(prev_plot,plot_pos);
+ }
+
+ Color col = _get_color_from_signature(E->get());
+
+ for(int j=prev_plot;j<=plot_pos;j++) {
+
+ column[j*4+0]+=Math::fast_ftoi(CLAMP(col.r*255,0,255));
+ column[j*4+1]+=Math::fast_ftoi(CLAMP(col.g*255,0,255));
+ column[j*4+2]+=Math::fast_ftoi(CLAMP(col.b*255,0,255));
+ column[j*4+3]+=1;
+
+ }
+ }
+
+
+ for(int j=0;j<h*4;j+=4) {
+
+ int a = column[j+3];
+ if (a>0) {
+ column[j+0]/=a;
+ column[j+1]/=a;
+ column[j+2]/=a;
+
+ }
+
+ uint8_t r = uint8_t(column[j+0]);
+ uint8_t g = uint8_t(column[j+1]);
+ uint8_t b = uint8_t(column[j+2]);
+
+ int widx = ((j>>2)*w+i)*4;
+ wr[widx+0]=r;
+ wr[widx+1]=g;
+ wr[widx+2]=b;
+ wr[widx+3]=255;
+ }
+ }
+
+ time = OS::get_singleton()->get_ticks_usec() - time;
+ //print_line("Taken: "+rtos(USEC_TO_SEC(time)));
+
+ }
+
+
+ wr = PoolVector<uint8_t>::Write();
+
+ Image img(w,h,0,Image::FORMAT_RGBA8,graph_image);
+
+ if (reset_texture) {
+
+ if (graph_texture.is_null()) {
+ graph_texture.instance();
+ }
+ graph_texture->create(img.get_width(),img.get_height(),img.get_format(),Texture::FLAG_VIDEO_SURFACE);
+
+ }
+
+ graph_texture->set_data(img);
+
+
+ graph->set_texture(graph_texture);
+ graph->update();
+
+}
+
+void EditorProfiler::_update_frame() {
+
+ int cursor_metric = _get_cursor_index();
+
+
+ ERR_FAIL_INDEX(cursor_metric,frame_metrics.size());
+
+ updating_frame=true;
+ variables->clear();
+
+ TreeItem* root = variables->create_item();
+ Metric &m = frame_metrics[cursor_metric];
+
+
+ int dtime = display_time->get_selected();
+
+
+ for(int i=0;i<m.categories.size();i++) {
+
+ TreeItem *category = variables->create_item(root);
+ category->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ category->set_editable(0,true);
+ category->set_metadata(0,m.categories[i].signature);
+ category->set_text(0,String(m.categories[i].name));
+ category->set_text(1,_get_time_as_text(m,m.categories[i].total_time,1));
+
+ if (plot_sigs.has(m.categories[i].signature)) {
+ category->set_checked(0,true);
+ category->set_custom_bg_color(0,Color(0,0,0));
+ category->set_custom_color(0,_get_color_from_signature(m.categories[i].signature));
+ }
+
+
+ for(int j=0;j<m.categories[i].items.size();j++) {
+ Metric::Category::Item &it = m.categories[i].items[j];
+
+ TreeItem *item = variables->create_item(category);
+ item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0,true);
+ item->set_text(0,it.name);
+ item->set_metadata(0,it.signature);
+ item->set_metadata(1,it.script);
+ item->set_metadata(2,it.line);
+ item->set_tooltip(0,it.script+":"+itos(it.line));
+
+ float time = dtime == DISPLAY_SELF_TIME ? it.self : it.total;
+
+ item->set_text(1,_get_time_as_text(m,time,it.calls));
+
+ item->set_text(2,itos(it.calls));
+
+ if (plot_sigs.has(it.signature)) {
+ item->set_checked(0,true);
+ item->set_custom_bg_color(0,Color(0,0,0));
+ item->set_custom_color(0,_get_color_from_signature(it.signature));
+ }
+
+ }
+ }
+
+ updating_frame=false;
+
+}
+
+
+void EditorProfiler::_activate_pressed() {
+
+ if (activate->is_pressed()) {
+ clear();
+ activate->set_icon(get_icon("Stop","EditorIcons"));
+ activate->set_text(TTR("Stop Profiling"));
+ } else {
+ activate->set_icon(get_icon("Play","EditorIcons"));
+ activate->set_text(TTR("Start Profiling"));
+
+
+ }
+ emit_signal("enable_profiling",activate->is_pressed());
+
+}
+
+
+void EditorProfiler::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ activate->set_icon(get_icon("Play","EditorIcons"));
+ }
+}
+
+void EditorProfiler::_graph_tex_draw() {
+
+ if (last_metric<0)
+ return;
+ if (seeking) {
+
+ int max_frames = frame_metrics.size();
+ int frame = cursor_metric_edit->get_value() - (frame_metrics[last_metric].frame_number-max_frames+1);
+ if (frame<0)
+ frame=0;
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+
+ graph->draw_line(Vector2(cur_x,0),Vector2(cur_x,graph->get_size().y),Color(1,1,1,0.8));
+ }
+
+
+ if (hover_metric!=-1 && frame_metrics[hover_metric].valid) {
+
+
+
+ int max_frames = frame_metrics.size();
+ int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number-max_frames+1);
+ if (frame<0)
+ frame=0;
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+ graph->draw_line(Vector2(cur_x,0),Vector2(cur_x,graph->get_size().y),Color(1,1,1,0.4));
+
+
+ }
+
+}
+
+void EditorProfiler::_graph_tex_mouse_exit() {
+
+ hover_metric=-1;
+ graph->update();
+}
+
+
+void EditorProfiler::_cursor_metric_changed(double) {
+ if (updating_frame)
+ return;
+
+
+ graph->update();
+ _update_frame();
+
+}
+
+void EditorProfiler::_graph_tex_input(const InputEvent& p_ev){
+
+ if (last_metric<0)
+ return;
+
+ if (
+ (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.button_index==BUTTON_LEFT && p_ev.mouse_button.pressed) ||
+ (p_ev.type==InputEvent::MOUSE_MOTION) ) {
+
+ int x = p_ev.mouse_button.x;
+ x=x*frame_metrics.size()/graph->get_size().width;
+
+ bool show_hover = x>=0 && x<frame_metrics.size();
+
+ if (x<0) {
+ x=0;
+ }
+
+ if (x>=frame_metrics.size()) {
+ x=frame_metrics.size()-1;
+ }
+
+
+
+ int metric=frame_metrics.size()-x-1;
+ metric = last_metric-metric;
+ while(metric<0) {
+ metric+=frame_metrics.size();
+ }
+
+
+
+ if (show_hover) {
+
+ hover_metric=metric;
+
+ } else {
+ hover_metric=-1;
+ }
+
+
+ if (p_ev.type==InputEvent::MOUSE_BUTTON || p_ev.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+ //cursor_metric=x;
+ updating_frame=true;
+
+ //metric may be invalid, so look for closest metric that is valid, this makes snap feel better
+ bool valid=false;
+ for(int i=0;i<frame_metrics.size();i++) {
+
+ if (frame_metrics[metric].valid) {
+ valid=true;
+ break;
+ }
+
+ metric++;
+ if (metric>=frame_metrics.size())
+ metric=0;
+ }
+
+ if (valid)
+ cursor_metric_edit->set_value(frame_metrics[metric].frame_number);
+
+ updating_frame=false;
+
+ if (activate->is_pressed()) {
+ if (!seeking) {
+ emit_signal("break_request");
+ }
+ }
+
+ seeking=true;
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+ }
+
+ graph->update();
+
+ }
+
+}
+
+int EditorProfiler::_get_cursor_index() const {
+
+ if (last_metric<0)
+ return 0;
+ if (!frame_metrics[last_metric].valid)
+ return 0;
+
+ int diff = (frame_metrics[last_metric].frame_number-cursor_metric_edit->get_value());
+
+ int idx = last_metric - diff;
+ while (idx<0) {
+ idx+=frame_metrics.size();
+ }
+
+
+ return idx;
+
+}
+
+void EditorProfiler::disable_seeking() {
+
+ seeking=false;
+ graph->update();
+
+}
+
+void EditorProfiler::_combo_changed(int) {
+
+ _update_frame();
+ _update_plot();
+}
+
+void EditorProfiler::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_update_frame"),&EditorProfiler::_update_frame);
+ ClassDB::bind_method(D_METHOD("_update_plot"),&EditorProfiler::_update_plot);
+ ClassDB::bind_method(D_METHOD("_activate_pressed"),&EditorProfiler::_activate_pressed);
+ ClassDB::bind_method(D_METHOD("_graph_tex_draw"),&EditorProfiler::_graph_tex_draw);
+ ClassDB::bind_method(D_METHOD("_graph_tex_input"),&EditorProfiler::_graph_tex_input);
+ ClassDB::bind_method(D_METHOD("_graph_tex_mouse_exit"),&EditorProfiler::_graph_tex_mouse_exit);
+ ClassDB::bind_method(D_METHOD("_cursor_metric_changed"),&EditorProfiler::_cursor_metric_changed);
+ ClassDB::bind_method(D_METHOD("_combo_changed"),&EditorProfiler::_combo_changed);
+
+ ClassDB::bind_method(D_METHOD("_item_edited"),&EditorProfiler::_item_edited);
+ ADD_SIGNAL( MethodInfo("enable_profiling",PropertyInfo(Variant::BOOL,"enable")));
+ ADD_SIGNAL( MethodInfo("break_request"));
+
+}
+
+void EditorProfiler::set_enabled(bool p_enable) {
+
+ activate->set_disabled(!p_enable);
+}
+
+bool EditorProfiler::is_profiling() {
+ return activate->is_pressed();
+}
+
+EditorProfiler::EditorProfiler()
+{
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+ activate = memnew( Button );
+ activate->set_toggle_mode(true);
+ activate->set_text(TTR("Start Profiling"));
+ activate->connect("pressed",this,"_activate_pressed");
+ hb->add_child(activate);
+
+ hb->add_child( memnew( Label(TTR("Measure:") ) ) );
+
+ display_mode = memnew( OptionButton );
+ display_mode->add_item(TTR("Frame Time (sec)"));
+ display_mode->add_item(TTR("Average Time (sec)"));
+ display_mode->add_item(TTR("Frame %"));
+ display_mode->add_item(TTR("Fixed Frame %"));
+ display_mode->connect("item_selected",this,"_combo_changed");
+
+ hb->add_child( display_mode );
+
+ hb->add_child( memnew( Label(TTR("Time:") ) ) );
+
+ display_time = memnew( OptionButton );
+ display_time->add_item(TTR("Inclusive"));
+ display_time->add_item(TTR("Self"));
+ display_time->connect("item_selected",this,"_combo_changed");
+
+ hb->add_child(display_time);
+
+ hb->add_spacer();
+
+ hb->add_child( memnew( Label(TTR("Frame #:") ) ) );
+
+ cursor_metric_edit = memnew( SpinBox );
+ cursor_metric_edit->set_h_size_flags(SIZE_FILL);
+ hb->add_child(cursor_metric_edit);
+ cursor_metric_edit->connect("value_changed",this,"_cursor_metric_changed");
+
+ hb->add_constant_override("separation",8);
+
+
+
+ h_split = memnew( HSplitContainer );
+ add_child(h_split);
+ h_split->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ variables = memnew( Tree );
+ variables->set_custom_minimum_size(Size2(300,0));
+ variables->set_hide_folding(true);
+ h_split->add_child(variables);
+ variables->set_hide_root(true);
+ variables->set_columns(3);
+ variables->set_column_titles_visible(true);
+ variables->set_column_title(0,"Name");
+ variables->set_column_expand(0,true);
+ variables->set_column_min_width(0,60);
+ variables->set_column_title(1,"Time");
+ variables->set_column_expand(1,false);
+ variables->set_column_min_width(1,60);
+ variables->set_column_title(2,"Calls");
+ variables->set_column_expand(2,false);
+ variables->set_column_min_width(2,60);
+ variables->connect("item_edited",this,"_item_edited");
+
+
+ graph = memnew( TextureRect );
+ graph->set_expand(true);
+ graph->set_mouse_filter(MOUSE_FILTER_STOP);
+ //graph->set_ignore_mouse(false);
+ graph->connect("draw",this,"_graph_tex_draw");
+ graph->connect("gui_input",this,"_graph_tex_input");
+ graph->connect("mouse_exited",this,"_graph_tex_mouse_exit");
+
+ h_split->add_child(graph);
+ graph->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ add_constant_override("separation",3);
+
+ int metric_size=CLAMP(int(EDITOR_DEF("debugger/profiler_frame_history_size",600)),60,1024);
+ frame_metrics.resize(metric_size);
+ last_metric=-1;
+ //cursor_metric=-1;
+ hover_metric=-1;
+
+
+ EDITOR_DEF("debugger/profiler_frame_max_functions",64);
+
+ //display_mode=DISPLAY_FRAME_TIME;
+
+ frame_delay = memnew( Timer );
+ frame_delay->set_wait_time(0.1);
+ frame_delay->set_one_shot(true);
+ add_child(frame_delay);
+ frame_delay->connect("timeout",this,"_update_frame");
+
+ plot_delay = memnew( Timer );
+ plot_delay->set_wait_time(0.1);
+ plot_delay->set_one_shot(true);
+ add_child(plot_delay);
+ plot_delay->connect("timeout",this,"_update_plot");
+
+ plot_sigs.insert("fixed_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ seeking=false;
+ graph_height=1;
+
+ //activate->set_disabled(true);
+
+}
diff --git a/editor/editor_profiler.h b/editor/editor_profiler.h
new file mode 100644
index 0000000000..bf89e3939c
--- /dev/null
+++ b/editor/editor_profiler.h
@@ -0,0 +1,173 @@
+/*************************************************************************/
+/* editor_profiler.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORPROFILER_H
+#define EDITORPROFILER_H
+
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/button.h"
+#include "scene/gui/label.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/spin_box.h"
+
+
+class EditorProfiler : public VBoxContainer {
+
+ GDCLASS(EditorProfiler,VBoxContainer)
+
+public:
+
+ struct Metric {
+
+ bool valid;
+
+ int frame_number;
+ float frame_time;
+ float idle_time;
+ float fixed_time;
+ float fixed_frame_time;
+
+ struct Category {
+
+ StringName signature;
+ String name;
+ float total_time; //total for category
+
+ struct Item {
+
+ StringName signature;
+ String name;
+ String script;
+ int line;
+ float self;
+ float total;
+ int calls;
+ };
+
+ Vector<Item> items;
+ };
+
+ Vector<Category> categories;
+
+ Map<StringName,Category*> category_ptrs;
+ Map<StringName,Category::Item*> item_ptrs;
+
+
+ Metric() { valid=false; frame_number=0; }
+ };
+
+ enum DisplayMode {
+ DISPLAY_FRAME_TIME,
+ DISPLAY_AVERAGE_TIME,
+ DISPLAY_FRAME_PERCENT,
+ DISPLAY_FIXED_FRAME_PERCENT,
+ };
+
+ enum DisplayTime {
+ DISPLAY_TOTAL_TIME,
+ DISPLAY_SELF_TIME,
+ };
+
+private:
+ Button *activate;
+ TextureRect *graph;
+ Ref<ImageTexture> graph_texture;
+ PoolVector<uint8_t> graph_image;
+ Tree *variables;
+ HSplitContainer *h_split;
+
+ Set<StringName> plot_sigs;
+
+ OptionButton *display_mode;
+ OptionButton *display_time;
+
+ SpinBox * cursor_metric_edit;
+
+ Vector<Metric> frame_metrics;
+ int last_metric;
+
+ int max_functions;
+
+ bool updating_frame;
+
+ //int cursor_metric;
+ int hover_metric;
+
+ float graph_height;
+
+ bool seeking;
+
+ Timer *frame_delay;
+ Timer *plot_delay;
+
+ void _update_frame();
+
+ void _activate_pressed();
+
+ String _get_time_as_text(Metric &m,float p_time,int p_calls);
+
+ void _make_metric_ptrs(Metric& m);
+ void _item_edited();
+
+ void _update_plot();
+
+ void _graph_tex_mouse_exit();
+
+ void _graph_tex_draw();
+ void _graph_tex_input(const InputEvent& p_ev);
+
+ int _get_cursor_index() const;
+
+ Color _get_color_from_signature(const StringName& p_signature) const;
+
+ void _cursor_metric_changed(double);
+
+ void _combo_changed(int);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void add_frame_metric(const Metric& p_metric, bool p_final=false);
+ void set_enabled(bool p_enable);
+ bool is_profiling();
+ bool is_seeking() { return seeking; }
+ void disable_seeking();
+
+ void clear();
+
+ EditorProfiler();
+};
+
+#endif // EDITORPROFILER_H
diff --git a/editor/editor_reimport_dialog.cpp b/editor/editor_reimport_dialog.cpp
new file mode 100644
index 0000000000..5904070230
--- /dev/null
+++ b/editor/editor_reimport_dialog.cpp
@@ -0,0 +1,148 @@
+/*************************************************************************/
+/* editor_reimport_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_reimport_dialog.h"
+
+#include "editor_file_system.h"
+#include "editor_node.h"
+
+#if 0
+void EditorReImportDialog::popup_reimport() {
+
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ error->set_text(TTR("Please wait for scan to complete."));
+ error->popup_centered_minsize();
+ return;
+ }
+
+ tree->clear();
+ items.clear();
+ List<String> ril;
+ EditorFileSystem::get_singleton()->get_changed_sources(&ril);
+
+ scene_must_save=false;
+
+
+ TreeItem *root = tree->create_item();
+ for(List<String>::Element *E=ril.front();E;E=E->next()) {
+
+ TreeItem *item = tree->create_item(root);
+ item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ item->set_metadata(0,E->get());
+ item->set_text(0,E->get().replace_first("res://",""));
+ item->set_tooltip(0,E->get());
+ item->set_checked(0,true);
+ item->set_editable(0,true);
+ items.push_back(item);
+
+ String name = E->get();
+
+ if (EditorFileSystem::get_singleton()->get_file_type(name)=="PackedScene" && EditorNode::get_singleton()->is_scene_in_use(name)) {
+
+ scene_must_save=true;
+ }
+ }
+
+
+ if (scene_must_save) {
+ if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->get_filename()=="") {
+
+ error->set_text(TTR("Current scene must be saved to re-import."));
+ error->popup_centered_minsize();
+ get_ok()->set_text(TTR("Re-Import"));
+ get_ok()->set_disabled(true);
+ return;
+
+ }
+ get_ok()->set_disabled(false);
+ get_ok()->set_text(TTR("Save & Re-Import"));
+ } else {
+ get_ok()->set_text(TTR("Re-Import"));
+ get_ok()->set_disabled(false);
+ }
+
+ popup_centered(Size2(600,400));
+
+
+}
+
+
+void EditorReImportDialog::ok_pressed() {
+
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ error->set_text(TTR("Please wait for scan to complete."));
+ error->popup_centered_minsize();
+ return;
+ }
+
+
+
+ EditorProgress ep("reimport",TTR("Re-Importing"),items.size());
+ String reload_fname;
+ if (scene_must_save && EditorNode::get_singleton()->get_edited_scene()) {
+ reload_fname = EditorNode::get_singleton()->get_edited_scene()->get_filename();
+ EditorNode::get_singleton()->save_scene(reload_fname);
+ EditorNode::get_singleton()->clear_scene();
+ }
+
+ for(int i=0;i<items.size();i++) {
+
+ String it = items[i]->get_metadata(0);
+ ep.step(items[i]->get_text(0),i);
+ print_line("reload import from: "+it);
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(it);
+ ERR_CONTINUE(rimd.is_null());
+ String editor = rimd->get_editor();
+ Ref<EditorImportPlugin> eip = EditorImportExport::get_singleton()->get_import_plugin_by_name(editor);
+ ERR_CONTINUE(eip.is_null());
+ Error err = eip->import(it,rimd);
+ if (err!=OK) {
+ EditorNode::add_io_error("Error Importing:\n "+it);
+ }
+
+ }
+ if (reload_fname!="") {
+ EditorNode::get_singleton()->load_scene(reload_fname);
+ }
+
+ EditorFileSystem::get_singleton()->scan_sources();
+}
+
+EditorReImportDialog::EditorReImportDialog() {
+
+ tree = memnew( Tree );
+ add_child(tree);
+ tree->set_hide_root(true);
+ //set_child_rect(tree);
+ set_title(TTR("Re-Import Changed Resources"));
+ error = memnew( AcceptDialog);
+ add_child(error);
+ scene_must_save=false;
+
+}
+#endif
diff --git a/editor/editor_reimport_dialog.h b/editor/editor_reimport_dialog.h
new file mode 100644
index 0000000000..7379c70c5e
--- /dev/null
+++ b/editor/editor_reimport_dialog.h
@@ -0,0 +1,53 @@
+/*************************************************************************/
+/* editor_reimport_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_REIMPORT_DIALOG_H
+#define EDITOR_REIMPORT_DIALOG_H
+
+#if 0
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+
+class EditorReImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorReImportDialog,ConfirmationDialog);
+
+ Tree *tree;
+ Vector<TreeItem*> items;
+ AcceptDialog *error;
+ bool scene_must_save;
+
+ void ok_pressed();
+public:
+
+ void popup_reimport();
+ EditorReImportDialog();
+};
+
+#endif // EDITOR_REIMPORT_DIALOG_H
+#endif
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
new file mode 100644
index 0000000000..ab2226e79a
--- /dev/null
+++ b/editor/editor_resource_preview.cpp
@@ -0,0 +1,439 @@
+/*************************************************************************/
+/* editor_resource_preview.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_resource_preview.h"
+
+#include "editor_settings.h"
+#include "os/file_access.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "global_config.h"
+#include "editor_scale.h"
+#include "message_queue.h"
+
+bool EditorResourcePreviewGenerator::handles(const String& p_type) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("handles")) {
+ return get_script_instance()->call("handles",p_type);
+ }
+ ERR_EXPLAIN("EditorResourcePreviewGenerator::handles needs to be overriden");
+ ERR_FAIL_V(false);
+}
+Ref<Texture> EditorResourcePreviewGenerator::generate(const RES& p_from){
+
+ if (get_script_instance() && get_script_instance()->has_method("generate")) {
+ return get_script_instance()->call("generate",p_from);
+ }
+ ERR_EXPLAIN("EditorResourcePreviewGenerator::generate needs to be overriden");
+ ERR_FAIL_V(Ref<Texture>());
+
+}
+
+
+Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String& p_path) {
+
+ if (get_script_instance() && get_script_instance()->has_method("generate_from_path")) {
+ return get_script_instance()->call("generate_from_path",p_path);
+ }
+
+ RES res = ResourceLoader::load(p_path);
+ if (!res.is_valid())
+ return res;
+ return generate(res);
+}
+
+
+void EditorResourcePreviewGenerator::_bind_methods() {
+
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::BOOL,"handles",PropertyInfo(Variant::STRING,"type")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::OBJECT,"generate:Texture",PropertyInfo(Variant::OBJECT,"from",PROPERTY_HINT_RESOURCE_TYPE,"Resource")));
+ ClassDB::add_virtual_method(get_class_static(),MethodInfo(Variant::OBJECT,"generate_from_path:Texture",PropertyInfo(Variant::STRING,"path",PROPERTY_HINT_FILE)));
+
+}
+
+EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() {
+
+
+}
+
+
+EditorResourcePreview* EditorResourcePreview::singleton=NULL;
+
+
+void EditorResourcePreview::_thread_func(void *ud) {
+
+ EditorResourcePreview *erp=(EditorResourcePreview*)ud;
+ erp->_thread();
+
+}
+
+
+void EditorResourcePreview::_preview_ready(const String& p_str,const Ref<Texture>& p_texture,ObjectID id,const StringName& p_func,const Variant& p_ud) {
+
+ //print_line("preview is ready");
+ preview_mutex->lock();
+
+ String path = p_str;
+ uint32_t hash=0;
+ uint64_t modified_time=0;
+
+ if (p_str.begins_with("ID:")) {
+ hash=p_str.get_slicec(':',2).to_int();
+ path="ID:"+p_str.get_slicec(':',1);
+ } else {
+ modified_time = FileAccess::get_modified_time(path);
+ }
+
+ Item item;
+ item.order=order++;
+ item.preview=p_texture;
+ item.last_hash=hash;
+ item.modified_time=modified_time;
+
+ cache[path]=item;
+
+ preview_mutex->unlock();
+
+ MessageQueue::get_singleton()->push_call(id,p_func,path,p_texture,p_ud);
+
+}
+
+Ref<Texture> EditorResourcePreview::_generate_preview(const QueueItem& p_item,const String& cache_base) {
+
+ String type;
+
+ if (p_item.resource.is_valid())
+ type=p_item.resource->get_class();
+ else
+ type=ResourceLoader::get_resource_type(p_item.path);
+ //print_line("resource type is: "+type);
+
+ if (type=="")
+ return Ref<Texture>(); //could not guess type
+
+ Ref<Texture> generated;
+
+ for(int i=0;i<preview_generators.size();i++) {
+
+ if (!preview_generators[i]->handles(type))
+ continue;
+ if (p_item.resource.is_valid()) {
+ generated = preview_generators[i]->generate(p_item.resource);
+ } else {
+ generated = preview_generators[i]->generate_from_path(p_item.path);
+ }
+
+ break;
+ }
+
+ if (!p_item.resource.is_valid()) {
+ // cache the preview in case it's a resource on disk
+ if (generated.is_valid()) {
+ //print_line("was generated");
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ //wow it generated a preview... save cache
+ ResourceSaver::save(cache_base+".png",generated);
+ FileAccess *f=FileAccess::open(cache_base+".txt",FileAccess::WRITE);
+ f->store_line(itos(thumbnail_size));
+ f->store_line(itos(FileAccess::get_modified_time(p_item.path)));
+ f->store_line(FileAccess::get_md5(p_item.path));
+ memdelete(f);
+ } else {
+ //print_line("was not generated");
+
+ }
+ }
+
+ return generated;
+}
+
+void EditorResourcePreview::_thread() {
+
+ //print_line("begin thread");
+ while(!exit) {
+
+ //print_line("wait for semaphore");
+ preview_sem->wait();
+ preview_mutex->lock();
+
+ //print_line("blue team go");
+
+ if (queue.size()) {
+
+
+
+ QueueItem item = queue.front()->get();
+ queue.pop_front();
+
+ if (cache.has(item.path)) {
+ //already has it because someone loaded it, just let it know it's ready
+ if (item.resource.is_valid()) {
+ item.path+=":"+itos(cache[item.path].last_hash); //keep last hash (see description of what this is in condition below)
+ }
+
+ _preview_ready(item.path,cache[item.path].preview,item.id,item.function,item.userdata);
+
+ preview_mutex->unlock();
+ } else {
+ preview_mutex->unlock();
+
+
+ Ref<Texture> texture;
+
+ //print_line("pop from queue "+item.path);
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+
+
+ if (item.resource.is_valid()){
+
+ texture=_generate_preview(item,String());
+ //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred
+ _preview_ready(item.path+":"+itos(item.resource->hash_edited_version()),texture,item.id,item.function,item.userdata);
+
+ } else {
+
+
+ String temp_path=EditorSettings::get_singleton()->get_settings_path().plus_file("tmp");
+ String cache_base = GlobalConfig::get_singleton()->globalize_path(item.path).md5_text();
+ cache_base = temp_path.plus_file("resthumb-"+cache_base);
+
+ //does not have it, try to load a cached thumbnail
+
+ String file = cache_base+".txt";
+ //print_line("cachetxt at "+file);
+ FileAccess *f=FileAccess::open(file,FileAccess::READ);
+ if (!f) {
+
+ //print_line("generate because not cached");
+
+ //generate
+ texture=_generate_preview(item,cache_base);
+ } else {
+
+ uint64_t modtime = FileAccess::get_modified_time(item.path);
+ int tsize = f->get_line().to_int64();
+ uint64_t last_modtime = f->get_line().to_int64();
+
+ bool cache_valid = true;
+
+ if (tsize!=thumbnail_size) {
+ cache_valid=false;
+ memdelete(f);
+ } else if (last_modtime!=modtime) {
+
+ String last_md5 = f->get_line();
+ String md5 = FileAccess::get_md5(item.path);
+ memdelete(f);
+
+ if (last_md5!=md5) {
+
+ cache_valid=false;
+ } else {
+ //update modified time
+
+ f=FileAccess::open(file,FileAccess::WRITE);
+ f->store_line(itos(modtime));
+ f->store_line(md5);
+ memdelete(f);
+ }
+ } else {
+ memdelete(f);
+ }
+
+ cache_valid=false;
+
+ if (cache_valid) {
+
+ texture = ResourceLoader::load(cache_base+".png","ImageTexture",true);
+ if (!texture.is_valid()) {
+ //well fuck
+ cache_valid=false;
+ }
+ }
+
+ if (!cache_valid) {
+
+ texture=_generate_preview(item,cache_base);
+ }
+
+ }
+
+ //print_line("notify of preview ready");
+ _preview_ready(item.path,texture,item.id,item.function,item.userdata);
+
+ }
+ }
+
+
+ } else {
+ preview_mutex->unlock();
+ }
+
+ }
+}
+
+
+
+void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource>& p_res, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata) {
+
+ ERR_FAIL_NULL(p_receiver);
+ ERR_FAIL_COND(!p_res.is_valid());
+
+ preview_mutex->lock();
+
+ String path_id = "ID:"+itos(p_res->get_instance_ID());
+
+
+ if (cache.has(path_id) && cache[path_id].last_hash==p_res->hash_edited_version()) {
+
+ cache[path_id].order=order++;
+ p_receiver->call_deferred(p_receiver_func,path_id,cache[path_id].preview,p_userdata);
+ preview_mutex->unlock();
+ return;
+
+ }
+
+ cache.erase(path_id); //erase if exists, since it will be regen
+
+ //print_line("send to thread "+p_path);
+ QueueItem item;
+ item.function=p_receiver_func;
+ item.id=p_receiver->get_instance_ID();
+ item.resource=p_res;
+ item.path=path_id;
+ item.userdata=p_userdata;
+
+ queue.push_back(item);
+ preview_mutex->unlock();
+ preview_sem->post();
+}
+
+void EditorResourcePreview::queue_resource_preview(const String& p_path, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata) {
+
+ ERR_FAIL_NULL(p_receiver);
+ preview_mutex->lock();
+ if (cache.has(p_path)) {
+ cache[p_path].order=order++;
+ p_receiver->call_deferred(p_receiver_func,p_path,cache[p_path].preview,p_userdata);
+ preview_mutex->unlock();
+ return;
+ }
+
+ //print_line("send to thread "+p_path);
+ QueueItem item;
+ item.function=p_receiver_func;
+ item.id=p_receiver->get_instance_ID();
+ item.path=p_path;
+ item.userdata=p_userdata;
+
+ queue.push_back(item);
+ preview_mutex->unlock();
+ preview_sem->post();
+
+}
+
+void EditorResourcePreview::add_preview_generator(const Ref<EditorResourcePreviewGenerator>& p_generator) {
+
+ preview_generators.push_back(p_generator);
+}
+
+void EditorResourcePreview::remove_preview_generator(const Ref<EditorResourcePreviewGenerator>& p_generator) {
+
+ preview_generators.erase(p_generator);
+}
+
+EditorResourcePreview* EditorResourcePreview::get_singleton() {
+
+ return singleton;
+}
+
+void EditorResourcePreview::_bind_methods() {
+
+ ClassDB::bind_method("_preview_ready",&EditorResourcePreview::_preview_ready);
+
+ ClassDB::bind_method(D_METHOD("queue_resource_preview","path","receiver","receiver_func","userdata:Variant"),&EditorResourcePreview::queue_resource_preview);
+ ClassDB::bind_method(D_METHOD("queue_edited_resource_preview","resource:Resource","receiver","receiver_func","userdata:Variant"),&EditorResourcePreview::queue_edited_resource_preview);
+ ClassDB::bind_method(D_METHOD("add_preview_generator","generator:EditorResourcePreviewGenerator"),&EditorResourcePreview::add_preview_generator);
+ ClassDB::bind_method(D_METHOD("remove_preview_generator","generator:EditorResourcePreviewGenerator"),&EditorResourcePreview::remove_preview_generator);
+ ClassDB::bind_method(D_METHOD("check_for_invalidation","path"),&EditorResourcePreview::check_for_invalidation);
+
+
+ ADD_SIGNAL(MethodInfo("preview_invalidated",PropertyInfo(Variant::STRING,"path")));
+}
+
+void EditorResourcePreview::check_for_invalidation(const String& p_path) {
+
+ preview_mutex->lock();
+
+ bool call_invalidated=false;
+ if (cache.has(p_path)) {
+
+ uint64_t modified_time = FileAccess::get_modified_time(p_path);
+ if (modified_time!=cache[p_path].modified_time) {
+ cache.erase(p_path);
+ call_invalidated=true;
+ }
+ }
+
+ preview_mutex->unlock();
+
+ if (call_invalidated) {//do outside mutex
+ call_deferred("emit_signal","preview_invalidated",p_path);
+ }
+
+
+
+}
+
+EditorResourcePreview::EditorResourcePreview() {
+ singleton=this;
+ preview_mutex = Mutex::create();
+ preview_sem = Semaphore::create();
+ order=0;
+ exit=false;
+
+ thread = Thread::create(_thread_func,this);
+}
+
+
+EditorResourcePreview::~EditorResourcePreview()
+{
+
+ exit=true;
+ preview_sem->post();
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ memdelete(preview_mutex);
+ memdelete(preview_sem);
+
+
+}
+
diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h
new file mode 100644
index 0000000000..e4a593330d
--- /dev/null
+++ b/editor/editor_resource_preview.h
@@ -0,0 +1,134 @@
+/*************************************************************************/
+/* editor_resource_preview.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORRESOURCEPREVIEW_H
+#define EDITORRESOURCEPREVIEW_H
+
+#include "scene/main/node.h"
+#include "os/semaphore.h"
+#include "os/thread.h"
+#include "scene/resources/texture.h"
+
+/* make previews for:
+*packdscene
+*wav
+*image
+*mesh
+-font
+*script
+*material
+-shader
+-shader graph?
+-navigation mesh
+-collision?
+-occluder polygon
+-navigation polygon
+-tileset
+-curve and curve2D
+*/
+
+
+class EditorResourcePreviewGenerator : public Reference {
+
+ GDCLASS(EditorResourcePreviewGenerator,Reference );
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+ virtual Ref<Texture> generate_from_path(const String& p_path);
+
+ EditorResourcePreviewGenerator();
+};
+
+
+class EditorResourcePreview : public Node {
+
+ GDCLASS(EditorResourcePreview,Node);
+
+
+ static EditorResourcePreview* singleton;
+
+ struct QueueItem {
+ Ref<Resource> resource;
+ String path;
+ ObjectID id;
+ StringName function;
+ Variant userdata;
+ };
+
+ List<QueueItem> queue;
+
+ Mutex *preview_mutex;
+ Semaphore *preview_sem;
+ Thread *thread;
+ bool exit;
+
+ struct Item {
+ Ref<Texture> preview;
+ int order;
+ uint32_t last_hash;
+ uint64_t modified_time;
+ };
+
+ int order;
+
+ Map<String,Item> cache;
+
+ void _preview_ready(const String& p_str,const Ref<Texture>& p_texture, ObjectID id, const StringName &p_func, const Variant &p_ud);
+ Ref<Texture> _generate_preview(const QueueItem& p_item, const String &cache_base);
+
+ static void _thread_func(void *ud);
+ void _thread();
+
+ Vector<Ref<EditorResourcePreviewGenerator> > preview_generators;
+
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ static EditorResourcePreview* get_singleton();
+
+ //callback funtion is callback(String p_path,Ref<Texture> preview,Variant udata) preview null if could not load
+ void queue_resource_preview(const String& p_res, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata);
+ void queue_edited_resource_preview(const Ref<Resource>& p_path, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata);
+
+ void add_preview_generator(const Ref<EditorResourcePreviewGenerator>& p_generator);
+ void remove_preview_generator(const Ref<EditorResourcePreviewGenerator>& p_generator);
+ void check_for_invalidation(const String& p_path);
+
+ EditorResourcePreview();
+ ~EditorResourcePreview();
+};
+
+#endif // EDITORRESOURCEPREVIEW_H
diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp
new file mode 100644
index 0000000000..46e400ae7f
--- /dev/null
+++ b/editor/editor_run.cpp
@@ -0,0 +1,211 @@
+/*************************************************************************/
+/* editor_run.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_run.h"
+
+#include "global_config.h"
+#include "editor_settings.h"
+
+EditorRun::Status EditorRun::get_status() const {
+
+ return status;
+}
+Error EditorRun::run(const String& p_scene,const String p_custom_args,const List<String>& p_breakpoints) {
+
+ List<String> args;
+
+
+ String resource_path = GlobalConfig::get_singleton()->get_resource_path();
+
+ if (resource_path!="") {
+ args.push_back("-path");
+ args.push_back(resource_path.replace(" ","%20"));
+
+ }
+
+ if (true) {
+ args.push_back("-rdebug");
+ args.push_back("localhost:"+String::num(GLOBAL_GET("network/debug/remote_port")));
+ }
+
+ args.push_back("-epid");
+ args.push_back(String::num(OS::get_singleton()->get_process_ID()));
+
+ if (debug_collisions) {
+ args.push_back("-debugcol");
+ }
+
+ if (debug_navigation) {
+ args.push_back("-debugnav");
+ }
+
+ int screen = EditorSettings::get_singleton()->get("run/window_placement/screen");
+
+ if (screen==0) {
+ screen=OS::get_singleton()->get_current_screen();
+ } else {
+ screen--;
+ }
+
+ Rect2 screen_rect;
+ screen_rect.pos=OS::get_singleton()->get_screen_position(screen);
+ screen_rect.size=OS::get_singleton()->get_screen_size(screen);
+
+
+ Size2 desired_size;
+
+ desired_size.x=GlobalConfig::get_singleton()->get("display/width");
+ desired_size.y=GlobalConfig::get_singleton()->get("display/height");
+
+ Size2 test_size;
+ test_size.x=GlobalConfig::get_singleton()->get("display/test_width");
+ test_size.y=GlobalConfig::get_singleton()->get("display/test_height");
+ if (test_size.x>0 && test_size.y>0) {
+
+ desired_size=test_size;
+ }
+
+
+ int window_placement=EditorSettings::get_singleton()->get("run/window_placement/rect");
+
+ switch(window_placement) {
+ case 0: { // default
+
+ args.push_back("-p");
+ args.push_back(itos(screen_rect.pos.x)+"x"+itos(screen_rect.pos.y));
+ } break;
+ case 1: { // centered
+ Vector2 pos=screen_rect.pos+((screen_rect.size-desired_size)/2).floor();
+ args.push_back("-p");
+ args.push_back(itos(pos.x)+"x"+itos(pos.y));
+ } break;
+ case 2: { // custom pos
+ Vector2 pos = EditorSettings::get_singleton()->get("run/window_placement/rect_custom_position");
+ pos+=screen_rect.pos;
+ args.push_back("-p");
+ args.push_back(itos(pos.x)+"x"+itos(pos.y));
+ } break;
+ case 3: { // force maximized
+ Vector2 pos=screen_rect.pos;
+ args.push_back("-p");
+ args.push_back(itos(pos.x)+"x"+itos(pos.y));
+ args.push_back("-mx");
+
+ } break;
+ case 4: { // force fullscreen
+
+ Vector2 pos=screen_rect.pos;
+ args.push_back("-p");
+ args.push_back(itos(pos.x)+"x"+itos(pos.y));
+ args.push_back("-f");
+ } break;
+ }
+
+
+
+ if (p_breakpoints.size()) {
+
+ args.push_back("-bp");
+ String bpoints;
+ for(const List<String>::Element *E=p_breakpoints.front();E;E=E->next()) {
+
+ bpoints+=E->get().replace(" ","%20");
+ if (E->next())
+ bpoints+=",";
+ }
+
+ args.push_back(bpoints);
+ }
+
+ if (p_scene!="") {
+ args.push_back(p_scene);
+ }
+
+ if (p_custom_args!="") {
+ Vector<String> cargs=p_custom_args.split(" ",false);
+ for(int i=0;i<cargs.size();i++) {
+ args.push_back(cargs[i].replace(" ","%20"));
+ }
+ }
+
+ String exec = OS::get_singleton()->get_executable_path();
+
+ printf("running: %ls", exec.c_str());
+ for (List<String>::Element* E = args.front(); E ; E = E->next()) {
+
+ printf(" %ls", E->get().c_str());
+ };
+ printf("\n");
+
+ pid=0;
+ Error err = OS::get_singleton()->execute(exec,args,false,&pid);
+ ERR_FAIL_COND_V(err,err);
+
+ status = STATUS_PLAY;
+
+ return OK;
+}
+
+void EditorRun::stop() {
+
+ if (status!=STATUS_STOP && pid!=0) {
+
+ OS::get_singleton()->kill(pid);
+ }
+
+ status=STATUS_STOP;
+}
+
+void EditorRun::set_debug_collisions(bool p_debug) {
+
+ debug_collisions=p_debug;
+}
+
+bool EditorRun::get_debug_collisions() const{
+
+ return debug_collisions;
+}
+
+void EditorRun::set_debug_navigation(bool p_debug) {
+
+ debug_navigation=p_debug;
+}
+
+bool EditorRun::get_debug_navigation() const{
+
+ return debug_navigation;
+}
+
+
+EditorRun::EditorRun() {
+
+ status=STATUS_STOP;
+ debug_collisions=false;
+ debug_navigation=false;
+
+}
diff --git a/editor/editor_run.h b/editor/editor_run.h
new file mode 100644
index 0000000000..46c5dc7521
--- /dev/null
+++ b/editor/editor_run.h
@@ -0,0 +1,67 @@
+/*************************************************************************/
+/* editor_run.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_RUN_H
+#define EDITOR_RUN_H
+
+#include "scene/main/node.h"
+#include "os/os.h"
+class EditorRun {
+public:
+ enum Status {
+
+ STATUS_PLAY,
+ STATUS_PAUSED,
+ STATUS_STOP
+ };
+
+ OS::ProcessID pid;
+private:
+
+ bool debug_collisions;
+ bool debug_navigation;
+ Status status;
+public:
+
+ Status get_status() const;
+ Error run(const String& p_scene,const String p_custom_args,const List<String>& p_breakpoints);
+ void run_native_notify() { status=STATUS_PLAY; }
+ void stop();
+
+ OS::ProcessID get_pid() const { return pid; }
+
+ void set_debug_collisions(bool p_debug);
+ bool get_debug_collisions() const;
+
+ void set_debug_navigation(bool p_debug);
+ bool get_debug_navigation() const;
+
+ EditorRun();
+};
+
+#endif // EDITOR_RUN_H
diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp
new file mode 100644
index 0000000000..60a9f53b94
--- /dev/null
+++ b/editor/editor_run_native.cpp
@@ -0,0 +1,189 @@
+/*************************************************************************/
+/* editor_run_native.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_run_native.h"
+
+#include "editor_export.h"
+
+void EditorRunNative::_notification(int p_what) {
+
+#if 0
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ List<StringName> ep;
+ EditorImportExport::get_singleton()->get_export_platforms(&ep);
+ ep.sort_custom<StringName::AlphCompare>();
+ for(List<StringName>::Element *E=ep.front();E;E=E->next()) {
+
+ Ref<EditorExportPlatform> eep = EditorImportExport::get_singleton()->get_export_platform(E->get());
+ if (eep.is_null())
+ continue;
+ Ref<ImageTexture> icon = eep->get_logo();
+ if (!icon.is_null()) {
+ Image im = icon->get_data();
+ im.clear_mipmaps();
+ if (!im.empty()) {
+
+ im.resize(16,16);
+
+ Ref<ImageTexture> small_icon = memnew( ImageTexture);
+ small_icon->create_from_image(im);
+ MenuButton *mb = memnew( MenuButton );
+ mb->get_popup()->connect("id_pressed",this,"_run_native",varray(E->get()));
+ mb->connect("pressed",this,"_run_native",varray(-1, E->get()));
+ mb->set_icon(small_icon);
+ add_child(mb);
+ menus[E->get()]=mb;
+ }
+ }
+ }
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+
+ bool changed = EditorImportExport::get_singleton()->poll_export_platforms() || first;
+
+ if (changed) {
+
+ for(Map<StringName,MenuButton*>::Element *E=menus.front();E;E=E->next()) {
+
+ Ref<EditorExportPlatform> eep = EditorImportExport::get_singleton()->get_export_platform(E->key());
+ MenuButton *mb = E->get();
+ int dc = eep->get_device_count();
+
+ if (dc==0) {
+ mb->hide();
+ } else {
+ mb->get_popup()->clear();
+ mb->show();
+ if (dc == 1) {
+ mb->set_tooltip(eep->get_device_name(0) + "\n\n" + eep->get_device_info(0).strip_edges());
+ } else {
+ mb->set_tooltip("Select device from the list");
+ for(int i=0;i<dc;i++) {
+ mb->get_popup()->add_icon_item(get_icon("Play","EditorIcons"),eep->get_device_name(i));
+ mb->get_popup()->set_item_tooltip(mb->get_popup()->get_item_count() -1,eep->get_device_info(i).strip_edges());
+ }
+ }
+ }
+ }
+
+ first=false;
+ }
+ }
+#endif
+}
+
+void EditorRunNative::_run_native(int p_idx,const String& p_platform) {
+
+#if 0
+ Ref<EditorExportPlatform> eep = EditorImportExport::get_singleton()->get_export_platform(p_platform);
+ ERR_FAIL_COND(eep.is_null());
+ if (p_idx == -1) {
+ if (eep->get_device_count() == 1) {
+ menus[p_platform]->get_popup()->hide();
+ p_idx = 0;
+ } else {
+ return;
+ }
+ }
+ emit_signal("native_run");
+
+ int flags=0;
+ if (deploy_debug_remote)
+ flags|=EditorExportPlatform::EXPORT_REMOTE_DEBUG;
+ if (deploy_dumb)
+ flags|=EditorExportPlatform::EXPORT_DUMB_CLIENT;
+ if (debug_collisions)
+ flags|=EditorExportPlatform::EXPORT_VIEW_COLLISONS;
+ if (debug_navigation)
+ flags|=EditorExportPlatform::EXPORT_VIEW_NAVIGATION;
+
+ eep->run(p_idx,flags);
+
+#endif
+}
+
+void EditorRunNative::_bind_methods() {
+
+ ClassDB::bind_method("_run_native",&EditorRunNative::_run_native);
+
+ ADD_SIGNAL(MethodInfo("native_run"));
+}
+
+void EditorRunNative::set_deploy_dumb(bool p_enabled) {
+
+ deploy_dumb=p_enabled;
+}
+
+bool EditorRunNative::is_deploy_dumb_enabled() const{
+
+ return deploy_dumb;
+}
+
+void EditorRunNative::set_deploy_debug_remote(bool p_enabled) {
+
+ deploy_debug_remote=p_enabled;
+}
+
+bool EditorRunNative::is_deploy_debug_remote_enabled() const{
+
+ return deploy_debug_remote;
+}
+
+void EditorRunNative::set_debug_collisions(bool p_debug) {
+
+ debug_collisions=p_debug;
+}
+
+bool EditorRunNative::get_debug_collisions() const{
+
+ return debug_collisions;
+}
+
+void EditorRunNative::set_debug_navigation(bool p_debug) {
+
+ debug_navigation=p_debug;
+}
+
+bool EditorRunNative::get_debug_navigation() const{
+
+ return debug_navigation;
+}
+
+EditorRunNative::EditorRunNative()
+{
+ set_process(true);
+ first=true;
+ deploy_dumb=false;
+ deploy_debug_remote=false;
+ debug_collisions=false;
+ debug_navigation=false;
+
+}
diff --git a/editor/editor_run_native.h b/editor/editor_run_native.h
new file mode 100644
index 0000000000..c62021148b
--- /dev/null
+++ b/editor/editor_run_native.h
@@ -0,0 +1,69 @@
+/*************************************************************************/
+/* editor_run_native.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_RUN_NATIVE_H
+#define EDITOR_RUN_NATIVE_H
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/menu_button.h"
+
+class EditorRunNative : public HBoxContainer {
+
+ GDCLASS(EditorRunNative,BoxContainer);
+
+ Map<StringName,MenuButton*> menus;
+ bool first;
+ bool deploy_dumb;
+ bool deploy_debug_remote;
+ bool debug_collisions;
+ bool debug_navigation;
+
+ void _run_native(int p_idx,const String& p_platform);
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void set_deploy_dumb(bool p_enabled);
+ bool is_deploy_dumb_enabled() const;
+
+ void set_deploy_debug_remote(bool p_enabled);
+ bool is_deploy_debug_remote_enabled() const;
+
+ void set_debug_collisions(bool p_debug);
+ bool get_debug_collisions() const;
+
+ void set_debug_navigation(bool p_debug);
+ bool get_debug_navigation() const;
+
+ EditorRunNative();
+};
+
+#endif // EDITOR_RUN_NATIVE_H
diff --git a/editor/editor_run_script.cpp b/editor/editor_run_script.cpp
new file mode 100644
index 0000000000..77dc7bd4bf
--- /dev/null
+++ b/editor/editor_run_script.cpp
@@ -0,0 +1,97 @@
+/*************************************************************************/
+/* editor_run_script.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_run_script.h"
+
+#include "editor_node.h"
+
+
+void EditorScript::add_root_node(Node *p_node) {
+
+ if (!editor) {
+ EditorNode::add_io_error("EditorScript::add_root_node: "+TTR("Write your logic in the _run() method."));
+ return;
+ }
+
+ if (editor->get_edited_scene()) {
+ EditorNode::add_io_error("EditorScript::add_root_node: "+TTR("There is an edited scene already."));
+ return;
+ }
+
+ //editor->set_edited_scene(p_node);
+}
+
+Node *EditorScript::get_scene() {
+
+ if (!editor) {
+ EditorNode::add_io_error("EditorScript::get_scene: "+TTR("Write your logic in the _run() method."));
+ return NULL;
+ }
+
+ return editor->get_edited_scene();
+}
+
+void EditorScript::_run() {
+
+ Ref<Script> s = get_script();
+ ERR_FAIL_COND(!s.is_valid());
+ if (!get_script_instance()) {
+ EditorNode::add_io_error(TTR("Couldn't instance script:")+"\n "+s->get_path()+"\n"+TTR("Did you forget the 'tool' keyword?"));
+ return;
+
+ }
+
+ Variant::CallError ce;
+ ce.error=Variant::CallError::CALL_OK;
+ get_script_instance()->call("_run",NULL,0,ce);
+ if (ce.error!=Variant::CallError::CALL_OK) {
+
+ EditorNode::add_io_error(TTR("Couldn't run script:")+"\n "+s->get_path()+"\n"+TTR("Did you forget the '_run' method?"));
+ }
+}
+
+void EditorScript::set_editor(EditorNode *p_editor) {
+
+ editor=p_editor;
+}
+
+
+void EditorScript::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("add_root_node","node"),&EditorScript::add_root_node);
+ ClassDB::bind_method(D_METHOD("get_scene"),&EditorScript::get_scene);
+ BIND_VMETHOD( MethodInfo("_run") );
+
+
+}
+
+EditorScript::EditorScript() {
+
+ editor=NULL;
+}
+
diff --git a/editor/editor_run_script.h b/editor/editor_run_script.h
new file mode 100644
index 0000000000..3ab8525cc6
--- /dev/null
+++ b/editor/editor_run_script.h
@@ -0,0 +1,55 @@
+/*************************************************************************/
+/* editor_run_script.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_RUN_SCRIPT_H
+#define EDITOR_RUN_SCRIPT_H
+
+#include "reference.h"
+
+
+class EditorNode;
+class EditorScript : public Reference {
+
+ GDCLASS( EditorScript, Reference );
+
+ EditorNode *editor;
+protected:
+
+ static void _bind_methods();
+public:
+
+ void add_root_node(Node *p_node);
+ Node *get_scene();
+
+ virtual void _run();
+
+ void set_editor(EditorNode *p_editor);
+ EditorScript();
+};
+
+#endif // EDITOR_RUN_SCRIPT_H
diff --git a/editor/editor_scale.cpp b/editor/editor_scale.cpp
new file mode 100644
index 0000000000..5687f97b22
--- /dev/null
+++ b/editor/editor_scale.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************/
+/* editor_scale.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_scale.h"
+
+#include "os/os.h"
+
+static float scale = 1.0;
+
+void editor_set_scale(float p_scale) {
+
+ scale=p_scale;
+}
+float editor_get_scale() {
+
+ return scale;
+}
diff --git a/editor/editor_scale.h b/editor/editor_scale.h
new file mode 100644
index 0000000000..035a5056c1
--- /dev/null
+++ b/editor/editor_scale.h
@@ -0,0 +1,36 @@
+/*************************************************************************/
+/* editor_scale.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SCALE_H
+#define EDITOR_SCALE_H
+
+void editor_set_scale(float p_scale);
+float editor_get_scale();
+
+#define EDSCALE (editor_get_scale())
+#endif // EDITOR_SCALE_H
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
new file mode 100644
index 0000000000..f977a40243
--- /dev/null
+++ b/editor/editor_settings.cpp
@@ -0,0 +1,1158 @@
+/*************************************************************************/
+/* editor_settings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http:/www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_settings.h"
+
+#include "os/os.h"
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "version.h"
+#include "scene/main/scene_main_loop.h"
+#include "scene/main/node.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "scene/main/viewport.h"
+#include "io/config_file.h"
+#include "editor_node.h"
+#include "global_config.h"
+#include "translations.h"
+#include "io/file_access_memory.h"
+#include "io/translation_loader_po.h"
+#include "io/compression.h"
+#include "os/keyboard.h"
+
+
+
+
+Ref<EditorSettings> EditorSettings::singleton=NULL;
+
+EditorSettings *EditorSettings::get_singleton() {
+
+ return singleton.ptr();
+}
+
+
+bool EditorSettings::_set(const StringName& p_name, const Variant& p_value) {
+
+ _THREAD_SAFE_METHOD_
+
+ if (p_name.operator String()=="shortcuts") {
+
+ Array arr=p_value;
+ ERR_FAIL_COND_V(arr.size() && arr.size()&1,true);
+ for(int i=0;i<arr.size();i+=2) {
+
+ String name = arr[i];
+ InputEvent shortcut = arr[i+1];
+
+ Ref<ShortCut> sc;
+ sc.instance();
+ sc->set_shortcut(shortcut);
+ add_shortcut(name,sc);
+ }
+
+ return true;
+ }
+
+ if (p_value.get_type()==Variant::NIL)
+ props.erase(p_name);
+ else {
+
+ if (props.has(p_name))
+ props[p_name].variant=p_value;
+ else
+ props[p_name]=VariantContainer(p_value,last_order++);
+
+ if (save_changed_setting) {
+ props[p_name].save=true;
+ }
+ }
+
+ emit_signal("settings_changed");
+ return true;
+}
+bool EditorSettings::_get(const StringName& p_name,Variant &r_ret) const {
+
+ _THREAD_SAFE_METHOD_
+
+ if (p_name.operator String()=="shortcuts") {
+
+ Array arr;
+ for (const Map<String,Ref<ShortCut> >::Element *E=shortcuts.front();E;E=E->next()) {
+
+ Ref<ShortCut> sc=E->get();
+
+ if (optimize_save) {
+ if (!sc->has_meta("original")) {
+ continue; //this came from settings but is not any longer used
+ }
+
+ InputEvent original = sc->get_meta("original");
+ if (sc->is_shortcut(original) || (original.type==InputEvent::NONE && sc->get_shortcut().type==InputEvent::NONE))
+ continue; //not changed from default, don't save
+ }
+
+ arr.push_back(E->key());
+ arr.push_back(sc->get_shortcut());
+ }
+ r_ret=arr;
+ return true;
+ }
+
+ const VariantContainer *v=props.getptr(p_name);
+ if (!v) {
+ print_line("EditorSettings::_get - Warning, not found: "+String(p_name));
+ return false;
+ }
+ r_ret = v->variant;
+ return true;
+}
+
+struct _EVCSort {
+
+ String name;
+ Variant::Type type;
+ int order;
+ bool save;
+
+ bool operator<(const _EVCSort& p_vcs) const{ return order< p_vcs.order; }
+};
+
+void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
+
+ _THREAD_SAFE_METHOD_
+
+ const String *k=NULL;
+ Set<_EVCSort> vclist;
+
+ while ((k=props.next(k))) {
+
+ const VariantContainer *v=props.getptr(*k);
+
+ if (v->hide_from_editor)
+ continue;
+
+ _EVCSort vc;
+ vc.name=*k;
+ vc.order=v->order;
+ vc.type=v->variant.get_type();
+ vc.save=v->save;
+
+
+ vclist.insert(vc);
+ }
+
+ for(Set<_EVCSort>::Element *E=vclist.front();E;E=E->next()) {
+
+ int pinfo = 0;
+ if (E->get().save || !optimize_save) {
+ pinfo|=PROPERTY_USAGE_STORAGE;
+ }
+
+ if (!E->get().name.begins_with("_") && !E->get().name.begins_with("projects/")) {
+ pinfo|=PROPERTY_USAGE_EDITOR;
+ } else {
+ pinfo|=PROPERTY_USAGE_STORAGE; //hiddens must always be saved
+ }
+
+ PropertyInfo pi(E->get().type, E->get().name);
+ pi.usage=pinfo;
+ if (hints.has(E->get().name))
+ pi=hints[E->get().name];
+
+
+ p_list->push_back( pi );
+ }
+
+ p_list->push_back(PropertyInfo(Variant::ARRAY,"shortcuts",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR)); //do not edit
+}
+
+bool EditorSettings::has(String p_var) const {
+
+ _THREAD_SAFE_METHOD_
+
+ return props.has(p_var);
+}
+
+void EditorSettings::erase(String p_var) {
+
+ _THREAD_SAFE_METHOD_
+
+ props.erase(p_var);
+}
+
+void EditorSettings::raise_order(const String& p_name) {
+ _THREAD_SAFE_METHOD_
+
+ ERR_FAIL_COND(!props.has(p_name));
+ props[p_name].order=++last_order;
+
+
+}
+
+
+Variant _EDITOR_DEF( const String& p_var, const Variant& p_default) {
+
+ if (EditorSettings::get_singleton()->has(p_var))
+ return EditorSettings::get_singleton()->get(p_var);
+ EditorSettings::get_singleton()->set(p_var,p_default);
+ return p_default;
+
+}
+
+
+void EditorSettings::create() {
+
+
+ if (singleton.ptr())
+ return; //pointless
+
+ DirAccess *dir=NULL;
+ Variant meta;
+
+ String config_path;
+ String config_dir;
+ //String config_file="editor_settings.xml";
+ Ref<ConfigFile> extra_config = memnew(ConfigFile);
+
+ String exe_path = OS::get_singleton()->get_executable_path().get_base_dir();
+ DirAccess* d = DirAccess::create_for_path(exe_path);
+ bool self_contained = false;
+
+ if (d->file_exists(exe_path + "/._sc_")) {
+ self_contained = true;
+ extra_config->load(exe_path + "/._sc_");
+ } else if (d->file_exists(exe_path + "/_sc_")) {
+ self_contained = true;
+ extra_config->load(exe_path + "/_sc_");
+ }
+
+ if (self_contained) {
+ // editor is self contained
+ config_path = exe_path;
+ config_dir = "editor_data";
+ } else {
+
+ if (OS::get_singleton()->has_environment("APPDATA")) {
+ // Most likely under windows, save here
+ config_path=OS::get_singleton()->get_environment("APPDATA");
+ config_dir=String(_MKSTR(VERSION_SHORT_NAME)).capitalize();
+ } else if (OS::get_singleton()->has_environment("HOME")) {
+
+ config_path=OS::get_singleton()->get_environment("HOME");
+ config_dir="."+String(_MKSTR(VERSION_SHORT_NAME)).to_lower();
+ }
+ };
+
+ ClassDB::register_class<EditorSettings>(); //otherwise it can't be unserialized
+ String config_file_path;
+
+ if (config_path!=""){
+
+ dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ if (dir->change_dir(config_path)!=OK) {
+ ERR_PRINT("Cannot find path for config directory!");
+ memdelete(dir);
+ goto fail;
+ }
+
+ if (dir->change_dir(config_dir)!=OK) {
+ dir->make_dir(config_dir);
+ if (dir->change_dir(config_dir)!=OK) {
+ ERR_PRINT("Cannot create config directory!");
+ memdelete(dir);
+ goto fail;
+ }
+ }
+
+ if (dir->change_dir("templates")!=OK) {
+ dir->make_dir("templates");
+ } else {
+
+ dir->change_dir("..");
+ }
+
+ if (dir->change_dir("text_editor_themes")!=OK) {
+ dir->make_dir("text_editor_themes");
+ } else {
+ dir->change_dir("..");
+ }
+
+ if (dir->change_dir("tmp")!=OK) {
+ dir->make_dir("tmp");
+ } else {
+
+ dir->change_dir("..");
+ }
+
+ if (dir->change_dir("config")!=OK) {
+ dir->make_dir("config");
+ } else {
+
+ dir->change_dir("..");
+ }
+
+ dir->change_dir("config");
+
+ String pcp=GlobalConfig::get_singleton()->get_resource_path();
+ if (pcp.ends_with("/"))
+ pcp=config_path.substr(0,pcp.size()-1);
+ pcp=pcp.get_file()+"-"+pcp.md5_text();
+
+ if (dir->change_dir(pcp)) {
+ dir->make_dir(pcp);
+ } else {
+ dir->change_dir("..");
+ }
+
+ dir->change_dir("..");
+
+ // path at least is validated, so validate config file
+
+ String config_file_name = "editor_settings-" + String(_MKSTR(VERSION_MAJOR)) + ".tres";
+ config_file_path = config_path + "/" + config_dir + "/" + config_file_name;
+
+ String open_path = config_file_path;
+
+ if (!dir->file_exists(config_file_name)) {
+
+ goto fail;
+ }
+
+ memdelete(dir);
+
+ singleton = ResourceLoader::load(open_path,"EditorSettings");
+
+ if (singleton.is_null()) {
+ WARN_PRINT("Could not open config file.");
+ goto fail;
+ }
+
+ singleton->save_changed_setting=true;
+ singleton->config_file_path=config_file_path;
+ singleton->project_config_path=pcp;
+ singleton->settings_path=config_path+"/"+config_dir;
+
+ if (OS::get_singleton()->is_stdout_verbose()) {
+
+ print_line("EditorSettings: Load OK!");
+ }
+
+ singleton->setup_language();
+ singleton->setup_network();
+ singleton->load_favorites();
+ singleton->list_text_editor_themes();
+
+ return;
+
+ }
+
+
+
+ fail:
+
+ // patch init projects
+ if (extra_config->has_section("init_projects")) {
+ Vector<String> list = extra_config->get_value("init_projects", "list");
+ for (int i=0; i<list.size(); i++) {
+
+ list[i] = exe_path + "/" + list[i];
+ };
+ extra_config->set_value("init_projects", "list", list);
+ };
+
+ singleton = Ref<EditorSettings>( memnew( EditorSettings ) );
+ singleton->save_changed_setting=true;
+ singleton->config_file_path=config_file_path;
+ singleton->settings_path=config_path+"/"+config_dir;
+ singleton->_load_defaults(extra_config);
+ singleton->setup_language();
+ singleton->setup_network();
+ singleton->list_text_editor_themes();
+
+
+}
+
+String EditorSettings::get_settings_path() const {
+
+ return settings_path;
+}
+
+
+
+void EditorSettings::setup_language() {
+
+ String lang = get("interface/editor_language");
+ if (lang=="en")
+ return;//none to do
+
+ for(int i=0;i<translations.size();i++) {
+ if (translations[i]->get_locale()==lang) {
+ TranslationServer::get_singleton()->set_tool_translation(translations[i]);
+ break;
+ }
+ }
+}
+
+void EditorSettings::setup_network() {
+
+ List<IP_Address> local_ip;
+ IP::get_singleton()->get_local_addresses(&local_ip);
+ String lip;
+ String hint;
+ String current=get("network/debug_host");
+
+ for(List<IP_Address>::Element *E=local_ip.front();E;E=E->next()) {
+
+ String ip = E->get();
+ if (ip=="127.0.0.1")
+ continue;
+
+ if (lip=="")
+ lip=ip;
+ if (ip==current)
+ lip=current; //so it saves
+ if (hint!="")
+ hint+=",";
+ hint+=ip;
+
+ }
+
+ set("network/debug_host",lip);
+ add_property_hint(PropertyInfo(Variant::STRING,"network/debug_host",PROPERTY_HINT_ENUM,hint));
+
+}
+
+
+void EditorSettings::save() {
+
+ //_THREAD_SAFE_METHOD_
+
+ if (!singleton.ptr())
+ return;
+
+ if (singleton->config_file_path=="") {
+ ERR_PRINT("Cannot save EditorSettings config, no valid path");
+ return;
+ }
+
+ Error err = ResourceSaver::save(singleton->config_file_path,singleton);
+
+ if (err!=OK) {
+ ERR_PRINT("Can't Save!");
+ return;
+ }
+
+ if (OS::get_singleton()->is_stdout_verbose()) {
+ print_line("EditorSettings Save OK!");
+ }
+
+}
+
+void EditorSettings::destroy() {
+
+ if (!singleton.ptr())
+ return;
+ save();
+ singleton=Ref<EditorSettings>();
+}
+
+void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
+
+ _THREAD_SAFE_METHOD_
+
+
+ {
+ String lang_hint="en";
+ String host_lang = OS::get_singleton()->get_locale();
+
+ String best;
+
+ for(int i=0;i<translations.size();i++) {
+ String locale = translations[i]->get_locale();
+ lang_hint+=",";
+ lang_hint+=locale;
+
+ if (host_lang==locale) {
+ best=locale;
+ }
+
+ if (best==String() && host_lang.begins_with(locale)) {
+ best=locale;
+ }
+ }
+
+ if (best==String()) {
+ best="en";
+ }
+
+ set("interface/editor_language",best);
+ hints["interface/editor_language"]=PropertyInfo(Variant::STRING,"interface/editor_language",PROPERTY_HINT_ENUM,lang_hint,PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+ }
+
+ set("interface/hidpi_mode",0);
+ hints["interface/hidpi_mode"]=PropertyInfo(Variant::INT,"interface/hidpi_mode",PROPERTY_HINT_ENUM,"Auto,VeryLoDPI,LoDPI,MidDPI,HiDPI",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+ set("interface/show_script_in_scene_tabs",false);
+ set("interface/font_size",14);
+ hints["interface/font_size"]=PropertyInfo(Variant::INT,"interface/font_size",PROPERTY_HINT_RANGE,"10,40,1",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+ set("interface/source_font_size",14);
+ hints["interface/source_font_size"]=PropertyInfo(Variant::INT,"interface/source_font_size",PROPERTY_HINT_RANGE,"8,96,1",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+ set("interface/custom_font","");
+ hints["interface/custom_font"]=PropertyInfo(Variant::STRING,"interface/custom_font",PROPERTY_HINT_GLOBAL_FILE,"*.fnt",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+ set("interface/custom_theme","");
+ hints["interface/custom_theme"]=PropertyInfo(Variant::STRING,"interface/custom_theme",PROPERTY_HINT_GLOBAL_FILE,"*.res,*.tres,*.theme",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+
+
+ set("filesystem/directories/autoscan_project_path","");
+ hints["filesystem/directories/autoscan_project_path"]=PropertyInfo(Variant::STRING,"filesystem/directories/autoscan_project_path",PROPERTY_HINT_GLOBAL_DIR);
+ set("filesystem/directories/default_project_path","");
+ hints["filesystem/directories/default_project_path"]=PropertyInfo(Variant::STRING,"filesystem/directories/default_project_path",PROPERTY_HINT_GLOBAL_DIR);
+ set("filesystem/directories/default_project_export_path","");
+ hints["global/default_project_export_path"]=PropertyInfo(Variant::STRING,"global/default_project_export_path",PROPERTY_HINT_GLOBAL_DIR);
+ set("interface/show_script_in_scene_tabs",false);
+
+
+ set("text_editor/theme/color_theme","Default");
+ hints["text_editor/theme/color_theme"]=PropertyInfo(Variant::STRING,"text_editor/theme/color_theme",PROPERTY_HINT_ENUM,"Default");
+
+ set("text_editor/theme/line_spacing",4);
+
+
+ _load_default_text_editor_theme();
+
+ set("text_editor/highlighting/syntax_highlighting", true);
+
+ set("text_editor/highlighting/highlight_all_occurrences", true);
+ set("text_editor/cursor/scroll_past_end_of_file", false);
+
+ set("text_editor/indent/tab_size", 4);
+ hints["text_editor/indent/tab_size"]=PropertyInfo(Variant::INT,"text_editor/indent/tab_size",PROPERTY_HINT_RANGE,"1, 64, 1"); // size of 0 crashes.
+ set("text_editor/indent/draw_tabs", true);
+
+ set("text_editor/line_numbers/show_line_numbers", true);
+ set("text_editor/line_numbers/line_numbers_zero_padded", false);
+ set("text_editor/line_numbers/show_breakpoint_gutter", true);
+ set("text_editor/line_numbers/show_line_length_guideline", false);
+ set("text_editor/line_numbers/line_length_guideline_column", 80);
+ hints["text_editor/line_numbers/line_length_guideline_column"]=PropertyInfo(Variant::INT,"text_editor/line_numbers/line_length_guideline_column",PROPERTY_HINT_RANGE,"20, 160, 10");
+
+ set("text_editor/files/trim_trailing_whitespace_on_save", false);
+ set("text_editor/completion/idle_parse_delay",2);
+ set("text_editor/tools/create_signal_callbacks",true);
+ set("text_editor/files/autosave_interval_secs",0);
+
+ set("text_editor/cursor/block_caret", false);
+ set("text_editor/cursor/caret_blink", false);
+ set("text_editor/cursor/caret_blink_speed", 0.65);
+ hints["text_editor/cursor/caret_blink_speed"]=PropertyInfo(Variant::REAL,"text_editor/cursor/caret_blink_speed",PROPERTY_HINT_RANGE,"0.1, 10, 0.1");
+
+ set("text_editor/theme/font","");
+ hints["text_editor/theme/font"]=PropertyInfo(Variant::STRING,"text_editor/theme/font",PROPERTY_HINT_GLOBAL_FILE,"*.fnt");
+ set("text_editor/completion/auto_brace_complete", false);
+ set("text_editor/files/restore_scripts_on_load",true);
+
+
+ //set("docks/scene_tree/display_old_action_buttons",false);
+ set("docks/scene_tree/start_create_dialog_fully_expanded",false);
+ set("docks/scene_tree/draw_relationship_lines",false);
+ set("docks/scene_tree/relationship_line_color",Color::html("464646"));
+
+ set("editors/grid_map/pick_distance", 5000.0);
+
+ set("editors/3d/grid_color",Color(0,1,0,0.2));
+ hints["editors/3d/grid_color"]=PropertyInfo(Variant::COLOR,"editors/3d/grid_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED);
+
+ set("editors/3d/default_fov",45.0);
+ set("editors/3d/default_z_near",0.1);
+ set("editors/3d/default_z_far",500.0);
+
+ set("editors/3d/navigation_scheme",0);
+ hints["editors/3d/navigation_scheme"]=PropertyInfo(Variant::INT,"editors/3d/navigation_scheme",PROPERTY_HINT_ENUM,"Godot,Maya,Modo");
+ set("editors/3d/zoom_style",0);
+ hints["editors/3d/zoom_style"]=PropertyInfo(Variant::INT,"editors/3d/zoom_style",PROPERTY_HINT_ENUM,"Vertical, Horizontal");
+ set("editors/3d/orbit_modifier",0);
+ hints["editors/3d/orbit_modifier"]=PropertyInfo(Variant::INT,"editors/3d/orbit_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl");
+ set("editors/3d/pan_modifier",1);
+ hints["editors/3d/pan_modifier"]=PropertyInfo(Variant::INT,"editors/3d/pan_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl");
+ set("editors/3d/zoom_modifier",4);
+ hints["editors/3d/zoom_modifier"]=PropertyInfo(Variant::INT,"editors/3d/zoom_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl");
+ set("editors/3d/emulate_numpad",false);
+ set("editors/3d/emulate_3_button_mouse", false);
+
+ set("editors/2d/bone_width",5);
+ set("editors/2d/bone_color1",Color(1.0,1.0,1.0,0.9));
+ set("editors/2d/bone_color2",Color(0.75,0.75,0.75,0.9));
+ set("editors/2d/bone_selected_color",Color(0.9,0.45,0.45,0.9));
+ set("editors/2d/bone_ik_color",Color(0.9,0.9,0.45,0.9));
+
+ set("editors/2d/keep_margins_when_changing_anchors", false);
+
+ set("run/window_placement/rect",0);
+ hints["run/window_placement/rect"]=PropertyInfo(Variant::INT,"run/window_placement/rect",PROPERTY_HINT_ENUM,"Default,Centered,Custom Position,Force Maximized,Force Full Screen");
+ String screen_hints=TTR("Default (Same as Editor)");
+ for(int i=0;i<OS::get_singleton()->get_screen_count();i++) {
+ screen_hints+=",Monitor "+itos(i+1);
+ }
+ set("run/window_placement/rect_custom_position",Vector2());
+ set("run/window_placement/screen",0);
+ hints["run/window_placement/screen"]=PropertyInfo(Variant::INT,"run/window_placement/screen",PROPERTY_HINT_ENUM,screen_hints);
+
+ set("filesystem/on_save/compress_binary_resources",true);
+ set("filesystem/on_save/save_modified_external_resources",true);
+ //set("filesystem/on_save/save_paths_as_relative",false);
+ //set("filesystem/on_save/save_paths_without_extension",false);
+
+ set("text_editor/tools/create_signal_callbacks",true);
+
+ set("filesystem/file_dialog/show_hidden_files", false);
+ set("filesystem/file_dialog/display_mode", 0);
+ hints["filesystem/file_dialog/display_mode"]=PropertyInfo(Variant::INT,"filesystem/file_dialog/display_mode",PROPERTY_HINT_ENUM,"Thumbnails,List");
+ set("filesystem/file_dialog/thumbnail_size", 64);
+ hints["filesystem/file_dialog/thumbnail_size"]=PropertyInfo(Variant::INT,"filesystem/file_dialog/thumbnail_size",PROPERTY_HINT_RANGE,"32,128,16");
+
+ set("docks/filesystem/display_mode", 0);
+ hints["docks/filesystem/display_mode"]=PropertyInfo(Variant::INT,"docks/filesystem/display_mode",PROPERTY_HINT_ENUM,"Thumbnails,List");
+ set("docks/filesystem/thumbnail_size", 64);
+ hints["docks/filesystem/thumbnail_size"]=PropertyInfo(Variant::INT,"docks/filesystem/thumbnail_size",PROPERTY_HINT_RANGE,"32,128,16");
+
+ set("editors/animation/autorename_animation_tracks",true);
+ set("editors/animation/confirm_insert_track",true);
+
+ set("docks/property_editor/texture_preview_width",48);
+ set("docks/property_editor/auto_refresh_interval",0.3);
+ set("text_editor/help/doc_path","");
+
+ set("filesystem/import/ask_save_before_reimport",false);
+
+ set("filesystem/import/pvrtc_texture_tool","");
+#ifdef WINDOWS_ENABLED
+ hints["filesystem/import/pvrtc_texture_tool"]=PropertyInfo(Variant::STRING,"import/pvrtc_texture_tool",PROPERTY_HINT_GLOBAL_FILE,"*.exe");
+#else
+ hints["import/pvrtc_texture_tool"]=PropertyInfo(Variant::STRING,"import/pvrtc_texture_tool",PROPERTY_HINT_GLOBAL_FILE,"");
+#endif
+ // TODO: Rename to "filesystem/import/pvrtc_fast_conversion" to match other names?
+ set("filesystem/import/pvrtc_fast_conversion",false);
+
+
+ set("run/auto_save/save_before_running",true);
+ set("run/output/always_clear_output_on_play",true);
+ set("run/output/always_open_output_on_play",true);
+ set("run/output/always_close_output_on_stop",false);
+ set("filesystem/resources/save_compressed_resources",true);
+ set("filesystem/resources/auto_reload_modified_images",true);
+
+ set("filesystem/import/automatic_reimport_on_sources_changed",true);
+
+ if (p_extra_config.is_valid()) {
+
+ if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) {
+
+ Vector<String> list = p_extra_config->get_value("init_projects", "list");
+ for (int i=0; i<list.size(); i++) {
+
+ String name = list[i].replace("/", "::");
+ set("projects/"+name, list[i]);
+ };
+ };
+
+ if (p_extra_config->has_section("presets")) {
+
+ List<String> keys;
+ p_extra_config->get_section_keys("presets", &keys);
+
+ for (List<String>::Element *E=keys.front();E;E=E->next()) {
+
+ String key = E->get();
+ Variant val = p_extra_config->get_value("presets", key);
+ set(key, val);
+ };
+ };
+ };
+
+
+
+
+}
+
+void EditorSettings::_load_default_text_editor_theme() {
+ set("text_editor/highlighting/background_color",Color::html("3b000000"));
+ set("text_editor/highlighting/completion_background_color", Color::html("2C2A32"));
+ set("text_editor/highlighting/completion_selected_color", Color::html("434244"));
+ set("text_editor/highlighting/completion_existing_color", Color::html("21dfdfdf"));
+ set("text_editor/highlighting/completion_scroll_color", Color::html("ffffff"));
+ set("text_editor/highlighting/completion_font_color", Color::html("aaaaaa"));
+ set("text_editor/highlighting/caret_color",Color::html("aaaaaa"));
+ set("text_editor/highlighting/caret_background_color", Color::html("000000"));
+ set("text_editor/highlighting/line_number_color",Color::html("66aaaaaa"));
+ set("text_editor/highlighting/text_color",Color::html("aaaaaa"));
+ set("text_editor/highlighting/text_selected_color",Color::html("000000"));
+ set("text_editor/highlighting/keyword_color",Color::html("ffffb3"));
+ set("text_editor/highlighting/base_type_color",Color::html("a4ffd4"));
+ set("text_editor/highlighting/engine_type_color",Color::html("83d3ff"));
+ set("text_editor/highlighting/function_color",Color::html("66a2ce"));
+ set("text_editor/highlighting/member_variable_color",Color::html("e64e59"));
+ set("text_editor/highlighting/comment_color",Color::html("676767"));
+ set("text_editor/highlighting/string_color",Color::html("ef6ebe"));
+ set("text_editor/highlighting/number_color",Color::html("EB9532"));
+ set("text_editor/highlighting/symbol_color",Color::html("badfff"));
+ set("text_editor/highlighting/selection_color",Color::html("7b5dbe"));
+ set("text_editor/highlighting/brace_mismatch_color",Color(1,0.2,0.2));
+ set("text_editor/highlighting/current_line_color",Color(0.3,0.5,0.8,0.15));
+ set("text_editor/highlighting/line_length_guideline_color",Color(0.3,0.5,0.8,0.1));
+ set("text_editor/highlighting/mark_color", Color(1.0,0.4,0.4,0.4));
+ set("text_editor/highlighting/breakpoint_color", Color(0.8,0.8,0.4,0.2));
+ set("text_editor/highlighting/word_highlighted_color",Color(0.8,0.9,0.9,0.15));
+ set("text_editor/highlighting/search_result_color",Color(0.05,0.25,0.05,1));
+ set("text_editor/highlighting/search_result_border_color",Color(0.1,0.45,0.1,1));
+}
+
+void EditorSettings::notify_changes() {
+
+ _THREAD_SAFE_METHOD_
+
+ SceneTree *sml=NULL;
+
+ if (OS::get_singleton()->get_main_loop())
+ sml = OS::get_singleton()->get_main_loop()->cast_to<SceneTree>();
+
+ if (!sml) {
+ return;
+ }
+
+ Node *root = sml->get_root()->get_child(0);
+
+ if (!root) {
+ return;
+ }
+ root->propagate_notification(NOTIFICATION_EDITOR_SETTINGS_CHANGED);
+
+}
+
+void EditorSettings::_add_property_info_bind(const Dictionary& p_info) {
+
+ ERR_FAIL_COND(!p_info.has("name"));
+ ERR_FAIL_COND(!p_info.has("type"));
+
+ PropertyInfo pinfo;
+ pinfo.name = p_info["name"];
+ ERR_FAIL_COND(!props.has(pinfo.name));
+ pinfo.type = Variant::Type(p_info["type"].operator int());
+ ERR_FAIL_INDEX(pinfo.type, Variant::VARIANT_MAX);
+
+ if (p_info.has("hint"))
+ pinfo.hint = PropertyHint(p_info["hint"].operator int());
+ if (p_info.has("hint_string"))
+ pinfo.hint_string = p_info["hint_string"];
+
+ add_property_hint(pinfo);
+}
+
+void EditorSettings::add_property_hint(const PropertyInfo& p_hint) {
+
+ _THREAD_SAFE_METHOD_
+
+ hints[p_hint.name]=p_hint;
+}
+
+
+
+
+
+
+void EditorSettings::set_favorite_dirs(const Vector<String>& p_favorites) {
+
+ favorite_dirs=p_favorites;
+ FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("favorite_dirs"),FileAccess::WRITE);
+ if (f) {
+ for(int i=0;i<favorite_dirs.size();i++)
+ f->store_line(favorite_dirs[i]);
+ memdelete(f);
+ }
+
+}
+
+Vector<String> EditorSettings::get_favorite_dirs() const {
+
+ return favorite_dirs;
+}
+
+
+void EditorSettings::set_recent_dirs(const Vector<String>& p_recent) {
+
+ recent_dirs=p_recent;
+ FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("recent_dirs"),FileAccess::WRITE);
+ if (f) {
+ for(int i=0;i<recent_dirs.size();i++)
+ f->store_line(recent_dirs[i]);
+ memdelete(f);
+ }
+}
+
+Vector<String> EditorSettings::get_recent_dirs() const {
+
+ return recent_dirs;
+}
+
+String EditorSettings::get_project_settings_path() const {
+
+
+ return get_settings_path().plus_file("config").plus_file(project_config_path);
+}
+
+
+void EditorSettings::load_favorites() {
+
+ FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("favorite_dirs"),FileAccess::READ);
+ if (f) {
+ String line = f->get_line().strip_edges();
+ while(line!="") {
+ favorite_dirs.push_back(line);
+ line = f->get_line().strip_edges();
+ }
+ memdelete(f);
+ }
+
+ f = FileAccess::open(get_project_settings_path().plus_file("recent_dirs"),FileAccess::READ);
+ if (f) {
+ String line = f->get_line().strip_edges();
+ while(line!="") {
+ recent_dirs.push_back(line);
+ line = f->get_line().strip_edges();
+ }
+ memdelete(f);
+ }
+
+}
+
+void EditorSettings::list_text_editor_themes() {
+ String themes="Default";
+ DirAccess *d = DirAccess::open(settings_path + "/text_editor_themes");
+ if (d) {
+ d->list_dir_begin();
+ String file = d->get_next();
+ while(file != String()) {
+ if (file.get_extension() == "tet" && file.get_basename().to_lower() != "default") {
+ themes += "," + file.get_basename();
+ }
+ file = d->get_next();
+ }
+ d->list_dir_end();
+ memdelete(d);
+ }
+ add_property_hint(PropertyInfo(Variant::STRING,"text_editor/theme/color_theme",PROPERTY_HINT_ENUM,themes));
+}
+
+void EditorSettings::load_text_editor_theme() {
+ if (get("text_editor/theme/color_theme") == "Default") {
+ _load_default_text_editor_theme(); // sorry for "Settings changed" console spam
+ return;
+ }
+
+ String theme_path = get_settings_path() + "/text_editor_themes/" + get("text_editor/theme/color_theme") + ".tet";
+
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+ Error err = cf->load(theme_path);
+
+ if (err != OK) {
+ return;
+ }
+
+ List<String> keys;
+ cf->get_section_keys("color_theme", &keys);
+
+ for(List<String>::Element *E=keys.front();E;E=E->next()) {
+ String key = E->get();
+ String val = cf->get_value("color_theme", key);
+
+ // don't load if it's not already there!
+ if (has("text_editor/highlighting/" + key)) {
+
+ // make sure it is actually a color
+ if (val.is_valid_html_color() && key.find("color") >= 0) {
+ props["text_editor/highlighting/"+key].variant = Color::html(val); // change manually to prevent "Settings changed" console spam
+ }
+ }
+ }
+ emit_signal("settings_changed");
+ // if it doesn't load just use what is currently loaded
+}
+
+bool EditorSettings::import_text_editor_theme(String p_file) {
+
+ if (!p_file.ends_with(".tet")) {
+ return false;
+ } else {
+ if (p_file.get_file().to_lower() == "default.tet") {
+ return false;
+ }
+
+ DirAccess *d = DirAccess::open(settings_path + "/text_editor_themes");
+ if (d) {
+ d->copy(p_file, settings_path + "/text_editor_themes/" + p_file.get_file());
+ memdelete(d);
+ return true;
+ }
+ }
+ return false;
+}
+
+bool EditorSettings::save_text_editor_theme() {
+
+ String p_file = get("text_editor/theme/color_theme");
+
+ if (p_file.get_file().to_lower() == "default") {
+ return false;
+ }
+ String theme_path = get_settings_path() + "/text_editor_themes/" + p_file + ".tet";
+ return _save_text_editor_theme(theme_path);
+}
+
+bool EditorSettings::save_text_editor_theme_as(String p_file) {
+ if (!p_file.ends_with(".tet")) {
+ p_file += ".tet";
+ }
+
+ if (p_file.get_file().to_lower() == "default.tet") {
+ return false;
+ }
+ if(_save_text_editor_theme(p_file)) {
+
+ // switch to theme is saved in the theme directory
+ list_text_editor_themes();
+ String theme_name = p_file.substr(0, p_file.length() - 4).get_file();
+
+ if (p_file.get_base_dir() == get_settings_path() + "/text_editor_themes") {
+ set("text_editor/theme/color_theme", theme_name);
+ load_text_editor_theme();
+ }
+ return true;
+ }
+ return false;
+}
+
+bool EditorSettings::_save_text_editor_theme(String p_file) {
+ String theme_section = "color_theme";
+ Ref<ConfigFile> cf = memnew( ConfigFile ); // hex is better?
+ cf->set_value(theme_section, "background_color", ((Color)get("text_editor/highlighting/background_color")).to_html());
+ cf->set_value(theme_section, "completion_background_color", ((Color)get("text_editor/highlighting/completion_background_color")).to_html());
+ cf->set_value(theme_section, "completion_selected_color", ((Color)get("text_editor/highlighting/completion_selected_color")).to_html());
+ cf->set_value(theme_section, "completion_existing_color", ((Color)get("text_editor/highlighting/completion_existing_color")).to_html());
+ cf->set_value(theme_section, "completion_scroll_color", ((Color)get("text_editor/highlighting/completion_scroll_color")).to_html());
+ cf->set_value(theme_section, "completion_font_color", ((Color)get("text_editor/highlighting/completion_font_color")).to_html());
+ cf->set_value(theme_section, "caret_color", ((Color)get("text_editor/highlighting/caret_color")).to_html());
+ cf->set_value(theme_section, "caret_background_color", ((Color)get("text_editor/highlighting/caret_background_color")).to_html());
+ cf->set_value(theme_section, "line_number_color", ((Color)get("text_editor/highlighting/line_number_color")).to_html());
+ cf->set_value(theme_section, "text_color", ((Color)get("text_editor/highlighting/text_color")).to_html());
+ cf->set_value(theme_section, "text_selected_color", ((Color)get("text_editor/highlighting/text_selected_color")).to_html());
+ cf->set_value(theme_section, "keyword_color", ((Color)get("text_editor/highlighting/keyword_color")).to_html());
+ cf->set_value(theme_section, "base_type_color", ((Color)get("text_editor/highlighting/base_type_color")).to_html());
+ cf->set_value(theme_section, "engine_type_color", ((Color)get("text_editor/highlighting/engine_type_color")).to_html());
+ cf->set_value(theme_section, "function_color", ((Color)get("text_editor/highlighting/function_color")).to_html());
+ cf->set_value(theme_section, "member_variable_color", ((Color)get("text_editor/highlighting/member_variable_color")).to_html());
+ cf->set_value(theme_section, "comment_color", ((Color)get("text_editor/highlighting/comment_color")).to_html());
+ cf->set_value(theme_section, "string_color", ((Color)get("text_editor/highlighting/string_color")).to_html());
+ cf->set_value(theme_section, "number_color", ((Color)get("text_editor/highlighting/number_color")).to_html());
+ cf->set_value(theme_section, "symbol_color", ((Color)get("text_editor/highlighting/symbol_color")).to_html());
+ cf->set_value(theme_section, "selection_color", ((Color)get("text_editor/highlighting/selection_color")).to_html());
+ cf->set_value(theme_section, "brace_mismatch_color", ((Color)get("text_editor/highlighting/brace_mismatch_color")).to_html());
+ cf->set_value(theme_section, "current_line_color", ((Color)get("text_editor/highlighting/current_line_color")).to_html());
+ cf->set_value(theme_section, "line_length_guideline_color", ((Color)get("text_editor/highlighting/line_length_guideline_color")).to_html());
+ cf->set_value(theme_section, "mark_color", ((Color)get("text_editor/highlighting/mark_color")).to_html());
+ cf->set_value(theme_section, "breakpoint_color", ((Color)get("text_editor/highlighting/breakpoint_color")).to_html());
+ cf->set_value(theme_section, "word_highlighted_color", ((Color)get("text_editor/highlighting/word_highlighted_color")).to_html());
+ cf->set_value(theme_section, "search_result_color", ((Color)get("text_editor/highlighting/search_result_color")).to_html());
+ cf->set_value(theme_section, "search_result_border_color", ((Color)get("text_editor/highlighting/search_result_border_color")).to_html());
+
+
+ Error err = cf->save(p_file);
+
+ if (err == OK) {
+ return true;
+ }
+ return false;
+}
+
+
+void EditorSettings::add_shortcut(const String& p_name, Ref<ShortCut> &p_shortcut) {
+
+ shortcuts[p_name]=p_shortcut;
+}
+
+bool EditorSettings::is_shortcut(const String&p_name, const InputEvent &p_event) const{
+
+ const Map<String,Ref<ShortCut> >::Element *E=shortcuts.find(p_name);
+ if (!E) {
+ ERR_EXPLAIN("Unknown Shortcut: "+p_name);
+ ERR_FAIL_V(false);
+ }
+
+ return E->get()->is_shortcut(p_event);
+
+}
+
+Ref<ShortCut> EditorSettings::get_shortcut(const String&p_name) const{
+
+ const Map<String,Ref<ShortCut> >::Element *E=shortcuts.find(p_name);
+ if (!E)
+ return Ref<ShortCut>();
+
+ return E->get();
+}
+
+void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) {
+
+ for (const Map<String,Ref<ShortCut> >::Element*E=shortcuts.front();E;E=E->next()) {
+
+ r_shortcuts->push_back(E->key());
+ }
+}
+
+void EditorSettings::set_optimize_save(bool p_optimize) {
+
+ optimize_save=p_optimize;
+}
+
+Variant EditorSettings::get_project_metadata(const String& p_section, const String& p_key, Variant p_default) {
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+ String path = get_project_settings_path().plus_file("project_metadata.cfg");
+ Error err = cf->load(path);
+ if (err != OK) {
+ return p_default;
+ }
+ return cf->get_value(p_section, p_key, p_default);
+}
+
+void EditorSettings::set_project_metadata(const String& p_section, const String& p_key, Variant p_data)
+{
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+ String path = get_project_settings_path().plus_file("project_metadata.cfg");
+ cf->load(path);
+ cf->set_value(p_section, p_key, p_data);
+ cf->save(path);
+}
+
+void EditorSettings::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("erase","property"),&EditorSettings::erase);
+ ClassDB::bind_method(D_METHOD("get_settings_path"),&EditorSettings::get_settings_path);
+ ClassDB::bind_method(D_METHOD("get_project_settings_path"),&EditorSettings::get_project_settings_path);
+
+ ClassDB::bind_method(D_METHOD("add_property_info", "info"),&EditorSettings::_add_property_info_bind);
+
+ ClassDB::bind_method(D_METHOD("set_favorite_dirs","dirs"),&EditorSettings::set_favorite_dirs);
+ ClassDB::bind_method(D_METHOD("get_favorite_dirs"),&EditorSettings::get_favorite_dirs);
+
+ ClassDB::bind_method(D_METHOD("set_recent_dirs","dirs"),&EditorSettings::set_recent_dirs);
+ ClassDB::bind_method(D_METHOD("get_recent_dirs"),&EditorSettings::get_recent_dirs);
+
+ ADD_SIGNAL(MethodInfo("settings_changed"));
+
+}
+
+EditorSettings::EditorSettings() {
+
+
+ //singleton=this;
+ last_order=0;
+ optimize_save=true;
+ save_changed_setting=true;
+
+ EditorTranslationList *etl=_editor_translations;
+
+ while(etl->data) {
+
+ Vector<uint8_t> data;
+ data.resize(etl->uncomp_size);
+ Compression::decompress(data.ptr(),etl->uncomp_size,etl->data,etl->comp_size,Compression::MODE_DEFLATE);
+
+ FileAccessMemory *fa = memnew (FileAccessMemory);
+ fa->open_custom(data.ptr(),data.size());
+
+ Ref<Translation> tr = TranslationLoaderPO::load_translation(fa,NULL,"translation_"+String(etl->lang));
+
+ if (tr.is_valid()) {
+ tr->set_locale(etl->lang);
+ translations.push_back(tr);
+ }
+
+ etl++;
+
+ }
+
+ _load_defaults();
+
+
+}
+
+
+EditorSettings::~EditorSettings() {
+
+ //singleton=NULL;
+}
+
+Ref<ShortCut> ED_GET_SHORTCUT(const String& p_path) {
+
+ Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
+ if (!sc.is_valid()) {
+ ERR_EXPLAIN("Used ED_GET_SHORTCUT with invalid shortcut: "+p_path);
+ ERR_FAIL_COND_V(!sc.is_valid(),sc);
+ }
+
+ return sc;
+}
+
+Ref<ShortCut> ED_SHORTCUT(const String& p_path,const String& p_name,uint32_t p_keycode) {
+
+ InputEvent ie;
+ if (p_keycode) {
+ ie.type=InputEvent::KEY;
+ ie.key.unicode=p_keycode&KEY_CODE_MASK;
+ ie.key.scancode=p_keycode&KEY_CODE_MASK;
+ ie.key.mod.shift=bool(p_keycode&KEY_MASK_SHIFT);
+ ie.key.mod.alt=bool(p_keycode&KEY_MASK_ALT);
+ ie.key.mod.control=bool(p_keycode&KEY_MASK_CTRL);
+ ie.key.mod.meta=bool(p_keycode&KEY_MASK_META);
+
+ }
+
+ Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
+ if (sc.is_valid()) {
+
+ sc->set_name(p_name); //keep name (the ones that come from disk have no name)
+ sc->set_meta("original",ie); //to compare against changes
+ return sc;
+ }
+
+ sc.instance();
+ sc->set_name(p_name);
+ sc->set_shortcut(ie);
+ sc->set_meta("original",ie); //to compare against changes
+ EditorSettings::get_singleton()->add_shortcut(p_path,sc);
+
+ return sc;
+}
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
new file mode 100644
index 0000000000..809389eb40
--- /dev/null
+++ b/editor/editor_settings.h
@@ -0,0 +1,180 @@
+/*************************************************************************/
+/* editor_settings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SETTINGS_H
+#define EDITOR_SETTINGS_H
+
+#include "object.h"
+
+#include "resource.h"
+#include "os/thread_safe.h"
+#include "core/io/config_file.h"
+#include "translation.h"
+#include "scene/gui/input_action.h"
+
+class EditorPlugin;
+
+class EditorSettings : public Resource {
+
+ GDCLASS( EditorSettings, Resource );
+private:
+ _THREAD_SAFE_CLASS_
+
+public:
+ struct Plugin {
+
+ EditorPlugin *instance;
+ String path;
+ String name;
+ String author;
+ String version;
+ String description;
+ bool installs;
+ String script;
+ Vector<String> install_files;
+ };
+private:
+
+ struct VariantContainer {
+ int order;
+ Variant variant;
+ bool hide_from_editor;
+ bool save;
+ VariantContainer(){ order=0; hide_from_editor=false; save=false;}
+ VariantContainer(const Variant& p_variant, int p_order) { variant=p_variant; order=p_order; hide_from_editor=false; }
+ };
+
+ HashMap<String,PropertyInfo> hints;
+ int last_order;
+ HashMap<String,VariantContainer> props;
+ String resource_path;
+
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list(List<PropertyInfo> *p_list) const;
+
+ static Ref<EditorSettings> singleton;
+
+ String config_file_path;
+ String settings_path;
+
+ Ref<Resource> clipboard;
+
+
+ bool save_changed_setting;
+
+ bool optimize_save; //do not save stuff that came from config but was not set from engine
+
+ void _load_defaults(Ref<ConfigFile> p_extra_config = NULL);
+ void _load_default_text_editor_theme();
+
+ bool _save_text_editor_theme(String p_file);
+
+ String project_config_path;
+
+ Vector<String> favorite_dirs;
+ Vector<String> recent_dirs;
+
+ Vector<Ref<Translation> > translations;
+
+ Map<String,Ref<ShortCut> > shortcuts;
+
+ void _add_property_info_bind(const Dictionary& p_info);
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ enum {
+ NOTIFICATION_EDITOR_SETTINGS_CHANGED=10000
+ };
+
+
+ bool has(String p_var) const;
+ static EditorSettings *get_singleton();
+ void erase(String p_var);
+ String get_settings_path() const;
+ //String get_global_settings_path() const;
+ String get_project_settings_path() const;
+
+
+ void setup_language();
+ void setup_network();
+
+ void raise_order(const String& p_name);
+ static void create();
+ static void save();
+ static void destroy();
+
+ void notify_changes();
+
+ void set_resource_clipboard(const Ref<Resource>& p_resource) { clipboard=p_resource; }
+ Ref<Resource> get_resource_clipboard() const { return clipboard; }
+
+ void add_property_hint(const PropertyInfo& p_hint);
+
+ void set_favorite_dirs(const Vector<String>& p_favorite_dirs);
+ Vector<String> get_favorite_dirs() const;
+
+ void set_recent_dirs(const Vector<String>& p_recent_dirs);
+ Vector<String> get_recent_dirs() const;
+
+ void load_favorites();
+
+ void list_text_editor_themes();
+ void load_text_editor_theme();
+ bool import_text_editor_theme(String p_file);
+ bool save_text_editor_theme();
+ bool save_text_editor_theme_as(String p_file);
+
+ void add_shortcut(const String& p_name,Ref<ShortCut>& p_shortcut);
+ bool is_shortcut(const String&p_name,const InputEvent& p_event) const;
+ Ref<ShortCut> get_shortcut(const String&p_name) const;
+ void get_shortcut_list(List<String> *r_shortcuts);
+
+ void set_optimize_save(bool p_optimize);
+
+ Variant get_project_metadata(const String& p_section, const String& p_key, Variant p_default);
+ void set_project_metadata(const String& p_section, const String& p_key, Variant p_data);
+
+ EditorSettings();
+ ~EditorSettings();
+
+};
+
+//not a macro any longer
+
+#define EDITOR_DEF(m_var,m_val) _EDITOR_DEF(m_var,Variant(m_val))
+Variant _EDITOR_DEF( const String& p_var, const Variant& p_default);
+
+#define ED_IS_SHORTCUT(p_name,p_ev) (EditorSettings::get_singleton()->is_shortcut(p_name,p_ev))
+Ref<ShortCut> ED_SHORTCUT(const String& p_path,const String& p_name,uint32_t p_keycode=0);
+Ref<ShortCut> ED_GET_SHORTCUT(const String& p_path);
+
+#endif // EDITOR_SETTINGS_H
diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp
new file mode 100644
index 0000000000..917560b540
--- /dev/null
+++ b/editor/editor_sub_scene.cpp
@@ -0,0 +1,238 @@
+/*************************************************************************/
+/* editor_sub_scene.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_sub_scene.h"
+
+#include "scene/gui/margin_container.h"
+#include "scene/resources/packed_scene.h"
+
+void EditorSubScene::_path_selected(const String& p_path) {
+
+ path->set_text(p_path);
+ _path_changed(p_path);
+
+}
+
+void EditorSubScene::_path_changed(const String& p_path) {
+
+ tree->clear();
+
+
+ if (scene) {
+ memdelete(scene);
+ scene=NULL;
+ }
+
+ if (p_path=="")
+ return;
+
+ Ref<PackedScene> ps = ResourceLoader::load(p_path,"PackedScene");
+
+ if (ps.is_null())
+ return;
+
+ scene = ps->instance();
+ if (!scene)
+ return;
+
+ _fill_tree(scene,NULL);
+
+
+
+}
+
+void EditorSubScene::_path_browse() {
+
+ file_dialog->popup_centered_ratio();
+}
+
+
+void EditorSubScene::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ if (!is_visible_in_tree()) {
+
+
+ }
+ }
+}
+
+
+void EditorSubScene::_fill_tree(Node* p_node,TreeItem *p_parent) {
+
+ TreeItem *it = tree->create_item(p_parent);
+ it->set_metadata(0,p_node);
+ it->set_text(0,p_node->get_name());
+ it->set_editable(0,false);
+ it->set_selectable(0,true);
+ if (has_icon(p_node->get_class(),"EditorIcons")) {
+ it->set_icon(0,get_icon(p_node->get_class(),"EditorIcons"));
+
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ Node *c = p_node->get_child(i);
+ if (c->get_owner()!=scene)
+ continue;
+ _fill_tree(c,it);
+ }
+
+}
+
+
+void EditorSubScene::ok_pressed() {
+
+
+ TreeItem *s = tree->get_selected();
+ if (!s)
+ return;
+ Node *selnode = s->get_metadata(0);
+ if (!selnode)
+ return;
+ emit_signal("subscene_selected");
+ hide();
+ clear();
+
+
+}
+
+
+void EditorSubScene::_reown(Node* p_node,List<Node*> *p_to_reown) {
+
+ if (p_node==scene) {
+
+ scene->set_filename("");
+ p_to_reown->push_back(p_node);
+ } else if (p_node->get_owner()==scene){
+
+ p_to_reown->push_back(p_node);
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+ Node *c=p_node->get_child(i);
+ _reown(c,p_to_reown);
+ }
+}
+
+void EditorSubScene::move(Node* p_new_parent, Node* p_new_owner) {
+
+ if (!scene) {
+ return;
+ }
+ TreeItem *s = tree->get_selected();
+ if (!s) {
+ return;
+ }
+
+ Node *selnode = s->get_metadata(0);
+ if (!selnode) {
+ return;
+ }
+
+ List<Node*> to_reown;
+ _reown(selnode,&to_reown);
+
+ if (selnode!=scene) {
+ selnode->get_parent()->remove_child(selnode);
+ }
+
+ p_new_parent->add_child(selnode);
+ for (List<Node*>::Element *E=to_reown.front();E;E=E->next()) {
+ E->get()->set_owner(p_new_owner);
+ }
+
+ if (selnode!=scene) {
+ memdelete(scene);
+ }
+ scene=NULL;
+
+
+ //return selnode;
+
+
+}
+
+void EditorSubScene::clear() {
+
+ path->set_text("");
+ _path_changed("");
+}
+
+void EditorSubScene::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_path_selected"),&EditorSubScene::_path_selected);
+ ClassDB::bind_method(D_METHOD("_path_changed"),&EditorSubScene::_path_changed);
+ ClassDB::bind_method(D_METHOD("_path_browse"),&EditorSubScene::_path_browse);
+ ADD_SIGNAL( MethodInfo("subscene_selected"));
+
+}
+
+
+EditorSubScene::EditorSubScene() {
+
+ scene=NULL;
+
+ set_title(TTR("Select Node(s) to Import"));
+ set_hide_on_ok(false);
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+ //set_child_rect(vb);
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ path = memnew( LineEdit );
+ path->connect("text_entered",this,"_path_changed");
+ hb->add_child(path);
+ path->set_h_size_flags(SIZE_EXPAND_FILL);
+ Button *b = memnew( Button );
+ b->set_text(" .. ");
+ hb->add_child(b);
+ b->connect("pressed",this,"_path_browse");
+ vb->add_margin_child(TTR("Scene Path:"),hb);
+
+ tree = memnew( Tree );
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ vb->add_margin_child(TTR("Import From Node:"),tree,true);
+ tree->connect("item_activated",this,"_ok",make_binds(),CONNECT_DEFERRED);
+
+ file_dialog = memnew( EditorFileDialog );
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+
+ for(List<String>::Element *E = extensions.front();E;E=E->next() ) {
+
+ file_dialog->add_filter("*."+E->get());
+ }
+
+ file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ add_child(file_dialog);
+ file_dialog->connect("file_selected",this,"_path_selected");
+
+}
diff --git a/editor/editor_sub_scene.h b/editor/editor_sub_scene.h
new file mode 100644
index 0000000000..46cdceafa5
--- /dev/null
+++ b/editor/editor_sub_scene.h
@@ -0,0 +1,69 @@
+/*************************************************************************/
+/* editor_sub_scene.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SUB_SCENE_H
+#define EDITOR_SUB_SCENE_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "editor/editor_file_dialog.h"
+
+class EditorSubScene : public ConfirmationDialog {
+
+ GDCLASS(EditorSubScene,ConfirmationDialog);
+
+
+ LineEdit *path;
+ Tree *tree;
+ Node *scene;
+
+ EditorFileDialog *file_dialog;
+
+ void _fill_tree(Node* p_node,TreeItem *p_parent);
+ void _reown(Node* p_node,List<Node*> *p_to_reown);
+
+ void ok_pressed();
+
+
+protected:
+
+
+ void _notification(int p_what);
+ static void _bind_methods();
+ void _path_browse();
+ void _path_selected(const String& p_path);
+ void _path_changed(const String& p_path);
+
+public:
+
+ void move(Node* p_new_parent, Node* p_new_owner);
+ void clear();
+ EditorSubScene();
+};
+
+#endif // EDITOR_SUB_SCENE_H
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
new file mode 100644
index 0000000000..7657996b81
--- /dev/null
+++ b/editor/editor_themes.cpp
@@ -0,0 +1,82 @@
+/*************************************************************************/
+/* editor_themes.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_themes.h"
+
+#include "editor_icons.h"
+#include "editor_fonts.h"
+#include "editor_settings.h"
+#include "core/io/resource_loader.h"
+#include "editor_scale.h"
+
+Ref<Theme> create_editor_theme()
+{
+ Ref<Theme> theme = Ref<Theme>( memnew( Theme ) );
+
+ editor_register_fonts(theme);
+ editor_register_icons(theme);
+
+ Ref<StyleBoxTexture> focus_sbt=memnew( StyleBoxTexture );
+ focus_sbt->set_texture(theme->get_icon("EditorFocus","EditorIcons"));
+ for(int i=0;i<4;i++) {
+ focus_sbt->set_margin_size(Margin(i),16*EDSCALE);
+ focus_sbt->set_default_margin(Margin(i),16*EDSCALE);
+ }
+ focus_sbt->set_draw_center(false);
+ theme->set_stylebox("EditorFocus","EditorStyles",focus_sbt);
+ theme->set_color("prop_category","Editor",Color::hex(0x3f3a44ff));
+ theme->set_color("prop_section","Editor",Color::hex(0x35313aff));
+ theme->set_color("prop_subsection","Editor",Color::hex(0x312e37ff));
+ theme->set_color("fg_selected","Editor",Color::html("ffbd8e8e"));
+ theme->set_color("fg_error","Editor",Color::html("ffbd8e8e"));
+
+ return theme;
+}
+
+Ref<Theme> create_custom_theme()
+{
+ Ref<Theme> theme;
+
+ String custom_theme = EditorSettings::get_singleton()->get("interface/custom_theme");
+ if (custom_theme!="") {
+ theme = ResourceLoader::load(custom_theme);
+ }
+
+ String global_font = EditorSettings::get_singleton()->get("interface/custom_font");
+ if (global_font!="") {
+ Ref<Font> fnt = ResourceLoader::load(global_font);
+ if (fnt.is_valid()) {
+ if (!theme.is_valid()) {
+ theme.instance();
+ }
+ theme->set_default_theme_font(fnt);
+ }
+ }
+
+ return theme;
+}
diff --git a/editor/editor_themes.h b/editor/editor_themes.h
new file mode 100644
index 0000000000..bf15420917
--- /dev/null
+++ b/editor/editor_themes.h
@@ -0,0 +1,38 @@
+/*************************************************************************/
+/* editor_themes.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_THEMES_H
+#define EDITOR_THEMES_H
+
+#include "scene/resources/theme.h"
+
+Ref<Theme> create_editor_theme();
+
+Ref<Theme> create_custom_theme();
+
+#endif
diff --git a/editor/file_type_cache.cpp b/editor/file_type_cache.cpp
new file mode 100644
index 0000000000..891669db13
--- /dev/null
+++ b/editor/file_type_cache.cpp
@@ -0,0 +1,108 @@
+/*************************************************************************/
+/* file_type_cache.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "file_type_cache.h"
+
+#include "global_config.h"
+#include "os/file_access.h"
+
+FileTypeCache* FileTypeCache::singleton=NULL;
+
+bool FileTypeCache::has_file(const String& p_path) const {
+
+ GLOBAL_LOCK_FUNCTION
+ return file_type_map.has(p_path);
+}
+
+String FileTypeCache::get_file_type(const String& p_path) const{
+
+ GLOBAL_LOCK_FUNCTION
+ ERR_FAIL_COND_V(!file_type_map.has(p_path),"");
+ return file_type_map[p_path];
+
+}
+void FileTypeCache::set_file_type(const String& p_path,const String& p_type){
+
+ GLOBAL_LOCK_FUNCTION
+ file_type_map[p_path]=p_type;
+}
+
+void FileTypeCache::load() {
+
+ GLOBAL_LOCK_FUNCTION
+ String project=GlobalConfig::get_singleton()->get_resource_path();
+ FileAccess *f =FileAccess::open(project+"/file_type_cache.cch",FileAccess::READ);
+
+ if (!f) {
+
+ WARN_PRINT("Can't open file_type_cache.cch.");
+ return;
+ }
+
+ file_type_map.clear();
+ while(!f->eof_reached()) {
+
+ String path=f->get_line();
+ if (f->eof_reached())
+ break;
+ String type=f->get_line();
+ set_file_type(path,type);
+ }
+
+ memdelete(f);
+
+}
+
+void FileTypeCache::save() {
+
+ GLOBAL_LOCK_FUNCTION
+ String project=GlobalConfig::get_singleton()->get_resource_path();
+ FileAccess *f =FileAccess::open(project+"/file_type_cache.cch",FileAccess::WRITE);
+ if (!f) {
+
+ ERR_EXPLAIN(TTR("Can't open file_type_cache.cch for writing, not saving file type cache!"));
+ ERR_FAIL();
+ }
+
+ const String *K=NULL;
+
+ while((K=file_type_map.next(K))) {
+
+ f->store_line(*K);
+ f->store_line(file_type_map[*K]);
+ }
+
+ memdelete(f);
+
+}
+
+FileTypeCache::FileTypeCache() {
+
+ ERR_FAIL_COND(singleton);
+ singleton=this;
+}
diff --git a/editor/file_type_cache.h b/editor/file_type_cache.h
new file mode 100644
index 0000000000..25755f168c
--- /dev/null
+++ b/editor/file_type_cache.h
@@ -0,0 +1,58 @@
+/*************************************************************************/
+/* file_type_cache.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef FILE_TYPE_CACHE_H
+#define FILE_TYPE_CACHE_H
+
+#include "object.h"
+
+class FileTypeCache : Object {
+
+ GDCLASS(FileTypeCache,Object);
+
+ HashMap<String,String> file_type_map;
+
+
+ static FileTypeCache* singleton;
+public:
+
+ static FileTypeCache* get_singleton() { return singleton; }
+
+ bool has_file(const String& p_path) const;
+ String get_file_type(const String& p_path) const;
+ void set_file_type(const String& p_path,const String& p_type);
+
+ void load();
+ void save();
+
+ FileTypeCache();
+};
+
+
+
+#endif // FILE_TYPE_CACHE_H
diff --git a/editor/fileserver/SCsub b/editor/fileserver/SCsub
new file mode 100644
index 0000000000..f1fa50148f
--- /dev/null
+++ b/editor/fileserver/SCsub
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import('env')
+Export('env')
+env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp
new file mode 100644
index 0000000000..2e5dbf6248
--- /dev/null
+++ b/editor/fileserver/editor_file_server.cpp
@@ -0,0 +1,361 @@
+/*************************************************************************/
+/* editor_file_server.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_file_server.h"
+
+#include "io/marshalls.h"
+#include "io/marshalls.h"
+#include "../editor_settings.h"
+
+//#define DEBUG_PRINT(m_p) print_line(m_p)
+#define DEBUG_TIME(m_what) printf("MS: %s - %lli\n",m_what,OS::get_singleton()->get_ticks_usec());
+
+//#define DEBUG_TIME(m_what)
+
+void EditorFileServer::_close_client(ClientData *cd) {
+
+ cd->connection->disconnect_from_host();
+ cd->efs->wait_mutex->lock();
+ cd->efs->to_wait.insert(cd->thread);
+ cd->efs->wait_mutex->unlock();
+ while(cd->files.size()) {
+ memdelete(cd->files.front()->get());
+ cd->files.erase(cd->files.front());
+ }
+ memdelete(cd);
+
+}
+
+void EditorFileServer::_subthread_start(void*s) {
+
+ ClientData *cd = (ClientData*)s;
+
+
+ cd->connection->set_nodelay(true);
+ uint8_t buf4[8];
+ Error err = cd->connection->get_data(buf4,4);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+
+
+
+ int passlen=decode_uint32(buf4);
+
+ if (passlen>512) {
+
+ _close_client(cd);
+ ERR_FAIL_COND(passlen>512);
+ } else if (passlen>0) {
+
+ Vector<char> passutf8;
+ passutf8.resize(passlen+1);
+ err = cd->connection->get_data((uint8_t*)passutf8.ptr(),passlen);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+ passutf8[passlen]=0;
+ String s;
+ s.parse_utf8(passutf8.ptr());
+ if (s!=cd->efs->password) {
+ encode_uint32(ERR_INVALID_DATA,buf4);
+ cd->connection->put_data(buf4,4);
+ OS::get_singleton()->delay_usec(1000000);
+ _close_client(cd);
+ ERR_PRINT("CLIENT PASSWORD MISMATCH");
+ ERR_FAIL();
+ }
+ } else {
+ if (cd->efs->password!="") {
+ encode_uint32(ERR_INVALID_DATA,buf4);
+ cd->connection->put_data(buf4,4);
+ OS::get_singleton()->delay_usec(1000000);
+ _close_client(cd);
+ ERR_PRINT("CLIENT PASSWORD MISMATCH (should be empty!)");
+ ERR_FAIL();
+ }
+ }
+
+ encode_uint32(OK,buf4);
+ cd->connection->put_data(buf4,4);
+
+ while(!cd->quit) {
+
+ //wait for ID
+ err = cd->connection->get_data(buf4,4);
+ //#define DEBUG_PRINT(m_p) print_line(m_p)
+ DEBUG_TIME("get_data")
+
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+ int id=decode_uint32(buf4);
+
+ //wait for command
+ err = cd->connection->get_data(buf4,4);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+ int cmd=decode_uint32(buf4);
+
+ switch(cmd) {
+
+ case FileAccessNetwork::COMMAND_FILE_EXISTS:
+ case FileAccessNetwork::COMMAND_GET_MODTIME:
+ case FileAccessNetwork::COMMAND_OPEN_FILE: {
+
+ DEBUG_TIME("open_file")
+ err = cd->connection->get_data(buf4,4);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+
+ int namelen=decode_uint32(buf4);
+ Vector<char> fileutf8;
+ fileutf8.resize(namelen+1);
+ err = cd->connection->get_data((uint8_t*)fileutf8.ptr(),namelen);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+ fileutf8[namelen]=0;
+ String s;
+ s.parse_utf8(fileutf8.ptr());
+
+ if (cmd==FileAccessNetwork::COMMAND_FILE_EXISTS) {
+ print_line("FILE EXISTS: "+s);
+ }
+ if (cmd==FileAccessNetwork::COMMAND_GET_MODTIME) {
+ print_line("MOD TIME: "+s);
+ }
+ if (cmd==FileAccessNetwork::COMMAND_OPEN_FILE) {
+ print_line("OPEN: "+s);
+ }
+
+ if ( !s.begins_with("res://")) {
+
+ _close_client(cd);
+ ERR_FAIL_COND(!s.begins_with("res://"));
+ }
+ ERR_CONTINUE(cd->files.has(id));
+
+ if (cmd==FileAccessNetwork::COMMAND_FILE_EXISTS) {
+
+ encode_uint32(id,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccessNetwork::RESPONSE_FILE_EXISTS,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccess::exists(s),buf4);
+ cd->connection->put_data(buf4,4);
+ DEBUG_TIME("open_file_end")
+ break;
+ }
+
+ if (cmd==FileAccessNetwork::COMMAND_GET_MODTIME) {
+
+ encode_uint32(id,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccessNetwork::RESPONSE_GET_MODTIME,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint64(FileAccess::get_modified_time(s),buf4);
+ cd->connection->put_data(buf4,8);
+ DEBUG_TIME("open_file_end")
+ break;
+ }
+
+ FileAccess *fa = FileAccess::open(s,FileAccess::READ);
+ if (!fa) {
+ //not found, continue
+ encode_uint32(id,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccessNetwork::RESPONSE_OPEN,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(ERR_FILE_NOT_FOUND,buf4);
+ cd->connection->put_data(buf4,4);
+ DEBUG_TIME("open_file_end")
+ break;
+
+ }
+
+ encode_uint32(id,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccessNetwork::RESPONSE_OPEN,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(OK,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint64(fa->get_len(),buf4);
+ cd->connection->put_data(buf4,8);
+
+ cd->files[id]=fa;
+ DEBUG_TIME("open_file_end")
+
+ } break;
+ case FileAccessNetwork::COMMAND_READ_BLOCK: {
+
+ err = cd->connection->get_data(buf4,8);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+
+ ERR_CONTINUE(!cd->files.has(id));
+
+ uint64_t offset = decode_uint64(buf4);
+
+ err = cd->connection->get_data(buf4,4);
+ if (err!=OK) {
+ _close_client(cd);
+ ERR_FAIL_COND(err!=OK);
+ }
+
+ int blocklen=decode_uint32(buf4);
+ ERR_CONTINUE(blocklen > (16*1024*1024));
+
+ cd->files[id]->seek(offset);
+ Vector<uint8_t> buf;
+ buf.resize(blocklen);
+ int read = cd->files[id]->get_buffer(buf.ptr(),blocklen);
+ ERR_CONTINUE(read<0);
+
+ print_line("GET BLOCK - offset: "+itos(offset)+", blocklen: "+itos(blocklen));
+
+ //not found, continue
+ encode_uint32(id,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint32(FileAccessNetwork::RESPONSE_DATA,buf4);
+ cd->connection->put_data(buf4,4);
+ encode_uint64(offset,buf4);
+ cd->connection->put_data(buf4,8);
+ encode_uint32(read,buf4);
+ cd->connection->put_data(buf4,4);
+ cd->connection->put_data(buf.ptr(),read);
+
+
+ } break;
+ case FileAccessNetwork::COMMAND_CLOSE: {
+
+ print_line("CLOSED");
+ ERR_CONTINUE(!cd->files.has(id));
+ memdelete(cd->files[id]);
+ cd->files.erase(id);
+ } break;
+ }
+ }
+
+ _close_client(cd);
+
+}
+
+void EditorFileServer::_thread_start(void*s) {
+
+ EditorFileServer *self=(EditorFileServer*)s;
+ while(!self->quit) {
+
+ if (self->cmd==CMD_ACTIVATE) {
+ self->server->listen(self->port);
+ self->active=true;
+ self->cmd=CMD_NONE;
+ } else if (self->cmd==CMD_STOP) {
+ self->server->stop();
+ self->active=false;
+ self->cmd=CMD_NONE;
+ }
+
+ if (self->active) {
+ if (self->server->is_connection_available()) {
+ ClientData *cd = memnew( ClientData);
+ cd->connection=self->server->take_connection();
+ cd->efs=self;
+ cd->quit=false;
+ cd->thread=Thread::create(_subthread_start,cd);
+ }
+ }
+
+ self->wait_mutex->lock();
+ while (self->to_wait.size()) {
+ Thread *w = self->to_wait.front()->get();
+ self->to_wait.erase(w);
+ self->wait_mutex->unlock();
+ Thread::wait_to_finish(w);
+ memdelete(w);
+ self->wait_mutex->lock();
+ }
+ self->wait_mutex->unlock();
+
+ OS::get_singleton()->delay_usec(100000);
+ }
+
+
+}
+
+void EditorFileServer::start() {
+
+
+ stop();
+ port=EDITOR_DEF("filesystem/file_server/port",6010);
+ password=EDITOR_DEF("filesystem/file_server/password","");
+ cmd=CMD_ACTIVATE;
+
+}
+
+bool EditorFileServer::is_active() const {
+
+ return active;
+}
+
+void EditorFileServer::stop(){
+
+ cmd=CMD_STOP;
+}
+
+EditorFileServer::EditorFileServer() {
+
+ server = TCP_Server::create_ref();
+ wait_mutex = Mutex::create();
+ quit=false;
+ active=false;
+ cmd=CMD_NONE;
+ thread=Thread::create(_thread_start,this);
+
+ EDITOR_DEF("filesystem/file_server/port",6010);
+ EDITOR_DEF("filesystem/file_server/password","");
+}
+
+EditorFileServer::~EditorFileServer() {
+
+
+ quit=true;
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ memdelete(wait_mutex);
+}
diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h
new file mode 100644
index 0000000000..31f8ae84b8
--- /dev/null
+++ b/editor/fileserver/editor_file_server.h
@@ -0,0 +1,87 @@
+/*************************************************************************/
+/* editor_file_server.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_FILE_SERVER_H
+#define EDITOR_FILE_SERVER_H
+
+#include "object.h"
+#include "os/thread.h"
+#include "io/tcp_server.h"
+#include "io/packet_peer.h"
+#include "io/file_access_network.h"
+
+class EditorFileServer : public Object {
+
+ GDCLASS(EditorFileServer,Object);
+
+ enum Command {
+ CMD_NONE,
+ CMD_ACTIVATE,
+ CMD_STOP,
+ };
+
+
+ struct ClientData {
+
+ Thread *thread;
+ Ref<StreamPeerTCP> connection;
+ Map<int,FileAccess*> files;
+ EditorFileServer *efs;
+ bool quit;
+
+ };
+
+ Ref<TCP_Server> server;
+ Set<Thread*> to_wait;
+
+ static void _close_client(ClientData *cd);
+ static void _subthread_start(void*s);
+
+ Mutex *wait_mutex;
+ Thread *thread;
+ static void _thread_start(void*);
+ bool quit;
+ Command cmd;
+
+ String password;
+ int port;
+ bool active;
+
+
+public:
+
+ void start();
+ void stop();
+
+ bool is_active() const;
+
+ EditorFileServer();
+ ~EditorFileServer();
+};
+
+#endif // EDITOR_FILE_SERVER_H
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
new file mode 100644
index 0000000000..bce0e9148a
--- /dev/null
+++ b/editor/filesystem_dock.cpp
@@ -0,0 +1,1891 @@
+/*************************************************************************/
+/* filesystem_dock.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "filesystem_dock.h"
+
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "global_config.h"
+#include "io/resource_loader.h"
+#include "os/os.h"
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "scene/main/viewport.h"
+
+bool FileSystemDock::_create_tree(TreeItem *p_parent,EditorFileSystemDirectory *p_dir) {
+
+ TreeItem *item = tree->create_item(p_parent);
+ String dname=p_dir->get_name();
+ if (dname=="")
+ dname="res://";
+ else {
+ // collapse every tree item but the root folder
+ item->set_collapsed(true);
+ }
+
+ item->set_text(0,dname);
+ item->set_icon(0,get_icon("Folder","EditorIcons"));
+ item->set_selectable(0,true);
+ String lpath = p_dir->get_path();
+ if (lpath!="res://" && lpath.ends_with("/")) {
+ lpath=lpath.substr(0,lpath.length()-1);
+ }
+ item->set_metadata(0,lpath);
+ if (lpath==path) {
+ item->select(0);
+ }
+
+ for(int i=0;i<p_dir->get_subdir_count();i++)
+ _create_tree(item,p_dir->get_subdir(i));
+
+ return true;
+}
+
+
+void FileSystemDock::_update_tree() {
+
+ tree->clear();
+ updating_tree=true;
+ TreeItem *root = tree->create_item();
+ TreeItem *favorites = tree->create_item(root);
+ favorites->set_icon(0, get_icon("Favorites","EditorIcons") );
+ favorites->set_text(0,TTR("Favorites:"));
+ favorites->set_selectable(0,false);
+ Vector<String> faves = EditorSettings::get_singleton()->get_favorite_dirs();
+ for(int i=0;i<faves.size();i++) {
+ if (!faves[i].begins_with("res://"))
+ continue;
+
+ TreeItem *ti = tree->create_item(favorites);
+ String fv = faves[i];
+ if (fv=="res://")
+ ti->set_text(0,"/");
+ else
+ ti->set_text(0,faves[i].get_file());
+ ti->set_icon(0,get_icon("Folder","EditorIcons"));
+ ti->set_selectable(0,true);
+ ti->set_metadata(0,faves[i]);
+ }
+
+ _create_tree(root,EditorFileSystem::get_singleton()->get_filesystem());
+ updating_tree=false;
+
+}
+
+
+void FileSystemDock::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_RESIZED: {
+
+
+ bool new_mode = get_size().height < get_viewport_rect().size.height*3/4;
+
+ if (new_mode != split_mode ) {
+
+ split_mode=new_mode;
+
+ //print_line("SPLIT MODE? "+itos(split_mode));
+ if (split_mode) {
+
+ file_list_vb->hide();
+ tree->set_custom_minimum_size(Size2(0,0));
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ button_back->show();
+ } else {
+
+ tree->show();
+ file_list_vb->show();
+ tree->set_custom_minimum_size(Size2(0,200)*EDSCALE);
+ tree->set_v_size_flags(SIZE_FILL);
+ button_back->hide();
+ if (!EditorFileSystem::get_singleton()->is_scanning()) {
+ _fs_changed();
+ }
+ }
+ }
+
+
+ } break;
+ case NOTIFICATION_ENTER_TREE: {
+
+ if (initialized)
+ return;
+ initialized=true;
+
+ EditorFileSystem::get_singleton()->connect("filesystem_changed",this,"_fs_changed");
+ EditorResourcePreview::get_singleton()->connect("preview_invalidated",this,"_preview_invalidated");
+
+ button_reload->set_icon( get_icon("Reload","EditorIcons"));
+ button_favorite->set_icon( get_icon("Favorites","EditorIcons"));
+ //button_instance->set_icon( get_icon("Add","EditorIcons"));
+ //button_open->set_icon( get_icon("Folder","EditorIcons"));
+ button_back->set_icon( get_icon("Filesystem","EditorIcons"));
+ if (display_mode == DISPLAY_THUMBNAILS) {
+ button_display_mode->set_icon(get_icon("FileList","EditorIcons"));
+ } else {
+ button_display_mode->set_icon(get_icon("FileThumbnail","EditorIcons"));
+ }
+ button_display_mode->connect("pressed",this,"_change_file_display");
+ //file_options->set_icon( get_icon("Tools","EditorIcons"));
+ files->connect("item_activated",this,"_select_file");
+ button_hist_next->connect("pressed",this,"_fw_history");
+ button_hist_prev->connect("pressed",this,"_bw_history");
+ search_icon->set_texture( get_icon("Zoom","EditorIcons"));
+
+ button_hist_next->set_icon( get_icon("Forward","EditorIcons"));
+ button_hist_prev->set_icon( get_icon("Back","EditorIcons"));
+ file_options->connect("id_pressed",this,"_file_option");
+ folder_options->connect("id_pressed",this,"_folder_option");
+
+
+ button_back->connect("pressed",this,"_go_to_tree",varray(),CONNECT_DEFERRED);
+ current_path->connect("text_entered",this,"_go_to_dir");
+ _update_tree(); //maybe it finished already
+
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ _set_scanning_mode();
+ }
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ scanning_progress->set_value(EditorFileSystem::get_singleton()->get_scanning_progress()*100);
+ }
+ } break;
+ case NOTIFICATION_EXIT_TREE: {
+
+ } break;
+ case NOTIFICATION_DRAG_BEGIN: {
+
+ Dictionary dd = get_viewport()->gui_get_drag_data();
+ if (tree->is_visible_in_tree() && dd.has("type") ) {
+ if ( (String(dd["type"])=="files") || (String(dd["type"])=="files_and_dirs") || (String(dd["type"])=="resource")) {
+ tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
+ }
+ if ( (String(dd["type"])=="favorite") ) {
+ tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+ }
+ }
+
+
+ } break;
+ case NOTIFICATION_DRAG_END: {
+
+ tree->set_drop_mode_flags(0);
+
+ } break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+
+ int new_mode = int(EditorSettings::get_singleton()->get("docks/filesystem/display_mode"));
+
+ if (new_mode != display_mode) {
+ set_display_mode(new_mode);
+ } else {
+ _update_files(true);
+ }
+ } break;
+ }
+
+}
+
+
+
+
+void FileSystemDock::_dir_selected() {
+
+ TreeItem *ti = tree->get_selected();
+ if (!ti)
+ return;
+ String dir = ti->get_metadata(0);
+ bool found=false;
+ Vector<String> favorites = EditorSettings::get_singleton()->get_favorite_dirs();
+ for(int i=0;i<favorites.size();i++) {
+
+ if (favorites[i]==dir) {
+ found=true;
+ break;
+ }
+ }
+
+
+ button_favorite->set_pressed(found);
+
+ if (!split_mode) {
+ _open_pressed(); //go directly to dir
+ }
+
+}
+
+
+void FileSystemDock::_favorites_pressed() {
+
+ TreeItem *sel = tree->get_selected();
+ if (!sel)
+ return ;
+ String dir = sel->get_metadata(0);
+
+ int idx = -1;
+ Vector<String> favorites = EditorSettings::get_singleton()->get_favorite_dirs();
+ for(int i=0;i<favorites.size();i++) {
+
+ if (favorites[i]==dir) {
+ idx=i;
+ break;
+ }
+ }
+
+ if (button_favorite->is_pressed() && idx==-1) {
+ favorites.push_back(dir);
+ EditorSettings::get_singleton()->set_favorite_dirs(favorites);
+ _update_tree();
+ } else if (!button_favorite->is_pressed() && idx!=-1) {
+ favorites.remove(idx);
+ EditorSettings::get_singleton()->set_favorite_dirs(favorites);
+ _update_tree();
+ }
+
+}
+
+String FileSystemDock::get_selected_path() const {
+
+ TreeItem *sel = tree->get_selected();
+ if (!sel)
+ return "";
+ String path = sel->get_metadata(0);
+ return "res://"+path;
+}
+
+String FileSystemDock::get_current_path() const {
+
+ return path;
+}
+
+void FileSystemDock::navigate_to_path(const String& p_path) {
+ // If the path is a file, do not only go to the directory in the tree, also select the file in the file list.
+ String dir_path="";
+ String file_name="";
+ DirAccess* dirAccess=DirAccess::open("res://");
+ if (dirAccess->file_exists(p_path)) {
+ dir_path=p_path.get_base_dir();
+ file_name=p_path.get_file();
+ } else if (dirAccess->dir_exists(p_path)) {
+ dir_path=p_path;
+ } else {
+ ERR_EXPLAIN(TTR("Cannot navigate to '" + p_path + "' as it has not been found in the file system!"));
+ ERR_FAIL();
+ }
+
+ path=dir_path;
+ _update_tree();
+ tree->ensure_cursor_is_visible();
+
+ if (!file_name.empty()) {
+ _open_pressed(); // Seems to be the only way to get into the file view. This also pushes to history.
+
+ // Focus the given file.
+ for (int i=0; i<files->get_item_count(); i++) {
+ if (files->get_item_text(i) == file_name) {
+ files->select(i,true);
+ files->ensure_current_is_visible();
+ break;
+ }
+ }
+ }
+}
+
+void FileSystemDock::_thumbnail_done(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata) {
+
+ bool valid=false;
+
+ if (search_box->is_visible()) {
+ valid=true;
+ } else {
+ valid=(path==p_path.get_base_dir());
+ }
+
+ if (p_preview.is_valid() && valid) {
+
+ Array uarr=p_udata;
+ int idx=uarr[0];
+ String file=uarr[1];
+ if (idx>=files->get_item_count())
+ return;
+ if (files->get_item_text(idx)!=file)
+ return;
+ String fpath = files->get_item_metadata(idx);
+ if (fpath!=p_path)
+ return;
+ files->set_item_icon(idx,p_preview);
+
+ }
+
+}
+
+void FileSystemDock::_change_file_display() {
+
+ if (button_display_mode->is_pressed()) {
+ display_mode = DISPLAY_LIST;
+ button_display_mode->set_icon( get_icon("FileThumbnail","EditorIcons"));
+ } else {
+ display_mode = DISPLAY_THUMBNAILS;
+ button_display_mode->set_icon( get_icon("FileList","EditorIcons"));
+ }
+
+ EditorSettings::get_singleton()->set("docks/filesystem/display_mode", display_mode);
+
+ _update_files(true);
+}
+
+void FileSystemDock::_search(EditorFileSystemDirectory *p_path,List<FileInfo>* matches,int p_max_items) {
+
+ if (matches->size()>p_max_items)
+ return;
+
+ for(int i=0;i<p_path->get_subdir_count();i++) {
+ _search(p_path->get_subdir(i),matches,p_max_items);
+
+ }
+
+ String match = search_box->get_text();
+
+ for(int i=0;i<p_path->get_file_count();i++) {
+ String file = p_path->get_file(i);
+
+ if (file.find(match)!=-1) {
+
+ FileInfo fi;
+ fi.name=file;
+ fi.type=p_path->get_file_type(i);
+ fi.path=p_path->get_file_path(i);
+ fi.import_status=0;
+
+
+ matches->push_back(fi);
+ if (matches->size()>p_max_items)
+ return;
+ }
+ }
+}
+
+void FileSystemDock::_update_files(bool p_keep_selection) {
+
+ Set<String> cselection;
+
+ if (p_keep_selection) {
+
+ for(int i=0;i<files->get_item_count();i++) {
+
+ if (files->is_selected(i))
+ cselection.insert(files->get_item_text(i));
+ }
+ }
+
+ files->clear();
+
+ current_path->set_text(path);
+
+
+ EditorFileSystemDirectory *efd = EditorFileSystem::get_singleton()->get_filesystem_path(path);
+ if (!efd)
+ return;
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("docks/filesystem/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ Ref<Texture> folder_thumbnail;
+ Ref<Texture> file_thumbnail;
+
+ bool use_thumbnails = (display_mode == DISPLAY_THUMBNAILS);
+ bool use_folders = search_box->get_text().length()==0 && split_mode;
+
+ if (use_thumbnails) { //thumbnails
+
+ files->set_max_columns(0);
+ files->set_icon_mode(ItemList::ICON_MODE_TOP);
+ files->set_fixed_column_width(thumbnail_size*3/2);
+ files->set_max_text_lines(2);
+ files->set_fixed_icon_size(Size2(thumbnail_size,thumbnail_size));
+
+ if (!has_icon("ResizedFolder","EditorIcons")) {
+ Ref<ImageTexture> folder = get_icon("FolderBig","EditorIcons");
+ Image img = folder->get_data();
+ img.resize(thumbnail_size,thumbnail_size);
+ Ref<ImageTexture> resized_folder = Ref<ImageTexture>( memnew( ImageTexture));
+ resized_folder->create_from_image(img,0);
+ Theme::get_default()->set_icon("ResizedFolder","EditorIcons",resized_folder);
+ }
+
+ folder_thumbnail = get_icon("ResizedFolder","EditorIcons");
+
+ if (!has_icon("ResizedFile","EditorIcons")) {
+ Ref<ImageTexture> file = get_icon("FileBig","EditorIcons");
+ Image img = file->get_data();
+ img.resize(thumbnail_size,thumbnail_size);
+ Ref<ImageTexture> resized_file = Ref<ImageTexture>( memnew( ImageTexture));
+ resized_file->create_from_image(img,0);
+ Theme::get_default()->set_icon("ResizedFile","EditorIcons",resized_file);
+ }
+
+ file_thumbnail = get_icon("ResizedFile","EditorIcons");
+
+ } else {
+
+ files->set_icon_mode(ItemList::ICON_MODE_LEFT);
+ files->set_max_columns(1);
+ files->set_max_text_lines(1);
+ files->set_fixed_column_width(0);
+ files->set_fixed_icon_size(Size2());
+
+ }
+
+ if (use_folders) {
+
+ if (path!="res://") {
+
+ if (use_thumbnails) {
+ files->add_item("..",folder_thumbnail,true);
+ } else {
+ files->add_item("..",get_icon("folder","FileDialog"),true);
+ }
+
+ String bd = path.get_base_dir();
+ if (bd!="res://" && !bd.ends_with("/"))
+ bd+="/";
+
+ files->set_item_metadata(files->get_item_count()-1,bd);
+ }
+
+ for(int i=0;i<efd->get_subdir_count();i++) {
+
+ String dname=efd->get_subdir(i)->get_name();
+
+
+ if (use_thumbnails) {
+ files->add_item(dname,folder_thumbnail,true);
+ } else {
+ files->add_item(dname,get_icon("folder","FileDialog"),true);
+ }
+
+ files->set_item_metadata(files->get_item_count()-1,path.plus_file(dname)+"/");
+
+ if (cselection.has(dname))
+ files->select(files->get_item_count()-1,false);
+ }
+ }
+
+
+ List<FileInfo> filelist;
+
+ if (search_box->get_text().length()) {
+
+ if (search_box->get_text().length()>1) {
+ _search(EditorFileSystem::get_singleton()->get_filesystem(),&filelist,128);
+ }
+
+ filelist.sort();
+ } else {
+
+ for(int i=0;i<efd->get_file_count();i++) {
+
+ FileInfo fi;
+ fi.name=efd->get_file(i);
+ fi.path=path.plus_file(fi.name);
+ fi.type=efd->get_file_type(i);
+ fi.import_status=0;
+
+
+
+ filelist.push_back(fi);
+ }
+ }
+
+ StringName ei="EditorIcons"; //make it faster..
+ StringName oi="Object";
+
+
+ for(List<FileInfo>::Element *E=filelist.front();E;E=E->next()) {
+ String fname=E->get().name;
+ String fp = E->get().path;
+ StringName type = E->get().type;
+
+ Ref<Texture> type_icon;
+
+ String tooltip=fname;
+
+ if (E->get().import_status==0) {
+
+ if (has_icon(type,ei)) {
+ type_icon=get_icon(type,ei);
+ } else {
+ type_icon=get_icon(oi,ei);
+ }
+ } else if (E->get().import_status==1) {
+ type_icon=get_icon("DependencyOk","EditorIcons");
+ } else if (E->get().import_status==2) {
+ type_icon=get_icon("DependencyChanged","EditorIcons");
+ tooltip+"\nStatus: Needs Re-Import";
+ } else if (E->get().import_status==3) {
+ type_icon=get_icon("ImportFail","EditorIcons");
+ tooltip+"\nStatus: Missing Dependencies";
+ }
+
+ if (E->get().sources.size()) {
+ for(int i=0;i<E->get().sources.size();i++) {
+ tooltip+="\nSource: "+E->get().sources[i];
+ }
+ }
+
+
+
+ if (use_thumbnails) {
+ files->add_item(fname,file_thumbnail,true);
+ files->set_item_metadata(files->get_item_count()-1,fp);
+ files->set_item_tag_icon(files->get_item_count()-1,type_icon);
+ Array udata;
+ udata.resize(2);
+ udata[0]=files->get_item_count()-1;
+ udata[1]=fname;
+ EditorResourcePreview::get_singleton()->queue_resource_preview(fp,this,"_thumbnail_done",udata);
+ } else {
+ files->add_item(fname,type_icon,true);
+ files->set_item_metadata(files->get_item_count()-1,fp);
+
+ }
+
+ if (cselection.has(fname))
+ files->select(files->get_item_count()-1,false);
+
+ files->set_item_tooltip(files->get_item_count()-1,tooltip);
+
+
+ }
+
+
+}
+
+void FileSystemDock::_select_file(int p_idx) {
+
+ files->select(p_idx,true);
+ _file_option(FILE_OPEN);
+}
+
+void FileSystemDock::_go_to_tree() {
+
+ tree->show();
+ file_list_vb->hide();
+ _update_tree();
+ tree->grab_focus();
+ tree->ensure_cursor_is_visible();
+ button_favorite->show();
+ //button_open->hide();
+ //file_options->hide();
+}
+
+void FileSystemDock::_go_to_dir(const String& p_dir){
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ if (da->change_dir(p_dir)==OK) {
+ path=da->get_current_dir();
+ _update_files(false);
+ }
+ current_path->set_text(path);
+ memdelete(da);
+
+
+}
+
+void FileSystemDock::_preview_invalidated(const String& p_path) {
+
+ if (p_path.get_base_dir()==path && search_box->get_text()==String() && file_list_vb->is_visible_in_tree()) {
+
+
+ for(int i=0;i<files->get_item_count();i++) {
+
+ if (files->get_item_metadata(i)==p_path) {
+ //re-request preview
+ Array udata;
+ udata.resize(2);
+ udata[0]=i;
+ udata[1]=files->get_item_text(i);
+ EditorResourcePreview::get_singleton()->queue_resource_preview(p_path,this,"_thumbnail_done",udata);
+ break;
+ }
+ }
+ }
+}
+
+void FileSystemDock::_fs_changed() {
+
+ button_hist_prev->set_disabled(history_pos==0);
+ button_hist_next->set_disabled(history_pos+1==history.size());
+ scanning_vb->hide();
+ split_box->show();
+
+ if (tree->is_visible()) {
+ button_favorite->show();
+ _update_tree();
+
+ }
+
+ if (file_list_vb->is_visible()) {
+
+ _update_files(true);
+ }
+
+ set_process(false);
+}
+
+void FileSystemDock::_set_scanning_mode() {
+
+ split_box->hide();
+ button_hist_prev->set_disabled(true);
+ button_hist_next->set_disabled(true);
+ scanning_vb->show();
+ set_process(true);
+ if (EditorFileSystem::get_singleton()->is_scanning()) {
+ scanning_progress->set_value(EditorFileSystem::get_singleton()->get_scanning_progress()*100);
+ } else {
+ scanning_progress->set_value(0);
+ }
+
+}
+
+void FileSystemDock::_fw_history() {
+
+ if (history_pos<history.size()-1)
+ history_pos++;
+
+ path=history[history_pos];
+
+ if (tree->is_visible()) {
+ _update_tree();
+ tree->grab_focus();
+ tree->ensure_cursor_is_visible();
+
+ }
+
+ if (file_list_vb->is_visible()) {
+ _update_files(false);
+ current_path->set_text(path);
+ }
+
+ button_hist_prev->set_disabled(history_pos==0);
+ button_hist_next->set_disabled(history_pos+1==history.size());
+
+}
+
+void FileSystemDock::_bw_history() {
+
+ if (history_pos>0)
+ history_pos--;
+
+ path=history[history_pos];
+
+
+ if (tree->is_visible()) {
+ _update_tree();
+ tree->grab_focus();
+ tree->ensure_cursor_is_visible();
+ }
+
+ if (file_list_vb->is_visible()) {
+ _update_files(false);
+ current_path->set_text(path);
+ }
+
+ button_hist_prev->set_disabled(history_pos==0);
+ button_hist_next->set_disabled(history_pos+1==history.size());
+
+}
+
+void FileSystemDock::_push_to_history() {
+
+ history.resize(history_pos+1);
+ if (history[history_pos]!=path) {
+ history.push_back(path);
+ history_pos++;
+ }
+
+ button_hist_prev->set_disabled(history_pos==0);
+ button_hist_next->set_disabled(history_pos+1==history.size());
+
+}
+
+
+void FileSystemDock::_find_inside_move_files(EditorFileSystemDirectory *efsd,Vector<String>& files) {
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+ _find_inside_move_files(efsd->get_subdir(i),files);
+ }
+ for(int i=0;i<efsd->get_file_count();i++) {
+ files.push_back(efsd->get_file_path(i));
+ }
+
+}
+
+void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd,Map<String,String> &renames,List<String>& to_remaps) {
+
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+ _find_remaps(efsd->get_subdir(i),renames,to_remaps);
+ }
+ for(int i=0;i<efsd->get_file_count();i++) {
+ Vector<String> deps=efsd->get_file_deps(i);
+ for(int j=0;j<deps.size();j++) {
+ if (renames.has(deps[j])) {
+ to_remaps.push_back(efsd->get_file_path(i));
+ break;
+ }
+ }
+ }
+}
+
+
+void FileSystemDock::_rename_operation(const String& p_to_path) {
+
+ if (move_files[0]==p_to_path) {
+ EditorNode::get_singleton()->show_warning(TTR("Same source and destination files, doing nothing."));
+ return;
+ }
+ if (FileAccess::exists(p_to_path)) {
+ EditorNode::get_singleton()->show_warning("Target file exists, can't overwrite. Delete first.");
+ return;
+ }
+
+ Map<String,String> renames;
+ renames[move_files[0]]=p_to_path;
+
+ List<String> remap;
+
+ _find_remaps(EditorFileSystem::get_singleton()->get_filesystem(),renames,remap);
+ print_line("found files to remap: "+itos(remap.size()));
+
+ //perform remaps
+ for(List<String>::Element *E=remap.front();E;E=E->next()) {
+
+ Error err = ResourceLoader::rename_dependencies(E->get(),renames);
+ print_line("remapping: "+E->get());
+
+ if (err!=OK) {
+ EditorNode::get_singleton()->add_io_error("Can't rename deps for:\n"+E->get()+"\n");
+ }
+ }
+
+ //finally, perform moves
+
+ DirAccess *da=DirAccess::create(DirAccess::ACCESS_RESOURCES);
+
+ Error err = da->rename(move_files[0],p_to_path);
+ print_line("moving file "+move_files[0]+" to "+p_to_path);
+ if (err!=OK) {
+ EditorNode::get_singleton()->add_io_error("Error moving file:\n"+move_files[0]+"\n");
+ }
+
+ //rescan everything
+ memdelete(da);
+ print_line("call rescan!");
+ _rescan();
+}
+
+
+void FileSystemDock::_move_operation(const String& p_to_path) {
+
+ if (p_to_path==path) {
+ EditorNode::get_singleton()->show_warning(TTR("Same source and destination paths, doing nothing."));
+ return;
+ }
+
+ //find files inside dirs to be moved
+
+ Vector<String> inside_files;
+
+ for(int i=0;i<move_dirs.size();i++) {
+ if (p_to_path.begins_with(move_dirs[i])) {
+ EditorNode::get_singleton()->show_warning(TTR("Can't move directories to within themselves."));
+ return;
+ }
+
+ EditorFileSystemDirectory *efsd=EditorFileSystem::get_singleton()->get_filesystem_path(move_dirs[i]);
+ if (!efsd)
+ continue;
+ _find_inside_move_files(efsd,inside_files);
+ }
+
+ //make list of remaps
+ Map<String,String> renames;
+ String repfrom=path=="res://"?path:String(path+"/");
+ String repto=p_to_path=="res://"?p_to_path:String(p_to_path+"/");
+
+ for(int i=0;i<move_files.size();i++) {
+ renames[move_files[i]]=move_files[i].replace_first(repfrom,repto);
+ print_line("move file "+move_files[i]+" -> "+renames[move_files[i]]);
+ }
+ for(int i=0;i<inside_files.size();i++) {
+ renames[inside_files[i]]=inside_files[i].replace_first(repfrom,repto);
+ print_line("inside file "+inside_files[i]+" -> "+renames[inside_files[i]]);
+ }
+
+ //make list of files that will be run the remapping
+ List<String> remap;
+
+ _find_remaps(EditorFileSystem::get_singleton()->get_filesystem(),renames,remap);
+ print_line("found files to remap: "+itos(remap.size()));
+
+ //perform remaps
+ for(List<String>::Element *E=remap.front();E;E=E->next()) {
+
+ Error err = ResourceLoader::rename_dependencies(E->get(),renames);
+ print_line("remapping: "+E->get());
+
+ if (err!=OK) {
+ EditorNode::get_singleton()->add_io_error("Can't rename deps for:\n"+E->get()+"\n");
+ }
+ }
+
+ //finally, perform moves
+
+ DirAccess *da=DirAccess::create(DirAccess::ACCESS_RESOURCES);
+
+ for(int i=0;i<move_files.size();i++) {
+
+ String to = move_files[i].replace_first(repfrom,repto);
+ Error err = da->rename(move_files[i],to);
+ print_line("moving file "+move_files[i]+" to "+to);
+ if (err!=OK) {
+ EditorNode::get_singleton()->add_io_error("Error moving file:\n"+move_files[i]+"\n");
+ }
+ }
+
+ for(int i=0;i<move_dirs.size();i++) {
+
+ String mdir = move_dirs[i];
+ if (mdir=="res://")
+ continue;
+
+ if (mdir.ends_with("/")) {
+ mdir=mdir.substr(0,mdir.length()-1);
+ }
+
+ String to = p_to_path.plus_file(mdir.get_file());
+ Error err = da->rename(mdir,to);
+ print_line("moving dir "+mdir+" to "+to);
+ if (err!=OK) {
+ EditorNode::get_singleton()->add_io_error("Error moving dir:\n"+move_dirs[i]+"\n");
+ }
+ }
+
+ memdelete(da);
+ //rescan everything
+ print_line("call rescan!");
+ _rescan();
+
+}
+
+void FileSystemDock::_file_option(int p_option) {
+
+ switch(p_option) {
+
+
+ case FILE_SHOW_IN_EXPLORER:
+ case FILE_OPEN: {
+ int idx=-1;
+ for(int i=0;i<files->get_item_count();i++) {
+ if (files->is_selected(i)) {
+ idx=i;
+ break;
+ }
+ }
+
+ if (idx<0)
+ return;
+
+
+
+ String path = files->get_item_metadata(idx);
+ if (p_option == FILE_SHOW_IN_EXPLORER) {
+ String dir = GlobalConfig::get_singleton()->globalize_path(path);
+ dir = dir.substr(0, dir.find_last("/"));
+ OS::get_singleton()->shell_open(String("file://")+dir);
+ return;
+ }
+
+ if (path.ends_with("/")) {
+ if (path!="res://") {
+ path=path.substr(0,path.length()-1);
+ }
+ this->path=path;
+ _update_files(false);
+ current_path->set_text(path);
+ _push_to_history();
+ } else {
+
+ if (ResourceLoader::get_resource_type(path)=="PackedScene") {
+
+ editor->open_request(path);
+ } else {
+
+ editor->load_resource(path);
+ }
+ }
+ } break;
+ case FILE_INSTANCE: {
+
+ Vector<String> paths;
+
+ for (int i = 0; i<files->get_item_count(); i++) {
+ if (!files->is_selected(i))
+ continue;
+ String path =files->get_item_metadata(i);
+ if (EditorFileSystem::get_singleton()->get_file_type(path)=="PackedScene") {
+ paths.push_back(path);
+ }
+ }
+
+ if (!paths.empty()) {
+ emit_signal("instance", paths);
+ }
+ } break;
+ case FILE_DEPENDENCIES: {
+
+ int idx = files->get_current();
+ if (idx<0 || idx>=files->get_item_count())
+ break;
+ String path = files->get_item_metadata(idx);
+ deps_editor->edit(path);
+ } break;
+ case FILE_OWNERS: {
+
+ int idx = files->get_current();
+ if (idx<0 || idx>=files->get_item_count())
+ break;
+ String path = files->get_item_metadata(idx);
+ owners_editor->show(path);
+ } break;
+ case FILE_MOVE: {
+
+ move_dirs.clear();
+ move_files.clear();
+
+ for(int i=0;i<files->get_item_count();i++) {
+
+ String path = files->get_item_metadata(i);
+ if (!files->is_selected(i))
+ continue;
+
+ if (files->get_item_text(i)=="..") {
+ EditorNode::get_singleton()->show_warning(TTR("Can't operate on '..'"));
+ return;
+ }
+
+ if (path.ends_with("/")) {
+ move_dirs.push_back(path.substr(0,path.length()-1));
+ } else {
+ move_files.push_back(path);
+ }
+ }
+
+
+ if (move_dirs.empty() && move_files.size()==1) {
+
+ rename_dialog->clear_filters();
+ rename_dialog->add_filter("*."+move_files[0].get_extension());
+ rename_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ rename_dialog->set_current_path(move_files[0]);
+ rename_dialog->popup_centered_ratio();
+ rename_dialog->set_title(TTR("Pick New Name and Location For:")+" "+move_files[0].get_file());
+
+
+ } else {
+ //just move
+ move_dialog->popup_centered_ratio();
+ }
+
+
+ } break;
+ case FILE_REMOVE: {
+
+ Vector<String> torem;
+
+ for(int i=0;i<files->get_item_count();i++) {
+
+ String path = files->get_item_metadata(i);
+ if (path.ends_with("/") || !files->is_selected(i))
+ continue;
+ torem.push_back(path);
+
+ }
+
+ if (torem.empty()) {
+ EditorNode::get_singleton()->show_warning(TTR("No files selected!"));
+ break;
+ }
+
+ remove_dialog->show(torem);
+ //1) find if used
+ //2) warn
+
+ } break;
+ case FILE_INFO: {
+
+ } break;
+ case FILE_REIMPORT: {
+
+
+ Vector<String> reimport;
+ for(int i=0;i<files->get_item_count();i++) {
+
+ if (!files->is_selected(i))
+ continue;
+
+ String path = files->get_item_metadata(i);
+ reimport.push_back(path);
+ }
+
+ ERR_FAIL_COND(reimport.size()==0);
+/*
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(reimport[0]);
+ ERR_FAIL_COND(!rimd.is_valid());
+ String editor=rimd->get_editor();
+
+ if (editor.begins_with("texture_")) { //compatibility fix for old texture format
+ editor="texture";
+ }
+
+ Ref<EditorImportPlugin> rimp = EditorImportExport::get_singleton()->get_import_plugin_by_name(editor);
+ ERR_FAIL_COND(!rimp.is_valid());
+
+ if (reimport.size()==1) {
+ rimp->import_dialog(reimport[0]);
+ } else {
+ rimp->reimport_multiple_files(reimport);
+
+ }
+ */
+
+ } break;
+ case FILE_COPY_PATH:
+
+ int idx = files->get_current();
+ if (idx<0 || idx>=files->get_item_count())
+ break;
+ String path = files->get_item_metadata(idx);
+ OS::get_singleton()->set_clipboard(path);
+ }
+}
+
+void FileSystemDock::_folder_option(int p_option) {
+
+ TreeItem *item = tree->get_selected();
+ TreeItem *child = item->get_children();
+
+ switch(p_option) {
+
+ case FOLDER_EXPAND_ALL:
+ item->set_collapsed(false);
+ while(child) {
+ child->set_collapsed(false);
+ child = child->get_next();
+ }
+ break;
+
+ case FOLDER_COLLAPSE_ALL:
+ while(child) {
+ child->set_collapsed(true);
+ child = child->get_next();
+ }
+ break;
+ }
+}
+
+void FileSystemDock::_open_pressed(){
+
+
+ TreeItem *sel = tree->get_selected();
+ if (!sel) {
+ return;
+ }
+ path = sel->get_metadata(0);
+ /*if (path!="res://" && path.ends_with("/")) {
+ path=path.substr(0,path.length()-1);
+ }*/
+
+ //tree_mode=false;
+
+ if (split_mode) {
+ tree->hide();
+ file_list_vb->show();
+ button_favorite->hide();
+ }
+
+ //file_options->show();
+
+ _update_files(false);
+ current_path->set_text(path);
+ _push_to_history();
+
+ //emit_signal("open",path);
+
+}
+
+void FileSystemDock::_dir_rmb_pressed(const Vector2& p_pos) {
+ folder_options->clear();
+ folder_options->set_size(Size2(1,1));
+
+ folder_options->add_item(TTR("Expand all"),FOLDER_EXPAND_ALL);
+ folder_options->add_item(TTR("Collapse all"),FOLDER_COLLAPSE_ALL);
+
+ folder_options->set_pos(files->get_global_pos() + p_pos);
+ folder_options->popup();
+}
+
+
+void FileSystemDock::_search_changed(const String& p_text) {
+
+ if (!search_box->is_visible_in_tree())
+ return; //wtf
+
+ _update_files(false);
+}
+
+void FileSystemDock::_rescan() {
+
+ _set_scanning_mode();
+ EditorFileSystem::get_singleton()->scan();
+
+}
+
+void FileSystemDock::fix_dependencies(const String& p_for_file) {
+ deps_editor->edit(p_for_file);
+}
+
+
+void FileSystemDock::focus_on_filter() {
+
+ if (!search_box->is_visible_in_tree()) {
+ // Tree mode, switch to files list with search box
+ tree->hide();
+ file_list_vb->show();
+ button_favorite->hide();
+ }
+
+ search_box->grab_focus();
+}
+
+void FileSystemDock::set_display_mode(int p_mode) {
+
+ if (p_mode == display_mode)
+ return;
+
+ button_display_mode->set_pressed(p_mode == DISPLAY_LIST);
+ _change_file_display();
+}
+
+
+Variant FileSystemDock::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ if (p_from==tree) {
+
+ TreeItem *selected = tree->get_selected();
+ if (!selected)
+ return Variant();
+
+ String path = selected->get_metadata(0);
+ if (path==String())
+ return Variant();
+ if (!path.ends_with("/"))
+ path=path+"/";
+ Vector<String> paths;
+ paths.push_back(path);
+ Dictionary d = EditorNode::get_singleton()->drag_files(paths,p_from);
+
+ if (selected->get_parent() && tree->get_root()->get_children()==selected->get_parent()) {
+ //a favorite.. treat as such
+ d["type"]="favorite";
+ }
+
+ return d;
+
+ }
+
+ if (p_from==files) {
+
+ List<int> seldirs;
+ List<int> selfiles;
+
+ for (int i = 0; i<files->get_item_count(); i++) {
+ if (files->is_selected(i)) {
+ String path = files->get_item_metadata(i);
+ if (path.ends_with("/"))
+ seldirs.push_back(i);
+ else
+ selfiles.push_back(i);
+ }
+ }
+
+ if (seldirs.empty() && selfiles.empty())
+ return Variant();
+ /*
+ if (seldirs.size() && selfiles.size())
+ return Variant(); //can't really mix files and dirs (i think?) - yes you can, commenting
+ */
+
+ /*if (selfiles.size()==1) {
+ Ref<Resource> resource = ResourceLoader::load(files->get_item_metadata(selfiles.front()->get()));
+ if (resource.is_valid()) {
+ return EditorNode::get_singleton()->drag_resource(resource,p_from);
+ }
+ }*/
+
+ if (selfiles.size()>0 && seldirs.size()==0) {
+ Vector<String> fnames;
+ for(List<int>::Element *E=selfiles.front();E;E=E->next()) {
+ fnames.push_back(files->get_item_metadata(E->get()));
+ }
+ return EditorNode::get_singleton()->drag_files(fnames,p_from);
+ }
+
+ if (selfiles.size()>0 || seldirs.size()>0) {
+ Vector<String> fnames;
+ for(List<int>::Element *E=selfiles.front();E;E=E->next()) {
+ fnames.push_back(files->get_item_metadata(E->get()));
+ }
+ for(List<int>::Element *E=seldirs.front();E;E=E->next()) {
+ fnames.push_back(files->get_item_metadata(E->get()));
+ }
+ return EditorNode::get_singleton()->drag_files_and_dirs(fnames,p_from);
+ }
+
+ }
+
+ return Variant();
+}
+
+bool FileSystemDock::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ Dictionary drag_data = p_data;
+
+ if (drag_data.has("type") && String(drag_data["type"])=="favorite") {
+
+ //moving favorite around
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+ if (!ti)
+ return false;
+
+ int what = tree->get_drop_section_at_pos(p_point);
+
+ if (ti==tree->get_root()->get_children()) {
+ return (what==1); //the parent, first fav
+ }
+ if (ti->get_parent() && tree->get_root()->get_children()==ti->get_parent()) {
+ return true; // a favorite
+ }
+
+ if (ti==tree->get_root()->get_children()->get_next()) {
+ return (what==-1); //the tree, last fav
+ }
+
+ return false;
+
+ }
+
+
+ if (drag_data.has("type") && String(drag_data["type"])=="resource") {
+ return true;
+ }
+
+ if (drag_data.has("type") && ( String(drag_data["type"])=="files" || String(drag_data["type"])=="files_and_dirs")) {
+
+ Vector<String> fnames = drag_data["files"];
+
+ if (p_from==files) {
+
+ int at_pos = files->get_item_at_pos(p_point);
+ if (at_pos!=-1) {
+
+ String dir = files->get_item_metadata(at_pos);
+ if (dir.ends_with("/"))
+ return true;
+ }
+ }
+
+ if (p_from==tree) {
+
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+ if (!ti)
+ return false;
+ String path = ti->get_metadata(0);
+
+ if (path==String())
+ return false;
+
+ return true;
+ }
+
+ }
+
+ return false;
+}
+
+void FileSystemDock::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ if (!can_drop_data_fw(p_point,p_data,p_from))
+ return;
+ Dictionary drag_data = p_data;
+
+ if (drag_data.has("type") && String(drag_data["type"])=="favorite") {
+
+ //moving favorite around
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+ if (!ti)
+ return;
+
+ Vector<String> files = drag_data["files"];
+
+ ERR_FAIL_COND(files.size()!=1);
+
+ String swap = files[0];
+ if (swap!="res://" && swap.ends_with("/")) {
+ swap=swap.substr(0,swap.length()-1);
+ }
+
+ int what = tree->get_drop_section_at_pos(p_point);
+
+ TreeItem *swap_item=NULL;
+
+ if (ti==tree->get_root()->get_children()) {
+ swap_item=tree->get_root()->get_children()->get_children();
+
+ } else if (ti->get_parent() && tree->get_root()->get_children()==ti->get_parent()) {
+ if (what==-1) {
+ swap_item=ti;
+ } else {
+ swap_item=ti->get_next();
+ }
+ }
+
+ String swap_with;
+
+ if (swap_item) {
+ swap_with=swap_item->get_metadata(0);
+ if (swap_with!="res://" && swap_with.ends_with("/")) {
+ swap_with=swap_with.substr(0,swap_with.length()-1);
+ }
+ }
+
+ if (swap==swap_with)
+ return;
+
+ Vector<String> dirs = EditorSettings::get_singleton()->get_favorite_dirs();
+
+ ERR_FAIL_COND(dirs.find(swap)==-1);
+ ERR_FAIL_COND(swap_with!=String() && dirs.find(swap_with)==-1);
+
+ dirs.erase(swap);
+
+ if (swap_with==String()) {
+ dirs.push_back(swap);
+ } else {
+ int idx = dirs.find(swap_with);
+ dirs.insert(idx,swap);
+ }
+
+ EditorSettings::get_singleton()->set_favorite_dirs(dirs);
+ _update_tree();
+ return;
+
+ }
+
+ if (drag_data.has("type") && String(drag_data["type"])=="resource") {
+ Ref<Resource> res = drag_data["resource"];
+
+ if (!res.is_valid()) {
+ return;
+ }
+
+
+ if (p_from==tree) {
+
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+ if (!ti)
+ return;
+ String path = ti->get_metadata(0);
+
+ if (path==String())
+ return;
+
+ EditorNode::get_singleton()->save_resource_as(res,path);
+ return;
+
+ }
+
+ if (p_from==files) {
+ String save_path=path;
+
+ int at_pos = files->get_item_at_pos(p_point);
+ if (at_pos!=-1) {
+ String to_dir = files->get_item_metadata(at_pos);
+ if (to_dir.ends_with("/")) {
+ save_path=to_dir;
+ if (save_path!="res://")
+ save_path=save_path.substr(0,save_path.length()-1);
+ }
+
+ }
+
+ EditorNode::get_singleton()->save_resource_as(res,save_path);
+ return;
+ }
+ }
+
+ if (drag_data.has("type") && ( String(drag_data["type"])=="files" || String(drag_data["type"])=="files_and_dirs")) {
+
+ if (p_from==files || p_from==tree) {
+
+ String to_dir;
+
+ if (p_from==files) {
+
+ int at_pos = files->get_item_at_pos(p_point);
+ ERR_FAIL_COND(at_pos==-1);
+ to_dir = files->get_item_metadata(at_pos);
+ } else {
+ TreeItem *ti = tree->get_item_at_pos(p_point);
+ if (!ti)
+ return;
+ to_dir = ti->get_metadata(0);
+ ERR_FAIL_COND(to_dir==String());
+
+ }
+
+ if (to_dir!="res://" && to_dir.ends_with("/")) {
+ to_dir=to_dir.substr(0,to_dir.length()-1);
+ }
+
+ Vector<String> fnames = drag_data["files"];
+ move_files.clear();
+ move_dirs.clear();
+
+ for(int i=0;i<fnames.size();i++) {
+ if (fnames[i].ends_with("/"))
+ move_dirs.push_back(fnames[i]);
+ else
+ move_files.push_back(fnames[i]);
+ }
+
+ _move_operation(to_dir);
+ }
+ }
+
+}
+
+void FileSystemDock::_files_list_rmb_select(int p_item,const Vector2& p_pos) {
+
+ Vector<String> filenames;
+
+ bool all_scenes=true;
+ bool all_can_reimport=true;
+ Set<String> types;
+
+ for(int i=0;i<files->get_item_count();i++) {
+
+ if (!files->is_selected(i))
+ continue;
+
+ String path = files->get_item_metadata(i);
+
+ if (files->get_item_text(i)=="..") {
+ // no operate on ..
+ return;
+ }
+
+ if (path.ends_with("/")) {
+ //no operate on dirs
+ return;
+ }
+
+
+ EditorFileSystemDirectory *efsd=NULL;
+ int pos;
+
+ efsd = EditorFileSystem::get_singleton()->find_file(path,&pos);
+
+ if (efsd) {
+
+
+ } else {
+ all_can_reimport=false;
+
+ }
+
+ filenames.push_back(path);
+ if (EditorFileSystem::get_singleton()->get_file_type(path)!="PackedScene")
+ all_scenes=false;
+ }
+
+
+ if (filenames.size()==0)
+ return;
+
+ file_options->clear();
+ file_options->set_size(Size2(1,1));
+
+ file_options->add_item(TTR("Open"),FILE_OPEN);
+ if (all_scenes) {
+ file_options->add_item(TTR("Instance"),FILE_INSTANCE);
+ }
+
+ file_options->add_separator();
+
+ if (filenames.size()==1) {
+ file_options->add_item(TTR("Edit Dependencies.."),FILE_DEPENDENCIES);
+ file_options->add_item(TTR("View Owners.."),FILE_OWNERS);
+ file_options->add_separator();
+ }
+
+ if (filenames.size()==1) {
+ file_options->add_item(TTR("Copy Path"), FILE_COPY_PATH);
+ file_options->add_item(TTR("Rename or Move.."),FILE_MOVE);
+ } else {
+ file_options->add_item(TTR("Move To.."),FILE_MOVE);
+ }
+
+
+ file_options->add_item(TTR("Delete"),FILE_REMOVE);
+
+ //file_options->add_item(TTR("Info"),FILE_INFO);
+
+ file_options->add_separator();
+ file_options->add_item(TTR("Show In File Manager"),FILE_SHOW_IN_EXPLORER);
+
+ if (all_can_reimport && types.size()==1) { //all can reimport and are of the same type
+
+/*
+ bool valid=true;
+ Ref<EditorImportPlugin> rimp = EditorImportExport::get_singleton()->get_import_plugin_by_name(types.front()->get());
+ if (rimp.is_valid()) {
+
+ if (filenames.size()>1 && !rimp->can_reimport_multiple_files()) {
+ valid=false;
+ }
+ } else {
+ valid=false;
+ }
+
+ if (valid) {
+ file_options->add_separator();
+ file_options->add_item(TTR("Re-Import.."),FILE_REIMPORT);
+ }
+ */
+ }
+
+ file_options->set_pos(files->get_global_pos() + p_pos);
+ file_options->popup();
+
+}
+
+void FileSystemDock::select_file(const String& p_file) {
+
+ _go_to_dir(p_file.get_base_dir());
+ for(int i=0;i<files->get_item_count();i++) {
+ if (files->get_item_metadata(i)==p_file) {
+ files->select(i);
+ files->ensure_current_is_visible();
+ break;
+ }
+ }
+
+}
+
+void FileSystemDock::_file_multi_selected(int p_index,bool p_selected) {
+
+
+ _file_selected();
+}
+
+void FileSystemDock::_file_selected() {
+
+ //check import
+ Vector<String> imports;
+ String import_type;
+
+ for(int i=0;i<files->get_item_count();i++) {
+ if (!files->is_selected(i))
+ continue;
+
+ String p = files->get_item_metadata(i);
+ if (!FileAccess::exists(p+".import")) {
+ imports.clear();
+ break;
+ }
+ Ref<ConfigFile> cf;
+ cf.instance();
+ Error err = cf->load(p+".import");
+ if (err!=OK) {
+ imports.clear();
+ break;
+ }
+
+ String type = cf->get_value("remap","type");
+ if (import_type=="") {
+ import_type=type;
+ } else if (import_type!=type) {
+ //all should be the same type
+ imports.clear();
+ break;
+ }
+ imports.push_back(p);
+ }
+
+
+ if (imports.size()==0) {
+ EditorNode::get_singleton()->get_import_dock()->clear();
+ } else if (imports.size()==1) {
+ EditorNode::get_singleton()->get_import_dock()->set_edit_path(imports[0]);
+ } else {
+ EditorNode::get_singleton()->get_import_dock()->set_edit_multiple_paths(imports);
+ }
+}
+
+
+void FileSystemDock::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_update_tree"),&FileSystemDock::_update_tree);
+ ClassDB::bind_method(D_METHOD("_rescan"),&FileSystemDock::_rescan);
+ ClassDB::bind_method(D_METHOD("_favorites_pressed"),&FileSystemDock::_favorites_pressed);
+ //ClassDB::bind_method(D_METHOD("_instance_pressed"),&ScenesDock::_instance_pressed);
+ ClassDB::bind_method(D_METHOD("_open_pressed"),&FileSystemDock::_open_pressed);
+ ClassDB::bind_method(D_METHOD("_dir_rmb_pressed"),&FileSystemDock::_dir_rmb_pressed);
+
+ ClassDB::bind_method(D_METHOD("_thumbnail_done"),&FileSystemDock::_thumbnail_done);
+ ClassDB::bind_method(D_METHOD("_select_file"), &FileSystemDock::_select_file);
+ ClassDB::bind_method(D_METHOD("_go_to_tree"), &FileSystemDock::_go_to_tree);
+ ClassDB::bind_method(D_METHOD("_go_to_dir"), &FileSystemDock::_go_to_dir);
+ ClassDB::bind_method(D_METHOD("_change_file_display"), &FileSystemDock::_change_file_display);
+ ClassDB::bind_method(D_METHOD("_fw_history"), &FileSystemDock::_fw_history);
+ ClassDB::bind_method(D_METHOD("_bw_history"), &FileSystemDock::_bw_history);
+ ClassDB::bind_method(D_METHOD("_fs_changed"), &FileSystemDock::_fs_changed);
+ ClassDB::bind_method(D_METHOD("_dir_selected"), &FileSystemDock::_dir_selected);
+ ClassDB::bind_method(D_METHOD("_file_option"), &FileSystemDock::_file_option);
+ ClassDB::bind_method(D_METHOD("_folder_option"), &FileSystemDock::_folder_option);
+ ClassDB::bind_method(D_METHOD("_move_operation"), &FileSystemDock::_move_operation);
+ ClassDB::bind_method(D_METHOD("_rename_operation"), &FileSystemDock::_rename_operation);
+
+ ClassDB::bind_method(D_METHOD("_search_changed"), &FileSystemDock::_search_changed);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &FileSystemDock::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &FileSystemDock::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &FileSystemDock::drop_data_fw);
+ ClassDB::bind_method(D_METHOD("_files_list_rmb_select"),&FileSystemDock::_files_list_rmb_select);
+
+ ClassDB::bind_method(D_METHOD("_preview_invalidated"),&FileSystemDock::_preview_invalidated);
+ ClassDB::bind_method(D_METHOD("_file_selected"),&FileSystemDock::_file_selected);
+ ClassDB::bind_method(D_METHOD("_file_multi_selected"),&FileSystemDock::_file_multi_selected);
+
+
+ ADD_SIGNAL(MethodInfo("instance", PropertyInfo(Variant::POOL_STRING_ARRAY, "files")));
+ ADD_SIGNAL(MethodInfo("open"));
+
+}
+
+FileSystemDock::FileSystemDock(EditorNode *p_editor) {
+
+ editor=p_editor;
+
+
+ HBoxContainer *toolbar_hbc = memnew( HBoxContainer );
+ add_child(toolbar_hbc);
+
+ button_hist_prev = memnew( ToolButton );
+ toolbar_hbc->add_child(button_hist_prev);
+ button_hist_prev->set_disabled(true);
+ button_hist_prev->set_tooltip(TTR("Previous Directory"));
+
+ button_hist_next = memnew( ToolButton );
+ toolbar_hbc->add_child(button_hist_next);
+ button_hist_next->set_disabled(true);
+ button_hist_prev->set_focus_mode(FOCUS_NONE);
+ button_hist_next->set_focus_mode(FOCUS_NONE);
+ button_hist_next->set_tooltip(TTR("Next Directory"));
+
+ current_path=memnew( LineEdit );
+ current_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ toolbar_hbc->add_child(current_path);
+
+
+ button_reload = memnew( Button );
+ button_reload->set_flat(true);
+ button_reload->connect("pressed",this,"_rescan");
+ toolbar_hbc->add_child(button_reload);
+ button_reload->set_focus_mode(FOCUS_NONE);
+ button_reload->set_tooltip(TTR("Re-Scan Filesystem"));
+ button_reload->hide();
+
+ //toolbar_hbc->add_spacer();
+
+
+ button_favorite = memnew( Button );
+ button_favorite->set_flat(true);
+ button_favorite->set_toggle_mode(true);
+ button_favorite->connect("pressed",this,"_favorites_pressed");
+ toolbar_hbc->add_child(button_favorite);
+ button_favorite->set_tooltip(TTR("Toggle folder status as Favorite"));
+
+ button_favorite->set_focus_mode(FOCUS_NONE);
+
+ //Control *spacer = memnew( Control);
+
+
+
+/*
+ button_open = memnew( Button );
+ button_open->set_flat(true);
+ button_open->connect("pressed",this,"_open_pressed");
+ toolbar_hbc->add_child(button_open);
+ button_open->hide();
+ button_open->set_focus_mode(FOCUS_NONE);
+ button_open->set_tooltip("Open the selected file.\nOpen as scene if a scene, or as resource otherwise.");
+
+
+ button_instance = memnew( Button );
+ button_instance->set_flat(true);
+ button_instance->connect("pressed",this,"_instance_pressed");
+ toolbar_hbc->add_child(button_instance);
+ button_instance->hide();
+ button_instance->set_focus_mode(FOCUS_NONE);
+ button_instance->set_tooltip(TTR("Instance the selected scene(s) as child of the selected node."));
+
+*/
+ file_options = memnew( PopupMenu );
+ add_child(file_options);
+
+ folder_options = memnew ( PopupMenu );
+ add_child(folder_options);
+
+ split_box = memnew( VSplitContainer );
+ add_child(split_box);
+ split_box->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ tree = memnew( Tree );
+
+ tree->set_hide_root(true);
+ split_box->add_child(tree);
+ tree->set_drag_forwarding(this);
+ tree->set_allow_rmb_select(true);
+
+
+ //tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->connect("item_edited",this,"_favorite_toggled");
+ tree->connect("item_activated",this,"_open_pressed");
+ tree->connect("cell_selected",this,"_dir_selected");
+ tree->connect("item_rmb_selected",this,"_dir_rmb_pressed");
+
+ files = memnew( ItemList );
+ files->set_v_size_flags(SIZE_EXPAND_FILL);
+ files->set_select_mode(ItemList::SELECT_MULTI);
+ files->set_drag_forwarding(this);
+ files->connect("item_rmb_selected",this,"_files_list_rmb_select");
+ files->connect("item_selected",this,"_file_selected");
+ files->connect("multi_selected",this,"_file_multi_selected");
+ files->set_allow_rmb_select(true);
+
+ file_list_vb = memnew( VBoxContainer );
+ split_box->add_child(file_list_vb);
+ file_list_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ path_hb = memnew( HBoxContainer );
+ file_list_vb->add_child(path_hb);
+
+ button_back = memnew( ToolButton );
+ path_hb->add_child(button_back);
+ button_back->hide();
+
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ path_hb->add_child(search_box);
+ search_box->connect("text_changed",this,"_search_changed");
+
+ search_icon = memnew( TextureRect );
+ search_icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
+ path_hb->add_child(search_icon);
+
+ button_display_mode = memnew( ToolButton );
+ path_hb->add_child(button_display_mode);
+ button_display_mode->set_toggle_mode(true);
+
+ file_list_vb->add_child(files);
+
+
+ scanning_vb = memnew( VBoxContainer );
+ Label *slabel = memnew( Label );
+ slabel->set_text("Scanning Files,\nPlease Wait..");
+ slabel->set_align(Label::ALIGN_CENTER);
+ scanning_vb->add_child(slabel);
+ scanning_progress = memnew( ProgressBar );
+ scanning_vb->add_child(scanning_progress);
+ add_child(scanning_vb);
+ scanning_vb->hide();
+
+
+
+ deps_editor = memnew( DependencyEditor );
+ add_child(deps_editor);
+
+ owners_editor = memnew( DependencyEditorOwners);
+ add_child(owners_editor);
+
+ remove_dialog = memnew( DependencyRemoveDialog);
+ add_child(remove_dialog);
+
+ move_dialog = memnew( EditorDirDialog );
+ add_child(move_dialog);
+ move_dialog->connect("dir_selected",this,"_move_operation");
+ move_dialog->get_ok()->set_text(TTR("Move"));
+
+ rename_dialog = memnew( EditorFileDialog );
+ rename_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ rename_dialog->connect("file_selected",this,"_rename_operation");
+ add_child(rename_dialog);
+
+ updating_tree=false;
+ initialized=false;
+
+ history.push_back("res://");
+ history_pos=0;
+
+ split_mode=false;
+ display_mode = DISPLAY_THUMBNAILS;
+
+ path="res://";
+
+
+ add_constant_override("separation",3);
+}
+
+FileSystemDock::~FileSystemDock() {
+
+}
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
new file mode 100644
index 0000000000..916321d8fd
--- /dev/null
+++ b/editor/filesystem_dock.h
@@ -0,0 +1,217 @@
+/*************************************************************************/
+/* filesystem_dock.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef FILESYSTEM_DOCK_H
+#define FILESYSTEM_DOCK_H
+
+#include "scene/main/timer.h"
+#include "scene/gui/control.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/item_list.h"
+#include "scene/gui/progress_bar.h"
+#include "scene/gui/split_container.h"
+
+#include "os/dir_access.h"
+#include "os/thread.h"
+
+#include "editor_file_system.h"
+#include "editor_dir_dialog.h"
+#include "dependency_editor.h"
+
+class EditorNode;
+
+
+class FileSystemDock : public VBoxContainer {
+ GDCLASS( FileSystemDock, VBoxContainer );
+
+public:
+ enum DisplayMode {
+ DISPLAY_THUMBNAILS,
+ DISPLAY_LIST
+ };
+private:
+ enum FileMenu {
+ FILE_OPEN,
+ FILE_INSTANCE,
+ FILE_DEPENDENCIES,
+ FILE_OWNERS,
+ FILE_MOVE,
+ FILE_REMOVE,
+ FILE_REIMPORT,
+ FILE_INFO,
+ FILE_SHOW_IN_EXPLORER,
+ FILE_COPY_PATH
+ };
+
+ enum FolderMenu {
+ FOLDER_EXPAND_ALL,
+ FOLDER_COLLAPSE_ALL
+ };
+
+
+ VBoxContainer *scanning_vb;
+ ProgressBar *scanning_progress;
+ VSplitContainer *split_box;
+ VBoxContainer *file_list_vb;
+
+ EditorNode *editor;
+ Set<String> favorites;
+
+ Button *button_reload;
+ Button *button_favorite;
+ Button *button_back;
+ Button *button_display_mode;
+ Button *button_hist_next;
+ Button *button_hist_prev;
+ LineEdit *current_path;
+ LineEdit *search_box;
+ TextureRect *search_icon;
+ HBoxContainer *path_hb;
+
+ bool split_mode;
+ DisplayMode display_mode;
+
+ PopupMenu *file_options;
+ PopupMenu *folder_options;
+
+ DependencyEditor *deps_editor;
+ DependencyEditorOwners *owners_editor;
+ DependencyRemoveDialog *remove_dialog;
+
+ EditorDirDialog *move_dialog;
+ EditorFileDialog *rename_dialog;
+
+ Vector<String> move_dirs;
+ Vector<String> move_files;
+
+
+ Vector<String> history;
+ int history_pos;
+
+ String path;
+
+ bool initialized;
+
+ bool updating_tree;
+ Tree * tree; //directories
+ ItemList *files;
+
+
+ void _file_multi_selected(int p_index, bool p_selected);
+ void _file_selected();
+
+
+ void _go_to_tree();
+ void _go_to_dir(const String& p_dir);
+ void _select_file(int p_idx);
+
+ bool _create_tree(TreeItem *p_parent,EditorFileSystemDirectory *p_dir);
+ void _thumbnail_done(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata);
+ void _find_inside_move_files(EditorFileSystemDirectory *efsd,Vector<String>& files);
+ void _find_remaps(EditorFileSystemDirectory *efsd,Map<String,String> &renames,List<String>& to_remaps);
+
+ void _rename_operation(const String& p_to_path);
+ void _move_operation(const String& p_to_path);
+
+
+ void _file_option(int p_option);
+ void _folder_option(int p_option);
+ void _update_files(bool p_keep_selection);
+ void _change_file_display();
+
+ void _fs_changed();
+ void _fw_history();
+ void _bw_history();
+ void _push_to_history();
+
+
+ void _dir_selected();
+ void _update_tree();
+ void _rescan();
+ void _set_scanning_mode();
+
+
+ void _favorites_pressed();
+ void _open_pressed();
+ void _dir_rmb_pressed(const Vector2& local_mouse_pos);
+ void _search_changed(const String& p_text);
+
+
+ void _files_list_rmb_select(int p_item,const Vector2& p_pos);
+
+
+ struct FileInfo {
+ String name;
+ String path;
+ StringName type;
+ int import_status; //0 not imported, 1 - ok, 2- must reimport, 3- broken
+ Vector<String> sources;
+
+ bool operator<(const FileInfo& fi) const {
+ return name < fi.name;
+ }
+ };
+
+ void _search(EditorFileSystemDirectory *p_path, List<FileInfo>* matches, int p_max_items);
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+ void _preview_invalidated(const String& p_path);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ String get_selected_path() const;
+
+ String get_current_path() const;
+ void navigate_to_path(const String& p_path);
+ void focus_on_filter();
+
+ void fix_dependencies(const String& p_for_file);
+
+ void set_display_mode(int p_mode);
+
+ int get_split_offset() { return split_box->get_split_offset(); }
+ void set_split_offset(int p_offset) { split_box->set_split_offset(p_offset); }
+ void select_file(const String& p_file);
+
+ FileSystemDock(EditorNode *p_editor);
+ ~FileSystemDock();
+};
+
+
+#endif // SCENES_DOCK_H
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
new file mode 100644
index 0000000000..90f0bab6dd
--- /dev/null
+++ b/editor/groups_editor.cpp
@@ -0,0 +1,188 @@
+/*************************************************************************/
+/* groups_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "groups_editor.h"
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/label.h"
+#include "editor_node.h"
+#include "scene/resources/packed_scene.h"
+
+void GroupsEditor::_add_group(const String& p_group) {
+
+ if (!node)
+ return;
+
+ String name = group_name->get_text();
+ if (name.strip_edges()=="")
+ return;
+
+ if (node->is_in_group(name))
+ return;
+
+ undo_redo->create_action(TTR("Add to Group"));
+
+ undo_redo->add_do_method(node,"add_to_group",name,true);
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(node,"remove_from_group",name);
+ undo_redo->add_undo_method(this,"update_tree");
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+
+ undo_redo->commit_action();
+
+ group_name->clear();
+}
+
+void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) {
+
+ if (!node)
+ return;
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+ if (!ti)
+ return;
+
+ String name = ti->get_text(0);
+
+ undo_redo->create_action(TTR("Remove from Group"));
+
+ undo_redo->add_do_method(node,"remove_from_group",name);
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(node,"add_to_group",name,true);
+ undo_redo->add_undo_method(this,"update_tree");
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(),"update_tree"); //to force redraw of scene tree
+
+ undo_redo->commit_action();
+}
+
+struct _GroupInfoComparator {
+
+ bool operator()(const Node::GroupInfo& p_a, const Node::GroupInfo& p_b) const {
+ return p_a.name.operator String() < p_b.name.operator String();
+ }
+};
+
+void GroupsEditor::update_tree() {
+
+ tree->clear();
+
+ if (!node)
+ return;
+
+ List<Node::GroupInfo> groups;
+ node->get_groups(&groups);
+ groups.sort_custom<_GroupInfoComparator>();
+
+ TreeItem *root=tree->create_item();
+
+ for(List<GroupInfo>::Element *E=groups.front();E;E=E->next()) {
+
+ Node::GroupInfo gi = E->get();
+ if (!gi.persistent)
+ continue;
+
+ Node *n = node;
+ bool can_be_deleted=true;
+
+ while(n) {
+
+ Ref<SceneState> ss = (n==EditorNode::get_singleton()->get_edited_scene()) ? n->get_scene_inherited_state() : n->get_scene_instance_state();
+
+ if (ss.is_valid()) {
+
+ int path = ss->find_node_by_path(n->get_path_to(node));
+ if (path!=-1) {
+ if (ss->is_node_in_group(path,gi.name)) {
+ can_be_deleted=false;
+ }
+ }
+ }
+
+ n=n->get_owner();
+ }
+
+
+ TreeItem *item=tree->create_item(root);
+ item->set_text(0, gi.name);
+ if (can_be_deleted) {
+ item->add_button(0, get_icon("Remove", "EditorIcons"), 0);
+ } else {
+ item->set_selectable(0,false);
+ }
+
+ }
+}
+
+void GroupsEditor::set_current(Node* p_node) {
+
+ node=p_node;
+ update_tree();
+}
+
+void GroupsEditor::_bind_methods() {
+
+ ClassDB::bind_method("_add_group",&GroupsEditor::_add_group);
+ ClassDB::bind_method("_remove_group",&GroupsEditor::_remove_group);
+ ClassDB::bind_method("update_tree",&GroupsEditor::update_tree);
+}
+
+GroupsEditor::GroupsEditor() {
+
+ node=NULL;
+
+ VBoxContainer *vbc = this;
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+ group_name = memnew( LineEdit );
+ group_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(group_name);
+ group_name->connect("text_entered",this,"_add_group");
+
+ add = memnew( Button );
+ add->set_text(TTR("Add"));
+ hbc->add_child(add);
+ add->connect("pressed", this,"_add_group", varray(String()));
+
+ tree = memnew( Tree );
+ tree->set_hide_root(true);
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_child(tree);
+ tree->connect("button_pressed",this,"_remove_group");
+ add_constant_override("separation",3*EDSCALE);
+}
+
+GroupsEditor::~GroupsEditor()
+{
+}
+
+
+
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
new file mode 100644
index 0000000000..9ab75c6cfd
--- /dev/null
+++ b/editor/groups_editor.h
@@ -0,0 +1,70 @@
+/*************************************************************************/
+/* groups_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef GROUPS_EDITOR_H
+#define GROUPS_EDITOR_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/line_edit.h"
+#include "undo_redo.h"
+
+/**
+@author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class GroupsEditor : public VBoxContainer {
+
+ GDCLASS(GroupsEditor,VBoxContainer);
+
+ Node *node;
+
+ LineEdit *group_name;
+ Button *add;
+ Tree *tree;
+
+ UndoRedo *undo_redo;
+
+ void update_tree();
+ void _add_group(const String& p_group="");
+ void _remove_group(Object *p_item, int p_column, int p_id);
+ void _close();
+protected:
+
+ static void _bind_methods();
+public:
+
+ void set_undo_redo(UndoRedo *p_undoredo) { undo_redo=p_undoredo; }
+ void set_current(Node* p_node);
+
+ GroupsEditor();
+ ~GroupsEditor();
+};
+
+#endif
diff --git a/editor/icons/2x/icon_accept_dialog.png b/editor/icons/2x/icon_accept_dialog.png
new file mode 100644
index 0000000000..fca344aefc
--- /dev/null
+++ b/editor/icons/2x/icon_accept_dialog.png
Binary files differ
diff --git a/editor/icons/2x/icon_add.png b/editor/icons/2x/icon_add.png
new file mode 100644
index 0000000000..a46c521f2a
--- /dev/null
+++ b/editor/icons/2x/icon_add.png
Binary files differ
diff --git a/editor/icons/2x/icon_add_track.png b/editor/icons/2x/icon_add_track.png
new file mode 100644
index 0000000000..a46c521f2a
--- /dev/null
+++ b/editor/icons/2x/icon_add_track.png
Binary files differ
diff --git a/editor/icons/2x/icon_anchor.png b/editor/icons/2x/icon_anchor.png
new file mode 100644
index 0000000000..7e9e259c13
--- /dev/null
+++ b/editor/icons/2x/icon_anchor.png
Binary files differ
diff --git a/editor/icons/2x/icon_animated_sprite.png b/editor/icons/2x/icon_animated_sprite.png
new file mode 100644
index 0000000000..461dac8f13
--- /dev/null
+++ b/editor/icons/2x/icon_animated_sprite.png
Binary files differ
diff --git a/editor/icons/2x/icon_animated_sprite_3d.png b/editor/icons/2x/icon_animated_sprite_3d.png
new file mode 100644
index 0000000000..6c79c38875
--- /dev/null
+++ b/editor/icons/2x/icon_animated_sprite_3d.png
Binary files differ
diff --git a/editor/icons/2x/icon_animation.png b/editor/icons/2x/icon_animation.png
new file mode 100644
index 0000000000..ef18959a74
--- /dev/null
+++ b/editor/icons/2x/icon_animation.png
Binary files differ
diff --git a/editor/icons/2x/icon_animation_player.png b/editor/icons/2x/icon_animation_player.png
new file mode 100644
index 0000000000..4a3209ab70
--- /dev/null
+++ b/editor/icons/2x/icon_animation_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_animation_tree.png b/editor/icons/2x/icon_animation_tree.png
new file mode 100644
index 0000000000..a213ab6e5e
--- /dev/null
+++ b/editor/icons/2x/icon_animation_tree.png
Binary files differ
diff --git a/editor/icons/2x/icon_animation_tree_player.png b/editor/icons/2x/icon_animation_tree_player.png
new file mode 100644
index 0000000000..a213ab6e5e
--- /dev/null
+++ b/editor/icons/2x/icon_animation_tree_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_area.png b/editor/icons/2x/icon_area.png
new file mode 100644
index 0000000000..d9cefe8fc4
--- /dev/null
+++ b/editor/icons/2x/icon_area.png
Binary files differ
diff --git a/editor/icons/2x/icon_area_2d.png b/editor/icons/2x/icon_area_2d.png
new file mode 100644
index 0000000000..22616cc754
--- /dev/null
+++ b/editor/icons/2x/icon_area_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_arrow_left.png b/editor/icons/2x/icon_arrow_left.png
new file mode 100644
index 0000000000..bc3995f70b
--- /dev/null
+++ b/editor/icons/2x/icon_arrow_left.png
Binary files differ
diff --git a/editor/icons/2x/icon_arrow_right.png b/editor/icons/2x/icon_arrow_right.png
new file mode 100644
index 0000000000..045b390e0d
--- /dev/null
+++ b/editor/icons/2x/icon_arrow_right.png
Binary files differ
diff --git a/editor/icons/2x/icon_arrow_up.png b/editor/icons/2x/icon_arrow_up.png
new file mode 100644
index 0000000000..524ab934e2
--- /dev/null
+++ b/editor/icons/2x/icon_arrow_up.png
Binary files differ
diff --git a/editor/icons/2x/icon_atlas_texture.png b/editor/icons/2x/icon_atlas_texture.png
new file mode 100644
index 0000000000..bd5bdc3148
--- /dev/null
+++ b/editor/icons/2x/icon_atlas_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_audio_stream_gibberish.png b/editor/icons/2x/icon_audio_stream_gibberish.png
new file mode 100644
index 0000000000..da200740a4
--- /dev/null
+++ b/editor/icons/2x/icon_audio_stream_gibberish.png
Binary files differ
diff --git a/editor/icons/2x/icon_auto_play.png b/editor/icons/2x/icon_auto_play.png
new file mode 100644
index 0000000000..ec31dee958
--- /dev/null
+++ b/editor/icons/2x/icon_auto_play.png
Binary files differ
diff --git a/editor/icons/2x/icon_back.png b/editor/icons/2x/icon_back.png
new file mode 100644
index 0000000000..648c440928
--- /dev/null
+++ b/editor/icons/2x/icon_back.png
Binary files differ
diff --git a/editor/icons/2x/icon_back_buffer_copy.png b/editor/icons/2x/icon_back_buffer_copy.png
new file mode 100644
index 0000000000..8b5c37b7e5
--- /dev/null
+++ b/editor/icons/2x/icon_back_buffer_copy.png
Binary files differ
diff --git a/editor/icons/2x/icon_bake.png b/editor/icons/2x/icon_bake.png
new file mode 100644
index 0000000000..3c1cba5586
--- /dev/null
+++ b/editor/icons/2x/icon_bake.png
Binary files differ
diff --git a/editor/icons/2x/icon_baked_light.png b/editor/icons/2x/icon_baked_light.png
new file mode 100644
index 0000000000..3c1cba5586
--- /dev/null
+++ b/editor/icons/2x/icon_baked_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_baked_light_instance.png b/editor/icons/2x/icon_baked_light_instance.png
new file mode 100644
index 0000000000..9b13ed8ff1
--- /dev/null
+++ b/editor/icons/2x/icon_baked_light_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_baked_light_sampler.png b/editor/icons/2x/icon_baked_light_sampler.png
new file mode 100644
index 0000000000..8dfc1793f1
--- /dev/null
+++ b/editor/icons/2x/icon_baked_light_sampler.png
Binary files differ
diff --git a/editor/icons/2x/icon_bit_map.png b/editor/icons/2x/icon_bit_map.png
new file mode 100644
index 0000000000..7372b85944
--- /dev/null
+++ b/editor/icons/2x/icon_bit_map.png
Binary files differ
diff --git a/editor/icons/2x/icon_bitmap_font.png b/editor/icons/2x/icon_bitmap_font.png
new file mode 100644
index 0000000000..c533b5f40e
--- /dev/null
+++ b/editor/icons/2x/icon_bitmap_font.png
Binary files differ
diff --git a/editor/icons/2x/icon_blend.png b/editor/icons/2x/icon_blend.png
new file mode 100644
index 0000000000..8dd30d1a04
--- /dev/null
+++ b/editor/icons/2x/icon_blend.png
Binary files differ
diff --git a/editor/icons/2x/icon_bone.png b/editor/icons/2x/icon_bone.png
new file mode 100644
index 0000000000..0a8ceb4ce1
--- /dev/null
+++ b/editor/icons/2x/icon_bone.png
Binary files differ
diff --git a/editor/icons/2x/icon_bone_attachment.png b/editor/icons/2x/icon_bone_attachment.png
new file mode 100644
index 0000000000..4e9333d3d1
--- /dev/null
+++ b/editor/icons/2x/icon_bone_attachment.png
Binary files differ
diff --git a/editor/icons/2x/icon_bone_track.png b/editor/icons/2x/icon_bone_track.png
new file mode 100644
index 0000000000..a956923a07
--- /dev/null
+++ b/editor/icons/2x/icon_bone_track.png
Binary files differ
diff --git a/editor/icons/2x/icon_bool.png b/editor/icons/2x/icon_bool.png
new file mode 100644
index 0000000000..47103538bd
--- /dev/null
+++ b/editor/icons/2x/icon_bool.png
Binary files differ
diff --git a/editor/icons/2x/icon_box_shape.png b/editor/icons/2x/icon_box_shape.png
new file mode 100644
index 0000000000..7d5356ad94
--- /dev/null
+++ b/editor/icons/2x/icon_box_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_button.png b/editor/icons/2x/icon_button.png
new file mode 100644
index 0000000000..210b0da486
--- /dev/null
+++ b/editor/icons/2x/icon_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_button_group.png b/editor/icons/2x/icon_button_group.png
new file mode 100644
index 0000000000..47f62005b9
--- /dev/null
+++ b/editor/icons/2x/icon_button_group.png
Binary files differ
diff --git a/editor/icons/2x/icon_camera.png b/editor/icons/2x/icon_camera.png
new file mode 100644
index 0000000000..ea17779784
--- /dev/null
+++ b/editor/icons/2x/icon_camera.png
Binary files differ
diff --git a/editor/icons/2x/icon_camera_2d.png b/editor/icons/2x/icon_camera_2d.png
new file mode 100644
index 0000000000..c5c881c435
--- /dev/null
+++ b/editor/icons/2x/icon_camera_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_item.png b/editor/icons/2x/icon_canvas_item.png
new file mode 100644
index 0000000000..42863020f0
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_item.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_item_material.png b/editor/icons/2x/icon_canvas_item_material.png
new file mode 100644
index 0000000000..a9f7948060
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_item_material.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_item_shader.png b/editor/icons/2x/icon_canvas_item_shader.png
new file mode 100644
index 0000000000..5091a947c0
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_item_shader.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_item_shader_graph.png b/editor/icons/2x/icon_canvas_item_shader_graph.png
new file mode 100644
index 0000000000..a26a9754fe
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_item_shader_graph.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_layer.png b/editor/icons/2x/icon_canvas_layer.png
new file mode 100644
index 0000000000..8a4b31cd7d
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_layer.png
Binary files differ
diff --git a/editor/icons/2x/icon_canvas_modulate.png b/editor/icons/2x/icon_canvas_modulate.png
new file mode 100644
index 0000000000..6cc15e2655
--- /dev/null
+++ b/editor/icons/2x/icon_canvas_modulate.png
Binary files differ
diff --git a/editor/icons/2x/icon_capsule_shape.png b/editor/icons/2x/icon_capsule_shape.png
new file mode 100644
index 0000000000..f8844ecef4
--- /dev/null
+++ b/editor/icons/2x/icon_capsule_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_capsule_shape_2d.png b/editor/icons/2x/icon_capsule_shape_2d.png
new file mode 100644
index 0000000000..e449ce4985
--- /dev/null
+++ b/editor/icons/2x/icon_capsule_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_center_container.png b/editor/icons/2x/icon_center_container.png
new file mode 100644
index 0000000000..c715f0959e
--- /dev/null
+++ b/editor/icons/2x/icon_center_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_check_box.png b/editor/icons/2x/icon_check_box.png
new file mode 100644
index 0000000000..bade572304
--- /dev/null
+++ b/editor/icons/2x/icon_check_box.png
Binary files differ
diff --git a/editor/icons/2x/icon_check_button.png b/editor/icons/2x/icon_check_button.png
new file mode 100644
index 0000000000..4f498bb9ad
--- /dev/null
+++ b/editor/icons/2x/icon_check_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_circle_shape_2d.png b/editor/icons/2x/icon_circle_shape_2d.png
new file mode 100644
index 0000000000..feb84d2f1c
--- /dev/null
+++ b/editor/icons/2x/icon_circle_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_class_list.png b/editor/icons/2x/icon_class_list.png
new file mode 100644
index 0000000000..4ae0b3edab
--- /dev/null
+++ b/editor/icons/2x/icon_class_list.png
Binary files differ
diff --git a/editor/icons/2x/icon_close.png b/editor/icons/2x/icon_close.png
new file mode 100644
index 0000000000..62ab763fec
--- /dev/null
+++ b/editor/icons/2x/icon_close.png
Binary files differ
diff --git a/editor/icons/2x/icon_collapse.png b/editor/icons/2x/icon_collapse.png
new file mode 100644
index 0000000000..18486c03f5
--- /dev/null
+++ b/editor/icons/2x/icon_collapse.png
Binary files differ
diff --git a/editor/icons/2x/icon_collision_2d.png b/editor/icons/2x/icon_collision_2d.png
new file mode 100644
index 0000000000..491ebfaa78
--- /dev/null
+++ b/editor/icons/2x/icon_collision_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_collision_polygon.png b/editor/icons/2x/icon_collision_polygon.png
new file mode 100644
index 0000000000..ef786f6a3d
--- /dev/null
+++ b/editor/icons/2x/icon_collision_polygon.png
Binary files differ
diff --git a/editor/icons/2x/icon_collision_polygon_2d.png b/editor/icons/2x/icon_collision_polygon_2d.png
new file mode 100644
index 0000000000..491ebfaa78
--- /dev/null
+++ b/editor/icons/2x/icon_collision_polygon_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_collision_shape.png b/editor/icons/2x/icon_collision_shape.png
new file mode 100644
index 0000000000..23bec8cdd9
--- /dev/null
+++ b/editor/icons/2x/icon_collision_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_collision_shape_2d.png b/editor/icons/2x/icon_collision_shape_2d.png
new file mode 100644
index 0000000000..c91456b58e
--- /dev/null
+++ b/editor/icons/2x/icon_collision_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_color.png b/editor/icons/2x/icon_color.png
new file mode 100644
index 0000000000..125dd86ec0
--- /dev/null
+++ b/editor/icons/2x/icon_color.png
Binary files differ
diff --git a/editor/icons/2x/icon_color_pick.png b/editor/icons/2x/icon_color_pick.png
new file mode 100644
index 0000000000..c61f2d4174
--- /dev/null
+++ b/editor/icons/2x/icon_color_pick.png
Binary files differ
diff --git a/editor/icons/2x/icon_color_picker.png b/editor/icons/2x/icon_color_picker.png
new file mode 100644
index 0000000000..2b683c75ea
--- /dev/null
+++ b/editor/icons/2x/icon_color_picker.png
Binary files differ
diff --git a/editor/icons/2x/icon_color_picker_button.png b/editor/icons/2x/icon_color_picker_button.png
new file mode 100644
index 0000000000..8d9bd17ccc
--- /dev/null
+++ b/editor/icons/2x/icon_color_picker_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_color_ramp.png b/editor/icons/2x/icon_color_ramp.png
new file mode 100644
index 0000000000..d0056f0c7d
--- /dev/null
+++ b/editor/icons/2x/icon_color_ramp.png
Binary files differ
diff --git a/editor/icons/2x/icon_color_rect.png b/editor/icons/2x/icon_color_rect.png
new file mode 100644
index 0000000000..153029ac20
--- /dev/null
+++ b/editor/icons/2x/icon_color_rect.png
Binary files differ
diff --git a/editor/icons/2x/icon_concave_polygon_shape.png b/editor/icons/2x/icon_concave_polygon_shape.png
new file mode 100644
index 0000000000..82a67ca4d0
--- /dev/null
+++ b/editor/icons/2x/icon_concave_polygon_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_concave_polygon_shape_2d.png b/editor/icons/2x/icon_concave_polygon_shape_2d.png
new file mode 100644
index 0000000000..1ad3f30950
--- /dev/null
+++ b/editor/icons/2x/icon_concave_polygon_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_cone_twist_joint.png b/editor/icons/2x/icon_cone_twist_joint.png
new file mode 100644
index 0000000000..3aeba5855d
--- /dev/null
+++ b/editor/icons/2x/icon_cone_twist_joint.png
Binary files differ
diff --git a/editor/icons/2x/icon_confirmation_dialog.png b/editor/icons/2x/icon_confirmation_dialog.png
new file mode 100644
index 0000000000..a0df7fcd1e
--- /dev/null
+++ b/editor/icons/2x/icon_confirmation_dialog.png
Binary files differ
diff --git a/editor/icons/2x/icon_connect.png b/editor/icons/2x/icon_connect.png
new file mode 100644
index 0000000000..e3f4b8fd12
--- /dev/null
+++ b/editor/icons/2x/icon_connect.png
Binary files differ
diff --git a/editor/icons/2x/icon_connection_and_groups.png b/editor/icons/2x/icon_connection_and_groups.png
new file mode 100644
index 0000000000..e7619327f6
--- /dev/null
+++ b/editor/icons/2x/icon_connection_and_groups.png
Binary files differ
diff --git a/editor/icons/2x/icon_container.png b/editor/icons/2x/icon_container.png
new file mode 100644
index 0000000000..baa09bbea9
--- /dev/null
+++ b/editor/icons/2x/icon_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_control.png b/editor/icons/2x/icon_control.png
new file mode 100644
index 0000000000..82d7457f3b
--- /dev/null
+++ b/editor/icons/2x/icon_control.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_bottom_center.png b/editor/icons/2x/icon_control_align_bottom_center.png
new file mode 100644
index 0000000000..9dc738c746
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_bottom_center.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_bottom_left.png b/editor/icons/2x/icon_control_align_bottom_left.png
new file mode 100644
index 0000000000..a11a13528d
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_bottom_left.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_bottom_right.png b/editor/icons/2x/icon_control_align_bottom_right.png
new file mode 100644
index 0000000000..7fee3f0752
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_bottom_right.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_bottom_wide.png b/editor/icons/2x/icon_control_align_bottom_wide.png
new file mode 100644
index 0000000000..573619ccbb
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_bottom_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_center.png b/editor/icons/2x/icon_control_align_center.png
new file mode 100644
index 0000000000..9850ecd775
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_center.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_center_left.png b/editor/icons/2x/icon_control_align_center_left.png
new file mode 100644
index 0000000000..2c48b889ad
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_center_left.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_center_right.png b/editor/icons/2x/icon_control_align_center_right.png
new file mode 100644
index 0000000000..4f87a68ad3
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_center_right.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_left_center.png b/editor/icons/2x/icon_control_align_left_center.png
new file mode 100644
index 0000000000..c4250dcb37
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_left_center.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_left_wide.png b/editor/icons/2x/icon_control_align_left_wide.png
new file mode 100644
index 0000000000..5436397189
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_left_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_right_center.png b/editor/icons/2x/icon_control_align_right_center.png
new file mode 100644
index 0000000000..b1fd9a075d
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_right_center.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_right_wide.png b/editor/icons/2x/icon_control_align_right_wide.png
new file mode 100644
index 0000000000..0ce81d3a50
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_right_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_top_center.png b/editor/icons/2x/icon_control_align_top_center.png
new file mode 100644
index 0000000000..baa2601531
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_top_center.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_top_left.png b/editor/icons/2x/icon_control_align_top_left.png
new file mode 100644
index 0000000000..90f3cb6105
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_top_left.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_top_right.png b/editor/icons/2x/icon_control_align_top_right.png
new file mode 100644
index 0000000000..040b7b27ee
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_top_right.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_top_wide.png b/editor/icons/2x/icon_control_align_top_wide.png
new file mode 100644
index 0000000000..5c14782fc2
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_top_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_align_wide.png b/editor/icons/2x/icon_control_align_wide.png
new file mode 100644
index 0000000000..383b63d069
--- /dev/null
+++ b/editor/icons/2x/icon_control_align_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_hcenter_wide.png b/editor/icons/2x/icon_control_hcenter_wide.png
new file mode 100644
index 0000000000..840ac557f5
--- /dev/null
+++ b/editor/icons/2x/icon_control_hcenter_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_control_vcenter_wide.png b/editor/icons/2x/icon_control_vcenter_wide.png
new file mode 100644
index 0000000000..a9e406d4b5
--- /dev/null
+++ b/editor/icons/2x/icon_control_vcenter_wide.png
Binary files differ
diff --git a/editor/icons/2x/icon_convex_polygon_shape.png b/editor/icons/2x/icon_convex_polygon_shape.png
new file mode 100644
index 0000000000..40dd40f299
--- /dev/null
+++ b/editor/icons/2x/icon_convex_polygon_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_convex_polygon_shape_2d.png b/editor/icons/2x/icon_convex_polygon_shape_2d.png
new file mode 100644
index 0000000000..6d46a96f9d
--- /dev/null
+++ b/editor/icons/2x/icon_convex_polygon_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_copy_node_path.png b/editor/icons/2x/icon_copy_node_path.png
new file mode 100644
index 0000000000..056748d20b
--- /dev/null
+++ b/editor/icons/2x/icon_copy_node_path.png
Binary files differ
diff --git a/editor/icons/2x/icon_create_new_scene_from.png b/editor/icons/2x/icon_create_new_scene_from.png
new file mode 100644
index 0000000000..cc3be48033
--- /dev/null
+++ b/editor/icons/2x/icon_create_new_scene_from.png
Binary files differ
diff --git a/editor/icons/2x/icon_cube_map.png b/editor/icons/2x/icon_cube_map.png
new file mode 100644
index 0000000000..0edf82a88e
--- /dev/null
+++ b/editor/icons/2x/icon_cube_map.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_2d.png b/editor/icons/2x/icon_curve_2d.png
new file mode 100644
index 0000000000..69a6f9a9dc
--- /dev/null
+++ b/editor/icons/2x/icon_curve_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_3d.png b/editor/icons/2x/icon_curve_3d.png
new file mode 100644
index 0000000000..e989df4769
--- /dev/null
+++ b/editor/icons/2x/icon_curve_3d.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_close.png b/editor/icons/2x/icon_curve_close.png
new file mode 100644
index 0000000000..bd2de0edc8
--- /dev/null
+++ b/editor/icons/2x/icon_curve_close.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_constant.png b/editor/icons/2x/icon_curve_constant.png
new file mode 100644
index 0000000000..a6e32e0467
--- /dev/null
+++ b/editor/icons/2x/icon_curve_constant.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_create.png b/editor/icons/2x/icon_curve_create.png
new file mode 100644
index 0000000000..39f10fd8db
--- /dev/null
+++ b/editor/icons/2x/icon_curve_create.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_curve.png b/editor/icons/2x/icon_curve_curve.png
new file mode 100644
index 0000000000..6476579a64
--- /dev/null
+++ b/editor/icons/2x/icon_curve_curve.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_delete.png b/editor/icons/2x/icon_curve_delete.png
new file mode 100644
index 0000000000..60c081bbd0
--- /dev/null
+++ b/editor/icons/2x/icon_curve_delete.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_edit.png b/editor/icons/2x/icon_curve_edit.png
new file mode 100644
index 0000000000..f9701e05cb
--- /dev/null
+++ b/editor/icons/2x/icon_curve_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_in.png b/editor/icons/2x/icon_curve_in.png
new file mode 100644
index 0000000000..a018d28035
--- /dev/null
+++ b/editor/icons/2x/icon_curve_in.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_in_out.png b/editor/icons/2x/icon_curve_in_out.png
new file mode 100644
index 0000000000..8b8b8d7d8a
--- /dev/null
+++ b/editor/icons/2x/icon_curve_in_out.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_linear.png b/editor/icons/2x/icon_curve_linear.png
new file mode 100644
index 0000000000..9733ec6f49
--- /dev/null
+++ b/editor/icons/2x/icon_curve_linear.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_out.png b/editor/icons/2x/icon_curve_out.png
new file mode 100644
index 0000000000..49e62ef471
--- /dev/null
+++ b/editor/icons/2x/icon_curve_out.png
Binary files differ
diff --git a/editor/icons/2x/icon_curve_out_in.png b/editor/icons/2x/icon_curve_out_in.png
new file mode 100644
index 0000000000..cc716cdbe8
--- /dev/null
+++ b/editor/icons/2x/icon_curve_out_in.png
Binary files differ
diff --git a/editor/icons/2x/icon_damped_spring_joint_2d.png b/editor/icons/2x/icon_damped_spring_joint_2d.png
new file mode 100644
index 0000000000..a51081efca
--- /dev/null
+++ b/editor/icons/2x/icon_damped_spring_joint_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_debug_continue.png b/editor/icons/2x/icon_debug_continue.png
new file mode 100644
index 0000000000..be460bd61d
--- /dev/null
+++ b/editor/icons/2x/icon_debug_continue.png
Binary files differ
diff --git a/editor/icons/2x/icon_debug_next.png b/editor/icons/2x/icon_debug_next.png
new file mode 100644
index 0000000000..b52e276f36
--- /dev/null
+++ b/editor/icons/2x/icon_debug_next.png
Binary files differ
diff --git a/editor/icons/2x/icon_debug_step.png b/editor/icons/2x/icon_debug_step.png
new file mode 100644
index 0000000000..e06a1ad56b
--- /dev/null
+++ b/editor/icons/2x/icon_debug_step.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_changed.png b/editor/icons/2x/icon_dependency_changed.png
new file mode 100644
index 0000000000..3ec13e0e3b
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_changed.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_changed_hl.png b/editor/icons/2x/icon_dependency_changed_hl.png
new file mode 100644
index 0000000000..630ea40554
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_changed_hl.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_local_changed.png b/editor/icons/2x/icon_dependency_local_changed.png
new file mode 100644
index 0000000000..9bc2545439
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_local_changed.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_local_changed_hl.png b/editor/icons/2x/icon_dependency_local_changed_hl.png
new file mode 100644
index 0000000000..385371df9f
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_local_changed_hl.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_ok.png b/editor/icons/2x/icon_dependency_ok.png
new file mode 100644
index 0000000000..80fe7f573a
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_ok.png
Binary files differ
diff --git a/editor/icons/2x/icon_dependency_ok_hl.png b/editor/icons/2x/icon_dependency_ok_hl.png
new file mode 100644
index 0000000000..9d496688cc
--- /dev/null
+++ b/editor/icons/2x/icon_dependency_ok_hl.png
Binary files differ
diff --git a/editor/icons/2x/icon_directional_light.png b/editor/icons/2x/icon_directional_light.png
new file mode 100644
index 0000000000..9a35325aec
--- /dev/null
+++ b/editor/icons/2x/icon_directional_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_distraction_free.png b/editor/icons/2x/icon_distraction_free.png
new file mode 100644
index 0000000000..034239a4e7
--- /dev/null
+++ b/editor/icons/2x/icon_distraction_free.png
Binary files differ
diff --git a/editor/icons/2x/icon_duplicate.png b/editor/icons/2x/icon_duplicate.png
new file mode 100644
index 0000000000..37996482ae
--- /dev/null
+++ b/editor/icons/2x/icon_duplicate.png
Binary files differ
diff --git a/editor/icons/2x/icon_dynamic_font.png b/editor/icons/2x/icon_dynamic_font.png
new file mode 100644
index 0000000000..1f1dc52dfb
--- /dev/null
+++ b/editor/icons/2x/icon_dynamic_font.png
Binary files differ
diff --git a/editor/icons/2x/icon_dynamic_font_data.png b/editor/icons/2x/icon_dynamic_font_data.png
new file mode 100644
index 0000000000..6d76303c81
--- /dev/null
+++ b/editor/icons/2x/icon_dynamic_font_data.png
Binary files differ
diff --git a/editor/icons/2x/icon_edit.png b/editor/icons/2x/icon_edit.png
new file mode 100644
index 0000000000..b9ed2c3e58
--- /dev/null
+++ b/editor/icons/2x/icon_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_edit_key.png b/editor/icons/2x/icon_edit_key.png
new file mode 100644
index 0000000000..58b9a6e749
--- /dev/null
+++ b/editor/icons/2x/icon_edit_key.png
Binary files differ
diff --git a/editor/icons/2x/icon_edit_pivot.png b/editor/icons/2x/icon_edit_pivot.png
new file mode 100644
index 0000000000..ac5a2cafb9
--- /dev/null
+++ b/editor/icons/2x/icon_edit_pivot.png
Binary files differ
diff --git a/editor/icons/2x/icon_edit_resource.png b/editor/icons/2x/icon_edit_resource.png
new file mode 100644
index 0000000000..5ba9b36b0a
--- /dev/null
+++ b/editor/icons/2x/icon_edit_resource.png
Binary files differ
diff --git a/editor/icons/2x/icon_editor_3d_handle.png b/editor/icons/2x/icon_editor_3d_handle.png
new file mode 100644
index 0000000000..f76af85cc1
--- /dev/null
+++ b/editor/icons/2x/icon_editor_3d_handle.png
Binary files differ
diff --git a/editor/icons/2x/icon_editor_handle.png b/editor/icons/2x/icon_editor_handle.png
new file mode 100644
index 0000000000..355d8fe155
--- /dev/null
+++ b/editor/icons/2x/icon_editor_handle.png
Binary files differ
diff --git a/editor/icons/2x/icon_editor_pivot.png b/editor/icons/2x/icon_editor_pivot.png
new file mode 100644
index 0000000000..e1666e38de
--- /dev/null
+++ b/editor/icons/2x/icon_editor_pivot.png
Binary files differ
diff --git a/editor/icons/2x/icon_editor_plugin.png b/editor/icons/2x/icon_editor_plugin.png
new file mode 100644
index 0000000000..f6411bb323
--- /dev/null
+++ b/editor/icons/2x/icon_editor_plugin.png
Binary files differ
diff --git a/editor/icons/2x/icon_enum.png b/editor/icons/2x/icon_enum.png
new file mode 100644
index 0000000000..d9df3a3ec3
--- /dev/null
+++ b/editor/icons/2x/icon_enum.png
Binary files differ
diff --git a/editor/icons/2x/icon_environment.png b/editor/icons/2x/icon_environment.png
new file mode 100644
index 0000000000..4c4c30b0e5
--- /dev/null
+++ b/editor/icons/2x/icon_environment.png
Binary files differ
diff --git a/editor/icons/2x/icon_error.png b/editor/icons/2x/icon_error.png
new file mode 100644
index 0000000000..a6d79ab41b
--- /dev/null
+++ b/editor/icons/2x/icon_error.png
Binary files differ
diff --git a/editor/icons/2x/icon_error_sign.png b/editor/icons/2x/icon_error_sign.png
new file mode 100644
index 0000000000..f1d16ea669
--- /dev/null
+++ b/editor/icons/2x/icon_error_sign.png
Binary files differ
diff --git a/editor/icons/2x/icon_event_player.png b/editor/icons/2x/icon_event_player.png
new file mode 100644
index 0000000000..2482c576db
--- /dev/null
+++ b/editor/icons/2x/icon_event_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_favorites.png b/editor/icons/2x/icon_favorites.png
new file mode 100644
index 0000000000..7a63835b3d
--- /dev/null
+++ b/editor/icons/2x/icon_favorites.png
Binary files differ
diff --git a/editor/icons/2x/icon_file.png b/editor/icons/2x/icon_file.png
new file mode 100644
index 0000000000..683f1141fd
--- /dev/null
+++ b/editor/icons/2x/icon_file.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_big.png b/editor/icons/2x/icon_file_big.png
new file mode 100644
index 0000000000..8c86c6b958
--- /dev/null
+++ b/editor/icons/2x/icon_file_big.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_dialog.png b/editor/icons/2x/icon_file_dialog.png
new file mode 100644
index 0000000000..f19b4d7507
--- /dev/null
+++ b/editor/icons/2x/icon_file_dialog.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_list.png b/editor/icons/2x/icon_file_list.png
new file mode 100644
index 0000000000..d9df3a3ec3
--- /dev/null
+++ b/editor/icons/2x/icon_file_list.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_server.png b/editor/icons/2x/icon_file_server.png
new file mode 100644
index 0000000000..d8021a4067
--- /dev/null
+++ b/editor/icons/2x/icon_file_server.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_server_active.png b/editor/icons/2x/icon_file_server_active.png
new file mode 100644
index 0000000000..f503fe406b
--- /dev/null
+++ b/editor/icons/2x/icon_file_server_active.png
Binary files differ
diff --git a/editor/icons/2x/icon_file_thumbnail.png b/editor/icons/2x/icon_file_thumbnail.png
new file mode 100644
index 0000000000..5a8d282fe1
--- /dev/null
+++ b/editor/icons/2x/icon_file_thumbnail.png
Binary files differ
diff --git a/editor/icons/2x/icon_filesystem.png b/editor/icons/2x/icon_filesystem.png
new file mode 100644
index 0000000000..4ae0b3edab
--- /dev/null
+++ b/editor/icons/2x/icon_filesystem.png
Binary files differ
diff --git a/editor/icons/2x/icon_fixed_material.png b/editor/icons/2x/icon_fixed_material.png
new file mode 100644
index 0000000000..21bfb15838
--- /dev/null
+++ b/editor/icons/2x/icon_fixed_material.png
Binary files differ
diff --git a/editor/icons/2x/icon_fixed_spatial_material.png b/editor/icons/2x/icon_fixed_spatial_material.png
new file mode 100644
index 0000000000..65509a590e
--- /dev/null
+++ b/editor/icons/2x/icon_fixed_spatial_material.png
Binary files differ
diff --git a/editor/icons/2x/icon_folder.png b/editor/icons/2x/icon_folder.png
new file mode 100644
index 0000000000..2e797c448b
--- /dev/null
+++ b/editor/icons/2x/icon_folder.png
Binary files differ
diff --git a/editor/icons/2x/icon_folder_big.png b/editor/icons/2x/icon_folder_big.png
new file mode 100644
index 0000000000..b89600619a
--- /dev/null
+++ b/editor/icons/2x/icon_folder_big.png
Binary files differ
diff --git a/editor/icons/2x/icon_font.png b/editor/icons/2x/icon_font.png
new file mode 100644
index 0000000000..b78c95a827
--- /dev/null
+++ b/editor/icons/2x/icon_font.png
Binary files differ
diff --git a/editor/icons/2x/icon_forward.png b/editor/icons/2x/icon_forward.png
new file mode 100644
index 0000000000..11fd444a04
--- /dev/null
+++ b/editor/icons/2x/icon_forward.png
Binary files differ
diff --git a/editor/icons/2x/icon_g_d_script.png b/editor/icons/2x/icon_g_d_script.png
new file mode 100644
index 0000000000..6143191fc7
--- /dev/null
+++ b/editor/icons/2x/icon_g_d_script.png
Binary files differ
diff --git a/editor/icons/2x/icon_g_i_probe.png b/editor/icons/2x/icon_g_i_probe.png
new file mode 100644
index 0000000000..921f1cca42
--- /dev/null
+++ b/editor/icons/2x/icon_g_i_probe.png
Binary files differ
diff --git a/editor/icons/2x/icon_g_i_probe_data.png b/editor/icons/2x/icon_g_i_probe_data.png
new file mode 100644
index 0000000000..69c4ed7184
--- /dev/null
+++ b/editor/icons/2x/icon_g_i_probe_data.png
Binary files differ
diff --git a/editor/icons/2x/icon_generic_6_d_o_f_joint.png b/editor/icons/2x/icon_generic_6_d_o_f_joint.png
new file mode 100644
index 0000000000..506c873376
--- /dev/null
+++ b/editor/icons/2x/icon_generic_6_d_o_f_joint.png
Binary files differ
diff --git a/editor/icons/2x/icon_gizmo_directional_light.png b/editor/icons/2x/icon_gizmo_directional_light.png
new file mode 100644
index 0000000000..0d02788040
--- /dev/null
+++ b/editor/icons/2x/icon_gizmo_directional_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_gizmo_light.png b/editor/icons/2x/icon_gizmo_light.png
new file mode 100644
index 0000000000..2ba9689107
--- /dev/null
+++ b/editor/icons/2x/icon_gizmo_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_gizmo_listener.png b/editor/icons/2x/icon_gizmo_listener.png
new file mode 100644
index 0000000000..bc2908824d
--- /dev/null
+++ b/editor/icons/2x/icon_gizmo_listener.png
Binary files differ
diff --git a/editor/icons/2x/icon_gizmo_spatial_sample_player.png b/editor/icons/2x/icon_gizmo_spatial_sample_player.png
new file mode 100644
index 0000000000..78a88c55c1
--- /dev/null
+++ b/editor/icons/2x/icon_gizmo_spatial_sample_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_gizmo_spatial_stream_player.png b/editor/icons/2x/icon_gizmo_spatial_stream_player.png
new file mode 100644
index 0000000000..631f03e874
--- /dev/null
+++ b/editor/icons/2x/icon_gizmo_spatial_stream_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_godot.png b/editor/icons/2x/icon_godot.png
new file mode 100644
index 0000000000..94d87e23cc
--- /dev/null
+++ b/editor/icons/2x/icon_godot.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_color_ramp.png b/editor/icons/2x/icon_graph_color_ramp.png
new file mode 100644
index 0000000000..d0056f0c7d
--- /dev/null
+++ b/editor/icons/2x/icon_graph_color_ramp.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_comment.png b/editor/icons/2x/icon_graph_comment.png
new file mode 100644
index 0000000000..3dedbfab52
--- /dev/null
+++ b/editor/icons/2x/icon_graph_comment.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_cube_uniform.png b/editor/icons/2x/icon_graph_cube_uniform.png
new file mode 100644
index 0000000000..43ec1fa6d6
--- /dev/null
+++ b/editor/icons/2x/icon_graph_cube_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_curve_map.png b/editor/icons/2x/icon_graph_curve_map.png
new file mode 100644
index 0000000000..f29086e503
--- /dev/null
+++ b/editor/icons/2x/icon_graph_curve_map.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_default_texture.png b/editor/icons/2x/icon_graph_default_texture.png
new file mode 100644
index 0000000000..45e4470502
--- /dev/null
+++ b/editor/icons/2x/icon_graph_default_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_edit.png b/editor/icons/2x/icon_graph_edit.png
new file mode 100644
index 0000000000..bd4386839d
--- /dev/null
+++ b/editor/icons/2x/icon_graph_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_input.png b/editor/icons/2x/icon_graph_input.png
new file mode 100644
index 0000000000..3eeb29a3e7
--- /dev/null
+++ b/editor/icons/2x/icon_graph_input.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_node.png b/editor/icons/2x/icon_graph_node.png
new file mode 100644
index 0000000000..7ce633af4d
--- /dev/null
+++ b/editor/icons/2x/icon_graph_node.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_rgb.png b/editor/icons/2x/icon_graph_rgb.png
new file mode 100644
index 0000000000..a9c39f0222
--- /dev/null
+++ b/editor/icons/2x/icon_graph_rgb.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_rgb_op.png b/editor/icons/2x/icon_graph_rgb_op.png
new file mode 100644
index 0000000000..44812d8dd8
--- /dev/null
+++ b/editor/icons/2x/icon_graph_rgb_op.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_rgb_uniform.png b/editor/icons/2x/icon_graph_rgb_uniform.png
new file mode 100644
index 0000000000..b06f1d4d8d
--- /dev/null
+++ b/editor/icons/2x/icon_graph_rgb_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_scalar.png b/editor/icons/2x/icon_graph_scalar.png
new file mode 100644
index 0000000000..382c429d35
--- /dev/null
+++ b/editor/icons/2x/icon_graph_scalar.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_scalar_interp.png b/editor/icons/2x/icon_graph_scalar_interp.png
new file mode 100644
index 0000000000..430e35470f
--- /dev/null
+++ b/editor/icons/2x/icon_graph_scalar_interp.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_scalar_op.png b/editor/icons/2x/icon_graph_scalar_op.png
new file mode 100644
index 0000000000..b90b6a6190
--- /dev/null
+++ b/editor/icons/2x/icon_graph_scalar_op.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_scalar_uniform.png b/editor/icons/2x/icon_graph_scalar_uniform.png
new file mode 100644
index 0000000000..dff850df03
--- /dev/null
+++ b/editor/icons/2x/icon_graph_scalar_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_scalars_to_vec.png b/editor/icons/2x/icon_graph_scalars_to_vec.png
new file mode 100644
index 0000000000..266c84e5ae
--- /dev/null
+++ b/editor/icons/2x/icon_graph_scalars_to_vec.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_texscreen.png b/editor/icons/2x/icon_graph_texscreen.png
new file mode 100644
index 0000000000..8b1d250129
--- /dev/null
+++ b/editor/icons/2x/icon_graph_texscreen.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_texture_uniform.png b/editor/icons/2x/icon_graph_texture_uniform.png
new file mode 100644
index 0000000000..ee211b6c03
--- /dev/null
+++ b/editor/icons/2x/icon_graph_texture_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_time.png b/editor/icons/2x/icon_graph_time.png
new file mode 100644
index 0000000000..3cf9bf2035
--- /dev/null
+++ b/editor/icons/2x/icon_graph_time.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_dp.png b/editor/icons/2x/icon_graph_vec_dp.png
new file mode 100644
index 0000000000..e339f6a1e8
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_dp.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_interp.png b/editor/icons/2x/icon_graph_vec_interp.png
new file mode 100644
index 0000000000..02e7915748
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_interp.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_length.png b/editor/icons/2x/icon_graph_vec_length.png
new file mode 100644
index 0000000000..857e006b6e
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_length.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_op.png b/editor/icons/2x/icon_graph_vec_op.png
new file mode 100644
index 0000000000..282336f9d0
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_op.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_scalar_op.png b/editor/icons/2x/icon_graph_vec_scalar_op.png
new file mode 100644
index 0000000000..38d355ef06
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_scalar_op.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vec_to_scalars.png b/editor/icons/2x/icon_graph_vec_to_scalars.png
new file mode 100644
index 0000000000..1b8254b3c6
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vec_to_scalars.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vecs_to_xform.png b/editor/icons/2x/icon_graph_vecs_to_xform.png
new file mode 100644
index 0000000000..a9ed5052be
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vecs_to_xform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vector.png b/editor/icons/2x/icon_graph_vector.png
new file mode 100644
index 0000000000..eb4e94acee
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vector.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_vector_uniform.png b/editor/icons/2x/icon_graph_vector_uniform.png
new file mode 100644
index 0000000000..94cde72904
--- /dev/null
+++ b/editor/icons/2x/icon_graph_vector_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform.png b/editor/icons/2x/icon_graph_xform.png
new file mode 100644
index 0000000000..4d823e2aa9
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_mult.png b/editor/icons/2x/icon_graph_xform_mult.png
new file mode 100644
index 0000000000..a6d41e43a4
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_mult.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_scalar_func.png b/editor/icons/2x/icon_graph_xform_scalar_func.png
new file mode 100644
index 0000000000..06826a1ca2
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_scalar_func.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_to_vecs.png b/editor/icons/2x/icon_graph_xform_to_vecs.png
new file mode 100644
index 0000000000..22125df573
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_to_vecs.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_uniform.png b/editor/icons/2x/icon_graph_xform_uniform.png
new file mode 100644
index 0000000000..b87f9936b8
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_uniform.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_vec_func.png b/editor/icons/2x/icon_graph_xform_vec_func.png
new file mode 100644
index 0000000000..007555ff7b
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_vec_func.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_vec_imult.png b/editor/icons/2x/icon_graph_xform_vec_imult.png
new file mode 100644
index 0000000000..39e25ef9b3
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_vec_imult.png
Binary files differ
diff --git a/editor/icons/2x/icon_graph_xform_vec_mult.png b/editor/icons/2x/icon_graph_xform_vec_mult.png
new file mode 100644
index 0000000000..32802fa1ed
--- /dev/null
+++ b/editor/icons/2x/icon_graph_xform_vec_mult.png
Binary files differ
diff --git a/editor/icons/2x/icon_grid.png b/editor/icons/2x/icon_grid.png
new file mode 100644
index 0000000000..99d896c012
--- /dev/null
+++ b/editor/icons/2x/icon_grid.png
Binary files differ
diff --git a/editor/icons/2x/icon_grid_container.png b/editor/icons/2x/icon_grid_container.png
new file mode 100644
index 0000000000..b83b1f4347
--- /dev/null
+++ b/editor/icons/2x/icon_grid_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_grid_map.png b/editor/icons/2x/icon_grid_map.png
new file mode 100644
index 0000000000..5bbd16d3df
--- /dev/null
+++ b/editor/icons/2x/icon_grid_map.png
Binary files differ
diff --git a/editor/icons/2x/icon_groove_joint_2d.png b/editor/icons/2x/icon_groove_joint_2d.png
new file mode 100644
index 0000000000..ab9cd4f3eb
--- /dev/null
+++ b/editor/icons/2x/icon_groove_joint_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_group.png b/editor/icons/2x/icon_group.png
new file mode 100644
index 0000000000..158efa5fe4
--- /dev/null
+++ b/editor/icons/2x/icon_group.png
Binary files differ
diff --git a/editor/icons/2x/icon_groups.png b/editor/icons/2x/icon_groups.png
new file mode 100644
index 0000000000..203d36071b
--- /dev/null
+++ b/editor/icons/2x/icon_groups.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_box_container.png b/editor/icons/2x/icon_h_box_container.png
new file mode 100644
index 0000000000..3767cab1cf
--- /dev/null
+++ b/editor/icons/2x/icon_h_box_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_button_array.png b/editor/icons/2x/icon_h_button_array.png
new file mode 100644
index 0000000000..750eef8267
--- /dev/null
+++ b/editor/icons/2x/icon_h_button_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_scroll_bar.png b/editor/icons/2x/icon_h_scroll_bar.png
new file mode 100644
index 0000000000..d15a36bb16
--- /dev/null
+++ b/editor/icons/2x/icon_h_scroll_bar.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_separator.png b/editor/icons/2x/icon_h_separator.png
new file mode 100644
index 0000000000..7dd7e1e314
--- /dev/null
+++ b/editor/icons/2x/icon_h_separator.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_slider.png b/editor/icons/2x/icon_h_slider.png
new file mode 100644
index 0000000000..50bad1cc18
--- /dev/null
+++ b/editor/icons/2x/icon_h_slider.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_split_container.png b/editor/icons/2x/icon_h_split_container.png
new file mode 100644
index 0000000000..33e18946c1
--- /dev/null
+++ b/editor/icons/2x/icon_h_split_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_h_t_t_p_request.png b/editor/icons/2x/icon_h_t_t_p_request.png
new file mode 100644
index 0000000000..a334dea4e2
--- /dev/null
+++ b/editor/icons/2x/icon_h_t_t_p_request.png
Binary files differ
diff --git a/editor/icons/2x/icon_headphones.png b/editor/icons/2x/icon_headphones.png
new file mode 100644
index 0000000000..eca62b9372
--- /dev/null
+++ b/editor/icons/2x/icon_headphones.png
Binary files differ
diff --git a/editor/icons/2x/icon_help.png b/editor/icons/2x/icon_help.png
new file mode 100644
index 0000000000..f16a34c918
--- /dev/null
+++ b/editor/icons/2x/icon_help.png
Binary files differ
diff --git a/editor/icons/2x/icon_hidden.png b/editor/icons/2x/icon_hidden.png
new file mode 100644
index 0000000000..09d38c5bef
--- /dev/null
+++ b/editor/icons/2x/icon_hidden.png
Binary files differ
diff --git a/editor/icons/2x/icon_hinge_joint.png b/editor/icons/2x/icon_hinge_joint.png
new file mode 100644
index 0000000000..b888102573
--- /dev/null
+++ b/editor/icons/2x/icon_hinge_joint.png
Binary files differ
diff --git a/editor/icons/2x/icon_history.png b/editor/icons/2x/icon_history.png
new file mode 100644
index 0000000000..153a2b4edf
--- /dev/null
+++ b/editor/icons/2x/icon_history.png
Binary files differ
diff --git a/editor/icons/2x/icon_hsize.png b/editor/icons/2x/icon_hsize.png
new file mode 100644
index 0000000000..3b096dce88
--- /dev/null
+++ b/editor/icons/2x/icon_hsize.png
Binary files differ
diff --git a/editor/icons/2x/icon_image.png b/editor/icons/2x/icon_image.png
new file mode 100644
index 0000000000..951b2242f1
--- /dev/null
+++ b/editor/icons/2x/icon_image.png
Binary files differ
diff --git a/editor/icons/2x/icon_image_sky_box.png b/editor/icons/2x/icon_image_sky_box.png
new file mode 100644
index 0000000000..487178afab
--- /dev/null
+++ b/editor/icons/2x/icon_image_sky_box.png
Binary files differ
diff --git a/editor/icons/2x/icon_image_texture.png b/editor/icons/2x/icon_image_texture.png
new file mode 100644
index 0000000000..ad5d04dfee
--- /dev/null
+++ b/editor/icons/2x/icon_image_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_immediate_geometry.png b/editor/icons/2x/icon_immediate_geometry.png
new file mode 100644
index 0000000000..5fafecadc3
--- /dev/null
+++ b/editor/icons/2x/icon_immediate_geometry.png
Binary files differ
diff --git a/editor/icons/2x/icon_import_check.png b/editor/icons/2x/icon_import_check.png
new file mode 100644
index 0000000000..98e76e2640
--- /dev/null
+++ b/editor/icons/2x/icon_import_check.png
Binary files differ
diff --git a/editor/icons/2x/icon_import_fail.png b/editor/icons/2x/icon_import_fail.png
new file mode 100644
index 0000000000..f89c2f5c75
--- /dev/null
+++ b/editor/icons/2x/icon_import_fail.png
Binary files differ
diff --git a/editor/icons/2x/icon_instance.png b/editor/icons/2x/icon_instance.png
new file mode 100644
index 0000000000..9b4731de03
--- /dev/null
+++ b/editor/icons/2x/icon_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_instance_options.png b/editor/icons/2x/icon_instance_options.png
new file mode 100644
index 0000000000..28e2db25f2
--- /dev/null
+++ b/editor/icons/2x/icon_instance_options.png
Binary files differ
diff --git a/editor/icons/2x/icon_integer.png b/editor/icons/2x/icon_integer.png
new file mode 100644
index 0000000000..7ad2f62458
--- /dev/null
+++ b/editor/icons/2x/icon_integer.png
Binary files differ
diff --git a/editor/icons/2x/icon_interp_cubic.png b/editor/icons/2x/icon_interp_cubic.png
new file mode 100644
index 0000000000..e33bb65577
--- /dev/null
+++ b/editor/icons/2x/icon_interp_cubic.png
Binary files differ
diff --git a/editor/icons/2x/icon_interp_linear.png b/editor/icons/2x/icon_interp_linear.png
new file mode 100644
index 0000000000..205f7febd5
--- /dev/null
+++ b/editor/icons/2x/icon_interp_linear.png
Binary files differ
diff --git a/editor/icons/2x/icon_interp_raw.png b/editor/icons/2x/icon_interp_raw.png
new file mode 100644
index 0000000000..848ef07be6
--- /dev/null
+++ b/editor/icons/2x/icon_interp_raw.png
Binary files differ
diff --git a/editor/icons/2x/icon_interp_wrap_clamp.png b/editor/icons/2x/icon_interp_wrap_clamp.png
new file mode 100644
index 0000000000..93a5bc56ee
--- /dev/null
+++ b/editor/icons/2x/icon_interp_wrap_clamp.png
Binary files differ
diff --git a/editor/icons/2x/icon_interp_wrap_loop.png b/editor/icons/2x/icon_interp_wrap_loop.png
new file mode 100644
index 0000000000..3e656f7b07
--- /dev/null
+++ b/editor/icons/2x/icon_interp_wrap_loop.png
Binary files differ
diff --git a/editor/icons/2x/icon_interpolated_camera.png b/editor/icons/2x/icon_interpolated_camera.png
new file mode 100644
index 0000000000..e4551a84ce
--- /dev/null
+++ b/editor/icons/2x/icon_interpolated_camera.png
Binary files differ
diff --git a/editor/icons/2x/icon_invalid_key.png b/editor/icons/2x/icon_invalid_key.png
new file mode 100644
index 0000000000..c34f2bc276
--- /dev/null
+++ b/editor/icons/2x/icon_invalid_key.png
Binary files differ
diff --git a/editor/icons/2x/icon_inverse_kinematics.png b/editor/icons/2x/icon_inverse_kinematics.png
new file mode 100644
index 0000000000..3b10c9590c
--- /dev/null
+++ b/editor/icons/2x/icon_inverse_kinematics.png
Binary files differ
diff --git a/editor/icons/2x/icon_item_list.png b/editor/icons/2x/icon_item_list.png
new file mode 100644
index 0000000000..11a375caac
--- /dev/null
+++ b/editor/icons/2x/icon_item_list.png
Binary files differ
diff --git a/editor/icons/2x/icon_joy_axis.png b/editor/icons/2x/icon_joy_axis.png
new file mode 100644
index 0000000000..90f3d7a444
--- /dev/null
+++ b/editor/icons/2x/icon_joy_axis.png
Binary files differ
diff --git a/editor/icons/2x/icon_joy_button.png b/editor/icons/2x/icon_joy_button.png
new file mode 100644
index 0000000000..a6b911ba1b
--- /dev/null
+++ b/editor/icons/2x/icon_joy_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_joypad.png b/editor/icons/2x/icon_joypad.png
new file mode 100644
index 0000000000..285d048544
--- /dev/null
+++ b/editor/icons/2x/icon_joypad.png
Binary files differ
diff --git a/editor/icons/2x/icon_key.png b/editor/icons/2x/icon_key.png
new file mode 100644
index 0000000000..d0c07bb1ea
--- /dev/null
+++ b/editor/icons/2x/icon_key.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_hover.png b/editor/icons/2x/icon_key_hover.png
new file mode 100644
index 0000000000..c9894ad8bf
--- /dev/null
+++ b/editor/icons/2x/icon_key_hover.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_invalid.png b/editor/icons/2x/icon_key_invalid.png
new file mode 100644
index 0000000000..c34f2bc276
--- /dev/null
+++ b/editor/icons/2x/icon_key_invalid.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_next.png b/editor/icons/2x/icon_key_next.png
new file mode 100644
index 0000000000..d35b52d3c7
--- /dev/null
+++ b/editor/icons/2x/icon_key_next.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_selected.png b/editor/icons/2x/icon_key_selected.png
new file mode 100644
index 0000000000..243dacb604
--- /dev/null
+++ b/editor/icons/2x/icon_key_selected.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_value.png b/editor/icons/2x/icon_key_value.png
new file mode 100644
index 0000000000..3863403706
--- /dev/null
+++ b/editor/icons/2x/icon_key_value.png
Binary files differ
diff --git a/editor/icons/2x/icon_key_xform.png b/editor/icons/2x/icon_key_xform.png
new file mode 100644
index 0000000000..70c49b5b5f
--- /dev/null
+++ b/editor/icons/2x/icon_key_xform.png
Binary files differ
diff --git a/editor/icons/2x/icon_keyboard.png b/editor/icons/2x/icon_keyboard.png
new file mode 100644
index 0000000000..a7daa06cc2
--- /dev/null
+++ b/editor/icons/2x/icon_keyboard.png
Binary files differ
diff --git a/editor/icons/2x/icon_kinematic_body.png b/editor/icons/2x/icon_kinematic_body.png
new file mode 100644
index 0000000000..59298dfa72
--- /dev/null
+++ b/editor/icons/2x/icon_kinematic_body.png
Binary files differ
diff --git a/editor/icons/2x/icon_kinematic_body_2d.png b/editor/icons/2x/icon_kinematic_body_2d.png
new file mode 100644
index 0000000000..5fd3b319ac
--- /dev/null
+++ b/editor/icons/2x/icon_kinematic_body_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_label.png b/editor/icons/2x/icon_label.png
new file mode 100644
index 0000000000..c5e3bc844d
--- /dev/null
+++ b/editor/icons/2x/icon_label.png
Binary files differ
diff --git a/editor/icons/2x/icon_large_texture.png b/editor/icons/2x/icon_large_texture.png
new file mode 100644
index 0000000000..dd1ec86d39
--- /dev/null
+++ b/editor/icons/2x/icon_large_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_light_2d.png b/editor/icons/2x/icon_light_2d.png
new file mode 100644
index 0000000000..d441659354
--- /dev/null
+++ b/editor/icons/2x/icon_light_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_light_occluder_2d.png b/editor/icons/2x/icon_light_occluder_2d.png
new file mode 100644
index 0000000000..90e4387297
--- /dev/null
+++ b/editor/icons/2x/icon_light_occluder_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_line_2d.png b/editor/icons/2x/icon_line_2d.png
new file mode 100644
index 0000000000..27299a2b69
--- /dev/null
+++ b/editor/icons/2x/icon_line_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_line_edit.png b/editor/icons/2x/icon_line_edit.png
new file mode 100644
index 0000000000..d0c987388f
--- /dev/null
+++ b/editor/icons/2x/icon_line_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_line_shape_2d.png b/editor/icons/2x/icon_line_shape_2d.png
new file mode 100644
index 0000000000..490db5ca5b
--- /dev/null
+++ b/editor/icons/2x/icon_line_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_link_button.png b/editor/icons/2x/icon_link_button.png
new file mode 100644
index 0000000000..20f300a553
--- /dev/null
+++ b/editor/icons/2x/icon_link_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_list_select.png b/editor/icons/2x/icon_list_select.png
new file mode 100644
index 0000000000..9f7fa5b865
--- /dev/null
+++ b/editor/icons/2x/icon_list_select.png
Binary files differ
diff --git a/editor/icons/2x/icon_listener.png b/editor/icons/2x/icon_listener.png
new file mode 100644
index 0000000000..1441a81bdd
--- /dev/null
+++ b/editor/icons/2x/icon_listener.png
Binary files differ
diff --git a/editor/icons/2x/icon_load.png b/editor/icons/2x/icon_load.png
new file mode 100644
index 0000000000..759381d636
--- /dev/null
+++ b/editor/icons/2x/icon_load.png
Binary files differ
diff --git a/editor/icons/2x/icon_lock.png b/editor/icons/2x/icon_lock.png
new file mode 100644
index 0000000000..912eaf9eb9
--- /dev/null
+++ b/editor/icons/2x/icon_lock.png
Binary files differ
diff --git a/editor/icons/2x/icon_loop.png b/editor/icons/2x/icon_loop.png
new file mode 100644
index 0000000000..bd1322ae00
--- /dev/null
+++ b/editor/icons/2x/icon_loop.png
Binary files differ
diff --git a/editor/icons/2x/icon_loop_interpolation.png b/editor/icons/2x/icon_loop_interpolation.png
new file mode 100644
index 0000000000..6009b50300
--- /dev/null
+++ b/editor/icons/2x/icon_loop_interpolation.png
Binary files differ
diff --git a/editor/icons/2x/icon_main_play.png b/editor/icons/2x/icon_main_play.png
new file mode 100644
index 0000000000..1f69ce6f17
--- /dev/null
+++ b/editor/icons/2x/icon_main_play.png
Binary files differ
diff --git a/editor/icons/2x/icon_main_stop.png b/editor/icons/2x/icon_main_stop.png
new file mode 100644
index 0000000000..5048141485
--- /dev/null
+++ b/editor/icons/2x/icon_main_stop.png
Binary files differ
diff --git a/editor/icons/2x/icon_margin_container.png b/editor/icons/2x/icon_margin_container.png
new file mode 100644
index 0000000000..10eda265e0
--- /dev/null
+++ b/editor/icons/2x/icon_margin_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_cube.png b/editor/icons/2x/icon_material_preview_cube.png
new file mode 100644
index 0000000000..2507c969c3
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_cube.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_cube_off.png b/editor/icons/2x/icon_material_preview_cube_off.png
new file mode 100644
index 0000000000..079b3a6645
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_cube_off.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_light_1.png b/editor/icons/2x/icon_material_preview_light_1.png
new file mode 100644
index 0000000000..f1d0ccdaca
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_light_1.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_light_1_off.png b/editor/icons/2x/icon_material_preview_light_1_off.png
new file mode 100644
index 0000000000..5a42b7f2a1
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_light_1_off.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_light_2.png b/editor/icons/2x/icon_material_preview_light_2.png
new file mode 100644
index 0000000000..934e696b51
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_light_2.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_light_2_off.png b/editor/icons/2x/icon_material_preview_light_2_off.png
new file mode 100644
index 0000000000..1aa4c0bb79
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_light_2_off.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_sphere.png b/editor/icons/2x/icon_material_preview_sphere.png
new file mode 100644
index 0000000000..f5cc7f7819
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_sphere.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_preview_sphere_off.png b/editor/icons/2x/icon_material_preview_sphere_off.png
new file mode 100644
index 0000000000..7ccef62553
--- /dev/null
+++ b/editor/icons/2x/icon_material_preview_sphere_off.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_shader.png b/editor/icons/2x/icon_material_shader.png
new file mode 100644
index 0000000000..f8c2e15fcb
--- /dev/null
+++ b/editor/icons/2x/icon_material_shader.png
Binary files differ
diff --git a/editor/icons/2x/icon_material_shader_graph.png b/editor/icons/2x/icon_material_shader_graph.png
new file mode 100644
index 0000000000..a26a9754fe
--- /dev/null
+++ b/editor/icons/2x/icon_material_shader_graph.png
Binary files differ
diff --git a/editor/icons/2x/icon_matrix.png b/editor/icons/2x/icon_matrix.png
new file mode 100644
index 0000000000..0ac4ae170b
--- /dev/null
+++ b/editor/icons/2x/icon_matrix.png
Binary files differ
diff --git a/editor/icons/2x/icon_menu_button.png b/editor/icons/2x/icon_menu_button.png
new file mode 100644
index 0000000000..abf9b490e3
--- /dev/null
+++ b/editor/icons/2x/icon_menu_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_mesh.png b/editor/icons/2x/icon_mesh.png
new file mode 100644
index 0000000000..19b9095619
--- /dev/null
+++ b/editor/icons/2x/icon_mesh.png
Binary files differ
diff --git a/editor/icons/2x/icon_mesh_instance.png b/editor/icons/2x/icon_mesh_instance.png
new file mode 100644
index 0000000000..02f3f5ffaa
--- /dev/null
+++ b/editor/icons/2x/icon_mesh_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_mesh_library.png b/editor/icons/2x/icon_mesh_library.png
new file mode 100644
index 0000000000..2495e4a037
--- /dev/null
+++ b/editor/icons/2x/icon_mesh_library.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_aabb.png b/editor/icons/2x/icon_mini_aabb.png
new file mode 100644
index 0000000000..25603eec49
--- /dev/null
+++ b/editor/icons/2x/icon_mini_aabb.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_array.png b/editor/icons/2x/icon_mini_array.png
new file mode 100644
index 0000000000..5c7bde2639
--- /dev/null
+++ b/editor/icons/2x/icon_mini_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_boolean.png b/editor/icons/2x/icon_mini_boolean.png
new file mode 100644
index 0000000000..a7d00056bb
--- /dev/null
+++ b/editor/icons/2x/icon_mini_boolean.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_color.png b/editor/icons/2x/icon_mini_color.png
new file mode 100644
index 0000000000..f4059bfb91
--- /dev/null
+++ b/editor/icons/2x/icon_mini_color.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_color_array.png b/editor/icons/2x/icon_mini_color_array.png
new file mode 100644
index 0000000000..26f1d9fce4
--- /dev/null
+++ b/editor/icons/2x/icon_mini_color_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_dictionary.png b/editor/icons/2x/icon_mini_dictionary.png
new file mode 100644
index 0000000000..241e0587b4
--- /dev/null
+++ b/editor/icons/2x/icon_mini_dictionary.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_float.png b/editor/icons/2x/icon_mini_float.png
new file mode 100644
index 0000000000..6edf76ece1
--- /dev/null
+++ b/editor/icons/2x/icon_mini_float.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_float_array.png b/editor/icons/2x/icon_mini_float_array.png
new file mode 100644
index 0000000000..5a79fab721
--- /dev/null
+++ b/editor/icons/2x/icon_mini_float_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_image.png b/editor/icons/2x/icon_mini_image.png
new file mode 100644
index 0000000000..98faebeef2
--- /dev/null
+++ b/editor/icons/2x/icon_mini_image.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_input.png b/editor/icons/2x/icon_mini_input.png
new file mode 100644
index 0000000000..48536e156c
--- /dev/null
+++ b/editor/icons/2x/icon_mini_input.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_int_array.png b/editor/icons/2x/icon_mini_int_array.png
new file mode 100644
index 0000000000..790ed44c30
--- /dev/null
+++ b/editor/icons/2x/icon_mini_int_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_integer.png b/editor/icons/2x/icon_mini_integer.png
new file mode 100644
index 0000000000..cd9118f024
--- /dev/null
+++ b/editor/icons/2x/icon_mini_integer.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_matrix3.png b/editor/icons/2x/icon_mini_matrix3.png
new file mode 100644
index 0000000000..93783177e1
--- /dev/null
+++ b/editor/icons/2x/icon_mini_matrix3.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_matrix32.png b/editor/icons/2x/icon_mini_matrix32.png
new file mode 100644
index 0000000000..c2f7ea3817
--- /dev/null
+++ b/editor/icons/2x/icon_mini_matrix32.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_object.png b/editor/icons/2x/icon_mini_object.png
new file mode 100644
index 0000000000..7987f750ff
--- /dev/null
+++ b/editor/icons/2x/icon_mini_object.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_path.png b/editor/icons/2x/icon_mini_path.png
new file mode 100644
index 0000000000..2e60a46086
--- /dev/null
+++ b/editor/icons/2x/icon_mini_path.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_plane.png b/editor/icons/2x/icon_mini_plane.png
new file mode 100644
index 0000000000..12b5cd26cc
--- /dev/null
+++ b/editor/icons/2x/icon_mini_plane.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_quat.png b/editor/icons/2x/icon_mini_quat.png
new file mode 100644
index 0000000000..9a33902e59
--- /dev/null
+++ b/editor/icons/2x/icon_mini_quat.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_raw_array.png b/editor/icons/2x/icon_mini_raw_array.png
new file mode 100644
index 0000000000..629b01e72a
--- /dev/null
+++ b/editor/icons/2x/icon_mini_raw_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_rect2.png b/editor/icons/2x/icon_mini_rect2.png
new file mode 100644
index 0000000000..88b12e3a3a
--- /dev/null
+++ b/editor/icons/2x/icon_mini_rect2.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_rid.png b/editor/icons/2x/icon_mini_rid.png
new file mode 100644
index 0000000000..5388c19817
--- /dev/null
+++ b/editor/icons/2x/icon_mini_rid.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_string.png b/editor/icons/2x/icon_mini_string.png
new file mode 100644
index 0000000000..2264451c73
--- /dev/null
+++ b/editor/icons/2x/icon_mini_string.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_string_array.png b/editor/icons/2x/icon_mini_string_array.png
new file mode 100644
index 0000000000..fa8109b88a
--- /dev/null
+++ b/editor/icons/2x/icon_mini_string_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_transform.png b/editor/icons/2x/icon_mini_transform.png
new file mode 100644
index 0000000000..5144871c5c
--- /dev/null
+++ b/editor/icons/2x/icon_mini_transform.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_variant.png b/editor/icons/2x/icon_mini_variant.png
new file mode 100644
index 0000000000..ae0aad16cf
--- /dev/null
+++ b/editor/icons/2x/icon_mini_variant.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_vector2.png b/editor/icons/2x/icon_mini_vector2.png
new file mode 100644
index 0000000000..9e608e61c1
--- /dev/null
+++ b/editor/icons/2x/icon_mini_vector2.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_vector2_array.png b/editor/icons/2x/icon_mini_vector2_array.png
new file mode 100644
index 0000000000..247c0e2592
--- /dev/null
+++ b/editor/icons/2x/icon_mini_vector2_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_vector3.png b/editor/icons/2x/icon_mini_vector3.png
new file mode 100644
index 0000000000..0b84b4628f
--- /dev/null
+++ b/editor/icons/2x/icon_mini_vector3.png
Binary files differ
diff --git a/editor/icons/2x/icon_mini_vector3_array.png b/editor/icons/2x/icon_mini_vector3_array.png
new file mode 100644
index 0000000000..68058e4232
--- /dev/null
+++ b/editor/icons/2x/icon_mini_vector3_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_mirror_x.png b/editor/icons/2x/icon_mirror_x.png
new file mode 100644
index 0000000000..3b096dce88
--- /dev/null
+++ b/editor/icons/2x/icon_mirror_x.png
Binary files differ
diff --git a/editor/icons/2x/icon_mirror_y.png b/editor/icons/2x/icon_mirror_y.png
new file mode 100644
index 0000000000..4c89b167b5
--- /dev/null
+++ b/editor/icons/2x/icon_mirror_y.png
Binary files differ
diff --git a/editor/icons/2x/icon_mouse.png b/editor/icons/2x/icon_mouse.png
new file mode 100644
index 0000000000..9c4a76bd4f
--- /dev/null
+++ b/editor/icons/2x/icon_mouse.png
Binary files differ
diff --git a/editor/icons/2x/icon_move_down.png b/editor/icons/2x/icon_move_down.png
new file mode 100644
index 0000000000..97bbeea631
--- /dev/null
+++ b/editor/icons/2x/icon_move_down.png
Binary files differ
diff --git a/editor/icons/2x/icon_move_point.png b/editor/icons/2x/icon_move_point.png
new file mode 100644
index 0000000000..5d135ae294
--- /dev/null
+++ b/editor/icons/2x/icon_move_point.png
Binary files differ
diff --git a/editor/icons/2x/icon_move_up.png b/editor/icons/2x/icon_move_up.png
new file mode 100644
index 0000000000..f8f31baeb1
--- /dev/null
+++ b/editor/icons/2x/icon_move_up.png
Binary files differ
diff --git a/editor/icons/2x/icon_multi_edit.png b/editor/icons/2x/icon_multi_edit.png
new file mode 100644
index 0000000000..93360b93f7
--- /dev/null
+++ b/editor/icons/2x/icon_multi_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_multi_line.png b/editor/icons/2x/icon_multi_line.png
new file mode 100644
index 0000000000..5d43b79e8a
--- /dev/null
+++ b/editor/icons/2x/icon_multi_line.png
Binary files differ
diff --git a/editor/icons/2x/icon_multi_mesh.png b/editor/icons/2x/icon_multi_mesh.png
new file mode 100644
index 0000000000..35b99d6698
--- /dev/null
+++ b/editor/icons/2x/icon_multi_mesh.png
Binary files differ
diff --git a/editor/icons/2x/icon_multi_mesh_instance.png b/editor/icons/2x/icon_multi_mesh_instance.png
new file mode 100644
index 0000000000..f69768c6e3
--- /dev/null
+++ b/editor/icons/2x/icon_multi_mesh_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_multi_node_edit.png b/editor/icons/2x/icon_multi_node_edit.png
new file mode 100644
index 0000000000..93360b93f7
--- /dev/null
+++ b/editor/icons/2x/icon_multi_node_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation.png b/editor/icons/2x/icon_navigation.png
new file mode 100644
index 0000000000..3cd838d2fc
--- /dev/null
+++ b/editor/icons/2x/icon_navigation.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation_2d.png b/editor/icons/2x/icon_navigation_2d.png
new file mode 100644
index 0000000000..9efbeaaef0
--- /dev/null
+++ b/editor/icons/2x/icon_navigation_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation_mesh.png b/editor/icons/2x/icon_navigation_mesh.png
new file mode 100644
index 0000000000..35b893c3bb
--- /dev/null
+++ b/editor/icons/2x/icon_navigation_mesh.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation_mesh_instance.png b/editor/icons/2x/icon_navigation_mesh_instance.png
new file mode 100644
index 0000000000..404fad2d31
--- /dev/null
+++ b/editor/icons/2x/icon_navigation_mesh_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation_polygon.png b/editor/icons/2x/icon_navigation_polygon.png
new file mode 100644
index 0000000000..3f4845e206
--- /dev/null
+++ b/editor/icons/2x/icon_navigation_polygon.png
Binary files differ
diff --git a/editor/icons/2x/icon_navigation_polygon_instance.png b/editor/icons/2x/icon_navigation_polygon_instance.png
new file mode 100644
index 0000000000..5556835d76
--- /dev/null
+++ b/editor/icons/2x/icon_navigation_polygon_instance.png
Binary files differ
diff --git a/editor/icons/2x/icon_new.png b/editor/icons/2x/icon_new.png
new file mode 100644
index 0000000000..683f1141fd
--- /dev/null
+++ b/editor/icons/2x/icon_new.png
Binary files differ
diff --git a/editor/icons/2x/icon_nine_patch_rect.png b/editor/icons/2x/icon_nine_patch_rect.png
new file mode 100644
index 0000000000..5762a0392e
--- /dev/null
+++ b/editor/icons/2x/icon_nine_patch_rect.png
Binary files differ
diff --git a/editor/icons/2x/icon_node.png b/editor/icons/2x/icon_node.png
new file mode 100644
index 0000000000..e487f988a2
--- /dev/null
+++ b/editor/icons/2x/icon_node.png
Binary files differ
diff --git a/editor/icons/2x/icon_node_2d.png b/editor/icons/2x/icon_node_2d.png
new file mode 100644
index 0000000000..967d4b7da6
--- /dev/null
+++ b/editor/icons/2x/icon_node_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_node_warning.png b/editor/icons/2x/icon_node_warning.png
new file mode 100644
index 0000000000..397a57bf1f
--- /dev/null
+++ b/editor/icons/2x/icon_node_warning.png
Binary files differ
diff --git a/editor/icons/2x/icon_non_favorite.png b/editor/icons/2x/icon_non_favorite.png
new file mode 100644
index 0000000000..18aa94e6b9
--- /dev/null
+++ b/editor/icons/2x/icon_non_favorite.png
Binary files differ
diff --git a/editor/icons/2x/icon_object.png b/editor/icons/2x/icon_object.png
new file mode 100644
index 0000000000..dc0a94aacd
--- /dev/null
+++ b/editor/icons/2x/icon_object.png
Binary files differ
diff --git a/editor/icons/2x/icon_occluder_polygon_2d.png b/editor/icons/2x/icon_occluder_polygon_2d.png
new file mode 100644
index 0000000000..e5e27dda32
--- /dev/null
+++ b/editor/icons/2x/icon_occluder_polygon_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_omni_light.png b/editor/icons/2x/icon_omni_light.png
new file mode 100644
index 0000000000..2c44252b9c
--- /dev/null
+++ b/editor/icons/2x/icon_omni_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_open.png b/editor/icons/2x/icon_open.png
new file mode 100644
index 0000000000..2e797c448b
--- /dev/null
+++ b/editor/icons/2x/icon_open.png
Binary files differ
diff --git a/editor/icons/2x/icon_option_button.png b/editor/icons/2x/icon_option_button.png
new file mode 100644
index 0000000000..f4438f9efd
--- /dev/null
+++ b/editor/icons/2x/icon_option_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_override.png b/editor/icons/2x/icon_override.png
new file mode 100644
index 0000000000..d735a1c734
--- /dev/null
+++ b/editor/icons/2x/icon_override.png
Binary files differ
diff --git a/editor/icons/2x/icon_p_hash_translation.png b/editor/icons/2x/icon_p_hash_translation.png
new file mode 100644
index 0000000000..0ddc1da282
--- /dev/null
+++ b/editor/icons/2x/icon_p_hash_translation.png
Binary files differ
diff --git a/editor/icons/2x/icon_packed_data_container.png b/editor/icons/2x/icon_packed_data_container.png
new file mode 100644
index 0000000000..958e41ede2
--- /dev/null
+++ b/editor/icons/2x/icon_packed_data_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_packed_scene.png b/editor/icons/2x/icon_packed_scene.png
new file mode 100644
index 0000000000..00778e8c0a
--- /dev/null
+++ b/editor/icons/2x/icon_packed_scene.png
Binary files differ
diff --git a/editor/icons/2x/icon_panel.png b/editor/icons/2x/icon_panel.png
new file mode 100644
index 0000000000..23491a7358
--- /dev/null
+++ b/editor/icons/2x/icon_panel.png
Binary files differ
diff --git a/editor/icons/2x/icon_panel_container.png b/editor/icons/2x/icon_panel_container.png
new file mode 100644
index 0000000000..fb2980ee8b
--- /dev/null
+++ b/editor/icons/2x/icon_panel_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_1.png b/editor/icons/2x/icon_panels_1.png
new file mode 100644
index 0000000000..b8386daa2e
--- /dev/null
+++ b/editor/icons/2x/icon_panels_1.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_2.png b/editor/icons/2x/icon_panels_2.png
new file mode 100644
index 0000000000..4d9f3ef724
--- /dev/null
+++ b/editor/icons/2x/icon_panels_2.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_2_alt.png b/editor/icons/2x/icon_panels_2_alt.png
new file mode 100644
index 0000000000..69aeecce34
--- /dev/null
+++ b/editor/icons/2x/icon_panels_2_alt.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_3.png b/editor/icons/2x/icon_panels_3.png
new file mode 100644
index 0000000000..e889504f15
--- /dev/null
+++ b/editor/icons/2x/icon_panels_3.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_3_alt.png b/editor/icons/2x/icon_panels_3_alt.png
new file mode 100644
index 0000000000..1e9a17ca75
--- /dev/null
+++ b/editor/icons/2x/icon_panels_3_alt.png
Binary files differ
diff --git a/editor/icons/2x/icon_panels_4.png b/editor/icons/2x/icon_panels_4.png
new file mode 100644
index 0000000000..62e77e417a
--- /dev/null
+++ b/editor/icons/2x/icon_panels_4.png
Binary files differ
diff --git a/editor/icons/2x/icon_parallax_background.png b/editor/icons/2x/icon_parallax_background.png
new file mode 100644
index 0000000000..a81046e805
--- /dev/null
+++ b/editor/icons/2x/icon_parallax_background.png
Binary files differ
diff --git a/editor/icons/2x/icon_parallax_layer.png b/editor/icons/2x/icon_parallax_layer.png
new file mode 100644
index 0000000000..285999df61
--- /dev/null
+++ b/editor/icons/2x/icon_parallax_layer.png
Binary files differ
diff --git a/editor/icons/2x/icon_particle_attractor_2d.png b/editor/icons/2x/icon_particle_attractor_2d.png
new file mode 100644
index 0000000000..b985a0ba57
--- /dev/null
+++ b/editor/icons/2x/icon_particle_attractor_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_particles.png b/editor/icons/2x/icon_particles.png
new file mode 100644
index 0000000000..68f30b4213
--- /dev/null
+++ b/editor/icons/2x/icon_particles.png
Binary files differ
diff --git a/editor/icons/2x/icon_particles_2d.png b/editor/icons/2x/icon_particles_2d.png
new file mode 100644
index 0000000000..13fc8a35e6
--- /dev/null
+++ b/editor/icons/2x/icon_particles_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_particles_shader.png b/editor/icons/2x/icon_particles_shader.png
new file mode 100644
index 0000000000..26ce8f6809
--- /dev/null
+++ b/editor/icons/2x/icon_particles_shader.png
Binary files differ
diff --git a/editor/icons/2x/icon_patch_9_rect.png b/editor/icons/2x/icon_patch_9_rect.png
new file mode 100644
index 0000000000..5762a0392e
--- /dev/null
+++ b/editor/icons/2x/icon_patch_9_rect.png
Binary files differ
diff --git a/editor/icons/2x/icon_path.png b/editor/icons/2x/icon_path.png
new file mode 100644
index 0000000000..d10cb37bcd
--- /dev/null
+++ b/editor/icons/2x/icon_path.png
Binary files differ
diff --git a/editor/icons/2x/icon_path_2d.png b/editor/icons/2x/icon_path_2d.png
new file mode 100644
index 0000000000..dabf5ccc49
--- /dev/null
+++ b/editor/icons/2x/icon_path_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_path_follow.png b/editor/icons/2x/icon_path_follow.png
new file mode 100644
index 0000000000..8538b1f3b9
--- /dev/null
+++ b/editor/icons/2x/icon_path_follow.png
Binary files differ
diff --git a/editor/icons/2x/icon_path_follow_2d.png b/editor/icons/2x/icon_path_follow_2d.png
new file mode 100644
index 0000000000..a83ed837ba
--- /dev/null
+++ b/editor/icons/2x/icon_path_follow_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_pause.png b/editor/icons/2x/icon_pause.png
new file mode 100644
index 0000000000..35e6b25294
--- /dev/null
+++ b/editor/icons/2x/icon_pause.png
Binary files differ
diff --git a/editor/icons/2x/icon_pin.png b/editor/icons/2x/icon_pin.png
new file mode 100644
index 0000000000..d19fe7afef
--- /dev/null
+++ b/editor/icons/2x/icon_pin.png
Binary files differ
diff --git a/editor/icons/2x/icon_pin_joint.png b/editor/icons/2x/icon_pin_joint.png
new file mode 100644
index 0000000000..304cb39724
--- /dev/null
+++ b/editor/icons/2x/icon_pin_joint.png
Binary files differ
diff --git a/editor/icons/2x/icon_pin_joint_2d.png b/editor/icons/2x/icon_pin_joint_2d.png
new file mode 100644
index 0000000000..a2302c4756
--- /dev/null
+++ b/editor/icons/2x/icon_pin_joint_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_pin_pressed.png b/editor/icons/2x/icon_pin_pressed.png
new file mode 100644
index 0000000000..d19fe7afef
--- /dev/null
+++ b/editor/icons/2x/icon_pin_pressed.png
Binary files differ
diff --git a/editor/icons/2x/icon_plane.png b/editor/icons/2x/icon_plane.png
new file mode 100644
index 0000000000..a096e30065
--- /dev/null
+++ b/editor/icons/2x/icon_plane.png
Binary files differ
diff --git a/editor/icons/2x/icon_plane_shape.png b/editor/icons/2x/icon_plane_shape.png
new file mode 100644
index 0000000000..8ebd38fe83
--- /dev/null
+++ b/editor/icons/2x/icon_plane_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_play.png b/editor/icons/2x/icon_play.png
new file mode 100644
index 0000000000..b84ed23091
--- /dev/null
+++ b/editor/icons/2x/icon_play.png
Binary files differ
diff --git a/editor/icons/2x/icon_play_backwards.png b/editor/icons/2x/icon_play_backwards.png
new file mode 100644
index 0000000000..42aeca74e5
--- /dev/null
+++ b/editor/icons/2x/icon_play_backwards.png
Binary files differ
diff --git a/editor/icons/2x/icon_play_custom.png b/editor/icons/2x/icon_play_custom.png
new file mode 100644
index 0000000000..299ac3ffbc
--- /dev/null
+++ b/editor/icons/2x/icon_play_custom.png
Binary files differ
diff --git a/editor/icons/2x/icon_play_scene.png b/editor/icons/2x/icon_play_scene.png
new file mode 100644
index 0000000000..948a2e9ba5
--- /dev/null
+++ b/editor/icons/2x/icon_play_scene.png
Binary files differ
diff --git a/editor/icons/2x/icon_play_start.png b/editor/icons/2x/icon_play_start.png
new file mode 100644
index 0000000000..227e1b6f19
--- /dev/null
+++ b/editor/icons/2x/icon_play_start.png
Binary files differ
diff --git a/editor/icons/2x/icon_play_start_backwards.png b/editor/icons/2x/icon_play_start_backwards.png
new file mode 100644
index 0000000000..e9a46325f6
--- /dev/null
+++ b/editor/icons/2x/icon_play_start_backwards.png
Binary files differ
diff --git a/editor/icons/2x/icon_polygon_2d.png b/editor/icons/2x/icon_polygon_2d.png
new file mode 100644
index 0000000000..491ebfaa78
--- /dev/null
+++ b/editor/icons/2x/icon_polygon_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_polygon_path_finder.png b/editor/icons/2x/icon_polygon_path_finder.png
new file mode 100644
index 0000000000..ee6423c265
--- /dev/null
+++ b/editor/icons/2x/icon_polygon_path_finder.png
Binary files differ
diff --git a/editor/icons/2x/icon_popup.png b/editor/icons/2x/icon_popup.png
new file mode 100644
index 0000000000..7bcfb114da
--- /dev/null
+++ b/editor/icons/2x/icon_popup.png
Binary files differ
diff --git a/editor/icons/2x/icon_popup_dialog.png b/editor/icons/2x/icon_popup_dialog.png
new file mode 100644
index 0000000000..6920fa27bf
--- /dev/null
+++ b/editor/icons/2x/icon_popup_dialog.png
Binary files differ
diff --git a/editor/icons/2x/icon_popup_menu.png b/editor/icons/2x/icon_popup_menu.png
new file mode 100644
index 0000000000..4e0246879b
--- /dev/null
+++ b/editor/icons/2x/icon_popup_menu.png
Binary files differ
diff --git a/editor/icons/2x/icon_popup_panel.png b/editor/icons/2x/icon_popup_panel.png
new file mode 100644
index 0000000000..15d977cc81
--- /dev/null
+++ b/editor/icons/2x/icon_popup_panel.png
Binary files differ
diff --git a/editor/icons/2x/icon_portal.png b/editor/icons/2x/icon_portal.png
new file mode 100644
index 0000000000..c934e65fc4
--- /dev/null
+++ b/editor/icons/2x/icon_portal.png
Binary files differ
diff --git a/editor/icons/2x/icon_position_2d.png b/editor/icons/2x/icon_position_2d.png
new file mode 100644
index 0000000000..176a2300ef
--- /dev/null
+++ b/editor/icons/2x/icon_position_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_position_3d.png b/editor/icons/2x/icon_position_3d.png
new file mode 100644
index 0000000000..ed19f011b0
--- /dev/null
+++ b/editor/icons/2x/icon_position_3d.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_1.png b/editor/icons/2x/icon_progress_1.png
new file mode 100644
index 0000000000..b73dded521
--- /dev/null
+++ b/editor/icons/2x/icon_progress_1.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_2.png b/editor/icons/2x/icon_progress_2.png
new file mode 100644
index 0000000000..19d89bd369
--- /dev/null
+++ b/editor/icons/2x/icon_progress_2.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_3.png b/editor/icons/2x/icon_progress_3.png
new file mode 100644
index 0000000000..ca6b270ef7
--- /dev/null
+++ b/editor/icons/2x/icon_progress_3.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_4.png b/editor/icons/2x/icon_progress_4.png
new file mode 100644
index 0000000000..3afa1f845e
--- /dev/null
+++ b/editor/icons/2x/icon_progress_4.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_5.png b/editor/icons/2x/icon_progress_5.png
new file mode 100644
index 0000000000..8230048771
--- /dev/null
+++ b/editor/icons/2x/icon_progress_5.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_6.png b/editor/icons/2x/icon_progress_6.png
new file mode 100644
index 0000000000..6c21a5d053
--- /dev/null
+++ b/editor/icons/2x/icon_progress_6.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_7.png b/editor/icons/2x/icon_progress_7.png
new file mode 100644
index 0000000000..96316b54ca
--- /dev/null
+++ b/editor/icons/2x/icon_progress_7.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_8.png b/editor/icons/2x/icon_progress_8.png
new file mode 100644
index 0000000000..95133b380d
--- /dev/null
+++ b/editor/icons/2x/icon_progress_8.png
Binary files differ
diff --git a/editor/icons/2x/icon_progress_bar.png b/editor/icons/2x/icon_progress_bar.png
new file mode 100644
index 0000000000..f9a243032e
--- /dev/null
+++ b/editor/icons/2x/icon_progress_bar.png
Binary files differ
diff --git a/editor/icons/2x/icon_proximity_group.png b/editor/icons/2x/icon_proximity_group.png
new file mode 100644
index 0000000000..6602afa7ce
--- /dev/null
+++ b/editor/icons/2x/icon_proximity_group.png
Binary files differ
diff --git a/editor/icons/2x/icon_quad.png b/editor/icons/2x/icon_quad.png
new file mode 100644
index 0000000000..a4074cd5b6
--- /dev/null
+++ b/editor/icons/2x/icon_quad.png
Binary files differ
diff --git a/editor/icons/2x/icon_quat.png b/editor/icons/2x/icon_quat.png
new file mode 100644
index 0000000000..f909e134f4
--- /dev/null
+++ b/editor/icons/2x/icon_quat.png
Binary files differ
diff --git a/editor/icons/2x/icon_range.png b/editor/icons/2x/icon_range.png
new file mode 100644
index 0000000000..92c0934df6
--- /dev/null
+++ b/editor/icons/2x/icon_range.png
Binary files differ
diff --git a/editor/icons/2x/icon_rating_no_star.png b/editor/icons/2x/icon_rating_no_star.png
new file mode 100644
index 0000000000..f855fd8b56
--- /dev/null
+++ b/editor/icons/2x/icon_rating_no_star.png
Binary files differ
diff --git a/editor/icons/2x/icon_rating_star.png b/editor/icons/2x/icon_rating_star.png
new file mode 100644
index 0000000000..bfe082d330
--- /dev/null
+++ b/editor/icons/2x/icon_rating_star.png
Binary files differ
diff --git a/editor/icons/2x/icon_ray_cast.png b/editor/icons/2x/icon_ray_cast.png
new file mode 100644
index 0000000000..26d958ac2b
--- /dev/null
+++ b/editor/icons/2x/icon_ray_cast.png
Binary files differ
diff --git a/editor/icons/2x/icon_ray_cast_2d.png b/editor/icons/2x/icon_ray_cast_2d.png
new file mode 100644
index 0000000000..e496cdcc2b
--- /dev/null
+++ b/editor/icons/2x/icon_ray_cast_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_ray_shape.png b/editor/icons/2x/icon_ray_shape.png
new file mode 100644
index 0000000000..54a1cf8fe9
--- /dev/null
+++ b/editor/icons/2x/icon_ray_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_ray_shape_2d.png b/editor/icons/2x/icon_ray_shape_2d.png
new file mode 100644
index 0000000000..2dc7041a93
--- /dev/null
+++ b/editor/icons/2x/icon_ray_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_rayito.png b/editor/icons/2x/icon_rayito.png
new file mode 100644
index 0000000000..1959b8bf00
--- /dev/null
+++ b/editor/icons/2x/icon_rayito.png
Binary files differ
diff --git a/editor/icons/2x/icon_real.png b/editor/icons/2x/icon_real.png
new file mode 100644
index 0000000000..5ec56ebcac
--- /dev/null
+++ b/editor/icons/2x/icon_real.png
Binary files differ
diff --git a/editor/icons/2x/icon_rectangle_shape_2d.png b/editor/icons/2x/icon_rectangle_shape_2d.png
new file mode 100644
index 0000000000..51a93cdb1d
--- /dev/null
+++ b/editor/icons/2x/icon_rectangle_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_reference_rect.png b/editor/icons/2x/icon_reference_rect.png
new file mode 100644
index 0000000000..63fe559fa7
--- /dev/null
+++ b/editor/icons/2x/icon_reference_rect.png
Binary files differ
diff --git a/editor/icons/2x/icon_reflection_probe.png b/editor/icons/2x/icon_reflection_probe.png
new file mode 100644
index 0000000000..5604b403df
--- /dev/null
+++ b/editor/icons/2x/icon_reflection_probe.png
Binary files differ
diff --git a/editor/icons/2x/icon_region_edit.png b/editor/icons/2x/icon_region_edit.png
new file mode 100644
index 0000000000..bcaba769d4
--- /dev/null
+++ b/editor/icons/2x/icon_region_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_reload.png b/editor/icons/2x/icon_reload.png
new file mode 100644
index 0000000000..b13c858124
--- /dev/null
+++ b/editor/icons/2x/icon_reload.png
Binary files differ
diff --git a/editor/icons/2x/icon_reload_small.png b/editor/icons/2x/icon_reload_small.png
new file mode 100644
index 0000000000..a278c34e4c
--- /dev/null
+++ b/editor/icons/2x/icon_reload_small.png
Binary files differ
diff --git a/editor/icons/2x/icon_remote.png b/editor/icons/2x/icon_remote.png
new file mode 100644
index 0000000000..87883ed7e1
--- /dev/null
+++ b/editor/icons/2x/icon_remote.png
Binary files differ
diff --git a/editor/icons/2x/icon_remote_transform.png b/editor/icons/2x/icon_remote_transform.png
new file mode 100644
index 0000000000..dad528615a
--- /dev/null
+++ b/editor/icons/2x/icon_remote_transform.png
Binary files differ
diff --git a/editor/icons/2x/icon_remote_transform_2d.png b/editor/icons/2x/icon_remote_transform_2d.png
new file mode 100644
index 0000000000..7ef3e06f81
--- /dev/null
+++ b/editor/icons/2x/icon_remote_transform_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_remove.png b/editor/icons/2x/icon_remove.png
new file mode 100644
index 0000000000..dbed177745
--- /dev/null
+++ b/editor/icons/2x/icon_remove.png
Binary files differ
diff --git a/editor/icons/2x/icon_rename.png b/editor/icons/2x/icon_rename.png
new file mode 100644
index 0000000000..a306a7b8c8
--- /dev/null
+++ b/editor/icons/2x/icon_rename.png
Binary files differ
diff --git a/editor/icons/2x/icon_reparent.png b/editor/icons/2x/icon_reparent.png
new file mode 100644
index 0000000000..3063da4b43
--- /dev/null
+++ b/editor/icons/2x/icon_reparent.png
Binary files differ
diff --git a/editor/icons/2x/icon_resource_preloader.png b/editor/icons/2x/icon_resource_preloader.png
new file mode 100644
index 0000000000..d48f37d21f
--- /dev/null
+++ b/editor/icons/2x/icon_resource_preloader.png
Binary files differ
diff --git a/editor/icons/2x/icon_rich_text_label.png b/editor/icons/2x/icon_rich_text_label.png
new file mode 100644
index 0000000000..598913d896
--- /dev/null
+++ b/editor/icons/2x/icon_rich_text_label.png
Binary files differ
diff --git a/editor/icons/2x/icon_rigid_body.png b/editor/icons/2x/icon_rigid_body.png
new file mode 100644
index 0000000000..3b682f0033
--- /dev/null
+++ b/editor/icons/2x/icon_rigid_body.png
Binary files differ
diff --git a/editor/icons/2x/icon_rigid_body_2d.png b/editor/icons/2x/icon_rigid_body_2d.png
new file mode 100644
index 0000000000..bd45d2f01a
--- /dev/null
+++ b/editor/icons/2x/icon_rigid_body_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_room.png b/editor/icons/2x/icon_room.png
new file mode 100644
index 0000000000..946f95e955
--- /dev/null
+++ b/editor/icons/2x/icon_room.png
Binary files differ
diff --git a/editor/icons/2x/icon_room_bounds.png b/editor/icons/2x/icon_room_bounds.png
new file mode 100644
index 0000000000..94da9c437d
--- /dev/null
+++ b/editor/icons/2x/icon_room_bounds.png
Binary files differ
diff --git a/editor/icons/2x/icon_rotate_0.png b/editor/icons/2x/icon_rotate_0.png
new file mode 100644
index 0000000000..a4524b7856
--- /dev/null
+++ b/editor/icons/2x/icon_rotate_0.png
Binary files differ
diff --git a/editor/icons/2x/icon_rotate_180.png b/editor/icons/2x/icon_rotate_180.png
new file mode 100644
index 0000000000..a00e1b727c
--- /dev/null
+++ b/editor/icons/2x/icon_rotate_180.png
Binary files differ
diff --git a/editor/icons/2x/icon_rotate_270.png b/editor/icons/2x/icon_rotate_270.png
new file mode 100644
index 0000000000..be56f080a9
--- /dev/null
+++ b/editor/icons/2x/icon_rotate_270.png
Binary files differ
diff --git a/editor/icons/2x/icon_rotate_90.png b/editor/icons/2x/icon_rotate_90.png
new file mode 100644
index 0000000000..a3a937892d
--- /dev/null
+++ b/editor/icons/2x/icon_rotate_90.png
Binary files differ
diff --git a/editor/icons/2x/icon_sample.png b/editor/icons/2x/icon_sample.png
new file mode 100644
index 0000000000..b01674f923
--- /dev/null
+++ b/editor/icons/2x/icon_sample.png
Binary files differ
diff --git a/editor/icons/2x/icon_sample_library.png b/editor/icons/2x/icon_sample_library.png
new file mode 100644
index 0000000000..3f76a78aca
--- /dev/null
+++ b/editor/icons/2x/icon_sample_library.png
Binary files differ
diff --git a/editor/icons/2x/icon_sample_player.png b/editor/icons/2x/icon_sample_player.png
new file mode 100644
index 0000000000..aac4c1bbed
--- /dev/null
+++ b/editor/icons/2x/icon_sample_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_sample_player_2d.png b/editor/icons/2x/icon_sample_player_2d.png
new file mode 100644
index 0000000000..9308d43128
--- /dev/null
+++ b/editor/icons/2x/icon_sample_player_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_save.png b/editor/icons/2x/icon_save.png
new file mode 100644
index 0000000000..0a643f2c88
--- /dev/null
+++ b/editor/icons/2x/icon_save.png
Binary files differ
diff --git a/editor/icons/2x/icon_script.png b/editor/icons/2x/icon_script.png
new file mode 100644
index 0000000000..6f54c20442
--- /dev/null
+++ b/editor/icons/2x/icon_script.png
Binary files differ
diff --git a/editor/icons/2x/icon_script_create.png b/editor/icons/2x/icon_script_create.png
new file mode 100644
index 0000000000..f1e25efe1c
--- /dev/null
+++ b/editor/icons/2x/icon_script_create.png
Binary files differ
diff --git a/editor/icons/2x/icon_script_remove.png b/editor/icons/2x/icon_script_remove.png
new file mode 100644
index 0000000000..f9a1bb19a4
--- /dev/null
+++ b/editor/icons/2x/icon_script_remove.png
Binary files differ
diff --git a/editor/icons/2x/icon_scroll_bar.png b/editor/icons/2x/icon_scroll_bar.png
new file mode 100644
index 0000000000..d15a36bb16
--- /dev/null
+++ b/editor/icons/2x/icon_scroll_bar.png
Binary files differ
diff --git a/editor/icons/2x/icon_scroll_container.png b/editor/icons/2x/icon_scroll_container.png
new file mode 100644
index 0000000000..4ffe2f78f5
--- /dev/null
+++ b/editor/icons/2x/icon_scroll_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_segment_shape_2d.png b/editor/icons/2x/icon_segment_shape_2d.png
new file mode 100644
index 0000000000..43d5d837cc
--- /dev/null
+++ b/editor/icons/2x/icon_segment_shape_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_shader.png b/editor/icons/2x/icon_shader.png
new file mode 100644
index 0000000000..f8c2e15fcb
--- /dev/null
+++ b/editor/icons/2x/icon_shader.png
Binary files differ
diff --git a/editor/icons/2x/icon_shader_material.png b/editor/icons/2x/icon_shader_material.png
new file mode 100644
index 0000000000..f8c2e15fcb
--- /dev/null
+++ b/editor/icons/2x/icon_shader_material.png
Binary files differ
diff --git a/editor/icons/2x/icon_short_cut.png b/editor/icons/2x/icon_short_cut.png
new file mode 100644
index 0000000000..58c3e08ca4
--- /dev/null
+++ b/editor/icons/2x/icon_short_cut.png
Binary files differ
diff --git a/editor/icons/2x/icon_signal.png b/editor/icons/2x/icon_signal.png
new file mode 100644
index 0000000000..22b6da361e
--- /dev/null
+++ b/editor/icons/2x/icon_signal.png
Binary files differ
diff --git a/editor/icons/2x/icon_skeleton.png b/editor/icons/2x/icon_skeleton.png
new file mode 100644
index 0000000000..5345dfbd5c
--- /dev/null
+++ b/editor/icons/2x/icon_skeleton.png
Binary files differ
diff --git a/editor/icons/2x/icon_slider_joint.png b/editor/icons/2x/icon_slider_joint.png
new file mode 100644
index 0000000000..626479152f
--- /dev/null
+++ b/editor/icons/2x/icon_slider_joint.png
Binary files differ
diff --git a/editor/icons/2x/icon_slot.png b/editor/icons/2x/icon_slot.png
new file mode 100644
index 0000000000..2176544c79
--- /dev/null
+++ b/editor/icons/2x/icon_slot.png
Binary files differ
diff --git a/editor/icons/2x/icon_snap.png b/editor/icons/2x/icon_snap.png
new file mode 100644
index 0000000000..509b1c73f3
--- /dev/null
+++ b/editor/icons/2x/icon_snap.png
Binary files differ
diff --git a/editor/icons/2x/icon_sound_room_params.png b/editor/icons/2x/icon_sound_room_params.png
new file mode 100644
index 0000000000..32927eaabc
--- /dev/null
+++ b/editor/icons/2x/icon_sound_room_params.png
Binary files differ
diff --git a/editor/icons/2x/icon_spatial.png b/editor/icons/2x/icon_spatial.png
new file mode 100644
index 0000000000..999771a7fe
--- /dev/null
+++ b/editor/icons/2x/icon_spatial.png
Binary files differ
diff --git a/editor/icons/2x/icon_spatial_sample_player.png b/editor/icons/2x/icon_spatial_sample_player.png
new file mode 100644
index 0000000000..f1926c446e
--- /dev/null
+++ b/editor/icons/2x/icon_spatial_sample_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_spatial_shader.png b/editor/icons/2x/icon_spatial_shader.png
new file mode 100644
index 0000000000..68f6cf8dac
--- /dev/null
+++ b/editor/icons/2x/icon_spatial_shader.png
Binary files differ
diff --git a/editor/icons/2x/icon_spatial_stream_player.png b/editor/icons/2x/icon_spatial_stream_player.png
new file mode 100644
index 0000000000..835c5c0bbc
--- /dev/null
+++ b/editor/icons/2x/icon_spatial_stream_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_sphere_shape.png b/editor/icons/2x/icon_sphere_shape.png
new file mode 100644
index 0000000000..bdb7881e70
--- /dev/null
+++ b/editor/icons/2x/icon_sphere_shape.png
Binary files differ
diff --git a/editor/icons/2x/icon_spin_box.png b/editor/icons/2x/icon_spin_box.png
new file mode 100644
index 0000000000..3d12664b86
--- /dev/null
+++ b/editor/icons/2x/icon_spin_box.png
Binary files differ
diff --git a/editor/icons/2x/icon_spot_light.png b/editor/icons/2x/icon_spot_light.png
new file mode 100644
index 0000000000..e7aa35cbbf
--- /dev/null
+++ b/editor/icons/2x/icon_spot_light.png
Binary files differ
diff --git a/editor/icons/2x/icon_sprite.png b/editor/icons/2x/icon_sprite.png
new file mode 100644
index 0000000000..3f18d313e7
--- /dev/null
+++ b/editor/icons/2x/icon_sprite.png
Binary files differ
diff --git a/editor/icons/2x/icon_sprite_3d.png b/editor/icons/2x/icon_sprite_3d.png
new file mode 100644
index 0000000000..d3a491b9ee
--- /dev/null
+++ b/editor/icons/2x/icon_sprite_3d.png
Binary files differ
diff --git a/editor/icons/2x/icon_sprite_frames.png b/editor/icons/2x/icon_sprite_frames.png
new file mode 100644
index 0000000000..263f5c4aad
--- /dev/null
+++ b/editor/icons/2x/icon_sprite_frames.png
Binary files differ
diff --git a/editor/icons/2x/icon_static_body.png b/editor/icons/2x/icon_static_body.png
new file mode 100644
index 0000000000..74f65ef490
--- /dev/null
+++ b/editor/icons/2x/icon_static_body.png
Binary files differ
diff --git a/editor/icons/2x/icon_static_body_2d.png b/editor/icons/2x/icon_static_body_2d.png
new file mode 100644
index 0000000000..220c829edd
--- /dev/null
+++ b/editor/icons/2x/icon_static_body_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_stream_player.png b/editor/icons/2x/icon_stream_player.png
new file mode 100644
index 0000000000..8ff471cb8a
--- /dev/null
+++ b/editor/icons/2x/icon_stream_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_string.png b/editor/icons/2x/icon_string.png
new file mode 100644
index 0000000000..e25a81f24e
--- /dev/null
+++ b/editor/icons/2x/icon_string.png
Binary files differ
diff --git a/editor/icons/2x/icon_style_box_empty.png b/editor/icons/2x/icon_style_box_empty.png
new file mode 100644
index 0000000000..e790af4de4
--- /dev/null
+++ b/editor/icons/2x/icon_style_box_empty.png
Binary files differ
diff --git a/editor/icons/2x/icon_style_box_flat.png b/editor/icons/2x/icon_style_box_flat.png
new file mode 100644
index 0000000000..1cd5c7f69a
--- /dev/null
+++ b/editor/icons/2x/icon_style_box_flat.png
Binary files differ
diff --git a/editor/icons/2x/icon_style_box_texture.png b/editor/icons/2x/icon_style_box_texture.png
new file mode 100644
index 0000000000..a93e0228bd
--- /dev/null
+++ b/editor/icons/2x/icon_style_box_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_tab_container.png b/editor/icons/2x/icon_tab_container.png
new file mode 100644
index 0000000000..93b7161a69
--- /dev/null
+++ b/editor/icons/2x/icon_tab_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_tabs.png b/editor/icons/2x/icon_tabs.png
new file mode 100644
index 0000000000..6c317010c8
--- /dev/null
+++ b/editor/icons/2x/icon_tabs.png
Binary files differ
diff --git a/editor/icons/2x/icon_test_cube.png b/editor/icons/2x/icon_test_cube.png
new file mode 100644
index 0000000000..f2e523be3f
--- /dev/null
+++ b/editor/icons/2x/icon_test_cube.png
Binary files differ
diff --git a/editor/icons/2x/icon_text_edit.png b/editor/icons/2x/icon_text_edit.png
new file mode 100644
index 0000000000..4fd92e518e
--- /dev/null
+++ b/editor/icons/2x/icon_text_edit.png
Binary files differ
diff --git a/editor/icons/2x/icon_texture.png b/editor/icons/2x/icon_texture.png
new file mode 100644
index 0000000000..ad5d04dfee
--- /dev/null
+++ b/editor/icons/2x/icon_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_texture_button.png b/editor/icons/2x/icon_texture_button.png
new file mode 100644
index 0000000000..84494209d7
--- /dev/null
+++ b/editor/icons/2x/icon_texture_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_texture_progress.png b/editor/icons/2x/icon_texture_progress.png
new file mode 100644
index 0000000000..c11c1bbe4b
--- /dev/null
+++ b/editor/icons/2x/icon_texture_progress.png
Binary files differ
diff --git a/editor/icons/2x/icon_texture_rect.png b/editor/icons/2x/icon_texture_rect.png
new file mode 100644
index 0000000000..50d715dd09
--- /dev/null
+++ b/editor/icons/2x/icon_texture_rect.png
Binary files differ
diff --git a/editor/icons/2x/icon_theme.png b/editor/icons/2x/icon_theme.png
new file mode 100644
index 0000000000..55b51428dd
--- /dev/null
+++ b/editor/icons/2x/icon_theme.png
Binary files differ
diff --git a/editor/icons/2x/icon_tile_map.png b/editor/icons/2x/icon_tile_map.png
new file mode 100644
index 0000000000..fd98fb6a39
--- /dev/null
+++ b/editor/icons/2x/icon_tile_map.png
Binary files differ
diff --git a/editor/icons/2x/icon_tile_set.png b/editor/icons/2x/icon_tile_set.png
new file mode 100644
index 0000000000..9fbd0b4719
--- /dev/null
+++ b/editor/icons/2x/icon_tile_set.png
Binary files differ
diff --git a/editor/icons/2x/icon_timer.png b/editor/icons/2x/icon_timer.png
new file mode 100644
index 0000000000..b0df31d803
--- /dev/null
+++ b/editor/icons/2x/icon_timer.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_button.png b/editor/icons/2x/icon_tool_button.png
new file mode 100644
index 0000000000..091fa8334f
--- /dev/null
+++ b/editor/icons/2x/icon_tool_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_move.png b/editor/icons/2x/icon_tool_move.png
new file mode 100644
index 0000000000..86419cb6a9
--- /dev/null
+++ b/editor/icons/2x/icon_tool_move.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_pan.png b/editor/icons/2x/icon_tool_pan.png
new file mode 100644
index 0000000000..b7a6c3566f
--- /dev/null
+++ b/editor/icons/2x/icon_tool_pan.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_rotate.png b/editor/icons/2x/icon_tool_rotate.png
new file mode 100644
index 0000000000..b13c858124
--- /dev/null
+++ b/editor/icons/2x/icon_tool_rotate.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_scale.png b/editor/icons/2x/icon_tool_scale.png
new file mode 100644
index 0000000000..1bc29f4acc
--- /dev/null
+++ b/editor/icons/2x/icon_tool_scale.png
Binary files differ
diff --git a/editor/icons/2x/icon_tool_select.png b/editor/icons/2x/icon_tool_select.png
new file mode 100644
index 0000000000..7421b98ef6
--- /dev/null
+++ b/editor/icons/2x/icon_tool_select.png
Binary files differ
diff --git a/editor/icons/2x/icon_tools.png b/editor/icons/2x/icon_tools.png
new file mode 100644
index 0000000000..6143191fc7
--- /dev/null
+++ b/editor/icons/2x/icon_tools.png
Binary files differ
diff --git a/editor/icons/2x/icon_touch_screen_button.png b/editor/icons/2x/icon_touch_screen_button.png
new file mode 100644
index 0000000000..b1af644e42
--- /dev/null
+++ b/editor/icons/2x/icon_touch_screen_button.png
Binary files differ
diff --git a/editor/icons/2x/icon_track_add_key.png b/editor/icons/2x/icon_track_add_key.png
new file mode 100644
index 0000000000..9b7bd14fb4
--- /dev/null
+++ b/editor/icons/2x/icon_track_add_key.png
Binary files differ
diff --git a/editor/icons/2x/icon_track_add_key_hl.png b/editor/icons/2x/icon_track_add_key_hl.png
new file mode 100644
index 0000000000..0763836c3a
--- /dev/null
+++ b/editor/icons/2x/icon_track_add_key_hl.png
Binary files differ
diff --git a/editor/icons/2x/icon_track_continuous.png b/editor/icons/2x/icon_track_continuous.png
new file mode 100644
index 0000000000..5b4515f642
--- /dev/null
+++ b/editor/icons/2x/icon_track_continuous.png
Binary files differ
diff --git a/editor/icons/2x/icon_track_discrete.png b/editor/icons/2x/icon_track_discrete.png
new file mode 100644
index 0000000000..19f479657b
--- /dev/null
+++ b/editor/icons/2x/icon_track_discrete.png
Binary files differ
diff --git a/editor/icons/2x/icon_track_trigger.png b/editor/icons/2x/icon_track_trigger.png
new file mode 100644
index 0000000000..c04d47f9a4
--- /dev/null
+++ b/editor/icons/2x/icon_track_trigger.png
Binary files differ
diff --git a/editor/icons/2x/icon_translation.png b/editor/icons/2x/icon_translation.png
new file mode 100644
index 0000000000..0ddc1da282
--- /dev/null
+++ b/editor/icons/2x/icon_translation.png
Binary files differ
diff --git a/editor/icons/2x/icon_transparent.png b/editor/icons/2x/icon_transparent.png
new file mode 100644
index 0000000000..627607039b
--- /dev/null
+++ b/editor/icons/2x/icon_transparent.png
Binary files differ
diff --git a/editor/icons/2x/icon_transpose.png b/editor/icons/2x/icon_transpose.png
new file mode 100644
index 0000000000..589dc54919
--- /dev/null
+++ b/editor/icons/2x/icon_transpose.png
Binary files differ
diff --git a/editor/icons/2x/icon_tree.png b/editor/icons/2x/icon_tree.png
new file mode 100644
index 0000000000..3f470cc0f3
--- /dev/null
+++ b/editor/icons/2x/icon_tree.png
Binary files differ
diff --git a/editor/icons/2x/icon_tween.png b/editor/icons/2x/icon_tween.png
new file mode 100644
index 0000000000..a13d955eb0
--- /dev/null
+++ b/editor/icons/2x/icon_tween.png
Binary files differ
diff --git a/editor/icons/2x/icon_unbone.png b/editor/icons/2x/icon_unbone.png
new file mode 100644
index 0000000000..c20d6d9b2c
--- /dev/null
+++ b/editor/icons/2x/icon_unbone.png
Binary files differ
diff --git a/editor/icons/2x/icon_ungroup.png b/editor/icons/2x/icon_ungroup.png
new file mode 100644
index 0000000000..bb46185370
--- /dev/null
+++ b/editor/icons/2x/icon_ungroup.png
Binary files differ
diff --git a/editor/icons/2x/icon_uninstance.png b/editor/icons/2x/icon_uninstance.png
new file mode 100644
index 0000000000..bf3dc00368
--- /dev/null
+++ b/editor/icons/2x/icon_uninstance.png
Binary files differ
diff --git a/editor/icons/2x/icon_unlock.png b/editor/icons/2x/icon_unlock.png
new file mode 100644
index 0000000000..40ff3f25a0
--- /dev/null
+++ b/editor/icons/2x/icon_unlock.png
Binary files differ
diff --git a/editor/icons/2x/icon_uv.png b/editor/icons/2x/icon_uv.png
new file mode 100644
index 0000000000..e06be54edd
--- /dev/null
+++ b/editor/icons/2x/icon_uv.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_box_container.png b/editor/icons/2x/icon_v_box_container.png
new file mode 100644
index 0000000000..97eb18c528
--- /dev/null
+++ b/editor/icons/2x/icon_v_box_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_button_array.png b/editor/icons/2x/icon_v_button_array.png
new file mode 100644
index 0000000000..93fd1fed04
--- /dev/null
+++ b/editor/icons/2x/icon_v_button_array.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_scroll_bar.png b/editor/icons/2x/icon_v_scroll_bar.png
new file mode 100644
index 0000000000..5e4f83197f
--- /dev/null
+++ b/editor/icons/2x/icon_v_scroll_bar.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_separator.png b/editor/icons/2x/icon_v_separator.png
new file mode 100644
index 0000000000..58cdc3e8de
--- /dev/null
+++ b/editor/icons/2x/icon_v_separator.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_slider.png b/editor/icons/2x/icon_v_slider.png
new file mode 100644
index 0000000000..afc88cf510
--- /dev/null
+++ b/editor/icons/2x/icon_v_slider.png
Binary files differ
diff --git a/editor/icons/2x/icon_v_split_container.png b/editor/icons/2x/icon_v_split_container.png
new file mode 100644
index 0000000000..b0f68381fc
--- /dev/null
+++ b/editor/icons/2x/icon_v_split_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_vector.png b/editor/icons/2x/icon_vector.png
new file mode 100644
index 0000000000..9950d950ac
--- /dev/null
+++ b/editor/icons/2x/icon_vector.png
Binary files differ
diff --git a/editor/icons/2x/icon_vector2.png b/editor/icons/2x/icon_vector2.png
new file mode 100644
index 0000000000..73c1ca007f
--- /dev/null
+++ b/editor/icons/2x/icon_vector2.png
Binary files differ
diff --git a/editor/icons/2x/icon_vehicle_body.png b/editor/icons/2x/icon_vehicle_body.png
new file mode 100644
index 0000000000..215f7ac021
--- /dev/null
+++ b/editor/icons/2x/icon_vehicle_body.png
Binary files differ
diff --git a/editor/icons/2x/icon_vehicle_wheel.png b/editor/icons/2x/icon_vehicle_wheel.png
new file mode 100644
index 0000000000..6f7fecac4a
--- /dev/null
+++ b/editor/icons/2x/icon_vehicle_wheel.png
Binary files differ
diff --git a/editor/icons/2x/icon_video_player.png b/editor/icons/2x/icon_video_player.png
new file mode 100644
index 0000000000..588e17aa4e
--- /dev/null
+++ b/editor/icons/2x/icon_video_player.png
Binary files differ
diff --git a/editor/icons/2x/icon_viewport.png b/editor/icons/2x/icon_viewport.png
new file mode 100644
index 0000000000..7e588333fb
--- /dev/null
+++ b/editor/icons/2x/icon_viewport.png
Binary files differ
diff --git a/editor/icons/2x/icon_viewport_container.png b/editor/icons/2x/icon_viewport_container.png
new file mode 100644
index 0000000000..c43e53c34e
--- /dev/null
+++ b/editor/icons/2x/icon_viewport_container.png
Binary files differ
diff --git a/editor/icons/2x/icon_viewport_sprite.png b/editor/icons/2x/icon_viewport_sprite.png
new file mode 100644
index 0000000000..adb336103f
--- /dev/null
+++ b/editor/icons/2x/icon_viewport_sprite.png
Binary files differ
diff --git a/editor/icons/2x/icon_viewport_texture.png b/editor/icons/2x/icon_viewport_texture.png
new file mode 100644
index 0000000000..f798f1d221
--- /dev/null
+++ b/editor/icons/2x/icon_viewport_texture.png
Binary files differ
diff --git a/editor/icons/2x/icon_visibility_enabler.png b/editor/icons/2x/icon_visibility_enabler.png
new file mode 100644
index 0000000000..4be06a5123
--- /dev/null
+++ b/editor/icons/2x/icon_visibility_enabler.png
Binary files differ
diff --git a/editor/icons/2x/icon_visibility_enabler_2d.png b/editor/icons/2x/icon_visibility_enabler_2d.png
new file mode 100644
index 0000000000..3d592e8983
--- /dev/null
+++ b/editor/icons/2x/icon_visibility_enabler_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_visibility_notifier.png b/editor/icons/2x/icon_visibility_notifier.png
new file mode 100644
index 0000000000..aa73402d8e
--- /dev/null
+++ b/editor/icons/2x/icon_visibility_notifier.png
Binary files differ
diff --git a/editor/icons/2x/icon_visibility_notifier_2d.png b/editor/icons/2x/icon_visibility_notifier_2d.png
new file mode 100644
index 0000000000..5f3b7ecf42
--- /dev/null
+++ b/editor/icons/2x/icon_visibility_notifier_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_visible.png b/editor/icons/2x/icon_visible.png
new file mode 100644
index 0000000000..761ff12c66
--- /dev/null
+++ b/editor/icons/2x/icon_visible.png
Binary files differ
diff --git a/editor/icons/2x/icon_visual_script.png b/editor/icons/2x/icon_visual_script.png
new file mode 100644
index 0000000000..78a3a0c318
--- /dev/null
+++ b/editor/icons/2x/icon_visual_script.png
Binary files differ
diff --git a/editor/icons/2x/icon_visual_shader_port.png b/editor/icons/2x/icon_visual_shader_port.png
new file mode 100644
index 0000000000..3f9bf96b01
--- /dev/null
+++ b/editor/icons/2x/icon_visual_shader_port.png
Binary files differ
diff --git a/editor/icons/2x/icon_vu_empty.png b/editor/icons/2x/icon_vu_empty.png
new file mode 100644
index 0000000000..7ecf215933
--- /dev/null
+++ b/editor/icons/2x/icon_vu_empty.png
Binary files differ
diff --git a/editor/icons/2x/icon_vu_full.png b/editor/icons/2x/icon_vu_full.png
new file mode 100644
index 0000000000..cfd29fa833
--- /dev/null
+++ b/editor/icons/2x/icon_vu_full.png
Binary files differ
diff --git a/editor/icons/2x/icon_warning.png b/editor/icons/2x/icon_warning.png
new file mode 100644
index 0000000000..5d807065e7
--- /dev/null
+++ b/editor/icons/2x/icon_warning.png
Binary files differ
diff --git a/editor/icons/2x/icon_window_dialog.png b/editor/icons/2x/icon_window_dialog.png
new file mode 100644
index 0000000000..995381ed5f
--- /dev/null
+++ b/editor/icons/2x/icon_window_dialog.png
Binary files differ
diff --git a/editor/icons/2x/icon_world.png b/editor/icons/2x/icon_world.png
new file mode 100644
index 0000000000..51b587c01e
--- /dev/null
+++ b/editor/icons/2x/icon_world.png
Binary files differ
diff --git a/editor/icons/2x/icon_world_2d.png b/editor/icons/2x/icon_world_2d.png
new file mode 100644
index 0000000000..e9cfa10461
--- /dev/null
+++ b/editor/icons/2x/icon_world_2d.png
Binary files differ
diff --git a/editor/icons/2x/icon_world_environment.png b/editor/icons/2x/icon_world_environment.png
new file mode 100644
index 0000000000..9ca558fcba
--- /dev/null
+++ b/editor/icons/2x/icon_world_environment.png
Binary files differ
diff --git a/editor/icons/2x/icon_y_sort.png b/editor/icons/2x/icon_y_sort.png
new file mode 100644
index 0000000000..a38cbbe863
--- /dev/null
+++ b/editor/icons/2x/icon_y_sort.png
Binary files differ
diff --git a/editor/icons/2x/icon_zoom.png b/editor/icons/2x/icon_zoom.png
new file mode 100644
index 0000000000..0c4a6a8c84
--- /dev/null
+++ b/editor/icons/2x/icon_zoom.png
Binary files differ
diff --git a/editor/icons/2x/icon_zoom_less.png b/editor/icons/2x/icon_zoom_less.png
new file mode 100644
index 0000000000..d483db55ce
--- /dev/null
+++ b/editor/icons/2x/icon_zoom_less.png
Binary files differ
diff --git a/editor/icons/2x/icon_zoom_more.png b/editor/icons/2x/icon_zoom_more.png
new file mode 100644
index 0000000000..8f9ef77849
--- /dev/null
+++ b/editor/icons/2x/icon_zoom_more.png
Binary files differ
diff --git a/editor/icons/2x/icon_zoom_reset.png b/editor/icons/2x/icon_zoom_reset.png
new file mode 100644
index 0000000000..092215b3e2
--- /dev/null
+++ b/editor/icons/2x/icon_zoom_reset.png
Binary files differ
diff --git a/editor/icons/SCsub b/editor/icons/SCsub
new file mode 100644
index 0000000000..3fc8e5461f
--- /dev/null
+++ b/editor/icons/SCsub
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+
+Import('env')
+
+
+def make_editor_icons_action(target, source, env):
+
+ import os
+ import cStringIO
+
+ dst = target[0].srcnode().abspath
+ pixmaps = source
+
+ s = cStringIO.StringIO()
+
+ s.write("#include \"editor_icons.h\"\n\n")
+ s.write("#include \"editor_scale.h\"\n\n")
+ s.write("#include \"scene/resources/theme.h\"\n\n")
+
+ hidpi_list = []
+
+ for x in pixmaps:
+
+ x = str(x)
+ var_str = os.path.basename(x)[:-4] + "_png"
+ # print(var_str)
+
+ s.write("static const unsigned char " + var_str + "[]={\n")
+
+ pngf = open(x, "rb")
+
+ b = pngf.read(1)
+ while(len(b) == 1):
+ s.write(hex(ord(b)))
+ b = pngf.read(1)
+ if (len(b) == 1):
+ s.write(",")
+
+ s.write("\n};\n\n")
+
+ pngf.close()
+ var_str = os.path.basename(x)[:-4] + "_hidpi_png"
+ try:
+
+ pngf = open(os.path.dirname(x) + "/2x/" + os.path.basename(x), "rb")
+
+ s.write("static const unsigned char " + var_str + "[]={\n")
+
+ b = pngf.read(1)
+ while(len(b) == 1):
+ s.write(hex(ord(b)))
+ b = pngf.read(1)
+ if (len(b) == 1):
+ s.write(",")
+
+ s.write("\n};\n\n\n")
+ hidpi_list.append(x)
+
+ except:
+ s.write("static const unsigned char* " + var_str + "=NULL;\n\n\n")
+
+ s.write("static Ref<ImageTexture> make_icon(const uint8_t* p_png,const uint8_t* p_hidpi_png) {\n")
+ s.write("\tRef<ImageTexture> texture( memnew( ImageTexture ) );\n")
+ s.write("\tbool use_hidpi_image=(editor_get_scale()>1.0&&p_hidpi_png);\n")
+ s.write("\tImage img(use_hidpi_image?p_hidpi_png:p_png);\n")
+ s.write("\tif (editor_get_scale()>1.0 && !p_hidpi_png) { img.convert(Image::FORMAT_RGBA8); img.expand_x2_hq2x(); use_hidpi_image=true;}\n")
+ s.write("\timg.resize(img.get_width()*EDSCALE/(use_hidpi_image?2:1),img.get_height()*EDSCALE/(use_hidpi_image?2:1));\n")
+ s.write("\ttexture->create_from_image( img,ImageTexture::FLAG_FILTER );\n")
+ s.write("\treturn texture;\n")
+ s.write("}\n\n")
+
+ s.write("void editor_register_icons(Ref<Theme> p_theme) {\n\n")
+
+ for x in pixmaps:
+
+ x = os.path.basename(str(x))
+ type = x[5:-4].title().replace("_", "")
+ var_str = x[:-4] + "_png"
+ var_str_hidpi = x[:-4] + "_hidpi_png"
+ s.write("\tp_theme->set_icon(\"" + type + "\",\"EditorIcons\",make_icon(" + var_str + "," + var_str_hidpi + "));\n")
+
+ s.write("\n\n}\n\n")
+
+ f = open(dst, "wb")
+ f.write(s.getvalue())
+ f.close()
+ s.close()
+
+make_editor_icons_builder = Builder(action=make_editor_icons_action,
+ suffix='.cpp',
+ src_suffix='.png')
+env['BUILDERS']['MakeEditorIconsBuilder'] = make_editor_icons_builder
+env.Alias('editor_icons', [env.MakeEditorIconsBuilder('#editor/editor_icons.cpp', Glob("*.png"))])
+
+env.editor_sources.append("#editor/editor_icons.cpp")
+Export('env')
diff --git a/editor/icons/icon_accept_dialog.png b/editor/icons/icon_accept_dialog.png
new file mode 100644
index 0000000000..7530127f82
--- /dev/null
+++ b/editor/icons/icon_accept_dialog.png
Binary files differ
diff --git a/editor/icons/icon_add.png b/editor/icons/icon_add.png
new file mode 100644
index 0000000000..fa675045bc
--- /dev/null
+++ b/editor/icons/icon_add.png
Binary files differ
diff --git a/editor/icons/icon_add_track.png b/editor/icons/icon_add_track.png
new file mode 100644
index 0000000000..fa675045bc
--- /dev/null
+++ b/editor/icons/icon_add_track.png
Binary files differ
diff --git a/editor/icons/icon_anchor.png b/editor/icons/icon_anchor.png
new file mode 100644
index 0000000000..7b02eb448e
--- /dev/null
+++ b/editor/icons/icon_anchor.png
Binary files differ
diff --git a/editor/icons/icon_anim_export.png b/editor/icons/icon_anim_export.png
new file mode 100644
index 0000000000..b17ecdeb22
--- /dev/null
+++ b/editor/icons/icon_anim_export.png
Binary files differ
diff --git a/editor/icons/icon_anim_export_all.png b/editor/icons/icon_anim_export_all.png
new file mode 100644
index 0000000000..65a3cf5745
--- /dev/null
+++ b/editor/icons/icon_anim_export_all.png
Binary files differ
diff --git a/editor/icons/icon_anim_get.png b/editor/icons/icon_anim_get.png
new file mode 100644
index 0000000000..7edd883f02
--- /dev/null
+++ b/editor/icons/icon_anim_get.png
Binary files differ
diff --git a/editor/icons/icon_anim_get_hl.png b/editor/icons/icon_anim_get_hl.png
new file mode 100644
index 0000000000..fa6e94545b
--- /dev/null
+++ b/editor/icons/icon_anim_get_hl.png
Binary files differ
diff --git a/editor/icons/icon_anim_import.png b/editor/icons/icon_anim_import.png
new file mode 100644
index 0000000000..166e3fecd7
--- /dev/null
+++ b/editor/icons/icon_anim_import.png
Binary files differ
diff --git a/editor/icons/icon_anim_import_all.png b/editor/icons/icon_anim_import_all.png
new file mode 100644
index 0000000000..c99893d59d
--- /dev/null
+++ b/editor/icons/icon_anim_import_all.png
Binary files differ
diff --git a/editor/icons/icon_anim_set.png b/editor/icons/icon_anim_set.png
new file mode 100644
index 0000000000..c52334c72f
--- /dev/null
+++ b/editor/icons/icon_anim_set.png
Binary files differ
diff --git a/editor/icons/icon_anim_set_hl.png b/editor/icons/icon_anim_set_hl.png
new file mode 100644
index 0000000000..aefaf7f738
--- /dev/null
+++ b/editor/icons/icon_anim_set_hl.png
Binary files differ
diff --git a/editor/icons/icon_animated_sprite.png b/editor/icons/icon_animated_sprite.png
new file mode 100644
index 0000000000..6b6cb2fbfa
--- /dev/null
+++ b/editor/icons/icon_animated_sprite.png
Binary files differ
diff --git a/editor/icons/icon_animated_sprite_3d.png b/editor/icons/icon_animated_sprite_3d.png
new file mode 100644
index 0000000000..e04d687bfb
--- /dev/null
+++ b/editor/icons/icon_animated_sprite_3d.png
Binary files differ
diff --git a/editor/icons/icon_animation.png b/editor/icons/icon_animation.png
new file mode 100644
index 0000000000..b333f82711
--- /dev/null
+++ b/editor/icons/icon_animation.png
Binary files differ
diff --git a/editor/icons/icon_animation_node.png b/editor/icons/icon_animation_node.png
new file mode 100644
index 0000000000..81026b3a98
--- /dev/null
+++ b/editor/icons/icon_animation_node.png
Binary files differ
diff --git a/editor/icons/icon_animation_play.png b/editor/icons/icon_animation_play.png
new file mode 100644
index 0000000000..b405bf98f4
--- /dev/null
+++ b/editor/icons/icon_animation_play.png
Binary files differ
diff --git a/editor/icons/icon_animation_player.png b/editor/icons/icon_animation_player.png
new file mode 100644
index 0000000000..8a6f446e4e
--- /dev/null
+++ b/editor/icons/icon_animation_player.png
Binary files differ
diff --git a/editor/icons/icon_animation_set.png b/editor/icons/icon_animation_set.png
new file mode 100644
index 0000000000..b603382b0c
--- /dev/null
+++ b/editor/icons/icon_animation_set.png
Binary files differ
diff --git a/editor/icons/icon_animation_tree.png b/editor/icons/icon_animation_tree.png
new file mode 100644
index 0000000000..684edb876b
--- /dev/null
+++ b/editor/icons/icon_animation_tree.png
Binary files differ
diff --git a/editor/icons/icon_animation_tree_player.png b/editor/icons/icon_animation_tree_player.png
new file mode 100644
index 0000000000..684edb876b
--- /dev/null
+++ b/editor/icons/icon_animation_tree_player.png
Binary files differ
diff --git a/editor/icons/icon_area.png b/editor/icons/icon_area.png
new file mode 100644
index 0000000000..31b4473d17
--- /dev/null
+++ b/editor/icons/icon_area.png
Binary files differ
diff --git a/editor/icons/icon_area_2d.png b/editor/icons/icon_area_2d.png
new file mode 100644
index 0000000000..2f9c6bb8d4
--- /dev/null
+++ b/editor/icons/icon_area_2d.png
Binary files differ
diff --git a/editor/icons/icon_array_data.png b/editor/icons/icon_array_data.png
new file mode 100644
index 0000000000..447acaab2b
--- /dev/null
+++ b/editor/icons/icon_array_data.png
Binary files differ
diff --git a/editor/icons/icon_array_float.png b/editor/icons/icon_array_float.png
new file mode 100644
index 0000000000..d1b78b4c3e
--- /dev/null
+++ b/editor/icons/icon_array_float.png
Binary files differ
diff --git a/editor/icons/icon_array_int.png b/editor/icons/icon_array_int.png
new file mode 100644
index 0000000000..2c4ec5bafb
--- /dev/null
+++ b/editor/icons/icon_array_int.png
Binary files differ
diff --git a/editor/icons/icon_array_string.png b/editor/icons/icon_array_string.png
new file mode 100644
index 0000000000..a2e3f11c35
--- /dev/null
+++ b/editor/icons/icon_array_string.png
Binary files differ
diff --git a/editor/icons/icon_array_variant.png b/editor/icons/icon_array_variant.png
new file mode 100644
index 0000000000..ab294898ad
--- /dev/null
+++ b/editor/icons/icon_array_variant.png
Binary files differ
diff --git a/editor/icons/icon_arrow_left.png b/editor/icons/icon_arrow_left.png
new file mode 100644
index 0000000000..1e0d38b4b6
--- /dev/null
+++ b/editor/icons/icon_arrow_left.png
Binary files differ
diff --git a/editor/icons/icon_arrow_left_disabled.png b/editor/icons/icon_arrow_left_disabled.png
new file mode 100644
index 0000000000..f1f9d0f988
--- /dev/null
+++ b/editor/icons/icon_arrow_left_disabled.png
Binary files differ
diff --git a/editor/icons/icon_arrow_right.png b/editor/icons/icon_arrow_right.png
new file mode 100644
index 0000000000..09907755e1
--- /dev/null
+++ b/editor/icons/icon_arrow_right.png
Binary files differ
diff --git a/editor/icons/icon_arrow_right_disabled.png b/editor/icons/icon_arrow_right_disabled.png
new file mode 100644
index 0000000000..840cd0da0a
--- /dev/null
+++ b/editor/icons/icon_arrow_right_disabled.png
Binary files differ
diff --git a/editor/icons/icon_arrow_up.png b/editor/icons/icon_arrow_up.png
new file mode 100644
index 0000000000..f7ec666f69
--- /dev/null
+++ b/editor/icons/icon_arrow_up.png
Binary files differ
diff --git a/editor/icons/icon_arrow_up_disabled.png b/editor/icons/icon_arrow_up_disabled.png
new file mode 100644
index 0000000000..fb46aa1373
--- /dev/null
+++ b/editor/icons/icon_arrow_up_disabled.png
Binary files differ
diff --git a/editor/icons/icon_atlas_texture.png b/editor/icons/icon_atlas_texture.png
new file mode 100644
index 0000000000..438ac8bfb5
--- /dev/null
+++ b/editor/icons/icon_atlas_texture.png
Binary files differ
diff --git a/editor/icons/icon_audio_effect_amplify.png b/editor/icons/icon_audio_effect_amplify.png
new file mode 100644
index 0000000000..9af3227d40
--- /dev/null
+++ b/editor/icons/icon_audio_effect_amplify.png
Binary files differ
diff --git a/editor/icons/icon_audio_stream_gibberish.png b/editor/icons/icon_audio_stream_gibberish.png
new file mode 100644
index 0000000000..60c85fa5b4
--- /dev/null
+++ b/editor/icons/icon_audio_stream_gibberish.png
Binary files differ
diff --git a/editor/icons/icon_audio_stream_m_p_c.png b/editor/icons/icon_audio_stream_m_p_c.png
new file mode 100644
index 0000000000..665d7b56a1
--- /dev/null
+++ b/editor/icons/icon_audio_stream_m_p_c.png
Binary files differ
diff --git a/editor/icons/icon_audio_stream_o_g_g_vorbis.png b/editor/icons/icon_audio_stream_o_g_g_vorbis.png
new file mode 100644
index 0000000000..7860e111d0
--- /dev/null
+++ b/editor/icons/icon_audio_stream_o_g_g_vorbis.png
Binary files differ
diff --git a/editor/icons/icon_audio_stream_opus.png b/editor/icons/icon_audio_stream_opus.png
new file mode 100644
index 0000000000..69b0c83b4d
--- /dev/null
+++ b/editor/icons/icon_audio_stream_opus.png
Binary files differ
diff --git a/editor/icons/icon_audio_stream_speex.png b/editor/icons/icon_audio_stream_speex.png
new file mode 100644
index 0000000000..6fefe47284
--- /dev/null
+++ b/editor/icons/icon_audio_stream_speex.png
Binary files differ
diff --git a/editor/icons/icon_auto_play.png b/editor/icons/icon_auto_play.png
new file mode 100644
index 0000000000..a6be64a1d1
--- /dev/null
+++ b/editor/icons/icon_auto_play.png
Binary files differ
diff --git a/editor/icons/icon_b_c_s_f_x.png b/editor/icons/icon_b_c_s_f_x.png
new file mode 100644
index 0000000000..2100aea6a0
--- /dev/null
+++ b/editor/icons/icon_b_c_s_f_x.png
Binary files differ
diff --git a/editor/icons/icon_b_g_color_f_x.png b/editor/icons/icon_b_g_color_f_x.png
new file mode 100644
index 0000000000..5b7552f6d5
--- /dev/null
+++ b/editor/icons/icon_b_g_color_f_x.png
Binary files differ
diff --git a/editor/icons/icon_b_g_image_f_x.png b/editor/icons/icon_b_g_image_f_x.png
new file mode 100644
index 0000000000..7e8ec86eec
--- /dev/null
+++ b/editor/icons/icon_b_g_image_f_x.png
Binary files differ
diff --git a/editor/icons/icon_back.png b/editor/icons/icon_back.png
new file mode 100644
index 0000000000..52fbc8117a
--- /dev/null
+++ b/editor/icons/icon_back.png
Binary files differ
diff --git a/editor/icons/icon_back_buffer_copy.png b/editor/icons/icon_back_buffer_copy.png
new file mode 100644
index 0000000000..35f04ddac8
--- /dev/null
+++ b/editor/icons/icon_back_buffer_copy.png
Binary files differ
diff --git a/editor/icons/icon_back_disabled.png b/editor/icons/icon_back_disabled.png
new file mode 100644
index 0000000000..31aab496e2
--- /dev/null
+++ b/editor/icons/icon_back_disabled.png
Binary files differ
diff --git a/editor/icons/icon_back_no.png b/editor/icons/icon_back_no.png
new file mode 100644
index 0000000000..539ce4124a
--- /dev/null
+++ b/editor/icons/icon_back_no.png
Binary files differ
diff --git a/editor/icons/icon_bake.png b/editor/icons/icon_bake.png
new file mode 100644
index 0000000000..3b7fce5c9f
--- /dev/null
+++ b/editor/icons/icon_bake.png
Binary files differ
diff --git a/editor/icons/icon_baked_light.png b/editor/icons/icon_baked_light.png
new file mode 100644
index 0000000000..3b7fce5c9f
--- /dev/null
+++ b/editor/icons/icon_baked_light.png
Binary files differ
diff --git a/editor/icons/icon_baked_light_instance.png b/editor/icons/icon_baked_light_instance.png
new file mode 100644
index 0000000000..c667b542c1
--- /dev/null
+++ b/editor/icons/icon_baked_light_instance.png
Binary files differ
diff --git a/editor/icons/icon_baked_light_sampler.png b/editor/icons/icon_baked_light_sampler.png
new file mode 100644
index 0000000000..15ff7b98b9
--- /dev/null
+++ b/editor/icons/icon_baked_light_sampler.png
Binary files differ
diff --git a/editor/icons/icon_bit_map.png b/editor/icons/icon_bit_map.png
new file mode 100644
index 0000000000..50dd8157d1
--- /dev/null
+++ b/editor/icons/icon_bit_map.png
Binary files differ
diff --git a/editor/icons/icon_bitmap_font.png b/editor/icons/icon_bitmap_font.png
new file mode 100644
index 0000000000..5334c335dc
--- /dev/null
+++ b/editor/icons/icon_bitmap_font.png
Binary files differ
diff --git a/editor/icons/icon_blend.png b/editor/icons/icon_blend.png
new file mode 100644
index 0000000000..1676c650c2
--- /dev/null
+++ b/editor/icons/icon_blend.png
Binary files differ
diff --git a/editor/icons/icon_bone.png b/editor/icons/icon_bone.png
new file mode 100644
index 0000000000..2d9a7b47f3
--- /dev/null
+++ b/editor/icons/icon_bone.png
Binary files differ
diff --git a/editor/icons/icon_bone_attachment.png b/editor/icons/icon_bone_attachment.png
new file mode 100644
index 0000000000..882bb55f44
--- /dev/null
+++ b/editor/icons/icon_bone_attachment.png
Binary files differ
diff --git a/editor/icons/icon_bone_track.png b/editor/icons/icon_bone_track.png
new file mode 100644
index 0000000000..1e55e53d6b
--- /dev/null
+++ b/editor/icons/icon_bone_track.png
Binary files differ
diff --git a/editor/icons/icon_bool.png b/editor/icons/icon_bool.png
new file mode 100644
index 0000000000..822b5dd688
--- /dev/null
+++ b/editor/icons/icon_bool.png
Binary files differ
diff --git a/editor/icons/icon_box_shape.png b/editor/icons/icon_box_shape.png
new file mode 100644
index 0000000000..68ec6088c9
--- /dev/null
+++ b/editor/icons/icon_box_shape.png
Binary files differ
diff --git a/editor/icons/icon_bus_vu_db.png b/editor/icons/icon_bus_vu_db.png
new file mode 100644
index 0000000000..52507cae52
--- /dev/null
+++ b/editor/icons/icon_bus_vu_db.png
Binary files differ
diff --git a/editor/icons/icon_bus_vu_empty.png b/editor/icons/icon_bus_vu_empty.png
new file mode 100644
index 0000000000..6fc3143a55
--- /dev/null
+++ b/editor/icons/icon_bus_vu_empty.png
Binary files differ
diff --git a/editor/icons/icon_bus_vu_frozen.png b/editor/icons/icon_bus_vu_frozen.png
new file mode 100644
index 0000000000..cf128afa91
--- /dev/null
+++ b/editor/icons/icon_bus_vu_frozen.png
Binary files differ
diff --git a/editor/icons/icon_bus_vu_full.png b/editor/icons/icon_bus_vu_full.png
new file mode 100644
index 0000000000..9e3d7a93e3
--- /dev/null
+++ b/editor/icons/icon_bus_vu_full.png
Binary files differ
diff --git a/editor/icons/icon_button.png b/editor/icons/icon_button.png
new file mode 100644
index 0000000000..da02831da2
--- /dev/null
+++ b/editor/icons/icon_button.png
Binary files differ
diff --git a/editor/icons/icon_button_group.png b/editor/icons/icon_button_group.png
new file mode 100644
index 0000000000..c105234598
--- /dev/null
+++ b/editor/icons/icon_button_group.png
Binary files differ
diff --git a/editor/icons/icon_camera.png b/editor/icons/icon_camera.png
new file mode 100644
index 0000000000..4dff1791ad
--- /dev/null
+++ b/editor/icons/icon_camera.png
Binary files differ
diff --git a/editor/icons/icon_camera_2d.png b/editor/icons/icon_camera_2d.png
new file mode 100644
index 0000000000..6497997afe
--- /dev/null
+++ b/editor/icons/icon_camera_2d.png
Binary files differ
diff --git a/editor/icons/icon_canvas_item.png b/editor/icons/icon_canvas_item.png
new file mode 100644
index 0000000000..64f5d8abdf
--- /dev/null
+++ b/editor/icons/icon_canvas_item.png
Binary files differ
diff --git a/editor/icons/icon_canvas_item_material.png b/editor/icons/icon_canvas_item_material.png
new file mode 100644
index 0000000000..a04f6e8f5f
--- /dev/null
+++ b/editor/icons/icon_canvas_item_material.png
Binary files differ
diff --git a/editor/icons/icon_canvas_item_shader.png b/editor/icons/icon_canvas_item_shader.png
new file mode 100644
index 0000000000..8392f889d1
--- /dev/null
+++ b/editor/icons/icon_canvas_item_shader.png
Binary files differ
diff --git a/editor/icons/icon_canvas_item_shader_graph.png b/editor/icons/icon_canvas_item_shader_graph.png
new file mode 100644
index 0000000000..f40e3755af
--- /dev/null
+++ b/editor/icons/icon_canvas_item_shader_graph.png
Binary files differ
diff --git a/editor/icons/icon_canvas_layer.png b/editor/icons/icon_canvas_layer.png
new file mode 100644
index 0000000000..bb32d6d3ad
--- /dev/null
+++ b/editor/icons/icon_canvas_layer.png
Binary files differ
diff --git a/editor/icons/icon_canvas_modulate.png b/editor/icons/icon_canvas_modulate.png
new file mode 100644
index 0000000000..b76e532268
--- /dev/null
+++ b/editor/icons/icon_canvas_modulate.png
Binary files differ
diff --git a/editor/icons/icon_capsule_shape.png b/editor/icons/icon_capsule_shape.png
new file mode 100644
index 0000000000..bc00e491d3
--- /dev/null
+++ b/editor/icons/icon_capsule_shape.png
Binary files differ
diff --git a/editor/icons/icon_capsule_shape_2d.png b/editor/icons/icon_capsule_shape_2d.png
new file mode 100644
index 0000000000..6f6554fbc7
--- /dev/null
+++ b/editor/icons/icon_capsule_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_center_container.png b/editor/icons/icon_center_container.png
new file mode 100644
index 0000000000..61904e7b00
--- /dev/null
+++ b/editor/icons/icon_center_container.png
Binary files differ
diff --git a/editor/icons/icon_character_body.png b/editor/icons/icon_character_body.png
new file mode 100644
index 0000000000..b859a271d5
--- /dev/null
+++ b/editor/icons/icon_character_body.png
Binary files differ
diff --git a/editor/icons/icon_character_camera.png b/editor/icons/icon_character_camera.png
new file mode 100644
index 0000000000..c238487942
--- /dev/null
+++ b/editor/icons/icon_character_camera.png
Binary files differ
diff --git a/editor/icons/icon_check_box.png b/editor/icons/icon_check_box.png
new file mode 100644
index 0000000000..f0e614d0e7
--- /dev/null
+++ b/editor/icons/icon_check_box.png
Binary files differ
diff --git a/editor/icons/icon_check_button.png b/editor/icons/icon_check_button.png
new file mode 100644
index 0000000000..968188f43d
--- /dev/null
+++ b/editor/icons/icon_check_button.png
Binary files differ
diff --git a/editor/icons/icon_checkerboard.png b/editor/icons/icon_checkerboard.png
new file mode 100644
index 0000000000..5f658c765e
--- /dev/null
+++ b/editor/icons/icon_checkerboard.png
Binary files differ
diff --git a/editor/icons/icon_circle_shape_2d.png b/editor/icons/icon_circle_shape_2d.png
new file mode 100644
index 0000000000..7865ed3dbe
--- /dev/null
+++ b/editor/icons/icon_circle_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_class_list.png b/editor/icons/icon_class_list.png
new file mode 100644
index 0000000000..5faff250d7
--- /dev/null
+++ b/editor/icons/icon_class_list.png
Binary files differ
diff --git a/editor/icons/icon_click2edit.png b/editor/icons/icon_click2edit.png
new file mode 100644
index 0000000000..795756dff0
--- /dev/null
+++ b/editor/icons/icon_click2edit.png
Binary files differ
diff --git a/editor/icons/icon_close.png b/editor/icons/icon_close.png
new file mode 100644
index 0000000000..20d9b5c810
--- /dev/null
+++ b/editor/icons/icon_close.png
Binary files differ
diff --git a/editor/icons/icon_close_hover.png b/editor/icons/icon_close_hover.png
new file mode 100644
index 0000000000..cb519691e5
--- /dev/null
+++ b/editor/icons/icon_close_hover.png
Binary files differ
diff --git a/editor/icons/icon_collapse.png b/editor/icons/icon_collapse.png
new file mode 100644
index 0000000000..ad2442183d
--- /dev/null
+++ b/editor/icons/icon_collapse.png
Binary files differ
diff --git a/editor/icons/icon_collapse_hl.png b/editor/icons/icon_collapse_hl.png
new file mode 100644
index 0000000000..0dfbc8b175
--- /dev/null
+++ b/editor/icons/icon_collapse_hl.png
Binary files differ
diff --git a/editor/icons/icon_collision.png b/editor/icons/icon_collision.png
new file mode 100644
index 0000000000..ccda8b6a25
--- /dev/null
+++ b/editor/icons/icon_collision.png
Binary files differ
diff --git a/editor/icons/icon_collision_2d.png b/editor/icons/icon_collision_2d.png
new file mode 100644
index 0000000000..b372749cb0
--- /dev/null
+++ b/editor/icons/icon_collision_2d.png
Binary files differ
diff --git a/editor/icons/icon_collision_polygon.png b/editor/icons/icon_collision_polygon.png
new file mode 100644
index 0000000000..738f80c3f3
--- /dev/null
+++ b/editor/icons/icon_collision_polygon.png
Binary files differ
diff --git a/editor/icons/icon_collision_polygon_2d.png b/editor/icons/icon_collision_polygon_2d.png
new file mode 100644
index 0000000000..b372749cb0
--- /dev/null
+++ b/editor/icons/icon_collision_polygon_2d.png
Binary files differ
diff --git a/editor/icons/icon_collision_shape.png b/editor/icons/icon_collision_shape.png
new file mode 100644
index 0000000000..7bcd61c719
--- /dev/null
+++ b/editor/icons/icon_collision_shape.png
Binary files differ
diff --git a/editor/icons/icon_collision_shape_2d.png b/editor/icons/icon_collision_shape_2d.png
new file mode 100644
index 0000000000..afc1326959
--- /dev/null
+++ b/editor/icons/icon_collision_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_color.png b/editor/icons/icon_color.png
new file mode 100644
index 0000000000..589a6d3ffa
--- /dev/null
+++ b/editor/icons/icon_color.png
Binary files differ
diff --git a/editor/icons/icon_color_pick.png b/editor/icons/icon_color_pick.png
new file mode 100644
index 0000000000..15679a9558
--- /dev/null
+++ b/editor/icons/icon_color_pick.png
Binary files differ
diff --git a/editor/icons/icon_color_picker.png b/editor/icons/icon_color_picker.png
new file mode 100644
index 0000000000..6d1114054a
--- /dev/null
+++ b/editor/icons/icon_color_picker.png
Binary files differ
diff --git a/editor/icons/icon_color_picker_button.png b/editor/icons/icon_color_picker_button.png
new file mode 100644
index 0000000000..a399128773
--- /dev/null
+++ b/editor/icons/icon_color_picker_button.png
Binary files differ
diff --git a/editor/icons/icon_color_ramp.png b/editor/icons/icon_color_ramp.png
new file mode 100644
index 0000000000..03d19a56bb
--- /dev/null
+++ b/editor/icons/icon_color_ramp.png
Binary files differ
diff --git a/editor/icons/icon_color_rect.png b/editor/icons/icon_color_rect.png
new file mode 100644
index 0000000000..40b9dab605
--- /dev/null
+++ b/editor/icons/icon_color_rect.png
Binary files differ
diff --git a/editor/icons/icon_concave_polygon_shape.png b/editor/icons/icon_concave_polygon_shape.png
new file mode 100644
index 0000000000..dc1ff1d388
--- /dev/null
+++ b/editor/icons/icon_concave_polygon_shape.png
Binary files differ
diff --git a/editor/icons/icon_concave_polygon_shape_2d.png b/editor/icons/icon_concave_polygon_shape_2d.png
new file mode 100644
index 0000000000..2e87eea5aa
--- /dev/null
+++ b/editor/icons/icon_concave_polygon_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_cone_twist_joint.png b/editor/icons/icon_cone_twist_joint.png
new file mode 100644
index 0000000000..bbf93f2f71
--- /dev/null
+++ b/editor/icons/icon_cone_twist_joint.png
Binary files differ
diff --git a/editor/icons/icon_confirmation_dialog.png b/editor/icons/icon_confirmation_dialog.png
new file mode 100644
index 0000000000..2dd4cd00fb
--- /dev/null
+++ b/editor/icons/icon_confirmation_dialog.png
Binary files differ
diff --git a/editor/icons/icon_connect.png b/editor/icons/icon_connect.png
new file mode 100644
index 0000000000..51615838a9
--- /dev/null
+++ b/editor/icons/icon_connect.png
Binary files differ
diff --git a/editor/icons/icon_connection_and_groups.png b/editor/icons/icon_connection_and_groups.png
new file mode 100644
index 0000000000..76e036e5bb
--- /dev/null
+++ b/editor/icons/icon_connection_and_groups.png
Binary files differ
diff --git a/editor/icons/icon_console.png b/editor/icons/icon_console.png
new file mode 100644
index 0000000000..7dc7407ef7
--- /dev/null
+++ b/editor/icons/icon_console.png
Binary files differ
diff --git a/editor/icons/icon_container.png b/editor/icons/icon_container.png
new file mode 100644
index 0000000000..ae0d76072b
--- /dev/null
+++ b/editor/icons/icon_container.png
Binary files differ
diff --git a/editor/icons/icon_control.png b/editor/icons/icon_control.png
new file mode 100644
index 0000000000..0d2a82ad0e
--- /dev/null
+++ b/editor/icons/icon_control.png
Binary files differ
diff --git a/editor/icons/icon_control_align_bottom_center.png b/editor/icons/icon_control_align_bottom_center.png
new file mode 100644
index 0000000000..166f122ace
--- /dev/null
+++ b/editor/icons/icon_control_align_bottom_center.png
Binary files differ
diff --git a/editor/icons/icon_control_align_bottom_left.png b/editor/icons/icon_control_align_bottom_left.png
new file mode 100644
index 0000000000..238f33a098
--- /dev/null
+++ b/editor/icons/icon_control_align_bottom_left.png
Binary files differ
diff --git a/editor/icons/icon_control_align_bottom_right.png b/editor/icons/icon_control_align_bottom_right.png
new file mode 100644
index 0000000000..ff8b6a0177
--- /dev/null
+++ b/editor/icons/icon_control_align_bottom_right.png
Binary files differ
diff --git a/editor/icons/icon_control_align_bottom_wide.png b/editor/icons/icon_control_align_bottom_wide.png
new file mode 100644
index 0000000000..309907767e
--- /dev/null
+++ b/editor/icons/icon_control_align_bottom_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_align_center.png b/editor/icons/icon_control_align_center.png
new file mode 100644
index 0000000000..964f132ac3
--- /dev/null
+++ b/editor/icons/icon_control_align_center.png
Binary files differ
diff --git a/editor/icons/icon_control_align_center_left.png b/editor/icons/icon_control_align_center_left.png
new file mode 100644
index 0000000000..704b4f504f
--- /dev/null
+++ b/editor/icons/icon_control_align_center_left.png
Binary files differ
diff --git a/editor/icons/icon_control_align_center_right.png b/editor/icons/icon_control_align_center_right.png
new file mode 100644
index 0000000000..bd7111aec3
--- /dev/null
+++ b/editor/icons/icon_control_align_center_right.png
Binary files differ
diff --git a/editor/icons/icon_control_align_left_center.png b/editor/icons/icon_control_align_left_center.png
new file mode 100644
index 0000000000..75c2d8573f
--- /dev/null
+++ b/editor/icons/icon_control_align_left_center.png
Binary files differ
diff --git a/editor/icons/icon_control_align_left_wide.png b/editor/icons/icon_control_align_left_wide.png
new file mode 100644
index 0000000000..92a13144cb
--- /dev/null
+++ b/editor/icons/icon_control_align_left_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_align_right_center.png b/editor/icons/icon_control_align_right_center.png
new file mode 100644
index 0000000000..a859035439
--- /dev/null
+++ b/editor/icons/icon_control_align_right_center.png
Binary files differ
diff --git a/editor/icons/icon_control_align_right_wide.png b/editor/icons/icon_control_align_right_wide.png
new file mode 100644
index 0000000000..b6fef9569e
--- /dev/null
+++ b/editor/icons/icon_control_align_right_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_align_top_center.png b/editor/icons/icon_control_align_top_center.png
new file mode 100644
index 0000000000..5cdd6cd2fc
--- /dev/null
+++ b/editor/icons/icon_control_align_top_center.png
Binary files differ
diff --git a/editor/icons/icon_control_align_top_left.png b/editor/icons/icon_control_align_top_left.png
new file mode 100644
index 0000000000..558e3f08cb
--- /dev/null
+++ b/editor/icons/icon_control_align_top_left.png
Binary files differ
diff --git a/editor/icons/icon_control_align_top_right.png b/editor/icons/icon_control_align_top_right.png
new file mode 100644
index 0000000000..5ca294de48
--- /dev/null
+++ b/editor/icons/icon_control_align_top_right.png
Binary files differ
diff --git a/editor/icons/icon_control_align_top_wide.png b/editor/icons/icon_control_align_top_wide.png
new file mode 100644
index 0000000000..ec089d0174
--- /dev/null
+++ b/editor/icons/icon_control_align_top_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_align_wide.png b/editor/icons/icon_control_align_wide.png
new file mode 100644
index 0000000000..45552740bf
--- /dev/null
+++ b/editor/icons/icon_control_align_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_hcenter_wide.png b/editor/icons/icon_control_hcenter_wide.png
new file mode 100644
index 0000000000..f298b22f5f
--- /dev/null
+++ b/editor/icons/icon_control_hcenter_wide.png
Binary files differ
diff --git a/editor/icons/icon_control_vcenter_wide.png b/editor/icons/icon_control_vcenter_wide.png
new file mode 100644
index 0000000000..b6c90646fb
--- /dev/null
+++ b/editor/icons/icon_control_vcenter_wide.png
Binary files differ
diff --git a/editor/icons/icon_convex_polygon_shape.png b/editor/icons/icon_convex_polygon_shape.png
new file mode 100644
index 0000000000..4dfc9acc9e
--- /dev/null
+++ b/editor/icons/icon_convex_polygon_shape.png
Binary files differ
diff --git a/editor/icons/icon_convex_polygon_shape_2d.png b/editor/icons/icon_convex_polygon_shape_2d.png
new file mode 100644
index 0000000000..e449c6930f
--- /dev/null
+++ b/editor/icons/icon_convex_polygon_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_copy_node_path.png b/editor/icons/icon_copy_node_path.png
new file mode 100644
index 0000000000..d777f132d8
--- /dev/null
+++ b/editor/icons/icon_copy_node_path.png
Binary files differ
diff --git a/editor/icons/icon_create_new_scene_from.png b/editor/icons/icon_create_new_scene_from.png
new file mode 100644
index 0000000000..45df9b1e25
--- /dev/null
+++ b/editor/icons/icon_create_new_scene_from.png
Binary files differ
diff --git a/editor/icons/icon_cube_grid_map.png b/editor/icons/icon_cube_grid_map.png
new file mode 100644
index 0000000000..fe13222691
--- /dev/null
+++ b/editor/icons/icon_cube_grid_map.png
Binary files differ
diff --git a/editor/icons/icon_cube_map.png b/editor/icons/icon_cube_map.png
new file mode 100644
index 0000000000..9c4c6fdc9f
--- /dev/null
+++ b/editor/icons/icon_cube_map.png
Binary files differ
diff --git a/editor/icons/icon_curve.png b/editor/icons/icon_curve.png
new file mode 100644
index 0000000000..27d423edcd
--- /dev/null
+++ b/editor/icons/icon_curve.png
Binary files differ
diff --git a/editor/icons/icon_curve_2d.png b/editor/icons/icon_curve_2d.png
new file mode 100644
index 0000000000..ce46dcaad4
--- /dev/null
+++ b/editor/icons/icon_curve_2d.png
Binary files differ
diff --git a/editor/icons/icon_curve_3d.png b/editor/icons/icon_curve_3d.png
new file mode 100644
index 0000000000..561837e4de
--- /dev/null
+++ b/editor/icons/icon_curve_3d.png
Binary files differ
diff --git a/editor/icons/icon_curve_close.png b/editor/icons/icon_curve_close.png
new file mode 100644
index 0000000000..9a66015252
--- /dev/null
+++ b/editor/icons/icon_curve_close.png
Binary files differ
diff --git a/editor/icons/icon_curve_constant.png b/editor/icons/icon_curve_constant.png
new file mode 100644
index 0000000000..510a01c7ec
--- /dev/null
+++ b/editor/icons/icon_curve_constant.png
Binary files differ
diff --git a/editor/icons/icon_curve_create.png b/editor/icons/icon_curve_create.png
new file mode 100644
index 0000000000..b07820a5cd
--- /dev/null
+++ b/editor/icons/icon_curve_create.png
Binary files differ
diff --git a/editor/icons/icon_curve_curve.png b/editor/icons/icon_curve_curve.png
new file mode 100644
index 0000000000..7d71af0a23
--- /dev/null
+++ b/editor/icons/icon_curve_curve.png
Binary files differ
diff --git a/editor/icons/icon_curve_delete.png b/editor/icons/icon_curve_delete.png
new file mode 100644
index 0000000000..108bfeac35
--- /dev/null
+++ b/editor/icons/icon_curve_delete.png
Binary files differ
diff --git a/editor/icons/icon_curve_edit.png b/editor/icons/icon_curve_edit.png
new file mode 100644
index 0000000000..51eb583384
--- /dev/null
+++ b/editor/icons/icon_curve_edit.png
Binary files differ
diff --git a/editor/icons/icon_curve_in.png b/editor/icons/icon_curve_in.png
new file mode 100644
index 0000000000..a809ee43d3
--- /dev/null
+++ b/editor/icons/icon_curve_in.png
Binary files differ
diff --git a/editor/icons/icon_curve_in_out.png b/editor/icons/icon_curve_in_out.png
new file mode 100644
index 0000000000..88e07d48a7
--- /dev/null
+++ b/editor/icons/icon_curve_in_out.png
Binary files differ
diff --git a/editor/icons/icon_curve_linear.png b/editor/icons/icon_curve_linear.png
new file mode 100644
index 0000000000..80306b6e04
--- /dev/null
+++ b/editor/icons/icon_curve_linear.png
Binary files differ
diff --git a/editor/icons/icon_curve_out.png b/editor/icons/icon_curve_out.png
new file mode 100644
index 0000000000..aa05bc8f86
--- /dev/null
+++ b/editor/icons/icon_curve_out.png
Binary files differ
diff --git a/editor/icons/icon_curve_out_in.png b/editor/icons/icon_curve_out_in.png
new file mode 100644
index 0000000000..7be46fc779
--- /dev/null
+++ b/editor/icons/icon_curve_out_in.png
Binary files differ
diff --git a/editor/icons/icon_cylinder_shape.png b/editor/icons/icon_cylinder_shape.png
new file mode 100644
index 0000000000..fd7d7e26e2
--- /dev/null
+++ b/editor/icons/icon_cylinder_shape.png
Binary files differ
diff --git a/editor/icons/icon_d_o_f_blur_f_x.png b/editor/icons/icon_d_o_f_blur_f_x.png
new file mode 100644
index 0000000000..fda7d48353
--- /dev/null
+++ b/editor/icons/icon_d_o_f_blur_f_x.png
Binary files differ
diff --git a/editor/icons/icon_damped_spring_joint_2d.png b/editor/icons/icon_damped_spring_joint_2d.png
new file mode 100644
index 0000000000..b6a9c2b3a1
--- /dev/null
+++ b/editor/icons/icon_damped_spring_joint_2d.png
Binary files differ
diff --git a/editor/icons/icon_debug.png b/editor/icons/icon_debug.png
new file mode 100644
index 0000000000..03b98aa9e4
--- /dev/null
+++ b/editor/icons/icon_debug.png
Binary files differ
diff --git a/editor/icons/icon_debug_continue.png b/editor/icons/icon_debug_continue.png
new file mode 100644
index 0000000000..78a61aa98f
--- /dev/null
+++ b/editor/icons/icon_debug_continue.png
Binary files differ
diff --git a/editor/icons/icon_debug_next.png b/editor/icons/icon_debug_next.png
new file mode 100644
index 0000000000..c61f221562
--- /dev/null
+++ b/editor/icons/icon_debug_next.png
Binary files differ
diff --git a/editor/icons/icon_debug_step.png b/editor/icons/icon_debug_step.png
new file mode 100644
index 0000000000..a1839d56d8
--- /dev/null
+++ b/editor/icons/icon_debug_step.png
Binary files differ
diff --git a/editor/icons/icon_default_project_icon.png b/editor/icons/icon_default_project_icon.png
new file mode 100644
index 0000000000..e87a49bd28
--- /dev/null
+++ b/editor/icons/icon_default_project_icon.png
Binary files differ
diff --git a/editor/icons/icon_del.png b/editor/icons/icon_del.png
new file mode 100644
index 0000000000..10e56d5bb8
--- /dev/null
+++ b/editor/icons/icon_del.png
Binary files differ
diff --git a/editor/icons/icon_dependency_changed.png b/editor/icons/icon_dependency_changed.png
new file mode 100644
index 0000000000..1b396457d3
--- /dev/null
+++ b/editor/icons/icon_dependency_changed.png
Binary files differ
diff --git a/editor/icons/icon_dependency_changed_hl.png b/editor/icons/icon_dependency_changed_hl.png
new file mode 100644
index 0000000000..51dfe6b39d
--- /dev/null
+++ b/editor/icons/icon_dependency_changed_hl.png
Binary files differ
diff --git a/editor/icons/icon_dependency_local_changed.png b/editor/icons/icon_dependency_local_changed.png
new file mode 100644
index 0000000000..d8737fd2f4
--- /dev/null
+++ b/editor/icons/icon_dependency_local_changed.png
Binary files differ
diff --git a/editor/icons/icon_dependency_local_changed_hl.png b/editor/icons/icon_dependency_local_changed_hl.png
new file mode 100644
index 0000000000..a87c48ca3e
--- /dev/null
+++ b/editor/icons/icon_dependency_local_changed_hl.png
Binary files differ
diff --git a/editor/icons/icon_dependency_ok.png b/editor/icons/icon_dependency_ok.png
new file mode 100644
index 0000000000..2b9ac389ba
--- /dev/null
+++ b/editor/icons/icon_dependency_ok.png
Binary files differ
diff --git a/editor/icons/icon_dependency_ok_hl.png b/editor/icons/icon_dependency_ok_hl.png
new file mode 100644
index 0000000000..62e48531e4
--- /dev/null
+++ b/editor/icons/icon_dependency_ok_hl.png
Binary files differ
diff --git a/editor/icons/icon_directional_light.png b/editor/icons/icon_directional_light.png
new file mode 100644
index 0000000000..31f47c974d
--- /dev/null
+++ b/editor/icons/icon_directional_light.png
Binary files differ
diff --git a/editor/icons/icon_distraction_free.png b/editor/icons/icon_distraction_free.png
new file mode 100644
index 0000000000..c6f8a08874
--- /dev/null
+++ b/editor/icons/icon_distraction_free.png
Binary files differ
diff --git a/editor/icons/icon_doc_code_font.png b/editor/icons/icon_doc_code_font.png
new file mode 100644
index 0000000000..628654f6e8
--- /dev/null
+++ b/editor/icons/icon_doc_code_font.png
Binary files differ
diff --git a/editor/icons/icon_doc_font.png b/editor/icons/icon_doc_font.png
new file mode 100644
index 0000000000..65fbcc5ccc
--- /dev/null
+++ b/editor/icons/icon_doc_font.png
Binary files differ
diff --git a/editor/icons/icon_doc_title_font.png b/editor/icons/icon_doc_title_font.png
new file mode 100644
index 0000000000..d78b394da0
--- /dev/null
+++ b/editor/icons/icon_doc_title_font.png
Binary files differ
diff --git a/editor/icons/icon_down.png b/editor/icons/icon_down.png
new file mode 100644
index 0000000000..d2fcdb4c9f
--- /dev/null
+++ b/editor/icons/icon_down.png
Binary files differ
diff --git a/editor/icons/icon_dummy.png b/editor/icons/icon_dummy.png
new file mode 100644
index 0000000000..24998a28af
--- /dev/null
+++ b/editor/icons/icon_dummy.png
Binary files differ
diff --git a/editor/icons/icon_duplicate.png b/editor/icons/icon_duplicate.png
new file mode 100644
index 0000000000..320b36504e
--- /dev/null
+++ b/editor/icons/icon_duplicate.png
Binary files differ
diff --git a/editor/icons/icon_dynamic_character_body.png b/editor/icons/icon_dynamic_character_body.png
new file mode 100644
index 0000000000..b685841e35
--- /dev/null
+++ b/editor/icons/icon_dynamic_character_body.png
Binary files differ
diff --git a/editor/icons/icon_dynamic_custom_body.png b/editor/icons/icon_dynamic_custom_body.png
new file mode 100644
index 0000000000..d383e7087f
--- /dev/null
+++ b/editor/icons/icon_dynamic_custom_body.png
Binary files differ
diff --git a/editor/icons/icon_dynamic_font.png b/editor/icons/icon_dynamic_font.png
new file mode 100644
index 0000000000..e373553e4e
--- /dev/null
+++ b/editor/icons/icon_dynamic_font.png
Binary files differ
diff --git a/editor/icons/icon_dynamic_font_data.png b/editor/icons/icon_dynamic_font_data.png
new file mode 100644
index 0000000000..5cff86c40c
--- /dev/null
+++ b/editor/icons/icon_dynamic_font_data.png
Binary files differ
diff --git a/editor/icons/icon_dynamic_rigid_body.png b/editor/icons/icon_dynamic_rigid_body.png
new file mode 100644
index 0000000000..f804b29528
--- /dev/null
+++ b/editor/icons/icon_dynamic_rigid_body.png
Binary files differ
diff --git a/editor/icons/icon_edit.png b/editor/icons/icon_edit.png
new file mode 100644
index 0000000000..c114d2f84d
--- /dev/null
+++ b/editor/icons/icon_edit.png
Binary files differ
diff --git a/editor/icons/icon_edit_key.png b/editor/icons/icon_edit_key.png
new file mode 100644
index 0000000000..3ebbe75f78
--- /dev/null
+++ b/editor/icons/icon_edit_key.png
Binary files differ
diff --git a/editor/icons/icon_edit_pivot.png b/editor/icons/icon_edit_pivot.png
new file mode 100644
index 0000000000..230122b969
--- /dev/null
+++ b/editor/icons/icon_edit_pivot.png
Binary files differ
diff --git a/editor/icons/icon_edit_resource.png b/editor/icons/icon_edit_resource.png
new file mode 100644
index 0000000000..9f064fea3f
--- /dev/null
+++ b/editor/icons/icon_edit_resource.png
Binary files differ
diff --git a/editor/icons/icon_edit_small.png b/editor/icons/icon_edit_small.png
new file mode 100644
index 0000000000..19c83415f9
--- /dev/null
+++ b/editor/icons/icon_edit_small.png
Binary files differ
diff --git a/editor/icons/icon_editor_2d.png b/editor/icons/icon_editor_2d.png
new file mode 100644
index 0000000000..1594f5adf0
--- /dev/null
+++ b/editor/icons/icon_editor_2d.png
Binary files differ
diff --git a/editor/icons/icon_editor_3d_handle.png b/editor/icons/icon_editor_3d_handle.png
new file mode 100644
index 0000000000..6935cc9bc4
--- /dev/null
+++ b/editor/icons/icon_editor_3d_handle.png
Binary files differ
diff --git a/editor/icons/icon_editor_focus.png b/editor/icons/icon_editor_focus.png
new file mode 100644
index 0000000000..40ce11f381
--- /dev/null
+++ b/editor/icons/icon_editor_focus.png
Binary files differ
diff --git a/editor/icons/icon_editor_handle.png b/editor/icons/icon_editor_handle.png
new file mode 100644
index 0000000000..8950a216da
--- /dev/null
+++ b/editor/icons/icon_editor_handle.png
Binary files differ
diff --git a/editor/icons/icon_editor_node.png b/editor/icons/icon_editor_node.png
new file mode 100644
index 0000000000..aec161ed54
--- /dev/null
+++ b/editor/icons/icon_editor_node.png
Binary files differ
diff --git a/editor/icons/icon_editor_pivot.png b/editor/icons/icon_editor_pivot.png
new file mode 100644
index 0000000000..db7feb0be6
--- /dev/null
+++ b/editor/icons/icon_editor_pivot.png
Binary files differ
diff --git a/editor/icons/icon_editor_plugin.png b/editor/icons/icon_editor_plugin.png
new file mode 100644
index 0000000000..ff7004b993
--- /dev/null
+++ b/editor/icons/icon_editor_plugin.png
Binary files differ
diff --git a/editor/icons/icon_editor_rect_2d.png b/editor/icons/icon_editor_rect_2d.png
new file mode 100644
index 0000000000..f59d493587
--- /dev/null
+++ b/editor/icons/icon_editor_rect_2d.png
Binary files differ
diff --git a/editor/icons/icon_empty_control.png b/editor/icons/icon_empty_control.png
new file mode 100644
index 0000000000..b43bb14d39
--- /dev/null
+++ b/editor/icons/icon_empty_control.png
Binary files differ
diff --git a/editor/icons/icon_enum.png b/editor/icons/icon_enum.png
new file mode 100644
index 0000000000..a98a33aedf
--- /dev/null
+++ b/editor/icons/icon_enum.png
Binary files differ
diff --git a/editor/icons/icon_environment.png b/editor/icons/icon_environment.png
new file mode 100644
index 0000000000..c8c4da3e8f
--- /dev/null
+++ b/editor/icons/icon_environment.png
Binary files differ
diff --git a/editor/icons/icon_error.png b/editor/icons/icon_error.png
new file mode 100644
index 0000000000..7a9bed43aa
--- /dev/null
+++ b/editor/icons/icon_error.png
Binary files differ
diff --git a/editor/icons/icon_error_sign.png b/editor/icons/icon_error_sign.png
new file mode 100644
index 0000000000..1bfb1f345c
--- /dev/null
+++ b/editor/icons/icon_error_sign.png
Binary files differ
diff --git a/editor/icons/icon_event_player.png b/editor/icons/icon_event_player.png
new file mode 100644
index 0000000000..b5478ca74e
--- /dev/null
+++ b/editor/icons/icon_event_player.png
Binary files differ
diff --git a/editor/icons/icon_expand.png b/editor/icons/icon_expand.png
new file mode 100644
index 0000000000..8a604f945b
--- /dev/null
+++ b/editor/icons/icon_expand.png
Binary files differ
diff --git a/editor/icons/icon_expand_hl.png b/editor/icons/icon_expand_hl.png
new file mode 100644
index 0000000000..6f51806db2
--- /dev/null
+++ b/editor/icons/icon_expand_hl.png
Binary files differ
diff --git a/editor/icons/icon_favorites.png b/editor/icons/icon_favorites.png
new file mode 100644
index 0000000000..14e05ad9b9
--- /dev/null
+++ b/editor/icons/icon_favorites.png
Binary files differ
diff --git a/editor/icons/icon_file.png b/editor/icons/icon_file.png
new file mode 100644
index 0000000000..69c6c90dc7
--- /dev/null
+++ b/editor/icons/icon_file.png
Binary files differ
diff --git a/editor/icons/icon_file_big.png b/editor/icons/icon_file_big.png
new file mode 100644
index 0000000000..d429736b57
--- /dev/null
+++ b/editor/icons/icon_file_big.png
Binary files differ
diff --git a/editor/icons/icon_file_dialog.png b/editor/icons/icon_file_dialog.png
new file mode 100644
index 0000000000..162827b2b0
--- /dev/null
+++ b/editor/icons/icon_file_dialog.png
Binary files differ
diff --git a/editor/icons/icon_file_list.png b/editor/icons/icon_file_list.png
new file mode 100644
index 0000000000..a98a33aedf
--- /dev/null
+++ b/editor/icons/icon_file_list.png
Binary files differ
diff --git a/editor/icons/icon_file_server.png b/editor/icons/icon_file_server.png
new file mode 100644
index 0000000000..f5a18fc52d
--- /dev/null
+++ b/editor/icons/icon_file_server.png
Binary files differ
diff --git a/editor/icons/icon_file_server_active.png b/editor/icons/icon_file_server_active.png
new file mode 100644
index 0000000000..af5fc0033a
--- /dev/null
+++ b/editor/icons/icon_file_server_active.png
Binary files differ
diff --git a/editor/icons/icon_file_thumbnail.png b/editor/icons/icon_file_thumbnail.png
new file mode 100644
index 0000000000..6fb4b8f36f
--- /dev/null
+++ b/editor/icons/icon_file_thumbnail.png
Binary files differ
diff --git a/editor/icons/icon_filesystem.png b/editor/icons/icon_filesystem.png
new file mode 100644
index 0000000000..5faff250d7
--- /dev/null
+++ b/editor/icons/icon_filesystem.png
Binary files differ
diff --git a/editor/icons/icon_fixed_material.png b/editor/icons/icon_fixed_material.png
new file mode 100644
index 0000000000..a9b0ebb568
--- /dev/null
+++ b/editor/icons/icon_fixed_material.png
Binary files differ
diff --git a/editor/icons/icon_fixed_spatial_material.png b/editor/icons/icon_fixed_spatial_material.png
new file mode 100644
index 0000000000..f26ac3be37
--- /dev/null
+++ b/editor/icons/icon_fixed_spatial_material.png
Binary files differ
diff --git a/editor/icons/icon_fog_f_x.png b/editor/icons/icon_fog_f_x.png
new file mode 100644
index 0000000000..54691aa9ab
--- /dev/null
+++ b/editor/icons/icon_fog_f_x.png
Binary files differ
diff --git a/editor/icons/icon_folder.png b/editor/icons/icon_folder.png
new file mode 100644
index 0000000000..cc05e98ebb
--- /dev/null
+++ b/editor/icons/icon_folder.png
Binary files differ
diff --git a/editor/icons/icon_folder_big.png b/editor/icons/icon_folder_big.png
new file mode 100644
index 0000000000..05c41720d8
--- /dev/null
+++ b/editor/icons/icon_folder_big.png
Binary files differ
diff --git a/editor/icons/icon_folder_scene.png b/editor/icons/icon_folder_scene.png
new file mode 100644
index 0000000000..6f6d706dae
--- /dev/null
+++ b/editor/icons/icon_folder_scene.png
Binary files differ
diff --git a/editor/icons/icon_font.png b/editor/icons/icon_font.png
new file mode 100644
index 0000000000..543ee01ae4
--- /dev/null
+++ b/editor/icons/icon_font.png
Binary files differ
diff --git a/editor/icons/icon_forward.png b/editor/icons/icon_forward.png
new file mode 100644
index 0000000000..412ffa89d3
--- /dev/null
+++ b/editor/icons/icon_forward.png
Binary files differ
diff --git a/editor/icons/icon_forward_no.png b/editor/icons/icon_forward_no.png
new file mode 100644
index 0000000000..bf62cd6ab2
--- /dev/null
+++ b/editor/icons/icon_forward_no.png
Binary files differ
diff --git a/editor/icons/icon_func.png b/editor/icons/icon_func.png
new file mode 100644
index 0000000000..45b32def8a
--- /dev/null
+++ b/editor/icons/icon_func.png
Binary files differ
diff --git a/editor/icons/icon_g_d_script.png b/editor/icons/icon_g_d_script.png
new file mode 100644
index 0000000000..4db4c53796
--- /dev/null
+++ b/editor/icons/icon_g_d_script.png
Binary files differ
diff --git a/editor/icons/icon_g_i_probe.png b/editor/icons/icon_g_i_probe.png
new file mode 100644
index 0000000000..a15ae18675
--- /dev/null
+++ b/editor/icons/icon_g_i_probe.png
Binary files differ
diff --git a/editor/icons/icon_g_i_probe_data.png b/editor/icons/icon_g_i_probe_data.png
new file mode 100644
index 0000000000..0aabcc49cb
--- /dev/null
+++ b/editor/icons/icon_g_i_probe_data.png
Binary files differ
diff --git a/editor/icons/icon_gamma_f_x.png b/editor/icons/icon_gamma_f_x.png
new file mode 100644
index 0000000000..50474340d1
--- /dev/null
+++ b/editor/icons/icon_gamma_f_x.png
Binary files differ
diff --git a/editor/icons/icon_generic_6_d_o_f_joint.png b/editor/icons/icon_generic_6_d_o_f_joint.png
new file mode 100644
index 0000000000..00ba76c098
--- /dev/null
+++ b/editor/icons/icon_generic_6_d_o_f_joint.png
Binary files differ
diff --git a/editor/icons/icon_gizmo_directional_light.png b/editor/icons/icon_gizmo_directional_light.png
new file mode 100644
index 0000000000..bdeb120b43
--- /dev/null
+++ b/editor/icons/icon_gizmo_directional_light.png
Binary files differ
diff --git a/editor/icons/icon_gizmo_light.png b/editor/icons/icon_gizmo_light.png
new file mode 100644
index 0000000000..be9903f8c2
--- /dev/null
+++ b/editor/icons/icon_gizmo_light.png
Binary files differ
diff --git a/editor/icons/icon_gizmo_listener.png b/editor/icons/icon_gizmo_listener.png
new file mode 100644
index 0000000000..47e978be61
--- /dev/null
+++ b/editor/icons/icon_gizmo_listener.png
Binary files differ
diff --git a/editor/icons/icon_gizmo_spatial_sample_player.png b/editor/icons/icon_gizmo_spatial_sample_player.png
new file mode 100644
index 0000000000..0119dbc433
--- /dev/null
+++ b/editor/icons/icon_gizmo_spatial_sample_player.png
Binary files differ
diff --git a/editor/icons/icon_gizmo_spatial_stream_player.png b/editor/icons/icon_gizmo_spatial_stream_player.png
new file mode 100644
index 0000000000..6a4f85d550
--- /dev/null
+++ b/editor/icons/icon_gizmo_spatial_stream_player.png
Binary files differ
diff --git a/editor/icons/icon_glow_f_x.png b/editor/icons/icon_glow_f_x.png
new file mode 100644
index 0000000000..c970204359
--- /dev/null
+++ b/editor/icons/icon_glow_f_x.png
Binary files differ
diff --git a/editor/icons/icon_godot.png b/editor/icons/icon_godot.png
new file mode 100644
index 0000000000..0b72e6ecc7
--- /dev/null
+++ b/editor/icons/icon_godot.png
Binary files differ
diff --git a/editor/icons/icon_godot_asset_default.png b/editor/icons/icon_godot_asset_default.png
new file mode 100644
index 0000000000..7478399e8b
--- /dev/null
+++ b/editor/icons/icon_godot_asset_default.png
Binary files differ
diff --git a/editor/icons/icon_graph_color_ramp.png b/editor/icons/icon_graph_color_ramp.png
new file mode 100644
index 0000000000..03d19a56bb
--- /dev/null
+++ b/editor/icons/icon_graph_color_ramp.png
Binary files differ
diff --git a/editor/icons/icon_graph_comment.png b/editor/icons/icon_graph_comment.png
new file mode 100644
index 0000000000..1686837d1d
--- /dev/null
+++ b/editor/icons/icon_graph_comment.png
Binary files differ
diff --git a/editor/icons/icon_graph_cube_uniform.png b/editor/icons/icon_graph_cube_uniform.png
new file mode 100644
index 0000000000..8b4ad57c31
--- /dev/null
+++ b/editor/icons/icon_graph_cube_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_curve_map.png b/editor/icons/icon_graph_curve_map.png
new file mode 100644
index 0000000000..ced27bd62f
--- /dev/null
+++ b/editor/icons/icon_graph_curve_map.png
Binary files differ
diff --git a/editor/icons/icon_graph_default_texture.png b/editor/icons/icon_graph_default_texture.png
new file mode 100644
index 0000000000..cad05e8332
--- /dev/null
+++ b/editor/icons/icon_graph_default_texture.png
Binary files differ
diff --git a/editor/icons/icon_graph_edit.png b/editor/icons/icon_graph_edit.png
new file mode 100644
index 0000000000..f6226b2193
--- /dev/null
+++ b/editor/icons/icon_graph_edit.png
Binary files differ
diff --git a/editor/icons/icon_graph_input.png b/editor/icons/icon_graph_input.png
new file mode 100644
index 0000000000..4725bcf7b1
--- /dev/null
+++ b/editor/icons/icon_graph_input.png
Binary files differ
diff --git a/editor/icons/icon_graph_node.png b/editor/icons/icon_graph_node.png
new file mode 100644
index 0000000000..fec38cb3eb
--- /dev/null
+++ b/editor/icons/icon_graph_node.png
Binary files differ
diff --git a/editor/icons/icon_graph_rgb.png b/editor/icons/icon_graph_rgb.png
new file mode 100644
index 0000000000..3113a18e8c
--- /dev/null
+++ b/editor/icons/icon_graph_rgb.png
Binary files differ
diff --git a/editor/icons/icon_graph_rgb_op.png b/editor/icons/icon_graph_rgb_op.png
new file mode 100644
index 0000000000..09d633e722
--- /dev/null
+++ b/editor/icons/icon_graph_rgb_op.png
Binary files differ
diff --git a/editor/icons/icon_graph_rgb_uniform.png b/editor/icons/icon_graph_rgb_uniform.png
new file mode 100644
index 0000000000..dbe10c9c8e
--- /dev/null
+++ b/editor/icons/icon_graph_rgb_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_scalar.png b/editor/icons/icon_graph_scalar.png
new file mode 100644
index 0000000000..d44fd34891
--- /dev/null
+++ b/editor/icons/icon_graph_scalar.png
Binary files differ
diff --git a/editor/icons/icon_graph_scalar_interp.png b/editor/icons/icon_graph_scalar_interp.png
new file mode 100644
index 0000000000..adcfc7d857
--- /dev/null
+++ b/editor/icons/icon_graph_scalar_interp.png
Binary files differ
diff --git a/editor/icons/icon_graph_scalar_op.png b/editor/icons/icon_graph_scalar_op.png
new file mode 100644
index 0000000000..6459cb9759
--- /dev/null
+++ b/editor/icons/icon_graph_scalar_op.png
Binary files differ
diff --git a/editor/icons/icon_graph_scalar_uniform.png b/editor/icons/icon_graph_scalar_uniform.png
new file mode 100644
index 0000000000..e7e0b9a73c
--- /dev/null
+++ b/editor/icons/icon_graph_scalar_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_scalars_to_vec.png b/editor/icons/icon_graph_scalars_to_vec.png
new file mode 100644
index 0000000000..231a25a02a
--- /dev/null
+++ b/editor/icons/icon_graph_scalars_to_vec.png
Binary files differ
diff --git a/editor/icons/icon_graph_texscreen.png b/editor/icons/icon_graph_texscreen.png
new file mode 100644
index 0000000000..628990553a
--- /dev/null
+++ b/editor/icons/icon_graph_texscreen.png
Binary files differ
diff --git a/editor/icons/icon_graph_texture_uniform.png b/editor/icons/icon_graph_texture_uniform.png
new file mode 100644
index 0000000000..9c0c758dc1
--- /dev/null
+++ b/editor/icons/icon_graph_texture_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_time.png b/editor/icons/icon_graph_time.png
new file mode 100644
index 0000000000..2a9b73dc2b
--- /dev/null
+++ b/editor/icons/icon_graph_time.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_dp.png b/editor/icons/icon_graph_vec_dp.png
new file mode 100644
index 0000000000..c395b61bb6
--- /dev/null
+++ b/editor/icons/icon_graph_vec_dp.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_interp.png b/editor/icons/icon_graph_vec_interp.png
new file mode 100644
index 0000000000..00cfe6ed29
--- /dev/null
+++ b/editor/icons/icon_graph_vec_interp.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_length.png b/editor/icons/icon_graph_vec_length.png
new file mode 100644
index 0000000000..af449109fd
--- /dev/null
+++ b/editor/icons/icon_graph_vec_length.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_op.png b/editor/icons/icon_graph_vec_op.png
new file mode 100644
index 0000000000..c4e3cf409a
--- /dev/null
+++ b/editor/icons/icon_graph_vec_op.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_scalar_op.png b/editor/icons/icon_graph_vec_scalar_op.png
new file mode 100644
index 0000000000..f7fc3b054e
--- /dev/null
+++ b/editor/icons/icon_graph_vec_scalar_op.png
Binary files differ
diff --git a/editor/icons/icon_graph_vec_to_scalars.png b/editor/icons/icon_graph_vec_to_scalars.png
new file mode 100644
index 0000000000..33f9fdf9bd
--- /dev/null
+++ b/editor/icons/icon_graph_vec_to_scalars.png
Binary files differ
diff --git a/editor/icons/icon_graph_vecs_to_xform.png b/editor/icons/icon_graph_vecs_to_xform.png
new file mode 100644
index 0000000000..82c32525dc
--- /dev/null
+++ b/editor/icons/icon_graph_vecs_to_xform.png
Binary files differ
diff --git a/editor/icons/icon_graph_vector.png b/editor/icons/icon_graph_vector.png
new file mode 100644
index 0000000000..d78a3fdf5c
--- /dev/null
+++ b/editor/icons/icon_graph_vector.png
Binary files differ
diff --git a/editor/icons/icon_graph_vector_uniform.png b/editor/icons/icon_graph_vector_uniform.png
new file mode 100644
index 0000000000..a89166768b
--- /dev/null
+++ b/editor/icons/icon_graph_vector_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform.png b/editor/icons/icon_graph_xform.png
new file mode 100644
index 0000000000..142ec3eca5
--- /dev/null
+++ b/editor/icons/icon_graph_xform.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_mult.png b/editor/icons/icon_graph_xform_mult.png
new file mode 100644
index 0000000000..94981d81af
--- /dev/null
+++ b/editor/icons/icon_graph_xform_mult.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_scalar_func.png b/editor/icons/icon_graph_xform_scalar_func.png
new file mode 100644
index 0000000000..d0edded8b0
--- /dev/null
+++ b/editor/icons/icon_graph_xform_scalar_func.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_to_vecs.png b/editor/icons/icon_graph_xform_to_vecs.png
new file mode 100644
index 0000000000..3d59c7957d
--- /dev/null
+++ b/editor/icons/icon_graph_xform_to_vecs.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_uniform.png b/editor/icons/icon_graph_xform_uniform.png
new file mode 100644
index 0000000000..36ed91e427
--- /dev/null
+++ b/editor/icons/icon_graph_xform_uniform.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_vec_func.png b/editor/icons/icon_graph_xform_vec_func.png
new file mode 100644
index 0000000000..3866430f72
--- /dev/null
+++ b/editor/icons/icon_graph_xform_vec_func.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_vec_imult.png b/editor/icons/icon_graph_xform_vec_imult.png
new file mode 100644
index 0000000000..07a7e214c2
--- /dev/null
+++ b/editor/icons/icon_graph_xform_vec_imult.png
Binary files differ
diff --git a/editor/icons/icon_graph_xform_vec_mult.png b/editor/icons/icon_graph_xform_vec_mult.png
new file mode 100644
index 0000000000..8048e755c5
--- /dev/null
+++ b/editor/icons/icon_graph_xform_vec_mult.png
Binary files differ
diff --git a/editor/icons/icon_grid.png b/editor/icons/icon_grid.png
new file mode 100644
index 0000000000..1366205fe0
--- /dev/null
+++ b/editor/icons/icon_grid.png
Binary files differ
diff --git a/editor/icons/icon_grid_container.png b/editor/icons/icon_grid_container.png
new file mode 100644
index 0000000000..027e992770
--- /dev/null
+++ b/editor/icons/icon_grid_container.png
Binary files differ
diff --git a/editor/icons/icon_grid_map.png b/editor/icons/icon_grid_map.png
new file mode 100644
index 0000000000..570b11d085
--- /dev/null
+++ b/editor/icons/icon_grid_map.png
Binary files differ
diff --git a/editor/icons/icon_grid_map_floor.png b/editor/icons/icon_grid_map_floor.png
new file mode 100644
index 0000000000..a75871188b
--- /dev/null
+++ b/editor/icons/icon_grid_map_floor.png
Binary files differ
diff --git a/editor/icons/icon_groove_joint_2d.png b/editor/icons/icon_groove_joint_2d.png
new file mode 100644
index 0000000000..f65dc2b6b8
--- /dev/null
+++ b/editor/icons/icon_groove_joint_2d.png
Binary files differ
diff --git a/editor/icons/icon_group.png b/editor/icons/icon_group.png
new file mode 100644
index 0000000000..5ffc90455e
--- /dev/null
+++ b/editor/icons/icon_group.png
Binary files differ
diff --git a/editor/icons/icon_groups.png b/editor/icons/icon_groups.png
new file mode 100644
index 0000000000..84a05560a9
--- /dev/null
+++ b/editor/icons/icon_groups.png
Binary files differ
diff --git a/editor/icons/icon_h_box_container.png b/editor/icons/icon_h_box_container.png
new file mode 100644
index 0000000000..36cef0a03c
--- /dev/null
+++ b/editor/icons/icon_h_box_container.png
Binary files differ
diff --git a/editor/icons/icon_h_button_array.png b/editor/icons/icon_h_button_array.png
new file mode 100644
index 0000000000..baf3386801
--- /dev/null
+++ b/editor/icons/icon_h_button_array.png
Binary files differ
diff --git a/editor/icons/icon_h_scroll_bar.png b/editor/icons/icon_h_scroll_bar.png
new file mode 100644
index 0000000000..e4576c4ae3
--- /dev/null
+++ b/editor/icons/icon_h_scroll_bar.png
Binary files differ
diff --git a/editor/icons/icon_h_separator.png b/editor/icons/icon_h_separator.png
new file mode 100644
index 0000000000..8ab1348c3b
--- /dev/null
+++ b/editor/icons/icon_h_separator.png
Binary files differ
diff --git a/editor/icons/icon_h_slider.png b/editor/icons/icon_h_slider.png
new file mode 100644
index 0000000000..87cf585e14
--- /dev/null
+++ b/editor/icons/icon_h_slider.png
Binary files differ
diff --git a/editor/icons/icon_h_split_container.png b/editor/icons/icon_h_split_container.png
new file mode 100644
index 0000000000..65ef8655dd
--- /dev/null
+++ b/editor/icons/icon_h_split_container.png
Binary files differ
diff --git a/editor/icons/icon_h_t_t_p_request.png b/editor/icons/icon_h_t_t_p_request.png
new file mode 100644
index 0000000000..60c6845b33
--- /dev/null
+++ b/editor/icons/icon_h_t_t_p_request.png
Binary files differ
diff --git a/editor/icons/icon_headphones.png b/editor/icons/icon_headphones.png
new file mode 100644
index 0000000000..83309d91d5
--- /dev/null
+++ b/editor/icons/icon_headphones.png
Binary files differ
diff --git a/editor/icons/icon_help.png b/editor/icons/icon_help.png
new file mode 100644
index 0000000000..f05b512f4c
--- /dev/null
+++ b/editor/icons/icon_help.png
Binary files differ
diff --git a/editor/icons/icon_hidden.png b/editor/icons/icon_hidden.png
new file mode 100644
index 0000000000..ef3039f580
--- /dev/null
+++ b/editor/icons/icon_hidden.png
Binary files differ
diff --git a/editor/icons/icon_hinge_joint.png b/editor/icons/icon_hinge_joint.png
new file mode 100644
index 0000000000..246ca1ba42
--- /dev/null
+++ b/editor/icons/icon_hinge_joint.png
Binary files differ
diff --git a/editor/icons/icon_history.png b/editor/icons/icon_history.png
new file mode 100644
index 0000000000..4782918233
--- /dev/null
+++ b/editor/icons/icon_history.png
Binary files differ
diff --git a/editor/icons/icon_hsize.png b/editor/icons/icon_hsize.png
new file mode 100644
index 0000000000..7be48946b4
--- /dev/null
+++ b/editor/icons/icon_hsize.png
Binary files differ
diff --git a/editor/icons/icon_iapi.png b/editor/icons/icon_iapi.png
new file mode 100644
index 0000000000..dc2639da83
--- /dev/null
+++ b/editor/icons/icon_iapi.png
Binary files differ
diff --git a/editor/icons/icon_image.png b/editor/icons/icon_image.png
new file mode 100644
index 0000000000..ddfabace25
--- /dev/null
+++ b/editor/icons/icon_image.png
Binary files differ
diff --git a/editor/icons/icon_image_sky_box.png b/editor/icons/icon_image_sky_box.png
new file mode 100644
index 0000000000..cf80258577
--- /dev/null
+++ b/editor/icons/icon_image_sky_box.png
Binary files differ
diff --git a/editor/icons/icon_image_texture.png b/editor/icons/icon_image_texture.png
new file mode 100644
index 0000000000..7c4493395e
--- /dev/null
+++ b/editor/icons/icon_image_texture.png
Binary files differ
diff --git a/editor/icons/icon_immediate_geometry.png b/editor/icons/icon_immediate_geometry.png
new file mode 100644
index 0000000000..1ff9976921
--- /dev/null
+++ b/editor/icons/icon_immediate_geometry.png
Binary files differ
diff --git a/editor/icons/icon_import_check.png b/editor/icons/icon_import_check.png
new file mode 100644
index 0000000000..e72a30603d
--- /dev/null
+++ b/editor/icons/icon_import_check.png
Binary files differ
diff --git a/editor/icons/icon_import_fail.png b/editor/icons/icon_import_fail.png
new file mode 100644
index 0000000000..f7dd6fd79a
--- /dev/null
+++ b/editor/icons/icon_import_fail.png
Binary files differ
diff --git a/editor/icons/icon_influence_zone.png b/editor/icons/icon_influence_zone.png
new file mode 100644
index 0000000000..6d687735e9
--- /dev/null
+++ b/editor/icons/icon_influence_zone.png
Binary files differ
diff --git a/editor/icons/icon_instance.png b/editor/icons/icon_instance.png
new file mode 100644
index 0000000000..51859a0425
--- /dev/null
+++ b/editor/icons/icon_instance.png
Binary files differ
diff --git a/editor/icons/icon_instance_options.png b/editor/icons/icon_instance_options.png
new file mode 100644
index 0000000000..ce6810ad27
--- /dev/null
+++ b/editor/icons/icon_instance_options.png
Binary files differ
diff --git a/editor/icons/icon_integer.png b/editor/icons/icon_integer.png
new file mode 100644
index 0000000000..583b9bda0b
--- /dev/null
+++ b/editor/icons/icon_integer.png
Binary files differ
diff --git a/editor/icons/icon_interp_cubic.png b/editor/icons/icon_interp_cubic.png
new file mode 100644
index 0000000000..c723f7b648
--- /dev/null
+++ b/editor/icons/icon_interp_cubic.png
Binary files differ
diff --git a/editor/icons/icon_interp_linear.png b/editor/icons/icon_interp_linear.png
new file mode 100644
index 0000000000..9d130b4507
--- /dev/null
+++ b/editor/icons/icon_interp_linear.png
Binary files differ
diff --git a/editor/icons/icon_interp_raw.png b/editor/icons/icon_interp_raw.png
new file mode 100644
index 0000000000..93ade1d674
--- /dev/null
+++ b/editor/icons/icon_interp_raw.png
Binary files differ
diff --git a/editor/icons/icon_interp_wrap_clamp.png b/editor/icons/icon_interp_wrap_clamp.png
new file mode 100644
index 0000000000..1024bd7d29
--- /dev/null
+++ b/editor/icons/icon_interp_wrap_clamp.png
Binary files differ
diff --git a/editor/icons/icon_interp_wrap_loop.png b/editor/icons/icon_interp_wrap_loop.png
new file mode 100644
index 0000000000..3a7ddacdb2
--- /dev/null
+++ b/editor/icons/icon_interp_wrap_loop.png
Binary files differ
diff --git a/editor/icons/icon_interpolated_camera.png b/editor/icons/icon_interpolated_camera.png
new file mode 100644
index 0000000000..c66724f513
--- /dev/null
+++ b/editor/icons/icon_interpolated_camera.png
Binary files differ
diff --git a/editor/icons/icon_invalid_key.png b/editor/icons/icon_invalid_key.png
new file mode 100644
index 0000000000..8ebc6d6add
--- /dev/null
+++ b/editor/icons/icon_invalid_key.png
Binary files differ
diff --git a/editor/icons/icon_inverse_kinematics.png b/editor/icons/icon_inverse_kinematics.png
new file mode 100644
index 0000000000..dd404765d3
--- /dev/null
+++ b/editor/icons/icon_inverse_kinematics.png
Binary files differ
diff --git a/editor/icons/icon_item_list.png b/editor/icons/icon_item_list.png
new file mode 100644
index 0000000000..3f5245d520
--- /dev/null
+++ b/editor/icons/icon_item_list.png
Binary files differ
diff --git a/editor/icons/icon_joy_axis.png b/editor/icons/icon_joy_axis.png
new file mode 100644
index 0000000000..8b1affd052
--- /dev/null
+++ b/editor/icons/icon_joy_axis.png
Binary files differ
diff --git a/editor/icons/icon_joy_button.png b/editor/icons/icon_joy_button.png
new file mode 100644
index 0000000000..150102b209
--- /dev/null
+++ b/editor/icons/icon_joy_button.png
Binary files differ
diff --git a/editor/icons/icon_joypad.png b/editor/icons/icon_joypad.png
new file mode 100644
index 0000000000..5df471109a
--- /dev/null
+++ b/editor/icons/icon_joypad.png
Binary files differ
diff --git a/editor/icons/icon_key.png b/editor/icons/icon_key.png
new file mode 100644
index 0000000000..564b474331
--- /dev/null
+++ b/editor/icons/icon_key.png
Binary files differ
diff --git a/editor/icons/icon_key_call.png b/editor/icons/icon_key_call.png
new file mode 100644
index 0000000000..044662eb92
--- /dev/null
+++ b/editor/icons/icon_key_call.png
Binary files differ
diff --git a/editor/icons/icon_key_hover.png b/editor/icons/icon_key_hover.png
new file mode 100644
index 0000000000..7ab405bb07
--- /dev/null
+++ b/editor/icons/icon_key_hover.png
Binary files differ
diff --git a/editor/icons/icon_key_invalid.png b/editor/icons/icon_key_invalid.png
new file mode 100644
index 0000000000..8ebc6d6add
--- /dev/null
+++ b/editor/icons/icon_key_invalid.png
Binary files differ
diff --git a/editor/icons/icon_key_invalid_hover.png b/editor/icons/icon_key_invalid_hover.png
new file mode 100644
index 0000000000..6f0396d96a
--- /dev/null
+++ b/editor/icons/icon_key_invalid_hover.png
Binary files differ
diff --git a/editor/icons/icon_key_next.png b/editor/icons/icon_key_next.png
new file mode 100644
index 0000000000..288161d245
--- /dev/null
+++ b/editor/icons/icon_key_next.png
Binary files differ
diff --git a/editor/icons/icon_key_selected.png b/editor/icons/icon_key_selected.png
new file mode 100644
index 0000000000..1838dc95aa
--- /dev/null
+++ b/editor/icons/icon_key_selected.png
Binary files differ
diff --git a/editor/icons/icon_key_value.png b/editor/icons/icon_key_value.png
new file mode 100644
index 0000000000..5c0b25a264
--- /dev/null
+++ b/editor/icons/icon_key_value.png
Binary files differ
diff --git a/editor/icons/icon_key_xform.png b/editor/icons/icon_key_xform.png
new file mode 100644
index 0000000000..1171bd80db
--- /dev/null
+++ b/editor/icons/icon_key_xform.png
Binary files differ
diff --git a/editor/icons/icon_keyboard.png b/editor/icons/icon_keyboard.png
new file mode 100644
index 0000000000..a275345577
--- /dev/null
+++ b/editor/icons/icon_keyboard.png
Binary files differ
diff --git a/editor/icons/icon_keying.png b/editor/icons/icon_keying.png
new file mode 100644
index 0000000000..de790a4f09
--- /dev/null
+++ b/editor/icons/icon_keying.png
Binary files differ
diff --git a/editor/icons/icon_kinematic_body.png b/editor/icons/icon_kinematic_body.png
new file mode 100644
index 0000000000..19a401dbf8
--- /dev/null
+++ b/editor/icons/icon_kinematic_body.png
Binary files differ
diff --git a/editor/icons/icon_kinematic_body_2d.png b/editor/icons/icon_kinematic_body_2d.png
new file mode 100644
index 0000000000..2f9d834805
--- /dev/null
+++ b/editor/icons/icon_kinematic_body_2d.png
Binary files differ
diff --git a/editor/icons/icon_label.png b/editor/icons/icon_label.png
new file mode 100644
index 0000000000..16919a5fef
--- /dev/null
+++ b/editor/icons/icon_label.png
Binary files differ
diff --git a/editor/icons/icon_large_texture.png b/editor/icons/icon_large_texture.png
new file mode 100644
index 0000000000..1727e2409f
--- /dev/null
+++ b/editor/icons/icon_large_texture.png
Binary files differ
diff --git a/editor/icons/icon_light_2d.png b/editor/icons/icon_light_2d.png
new file mode 100644
index 0000000000..ebab16c1b1
--- /dev/null
+++ b/editor/icons/icon_light_2d.png
Binary files differ
diff --git a/editor/icons/icon_light_map.png b/editor/icons/icon_light_map.png
new file mode 100644
index 0000000000..e0333f06ea
--- /dev/null
+++ b/editor/icons/icon_light_map.png
Binary files differ
diff --git a/editor/icons/icon_light_occluder_2d.png b/editor/icons/icon_light_occluder_2d.png
new file mode 100644
index 0000000000..ceefbcbe2a
--- /dev/null
+++ b/editor/icons/icon_light_occluder_2d.png
Binary files differ
diff --git a/editor/icons/icon_lightr.png b/editor/icons/icon_lightr.png
new file mode 100644
index 0000000000..6de8c8de3f
--- /dev/null
+++ b/editor/icons/icon_lightr.png
Binary files differ
diff --git a/editor/icons/icon_line_2d.png b/editor/icons/icon_line_2d.png
new file mode 100644
index 0000000000..4ebf46af04
--- /dev/null
+++ b/editor/icons/icon_line_2d.png
Binary files differ
diff --git a/editor/icons/icon_line_edit.png b/editor/icons/icon_line_edit.png
new file mode 100644
index 0000000000..81b5efcf6c
--- /dev/null
+++ b/editor/icons/icon_line_edit.png
Binary files differ
diff --git a/editor/icons/icon_line_shape_2d.png b/editor/icons/icon_line_shape_2d.png
new file mode 100644
index 0000000000..e31722d69c
--- /dev/null
+++ b/editor/icons/icon_line_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_link_button.png b/editor/icons/icon_link_button.png
new file mode 100644
index 0000000000..7febe3c19a
--- /dev/null
+++ b/editor/icons/icon_link_button.png
Binary files differ
diff --git a/editor/icons/icon_list_select.png b/editor/icons/icon_list_select.png
new file mode 100644
index 0000000000..9596d51e72
--- /dev/null
+++ b/editor/icons/icon_list_select.png
Binary files differ
diff --git a/editor/icons/icon_listener.png b/editor/icons/icon_listener.png
new file mode 100644
index 0000000000..3ce479e2fa
--- /dev/null
+++ b/editor/icons/icon_listener.png
Binary files differ
diff --git a/editor/icons/icon_live_debug.png b/editor/icons/icon_live_debug.png
new file mode 100644
index 0000000000..ad55646b9a
--- /dev/null
+++ b/editor/icons/icon_live_debug.png
Binary files differ
diff --git a/editor/icons/icon_load.png b/editor/icons/icon_load.png
new file mode 100644
index 0000000000..81835efa25
--- /dev/null
+++ b/editor/icons/icon_load.png
Binary files differ
diff --git a/editor/icons/icon_lock.png b/editor/icons/icon_lock.png
new file mode 100644
index 0000000000..a7059f5e7c
--- /dev/null
+++ b/editor/icons/icon_lock.png
Binary files differ
diff --git a/editor/icons/icon_logo.png b/editor/icons/icon_logo.png
new file mode 100644
index 0000000000..9bbd7dc619
--- /dev/null
+++ b/editor/icons/icon_logo.png
Binary files differ
diff --git a/editor/icons/icon_logo_small.png b/editor/icons/icon_logo_small.png
new file mode 100644
index 0000000000..9c7c7fe365
--- /dev/null
+++ b/editor/icons/icon_logo_small.png
Binary files differ
diff --git a/editor/icons/icon_loop.png b/editor/icons/icon_loop.png
new file mode 100644
index 0000000000..91c3ad600e
--- /dev/null
+++ b/editor/icons/icon_loop.png
Binary files differ
diff --git a/editor/icons/icon_loop_interpolation.png b/editor/icons/icon_loop_interpolation.png
new file mode 100644
index 0000000000..488b33316e
--- /dev/null
+++ b/editor/icons/icon_loop_interpolation.png
Binary files differ
diff --git a/editor/icons/icon_main_play.png b/editor/icons/icon_main_play.png
new file mode 100644
index 0000000000..a72672f963
--- /dev/null
+++ b/editor/icons/icon_main_play.png
Binary files differ
diff --git a/editor/icons/icon_main_stop.png b/editor/icons/icon_main_stop.png
new file mode 100644
index 0000000000..58387519dc
--- /dev/null
+++ b/editor/icons/icon_main_stop.png
Binary files differ
diff --git a/editor/icons/icon_margin_container.png b/editor/icons/icon_margin_container.png
new file mode 100644
index 0000000000..57f0cec42e
--- /dev/null
+++ b/editor/icons/icon_margin_container.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_cube.png b/editor/icons/icon_material_preview_cube.png
new file mode 100644
index 0000000000..f97c23b950
--- /dev/null
+++ b/editor/icons/icon_material_preview_cube.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_cube_off.png b/editor/icons/icon_material_preview_cube_off.png
new file mode 100644
index 0000000000..ad63218658
--- /dev/null
+++ b/editor/icons/icon_material_preview_cube_off.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_light_1.png b/editor/icons/icon_material_preview_light_1.png
new file mode 100644
index 0000000000..2a49a7530b
--- /dev/null
+++ b/editor/icons/icon_material_preview_light_1.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_light_1_off.png b/editor/icons/icon_material_preview_light_1_off.png
new file mode 100644
index 0000000000..738dd75594
--- /dev/null
+++ b/editor/icons/icon_material_preview_light_1_off.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_light_2.png b/editor/icons/icon_material_preview_light_2.png
new file mode 100644
index 0000000000..7e43b4425e
--- /dev/null
+++ b/editor/icons/icon_material_preview_light_2.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_light_2_off.png b/editor/icons/icon_material_preview_light_2_off.png
new file mode 100644
index 0000000000..e2f0e345a9
--- /dev/null
+++ b/editor/icons/icon_material_preview_light_2_off.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_sphere.png b/editor/icons/icon_material_preview_sphere.png
new file mode 100644
index 0000000000..80b06b39b7
--- /dev/null
+++ b/editor/icons/icon_material_preview_sphere.png
Binary files differ
diff --git a/editor/icons/icon_material_preview_sphere_off.png b/editor/icons/icon_material_preview_sphere_off.png
new file mode 100644
index 0000000000..a5acfcb8c9
--- /dev/null
+++ b/editor/icons/icon_material_preview_sphere_off.png
Binary files differ
diff --git a/editor/icons/icon_material_shader.png b/editor/icons/icon_material_shader.png
new file mode 100644
index 0000000000..568a45d938
--- /dev/null
+++ b/editor/icons/icon_material_shader.png
Binary files differ
diff --git a/editor/icons/icon_material_shader_graph.png b/editor/icons/icon_material_shader_graph.png
new file mode 100644
index 0000000000..f40e3755af
--- /dev/null
+++ b/editor/icons/icon_material_shader_graph.png
Binary files differ
diff --git a/editor/icons/icon_matrix.png b/editor/icons/icon_matrix.png
new file mode 100644
index 0000000000..ba0772ff8a
--- /dev/null
+++ b/editor/icons/icon_matrix.png
Binary files differ
diff --git a/editor/icons/icon_menu_button.png b/editor/icons/icon_menu_button.png
new file mode 100644
index 0000000000..1fd2e41c23
--- /dev/null
+++ b/editor/icons/icon_menu_button.png
Binary files differ
diff --git a/editor/icons/icon_mesh.png b/editor/icons/icon_mesh.png
new file mode 100644
index 0000000000..03e1501403
--- /dev/null
+++ b/editor/icons/icon_mesh.png
Binary files differ
diff --git a/editor/icons/icon_mesh_instance.png b/editor/icons/icon_mesh_instance.png
new file mode 100644
index 0000000000..c513feb1cd
--- /dev/null
+++ b/editor/icons/icon_mesh_instance.png
Binary files differ
diff --git a/editor/icons/icon_mesh_library.png b/editor/icons/icon_mesh_library.png
new file mode 100644
index 0000000000..0bb37b1da3
--- /dev/null
+++ b/editor/icons/icon_mesh_library.png
Binary files differ
diff --git a/editor/icons/icon_mesh_old.png b/editor/icons/icon_mesh_old.png
new file mode 100644
index 0000000000..18531ff844
--- /dev/null
+++ b/editor/icons/icon_mesh_old.png
Binary files differ
diff --git a/editor/icons/icon_meshr.png b/editor/icons/icon_meshr.png
new file mode 100644
index 0000000000..1ed2a123e6
--- /dev/null
+++ b/editor/icons/icon_meshr.png
Binary files differ
diff --git a/editor/icons/icon_mini_aabb.png b/editor/icons/icon_mini_aabb.png
new file mode 100644
index 0000000000..eebc4633e4
--- /dev/null
+++ b/editor/icons/icon_mini_aabb.png
Binary files differ
diff --git a/editor/icons/icon_mini_array.png b/editor/icons/icon_mini_array.png
new file mode 100644
index 0000000000..ade885e4d4
--- /dev/null
+++ b/editor/icons/icon_mini_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_boolean.png b/editor/icons/icon_mini_boolean.png
new file mode 100644
index 0000000000..9cb64fc983
--- /dev/null
+++ b/editor/icons/icon_mini_boolean.png
Binary files differ
diff --git a/editor/icons/icon_mini_color.png b/editor/icons/icon_mini_color.png
new file mode 100644
index 0000000000..bebf64e262
--- /dev/null
+++ b/editor/icons/icon_mini_color.png
Binary files differ
diff --git a/editor/icons/icon_mini_color_array.png b/editor/icons/icon_mini_color_array.png
new file mode 100644
index 0000000000..434b2f96f5
--- /dev/null
+++ b/editor/icons/icon_mini_color_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_dictionary.png b/editor/icons/icon_mini_dictionary.png
new file mode 100644
index 0000000000..11fd536a83
--- /dev/null
+++ b/editor/icons/icon_mini_dictionary.png
Binary files differ
diff --git a/editor/icons/icon_mini_float.png b/editor/icons/icon_mini_float.png
new file mode 100644
index 0000000000..f8c8d9a174
--- /dev/null
+++ b/editor/icons/icon_mini_float.png
Binary files differ
diff --git a/editor/icons/icon_mini_float_array.png b/editor/icons/icon_mini_float_array.png
new file mode 100644
index 0000000000..8b8177e151
--- /dev/null
+++ b/editor/icons/icon_mini_float_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_image.png b/editor/icons/icon_mini_image.png
new file mode 100644
index 0000000000..2ad359bdbe
--- /dev/null
+++ b/editor/icons/icon_mini_image.png
Binary files differ
diff --git a/editor/icons/icon_mini_input.png b/editor/icons/icon_mini_input.png
new file mode 100644
index 0000000000..fec26dd68e
--- /dev/null
+++ b/editor/icons/icon_mini_input.png
Binary files differ
diff --git a/editor/icons/icon_mini_int_array.png b/editor/icons/icon_mini_int_array.png
new file mode 100644
index 0000000000..d1bd2e82a7
--- /dev/null
+++ b/editor/icons/icon_mini_int_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_integer.png b/editor/icons/icon_mini_integer.png
new file mode 100644
index 0000000000..dad1bb160b
--- /dev/null
+++ b/editor/icons/icon_mini_integer.png
Binary files differ
diff --git a/editor/icons/icon_mini_matrix3.png b/editor/icons/icon_mini_matrix3.png
new file mode 100644
index 0000000000..dd59d093cc
--- /dev/null
+++ b/editor/icons/icon_mini_matrix3.png
Binary files differ
diff --git a/editor/icons/icon_mini_matrix32.png b/editor/icons/icon_mini_matrix32.png
new file mode 100644
index 0000000000..6018a00747
--- /dev/null
+++ b/editor/icons/icon_mini_matrix32.png
Binary files differ
diff --git a/editor/icons/icon_mini_object.png b/editor/icons/icon_mini_object.png
new file mode 100644
index 0000000000..4afe7cfca1
--- /dev/null
+++ b/editor/icons/icon_mini_object.png
Binary files differ
diff --git a/editor/icons/icon_mini_path.png b/editor/icons/icon_mini_path.png
new file mode 100644
index 0000000000..9eb0632571
--- /dev/null
+++ b/editor/icons/icon_mini_path.png
Binary files differ
diff --git a/editor/icons/icon_mini_plane.png b/editor/icons/icon_mini_plane.png
new file mode 100644
index 0000000000..45676236bd
--- /dev/null
+++ b/editor/icons/icon_mini_plane.png
Binary files differ
diff --git a/editor/icons/icon_mini_quat.png b/editor/icons/icon_mini_quat.png
new file mode 100644
index 0000000000..4ed2f5695c
--- /dev/null
+++ b/editor/icons/icon_mini_quat.png
Binary files differ
diff --git a/editor/icons/icon_mini_raw_array.png b/editor/icons/icon_mini_raw_array.png
new file mode 100644
index 0000000000..66bcf7c740
--- /dev/null
+++ b/editor/icons/icon_mini_raw_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_rect2.png b/editor/icons/icon_mini_rect2.png
new file mode 100644
index 0000000000..db13e1a48e
--- /dev/null
+++ b/editor/icons/icon_mini_rect2.png
Binary files differ
diff --git a/editor/icons/icon_mini_rid.png b/editor/icons/icon_mini_rid.png
new file mode 100644
index 0000000000..278a9d1ee6
--- /dev/null
+++ b/editor/icons/icon_mini_rid.png
Binary files differ
diff --git a/editor/icons/icon_mini_string.png b/editor/icons/icon_mini_string.png
new file mode 100644
index 0000000000..504556dd74
--- /dev/null
+++ b/editor/icons/icon_mini_string.png
Binary files differ
diff --git a/editor/icons/icon_mini_string_array.png b/editor/icons/icon_mini_string_array.png
new file mode 100644
index 0000000000..5177014185
--- /dev/null
+++ b/editor/icons/icon_mini_string_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_transform.png b/editor/icons/icon_mini_transform.png
new file mode 100644
index 0000000000..068ea0506c
--- /dev/null
+++ b/editor/icons/icon_mini_transform.png
Binary files differ
diff --git a/editor/icons/icon_mini_variant.png b/editor/icons/icon_mini_variant.png
new file mode 100644
index 0000000000..285f0bcd16
--- /dev/null
+++ b/editor/icons/icon_mini_variant.png
Binary files differ
diff --git a/editor/icons/icon_mini_vector2.png b/editor/icons/icon_mini_vector2.png
new file mode 100644
index 0000000000..a7caa1797f
--- /dev/null
+++ b/editor/icons/icon_mini_vector2.png
Binary files differ
diff --git a/editor/icons/icon_mini_vector2_array.png b/editor/icons/icon_mini_vector2_array.png
new file mode 100644
index 0000000000..de546de16c
--- /dev/null
+++ b/editor/icons/icon_mini_vector2_array.png
Binary files differ
diff --git a/editor/icons/icon_mini_vector3.png b/editor/icons/icon_mini_vector3.png
new file mode 100644
index 0000000000..69baeb229b
--- /dev/null
+++ b/editor/icons/icon_mini_vector3.png
Binary files differ
diff --git a/editor/icons/icon_mini_vector3_array.png b/editor/icons/icon_mini_vector3_array.png
new file mode 100644
index 0000000000..6bddbaf627
--- /dev/null
+++ b/editor/icons/icon_mini_vector3_array.png
Binary files differ
diff --git a/editor/icons/icon_mirror_x.png b/editor/icons/icon_mirror_x.png
new file mode 100644
index 0000000000..7be48946b4
--- /dev/null
+++ b/editor/icons/icon_mirror_x.png
Binary files differ
diff --git a/editor/icons/icon_mirror_y.png b/editor/icons/icon_mirror_y.png
new file mode 100644
index 0000000000..ba924f7ae7
--- /dev/null
+++ b/editor/icons/icon_mirror_y.png
Binary files differ
diff --git a/editor/icons/icon_mouse.png b/editor/icons/icon_mouse.png
new file mode 100644
index 0000000000..ad07a403a6
--- /dev/null
+++ b/editor/icons/icon_mouse.png
Binary files differ
diff --git a/editor/icons/icon_move_down.png b/editor/icons/icon_move_down.png
new file mode 100644
index 0000000000..3934310964
--- /dev/null
+++ b/editor/icons/icon_move_down.png
Binary files differ
diff --git a/editor/icons/icon_move_down_hl.png b/editor/icons/icon_move_down_hl.png
new file mode 100644
index 0000000000..f9de58a940
--- /dev/null
+++ b/editor/icons/icon_move_down_hl.png
Binary files differ
diff --git a/editor/icons/icon_move_point.png b/editor/icons/icon_move_point.png
new file mode 100644
index 0000000000..00e4ea32bd
--- /dev/null
+++ b/editor/icons/icon_move_point.png
Binary files differ
diff --git a/editor/icons/icon_move_up.png b/editor/icons/icon_move_up.png
new file mode 100644
index 0000000000..684013dc40
--- /dev/null
+++ b/editor/icons/icon_move_up.png
Binary files differ
diff --git a/editor/icons/icon_move_up_hl.png b/editor/icons/icon_move_up_hl.png
new file mode 100644
index 0000000000..e076c9a265
--- /dev/null
+++ b/editor/icons/icon_move_up_hl.png
Binary files differ
diff --git a/editor/icons/icon_multi_edit.png b/editor/icons/icon_multi_edit.png
new file mode 100644
index 0000000000..0256ae094a
--- /dev/null
+++ b/editor/icons/icon_multi_edit.png
Binary files differ
diff --git a/editor/icons/icon_multi_line.png b/editor/icons/icon_multi_line.png
new file mode 100644
index 0000000000..95a029cc6e
--- /dev/null
+++ b/editor/icons/icon_multi_line.png
Binary files differ
diff --git a/editor/icons/icon_multi_mesh.png b/editor/icons/icon_multi_mesh.png
new file mode 100644
index 0000000000..6ff9d22266
--- /dev/null
+++ b/editor/icons/icon_multi_mesh.png
Binary files differ
diff --git a/editor/icons/icon_multi_mesh_instance.png b/editor/icons/icon_multi_mesh_instance.png
new file mode 100644
index 0000000000..124bf81b5a
--- /dev/null
+++ b/editor/icons/icon_multi_mesh_instance.png
Binary files differ
diff --git a/editor/icons/icon_multi_node_edit.png b/editor/icons/icon_multi_node_edit.png
new file mode 100644
index 0000000000..0256ae094a
--- /dev/null
+++ b/editor/icons/icon_multi_node_edit.png
Binary files differ
diff --git a/editor/icons/icon_navigation.png b/editor/icons/icon_navigation.png
new file mode 100644
index 0000000000..3c5a3bdc4a
--- /dev/null
+++ b/editor/icons/icon_navigation.png
Binary files differ
diff --git a/editor/icons/icon_navigation_2d.png b/editor/icons/icon_navigation_2d.png
new file mode 100644
index 0000000000..a6ea55ef13
--- /dev/null
+++ b/editor/icons/icon_navigation_2d.png
Binary files differ
diff --git a/editor/icons/icon_navigation_mesh.png b/editor/icons/icon_navigation_mesh.png
new file mode 100644
index 0000000000..e3bb7f775f
--- /dev/null
+++ b/editor/icons/icon_navigation_mesh.png
Binary files differ
diff --git a/editor/icons/icon_navigation_mesh_instance.png b/editor/icons/icon_navigation_mesh_instance.png
new file mode 100644
index 0000000000..f5f25ef421
--- /dev/null
+++ b/editor/icons/icon_navigation_mesh_instance.png
Binary files differ
diff --git a/editor/icons/icon_navigation_polygon.png b/editor/icons/icon_navigation_polygon.png
new file mode 100644
index 0000000000..bfc4bfb542
--- /dev/null
+++ b/editor/icons/icon_navigation_polygon.png
Binary files differ
diff --git a/editor/icons/icon_navigation_polygon_instance.png b/editor/icons/icon_navigation_polygon_instance.png
new file mode 100644
index 0000000000..89d420ca14
--- /dev/null
+++ b/editor/icons/icon_navigation_polygon_instance.png
Binary files differ
diff --git a/editor/icons/icon_new.png b/editor/icons/icon_new.png
new file mode 100644
index 0000000000..69c6c90dc7
--- /dev/null
+++ b/editor/icons/icon_new.png
Binary files differ
diff --git a/editor/icons/icon_nine_patch_rect.png b/editor/icons/icon_nine_patch_rect.png
new file mode 100644
index 0000000000..bdd1467144
--- /dev/null
+++ b/editor/icons/icon_nine_patch_rect.png
Binary files differ
diff --git a/editor/icons/icon_node.png b/editor/icons/icon_node.png
new file mode 100644
index 0000000000..628b632332
--- /dev/null
+++ b/editor/icons/icon_node.png
Binary files differ
diff --git a/editor/icons/icon_node_2d.png b/editor/icons/icon_node_2d.png
new file mode 100644
index 0000000000..d6c8f1f988
--- /dev/null
+++ b/editor/icons/icon_node_2d.png
Binary files differ
diff --git a/editor/icons/icon_node_real_slot.png b/editor/icons/icon_node_real_slot.png
new file mode 100644
index 0000000000..6373bc0fa5
--- /dev/null
+++ b/editor/icons/icon_node_real_slot.png
Binary files differ
diff --git a/editor/icons/icon_node_vec_slot.png b/editor/icons/icon_node_vec_slot.png
new file mode 100644
index 0000000000..aedd983fb4
--- /dev/null
+++ b/editor/icons/icon_node_vec_slot.png
Binary files differ
diff --git a/editor/icons/icon_node_warning.png b/editor/icons/icon_node_warning.png
new file mode 100644
index 0000000000..8b1e9212a8
--- /dev/null
+++ b/editor/icons/icon_node_warning.png
Binary files differ
diff --git a/editor/icons/icon_non_favorite.png b/editor/icons/icon_non_favorite.png
new file mode 100644
index 0000000000..92351bde04
--- /dev/null
+++ b/editor/icons/icon_non_favorite.png
Binary files differ
diff --git a/editor/icons/icon_object.png b/editor/icons/icon_object.png
new file mode 100644
index 0000000000..f4f018c863
--- /dev/null
+++ b/editor/icons/icon_object.png
Binary files differ
diff --git a/editor/icons/icon_occluder_polygon_2d.png b/editor/icons/icon_occluder_polygon_2d.png
new file mode 100644
index 0000000000..bbfc9ac0a5
--- /dev/null
+++ b/editor/icons/icon_occluder_polygon_2d.png
Binary files differ
diff --git a/editor/icons/icon_omni_light.png b/editor/icons/icon_omni_light.png
new file mode 100644
index 0000000000..286ce723a4
--- /dev/null
+++ b/editor/icons/icon_omni_light.png
Binary files differ
diff --git a/editor/icons/icon_open.png b/editor/icons/icon_open.png
new file mode 100644
index 0000000000..cc05e98ebb
--- /dev/null
+++ b/editor/icons/icon_open.png
Binary files differ
diff --git a/editor/icons/icon_option_button.png b/editor/icons/icon_option_button.png
new file mode 100644
index 0000000000..c1155309aa
--- /dev/null
+++ b/editor/icons/icon_option_button.png
Binary files differ
diff --git a/editor/icons/icon_override.png b/editor/icons/icon_override.png
new file mode 100644
index 0000000000..9d917ede75
--- /dev/null
+++ b/editor/icons/icon_override.png
Binary files differ
diff --git a/editor/icons/icon_p_hash_translation.png b/editor/icons/icon_p_hash_translation.png
new file mode 100644
index 0000000000..abca359eea
--- /dev/null
+++ b/editor/icons/icon_p_hash_translation.png
Binary files differ
diff --git a/editor/icons/icon_packed_data_container.png b/editor/icons/icon_packed_data_container.png
new file mode 100644
index 0000000000..af89da48a9
--- /dev/null
+++ b/editor/icons/icon_packed_data_container.png
Binary files differ
diff --git a/editor/icons/icon_packed_scene.png b/editor/icons/icon_packed_scene.png
new file mode 100644
index 0000000000..9079762932
--- /dev/null
+++ b/editor/icons/icon_packed_scene.png
Binary files differ
diff --git a/editor/icons/icon_pane_drag.png b/editor/icons/icon_pane_drag.png
new file mode 100644
index 0000000000..57f8e49ba3
--- /dev/null
+++ b/editor/icons/icon_pane_drag.png
Binary files differ
diff --git a/editor/icons/icon_pane_drag_hover.png b/editor/icons/icon_pane_drag_hover.png
new file mode 100644
index 0000000000..068253ecef
--- /dev/null
+++ b/editor/icons/icon_pane_drag_hover.png
Binary files differ
diff --git a/editor/icons/icon_panel.png b/editor/icons/icon_panel.png
new file mode 100644
index 0000000000..dca2da94f3
--- /dev/null
+++ b/editor/icons/icon_panel.png
Binary files differ
diff --git a/editor/icons/icon_panel_container.png b/editor/icons/icon_panel_container.png
new file mode 100644
index 0000000000..05bd1e082f
--- /dev/null
+++ b/editor/icons/icon_panel_container.png
Binary files differ
diff --git a/editor/icons/icon_panel_top.png b/editor/icons/icon_panel_top.png
new file mode 100644
index 0000000000..20e67fad1a
--- /dev/null
+++ b/editor/icons/icon_panel_top.png
Binary files differ
diff --git a/editor/icons/icon_panels_1.png b/editor/icons/icon_panels_1.png
new file mode 100644
index 0000000000..a909e6aee8
--- /dev/null
+++ b/editor/icons/icon_panels_1.png
Binary files differ
diff --git a/editor/icons/icon_panels_2.png b/editor/icons/icon_panels_2.png
new file mode 100644
index 0000000000..28a1ca2a59
--- /dev/null
+++ b/editor/icons/icon_panels_2.png
Binary files differ
diff --git a/editor/icons/icon_panels_2_alt.png b/editor/icons/icon_panels_2_alt.png
new file mode 100644
index 0000000000..14f21304c5
--- /dev/null
+++ b/editor/icons/icon_panels_2_alt.png
Binary files differ
diff --git a/editor/icons/icon_panels_3.png b/editor/icons/icon_panels_3.png
new file mode 100644
index 0000000000..76f1f53636
--- /dev/null
+++ b/editor/icons/icon_panels_3.png
Binary files differ
diff --git a/editor/icons/icon_panels_3_alt.png b/editor/icons/icon_panels_3_alt.png
new file mode 100644
index 0000000000..b121bc62c3
--- /dev/null
+++ b/editor/icons/icon_panels_3_alt.png
Binary files differ
diff --git a/editor/icons/icon_panels_4.png b/editor/icons/icon_panels_4.png
new file mode 100644
index 0000000000..19a3bc0bf2
--- /dev/null
+++ b/editor/icons/icon_panels_4.png
Binary files differ
diff --git a/editor/icons/icon_parallax_background.png b/editor/icons/icon_parallax_background.png
new file mode 100644
index 0000000000..78d7484e8b
--- /dev/null
+++ b/editor/icons/icon_parallax_background.png
Binary files differ
diff --git a/editor/icons/icon_parallax_layer.png b/editor/icons/icon_parallax_layer.png
new file mode 100644
index 0000000000..748c9164bb
--- /dev/null
+++ b/editor/icons/icon_parallax_layer.png
Binary files differ
diff --git a/editor/icons/icon_particle_attractor_2d.png b/editor/icons/icon_particle_attractor_2d.png
new file mode 100644
index 0000000000..84be7dff3b
--- /dev/null
+++ b/editor/icons/icon_particle_attractor_2d.png
Binary files differ
diff --git a/editor/icons/icon_particles.png b/editor/icons/icon_particles.png
new file mode 100644
index 0000000000..8d146b2946
--- /dev/null
+++ b/editor/icons/icon_particles.png
Binary files differ
diff --git a/editor/icons/icon_particles_2d.png b/editor/icons/icon_particles_2d.png
new file mode 100644
index 0000000000..e03ff1e189
--- /dev/null
+++ b/editor/icons/icon_particles_2d.png
Binary files differ
diff --git a/editor/icons/icon_particles_frame.png b/editor/icons/icon_particles_frame.png
new file mode 100644
index 0000000000..968bbccf8a
--- /dev/null
+++ b/editor/icons/icon_particles_frame.png
Binary files differ
diff --git a/editor/icons/icon_particles_shader.png b/editor/icons/icon_particles_shader.png
new file mode 100644
index 0000000000..3b5c5644b2
--- /dev/null
+++ b/editor/icons/icon_particles_shader.png
Binary files differ
diff --git a/editor/icons/icon_patch_9_rect.png b/editor/icons/icon_patch_9_rect.png
new file mode 100644
index 0000000000..bdd1467144
--- /dev/null
+++ b/editor/icons/icon_patch_9_rect.png
Binary files differ
diff --git a/editor/icons/icon_path.png b/editor/icons/icon_path.png
new file mode 100644
index 0000000000..4ebdcbdc44
--- /dev/null
+++ b/editor/icons/icon_path.png
Binary files differ
diff --git a/editor/icons/icon_path_2d.png b/editor/icons/icon_path_2d.png
new file mode 100644
index 0000000000..c5b0d5d7c6
--- /dev/null
+++ b/editor/icons/icon_path_2d.png
Binary files differ
diff --git a/editor/icons/icon_path_follow.png b/editor/icons/icon_path_follow.png
new file mode 100644
index 0000000000..f71651d241
--- /dev/null
+++ b/editor/icons/icon_path_follow.png
Binary files differ
diff --git a/editor/icons/icon_path_follow_2d.png b/editor/icons/icon_path_follow_2d.png
new file mode 100644
index 0000000000..d82e682dba
--- /dev/null
+++ b/editor/icons/icon_path_follow_2d.png
Binary files differ
diff --git a/editor/icons/icon_pause.png b/editor/icons/icon_pause.png
new file mode 100644
index 0000000000..aec11d5c35
--- /dev/null
+++ b/editor/icons/icon_pause.png
Binary files differ
diff --git a/editor/icons/icon_pe_edit.png b/editor/icons/icon_pe_edit.png
new file mode 100644
index 0000000000..7082303a4e
--- /dev/null
+++ b/editor/icons/icon_pe_edit.png
Binary files differ
diff --git a/editor/icons/icon_physics_joint_pin.png b/editor/icons/icon_physics_joint_pin.png
new file mode 100644
index 0000000000..27ac67ed0a
--- /dev/null
+++ b/editor/icons/icon_physics_joint_pin.png
Binary files differ
diff --git a/editor/icons/icon_pin.png b/editor/icons/icon_pin.png
new file mode 100644
index 0000000000..cf89679f88
--- /dev/null
+++ b/editor/icons/icon_pin.png
Binary files differ
diff --git a/editor/icons/icon_pin_joint.png b/editor/icons/icon_pin_joint.png
new file mode 100644
index 0000000000..78e8a83724
--- /dev/null
+++ b/editor/icons/icon_pin_joint.png
Binary files differ
diff --git a/editor/icons/icon_pin_joint_2d.png b/editor/icons/icon_pin_joint_2d.png
new file mode 100644
index 0000000000..355d5a2022
--- /dev/null
+++ b/editor/icons/icon_pin_joint_2d.png
Binary files differ
diff --git a/editor/icons/icon_pin_pressed.png b/editor/icons/icon_pin_pressed.png
new file mode 100644
index 0000000000..cf89679f88
--- /dev/null
+++ b/editor/icons/icon_pin_pressed.png
Binary files differ
diff --git a/editor/icons/icon_plane.png b/editor/icons/icon_plane.png
new file mode 100644
index 0000000000..25d869f31e
--- /dev/null
+++ b/editor/icons/icon_plane.png
Binary files differ
diff --git a/editor/icons/icon_plane_shape.png b/editor/icons/icon_plane_shape.png
new file mode 100644
index 0000000000..e7ebe1fbcd
--- /dev/null
+++ b/editor/icons/icon_plane_shape.png
Binary files differ
diff --git a/editor/icons/icon_play.png b/editor/icons/icon_play.png
new file mode 100644
index 0000000000..864e4e4fb9
--- /dev/null
+++ b/editor/icons/icon_play.png
Binary files differ
diff --git a/editor/icons/icon_play_backwards.png b/editor/icons/icon_play_backwards.png
new file mode 100644
index 0000000000..bab2858373
--- /dev/null
+++ b/editor/icons/icon_play_backwards.png
Binary files differ
diff --git a/editor/icons/icon_play_custom.png b/editor/icons/icon_play_custom.png
new file mode 100644
index 0000000000..b742e131ca
--- /dev/null
+++ b/editor/icons/icon_play_custom.png
Binary files differ
diff --git a/editor/icons/icon_play_scene.png b/editor/icons/icon_play_scene.png
new file mode 100644
index 0000000000..ebba318799
--- /dev/null
+++ b/editor/icons/icon_play_scene.png
Binary files differ
diff --git a/editor/icons/icon_play_start.png b/editor/icons/icon_play_start.png
new file mode 100644
index 0000000000..dacc156614
--- /dev/null
+++ b/editor/icons/icon_play_start.png
Binary files differ
diff --git a/editor/icons/icon_play_start_backwards.png b/editor/icons/icon_play_start_backwards.png
new file mode 100644
index 0000000000..7608e18cba
--- /dev/null
+++ b/editor/icons/icon_play_start_backwards.png
Binary files differ
diff --git a/editor/icons/icon_polygon_2d.png b/editor/icons/icon_polygon_2d.png
new file mode 100644
index 0000000000..b372749cb0
--- /dev/null
+++ b/editor/icons/icon_polygon_2d.png
Binary files differ
diff --git a/editor/icons/icon_polygon_path_finder.png b/editor/icons/icon_polygon_path_finder.png
new file mode 100644
index 0000000000..9d76d872db
--- /dev/null
+++ b/editor/icons/icon_polygon_path_finder.png
Binary files differ
diff --git a/editor/icons/icon_popup.png b/editor/icons/icon_popup.png
new file mode 100644
index 0000000000..4dda9e50f9
--- /dev/null
+++ b/editor/icons/icon_popup.png
Binary files differ
diff --git a/editor/icons/icon_popup_dialog.png b/editor/icons/icon_popup_dialog.png
new file mode 100644
index 0000000000..82b011e06c
--- /dev/null
+++ b/editor/icons/icon_popup_dialog.png
Binary files differ
diff --git a/editor/icons/icon_popup_menu.png b/editor/icons/icon_popup_menu.png
new file mode 100644
index 0000000000..28d928a98e
--- /dev/null
+++ b/editor/icons/icon_popup_menu.png
Binary files differ
diff --git a/editor/icons/icon_popup_panel.png b/editor/icons/icon_popup_panel.png
new file mode 100644
index 0000000000..90c86c2c05
--- /dev/null
+++ b/editor/icons/icon_popup_panel.png
Binary files differ
diff --git a/editor/icons/icon_portal.png b/editor/icons/icon_portal.png
new file mode 100644
index 0000000000..b10aee650d
--- /dev/null
+++ b/editor/icons/icon_portal.png
Binary files differ
diff --git a/editor/icons/icon_position_2d.png b/editor/icons/icon_position_2d.png
new file mode 100644
index 0000000000..da7446e3e2
--- /dev/null
+++ b/editor/icons/icon_position_2d.png
Binary files differ
diff --git a/editor/icons/icon_position_3d.png b/editor/icons/icon_position_3d.png
new file mode 100644
index 0000000000..a36bca3260
--- /dev/null
+++ b/editor/icons/icon_position_3d.png
Binary files differ
diff --git a/editor/icons/icon_prev_scene.png b/editor/icons/icon_prev_scene.png
new file mode 100644
index 0000000000..9d8dda5180
--- /dev/null
+++ b/editor/icons/icon_prev_scene.png
Binary files differ
diff --git a/editor/icons/icon_progress_1.png b/editor/icons/icon_progress_1.png
new file mode 100644
index 0000000000..34196ec2dd
--- /dev/null
+++ b/editor/icons/icon_progress_1.png
Binary files differ
diff --git a/editor/icons/icon_progress_2.png b/editor/icons/icon_progress_2.png
new file mode 100644
index 0000000000..6f683f2473
--- /dev/null
+++ b/editor/icons/icon_progress_2.png
Binary files differ
diff --git a/editor/icons/icon_progress_3.png b/editor/icons/icon_progress_3.png
new file mode 100644
index 0000000000..82202d28a6
--- /dev/null
+++ b/editor/icons/icon_progress_3.png
Binary files differ
diff --git a/editor/icons/icon_progress_4.png b/editor/icons/icon_progress_4.png
new file mode 100644
index 0000000000..70198ab26a
--- /dev/null
+++ b/editor/icons/icon_progress_4.png
Binary files differ
diff --git a/editor/icons/icon_progress_5.png b/editor/icons/icon_progress_5.png
new file mode 100644
index 0000000000..b5f4bdcdec
--- /dev/null
+++ b/editor/icons/icon_progress_5.png
Binary files differ
diff --git a/editor/icons/icon_progress_6.png b/editor/icons/icon_progress_6.png
new file mode 100644
index 0000000000..df8f27c60d
--- /dev/null
+++ b/editor/icons/icon_progress_6.png
Binary files differ
diff --git a/editor/icons/icon_progress_7.png b/editor/icons/icon_progress_7.png
new file mode 100644
index 0000000000..892d5b53ba
--- /dev/null
+++ b/editor/icons/icon_progress_7.png
Binary files differ
diff --git a/editor/icons/icon_progress_8.png b/editor/icons/icon_progress_8.png
new file mode 100644
index 0000000000..c593afb7dd
--- /dev/null
+++ b/editor/icons/icon_progress_8.png
Binary files differ
diff --git a/editor/icons/icon_progress_bar.png b/editor/icons/icon_progress_bar.png
new file mode 100644
index 0000000000..30822dd7a8
--- /dev/null
+++ b/editor/icons/icon_progress_bar.png
Binary files differ
diff --git a/editor/icons/icon_property_editor.png b/editor/icons/icon_property_editor.png
new file mode 100644
index 0000000000..5ee0ab8068
--- /dev/null
+++ b/editor/icons/icon_property_editor.png
Binary files differ
diff --git a/editor/icons/icon_proximity_group.png b/editor/icons/icon_proximity_group.png
new file mode 100644
index 0000000000..230ca752ec
--- /dev/null
+++ b/editor/icons/icon_proximity_group.png
Binary files differ
diff --git a/editor/icons/icon_quad.png b/editor/icons/icon_quad.png
new file mode 100644
index 0000000000..a1b31b026b
--- /dev/null
+++ b/editor/icons/icon_quad.png
Binary files differ
diff --git a/editor/icons/icon_quat.png b/editor/icons/icon_quat.png
new file mode 100644
index 0000000000..0fcaa35b56
--- /dev/null
+++ b/editor/icons/icon_quat.png
Binary files differ
diff --git a/editor/icons/icon_range.png b/editor/icons/icon_range.png
new file mode 100644
index 0000000000..6e46df9690
--- /dev/null
+++ b/editor/icons/icon_range.png
Binary files differ
diff --git a/editor/icons/icon_rating_no_star.png b/editor/icons/icon_rating_no_star.png
new file mode 100644
index 0000000000..e7421bdb13
--- /dev/null
+++ b/editor/icons/icon_rating_no_star.png
Binary files differ
diff --git a/editor/icons/icon_rating_star.png b/editor/icons/icon_rating_star.png
new file mode 100644
index 0000000000..b2a7e01322
--- /dev/null
+++ b/editor/icons/icon_rating_star.png
Binary files differ
diff --git a/editor/icons/icon_ray_cast.png b/editor/icons/icon_ray_cast.png
new file mode 100644
index 0000000000..19cba12d1d
--- /dev/null
+++ b/editor/icons/icon_ray_cast.png
Binary files differ
diff --git a/editor/icons/icon_ray_cast_2d.png b/editor/icons/icon_ray_cast_2d.png
new file mode 100644
index 0000000000..2a5054ab00
--- /dev/null
+++ b/editor/icons/icon_ray_cast_2d.png
Binary files differ
diff --git a/editor/icons/icon_ray_shape.png b/editor/icons/icon_ray_shape.png
new file mode 100644
index 0000000000..a3188d1a3a
--- /dev/null
+++ b/editor/icons/icon_ray_shape.png
Binary files differ
diff --git a/editor/icons/icon_ray_shape_2d.png b/editor/icons/icon_ray_shape_2d.png
new file mode 100644
index 0000000000..c91a63570d
--- /dev/null
+++ b/editor/icons/icon_ray_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_rayito.png b/editor/icons/icon_rayito.png
new file mode 100644
index 0000000000..1afb5975d1
--- /dev/null
+++ b/editor/icons/icon_rayito.png
Binary files differ
diff --git a/editor/icons/icon_real.png b/editor/icons/icon_real.png
new file mode 100644
index 0000000000..555b61427f
--- /dev/null
+++ b/editor/icons/icon_real.png
Binary files differ
diff --git a/editor/icons/icon_rect2.png b/editor/icons/icon_rect2.png
new file mode 100644
index 0000000000..cf3cfe3b22
--- /dev/null
+++ b/editor/icons/icon_rect2.png
Binary files differ
diff --git a/editor/icons/icon_rect3.png b/editor/icons/icon_rect3.png
new file mode 100644
index 0000000000..8eacfff207
--- /dev/null
+++ b/editor/icons/icon_rect3.png
Binary files differ
diff --git a/editor/icons/icon_rectangle_shape_2d.png b/editor/icons/icon_rectangle_shape_2d.png
new file mode 100644
index 0000000000..002730b942
--- /dev/null
+++ b/editor/icons/icon_rectangle_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_reference_rect.png b/editor/icons/icon_reference_rect.png
new file mode 100644
index 0000000000..b253af477f
--- /dev/null
+++ b/editor/icons/icon_reference_rect.png
Binary files differ
diff --git a/editor/icons/icon_reflection_probe.png b/editor/icons/icon_reflection_probe.png
new file mode 100644
index 0000000000..a6646114fb
--- /dev/null
+++ b/editor/icons/icon_reflection_probe.png
Binary files differ
diff --git a/editor/icons/icon_region_edit.png b/editor/icons/icon_region_edit.png
new file mode 100644
index 0000000000..5f133072d4
--- /dev/null
+++ b/editor/icons/icon_region_edit.png
Binary files differ
diff --git a/editor/icons/icon_reload.png b/editor/icons/icon_reload.png
new file mode 100644
index 0000000000..9303fabb9c
--- /dev/null
+++ b/editor/icons/icon_reload.png
Binary files differ
diff --git a/editor/icons/icon_reload_empty.png b/editor/icons/icon_reload_empty.png
new file mode 100644
index 0000000000..d43582b2c4
--- /dev/null
+++ b/editor/icons/icon_reload_empty.png
Binary files differ
diff --git a/editor/icons/icon_reload_small.png b/editor/icons/icon_reload_small.png
new file mode 100644
index 0000000000..1397ac6aa5
--- /dev/null
+++ b/editor/icons/icon_reload_small.png
Binary files differ
diff --git a/editor/icons/icon_remote.png b/editor/icons/icon_remote.png
new file mode 100644
index 0000000000..7eb7608b13
--- /dev/null
+++ b/editor/icons/icon_remote.png
Binary files differ
diff --git a/editor/icons/icon_remote_transform.png b/editor/icons/icon_remote_transform.png
new file mode 100644
index 0000000000..2a8b5f4d0e
--- /dev/null
+++ b/editor/icons/icon_remote_transform.png
Binary files differ
diff --git a/editor/icons/icon_remote_transform_2d.png b/editor/icons/icon_remote_transform_2d.png
new file mode 100644
index 0000000000..16d2691832
--- /dev/null
+++ b/editor/icons/icon_remote_transform_2d.png
Binary files differ
diff --git a/editor/icons/icon_remove.png b/editor/icons/icon_remove.png
new file mode 100644
index 0000000000..b6bf05a16d
--- /dev/null
+++ b/editor/icons/icon_remove.png
Binary files differ
diff --git a/editor/icons/icon_remove_hl.png b/editor/icons/icon_remove_hl.png
new file mode 100644
index 0000000000..0d3b887e7f
--- /dev/null
+++ b/editor/icons/icon_remove_hl.png
Binary files differ
diff --git a/editor/icons/icon_remove_small.png b/editor/icons/icon_remove_small.png
new file mode 100644
index 0000000000..e0903689cf
--- /dev/null
+++ b/editor/icons/icon_remove_small.png
Binary files differ
diff --git a/editor/icons/icon_rename.png b/editor/icons/icon_rename.png
new file mode 100644
index 0000000000..2df503f100
--- /dev/null
+++ b/editor/icons/icon_rename.png
Binary files differ
diff --git a/editor/icons/icon_reparent.png b/editor/icons/icon_reparent.png
new file mode 100644
index 0000000000..135ccee4ad
--- /dev/null
+++ b/editor/icons/icon_reparent.png
Binary files differ
diff --git a/editor/icons/icon_replace.png b/editor/icons/icon_replace.png
new file mode 100644
index 0000000000..662a58dc93
--- /dev/null
+++ b/editor/icons/icon_replace.png
Binary files differ
diff --git a/editor/icons/icon_resource_preloader.png b/editor/icons/icon_resource_preloader.png
new file mode 100644
index 0000000000..d3064f5e90
--- /dev/null
+++ b/editor/icons/icon_resource_preloader.png
Binary files differ
diff --git a/editor/icons/icon_rich_text_label.png b/editor/icons/icon_rich_text_label.png
new file mode 100644
index 0000000000..1aea6e8fa7
--- /dev/null
+++ b/editor/icons/icon_rich_text_label.png
Binary files differ
diff --git a/editor/icons/icon_rid.png b/editor/icons/icon_rid.png
new file mode 100644
index 0000000000..f7bc02e128
--- /dev/null
+++ b/editor/icons/icon_rid.png
Binary files differ
diff --git a/editor/icons/icon_rigid_body.png b/editor/icons/icon_rigid_body.png
new file mode 100644
index 0000000000..4072308f71
--- /dev/null
+++ b/editor/icons/icon_rigid_body.png
Binary files differ
diff --git a/editor/icons/icon_rigid_body_2_d.png b/editor/icons/icon_rigid_body_2_d.png
new file mode 100644
index 0000000000..c296b88636
--- /dev/null
+++ b/editor/icons/icon_rigid_body_2_d.png
Binary files differ
diff --git a/editor/icons/icon_rigid_body_2d.png b/editor/icons/icon_rigid_body_2d.png
new file mode 100644
index 0000000000..8d11d536c1
--- /dev/null
+++ b/editor/icons/icon_rigid_body_2d.png
Binary files differ
diff --git a/editor/icons/icon_room.png b/editor/icons/icon_room.png
new file mode 100644
index 0000000000..840db145fd
--- /dev/null
+++ b/editor/icons/icon_room.png
Binary files differ
diff --git a/editor/icons/icon_room_bounds.png b/editor/icons/icon_room_bounds.png
new file mode 100644
index 0000000000..15b198e821
--- /dev/null
+++ b/editor/icons/icon_room_bounds.png
Binary files differ
diff --git a/editor/icons/icon_room_instance.png b/editor/icons/icon_room_instance.png
new file mode 100644
index 0000000000..f0c46e689c
--- /dev/null
+++ b/editor/icons/icon_room_instance.png
Binary files differ
diff --git a/editor/icons/icon_rotate_0.png b/editor/icons/icon_rotate_0.png
new file mode 100644
index 0000000000..75bd667845
--- /dev/null
+++ b/editor/icons/icon_rotate_0.png
Binary files differ
diff --git a/editor/icons/icon_rotate_180.png b/editor/icons/icon_rotate_180.png
new file mode 100644
index 0000000000..dd9333207e
--- /dev/null
+++ b/editor/icons/icon_rotate_180.png
Binary files differ
diff --git a/editor/icons/icon_rotate_270.png b/editor/icons/icon_rotate_270.png
new file mode 100644
index 0000000000..551fd3afb9
--- /dev/null
+++ b/editor/icons/icon_rotate_270.png
Binary files differ
diff --git a/editor/icons/icon_rotate_90.png b/editor/icons/icon_rotate_90.png
new file mode 100644
index 0000000000..55a084cc4e
--- /dev/null
+++ b/editor/icons/icon_rotate_90.png
Binary files differ
diff --git a/editor/icons/icon_run.png b/editor/icons/icon_run.png
new file mode 100644
index 0000000000..133d383d9e
--- /dev/null
+++ b/editor/icons/icon_run.png
Binary files differ
diff --git a/editor/icons/icon_s_s_a_o_f_x.png b/editor/icons/icon_s_s_a_o_f_x.png
new file mode 100644
index 0000000000..36eccedca5
--- /dev/null
+++ b/editor/icons/icon_s_s_a_o_f_x.png
Binary files differ
diff --git a/editor/icons/icon_sample.png b/editor/icons/icon_sample.png
new file mode 100644
index 0000000000..25755699be
--- /dev/null
+++ b/editor/icons/icon_sample.png
Binary files differ
diff --git a/editor/icons/icon_sample_library.png b/editor/icons/icon_sample_library.png
new file mode 100644
index 0000000000..5921aa86e7
--- /dev/null
+++ b/editor/icons/icon_sample_library.png
Binary files differ
diff --git a/editor/icons/icon_sample_player.png b/editor/icons/icon_sample_player.png
new file mode 100644
index 0000000000..4056cceeff
--- /dev/null
+++ b/editor/icons/icon_sample_player.png
Binary files differ
diff --git a/editor/icons/icon_sample_player_2d.png b/editor/icons/icon_sample_player_2d.png
new file mode 100644
index 0000000000..eb70340db8
--- /dev/null
+++ b/editor/icons/icon_sample_player_2d.png
Binary files differ
diff --git a/editor/icons/icon_save.png b/editor/icons/icon_save.png
new file mode 100644
index 0000000000..8695b7839d
--- /dev/null
+++ b/editor/icons/icon_save.png
Binary files differ
diff --git a/editor/icons/icon_scene.png b/editor/icons/icon_scene.png
new file mode 100644
index 0000000000..9629bb91c2
--- /dev/null
+++ b/editor/icons/icon_scene.png
Binary files differ
diff --git a/editor/icons/icon_scene_instance.png b/editor/icons/icon_scene_instance.png
new file mode 100644
index 0000000000..05df811aa0
--- /dev/null
+++ b/editor/icons/icon_scene_instance.png
Binary files differ
diff --git a/editor/icons/icon_scene_tree_editor.png b/editor/icons/icon_scene_tree_editor.png
new file mode 100644
index 0000000000..0b51763555
--- /dev/null
+++ b/editor/icons/icon_scene_tree_editor.png
Binary files differ
diff --git a/editor/icons/icon_script.png b/editor/icons/icon_script.png
new file mode 100644
index 0000000000..5aa673fcd6
--- /dev/null
+++ b/editor/icons/icon_script.png
Binary files differ
diff --git a/editor/icons/icon_script_control.png b/editor/icons/icon_script_control.png
new file mode 100644
index 0000000000..cd1cc9b9af
--- /dev/null
+++ b/editor/icons/icon_script_control.png
Binary files differ
diff --git a/editor/icons/icon_script_create.png b/editor/icons/icon_script_create.png
new file mode 100644
index 0000000000..86c19f748b
--- /dev/null
+++ b/editor/icons/icon_script_create.png
Binary files differ
diff --git a/editor/icons/icon_script_error.png b/editor/icons/icon_script_error.png
new file mode 100644
index 0000000000..3532c2c379
--- /dev/null
+++ b/editor/icons/icon_script_error.png
Binary files differ
diff --git a/editor/icons/icon_script_list.png b/editor/icons/icon_script_list.png
new file mode 100644
index 0000000000..cdea1e161e
--- /dev/null
+++ b/editor/icons/icon_script_list.png
Binary files differ
diff --git a/editor/icons/icon_script_node.png b/editor/icons/icon_script_node.png
new file mode 100644
index 0000000000..fcf205b2e9
--- /dev/null
+++ b/editor/icons/icon_script_node.png
Binary files differ
diff --git a/editor/icons/icon_script_remove.png b/editor/icons/icon_script_remove.png
new file mode 100644
index 0000000000..c200b01690
--- /dev/null
+++ b/editor/icons/icon_script_remove.png
Binary files differ
diff --git a/editor/icons/icon_scroll_bar.png b/editor/icons/icon_scroll_bar.png
new file mode 100644
index 0000000000..e4576c4ae3
--- /dev/null
+++ b/editor/icons/icon_scroll_bar.png
Binary files differ
diff --git a/editor/icons/icon_scroll_container.png b/editor/icons/icon_scroll_container.png
new file mode 100644
index 0000000000..4e42d84ab1
--- /dev/null
+++ b/editor/icons/icon_scroll_container.png
Binary files differ
diff --git a/editor/icons/icon_segment_shape_2d.png b/editor/icons/icon_segment_shape_2d.png
new file mode 100644
index 0000000000..8f3771be7a
--- /dev/null
+++ b/editor/icons/icon_segment_shape_2d.png
Binary files differ
diff --git a/editor/icons/icon_shader.png b/editor/icons/icon_shader.png
new file mode 100644
index 0000000000..568a45d938
--- /dev/null
+++ b/editor/icons/icon_shader.png
Binary files differ
diff --git a/editor/icons/icon_shader_material.png b/editor/icons/icon_shader_material.png
new file mode 100644
index 0000000000..568a45d938
--- /dev/null
+++ b/editor/icons/icon_shader_material.png
Binary files differ
diff --git a/editor/icons/icon_short_cut.png b/editor/icons/icon_short_cut.png
new file mode 100644
index 0000000000..22e15c3889
--- /dev/null
+++ b/editor/icons/icon_short_cut.png
Binary files differ
diff --git a/editor/icons/icon_signal.png b/editor/icons/icon_signal.png
new file mode 100644
index 0000000000..c2f393228c
--- /dev/null
+++ b/editor/icons/icon_signal.png
Binary files differ
diff --git a/editor/icons/icon_skeleton.png b/editor/icons/icon_skeleton.png
new file mode 100644
index 0000000000..17b003caac
--- /dev/null
+++ b/editor/icons/icon_skeleton.png
Binary files differ
diff --git a/editor/icons/icon_skeletonr.png b/editor/icons/icon_skeletonr.png
new file mode 100644
index 0000000000..dcb2d512ab
--- /dev/null
+++ b/editor/icons/icon_skeletonr.png
Binary files differ
diff --git a/editor/icons/icon_sky_box_f_x.png b/editor/icons/icon_sky_box_f_x.png
new file mode 100644
index 0000000000..cabd19e550
--- /dev/null
+++ b/editor/icons/icon_sky_box_f_x.png
Binary files differ
diff --git a/editor/icons/icon_slider_joint.png b/editor/icons/icon_slider_joint.png
new file mode 100644
index 0000000000..d65fb3650d
--- /dev/null
+++ b/editor/icons/icon_slider_joint.png
Binary files differ
diff --git a/editor/icons/icon_slot.png b/editor/icons/icon_slot.png
new file mode 100644
index 0000000000..856bf72281
--- /dev/null
+++ b/editor/icons/icon_slot.png
Binary files differ
diff --git a/editor/icons/icon_small_next.png b/editor/icons/icon_small_next.png
new file mode 100644
index 0000000000..f853d100b5
--- /dev/null
+++ b/editor/icons/icon_small_next.png
Binary files differ
diff --git a/editor/icons/icon_snap.png b/editor/icons/icon_snap.png
new file mode 100644
index 0000000000..93194d34e7
--- /dev/null
+++ b/editor/icons/icon_snap.png
Binary files differ
diff --git a/editor/icons/icon_sound_room_params.png b/editor/icons/icon_sound_room_params.png
new file mode 100644
index 0000000000..6f66da2e43
--- /dev/null
+++ b/editor/icons/icon_sound_room_params.png
Binary files differ
diff --git a/editor/icons/icon_spatial.png b/editor/icons/icon_spatial.png
new file mode 100644
index 0000000000..7c9f721053
--- /dev/null
+++ b/editor/icons/icon_spatial.png
Binary files differ
diff --git a/editor/icons/icon_spatial_add.png b/editor/icons/icon_spatial_add.png
new file mode 100644
index 0000000000..47950fbbb5
--- /dev/null
+++ b/editor/icons/icon_spatial_add.png
Binary files differ
diff --git a/editor/icons/icon_spatial_sample_player.png b/editor/icons/icon_spatial_sample_player.png
new file mode 100644
index 0000000000..bb2451da99
--- /dev/null
+++ b/editor/icons/icon_spatial_sample_player.png
Binary files differ
diff --git a/editor/icons/icon_spatial_shader.png b/editor/icons/icon_spatial_shader.png
new file mode 100644
index 0000000000..7608fc9036
--- /dev/null
+++ b/editor/icons/icon_spatial_shader.png
Binary files differ
diff --git a/editor/icons/icon_spatial_stream_player.png b/editor/icons/icon_spatial_stream_player.png
new file mode 100644
index 0000000000..a6f9851548
--- /dev/null
+++ b/editor/icons/icon_spatial_stream_player.png
Binary files differ
diff --git a/editor/icons/icon_sphere_shape.png b/editor/icons/icon_sphere_shape.png
new file mode 100644
index 0000000000..23300a0da1
--- /dev/null
+++ b/editor/icons/icon_sphere_shape.png
Binary files differ
diff --git a/editor/icons/icon_spin_box.png b/editor/icons/icon_spin_box.png
new file mode 100644
index 0000000000..6da0dbec79
--- /dev/null
+++ b/editor/icons/icon_spin_box.png
Binary files differ
diff --git a/editor/icons/icon_spline.png b/editor/icons/icon_spline.png
new file mode 100644
index 0000000000..3239aff383
--- /dev/null
+++ b/editor/icons/icon_spline.png
Binary files differ
diff --git a/editor/icons/icon_spot_light.png b/editor/icons/icon_spot_light.png
new file mode 100644
index 0000000000..f52570a5cd
--- /dev/null
+++ b/editor/icons/icon_spot_light.png
Binary files differ
diff --git a/editor/icons/icon_sprite.png b/editor/icons/icon_sprite.png
new file mode 100644
index 0000000000..b698d32d4c
--- /dev/null
+++ b/editor/icons/icon_sprite.png
Binary files differ
diff --git a/editor/icons/icon_sprite_3d.png b/editor/icons/icon_sprite_3d.png
new file mode 100644
index 0000000000..47a3ff429b
--- /dev/null
+++ b/editor/icons/icon_sprite_3d.png
Binary files differ
diff --git a/editor/icons/icon_sprite_frames.png b/editor/icons/icon_sprite_frames.png
new file mode 100644
index 0000000000..5576b24f2e
--- /dev/null
+++ b/editor/icons/icon_sprite_frames.png
Binary files differ
diff --git a/editor/icons/icon_squirrel_script.png b/editor/icons/icon_squirrel_script.png
new file mode 100644
index 0000000000..32926b5975
--- /dev/null
+++ b/editor/icons/icon_squirrel_script.png
Binary files differ
diff --git a/editor/icons/icon_static_body.png b/editor/icons/icon_static_body.png
new file mode 100644
index 0000000000..62948f97cd
--- /dev/null
+++ b/editor/icons/icon_static_body.png
Binary files differ
diff --git a/editor/icons/icon_static_body_2_d.png b/editor/icons/icon_static_body_2_d.png
new file mode 100644
index 0000000000..9af0274a65
--- /dev/null
+++ b/editor/icons/icon_static_body_2_d.png
Binary files differ
diff --git a/editor/icons/icon_static_body_2d.png b/editor/icons/icon_static_body_2d.png
new file mode 100644
index 0000000000..b7bad4f742
--- /dev/null
+++ b/editor/icons/icon_static_body_2d.png
Binary files differ
diff --git a/editor/icons/icon_stop.png b/editor/icons/icon_stop.png
new file mode 100644
index 0000000000..0fd43b403a
--- /dev/null
+++ b/editor/icons/icon_stop.png
Binary files differ
diff --git a/editor/icons/icon_stream_player.png b/editor/icons/icon_stream_player.png
new file mode 100644
index 0000000000..15bdbdf440
--- /dev/null
+++ b/editor/icons/icon_stream_player.png
Binary files differ
diff --git a/editor/icons/icon_string.png b/editor/icons/icon_string.png
new file mode 100644
index 0000000000..8d01b738da
--- /dev/null
+++ b/editor/icons/icon_string.png
Binary files differ
diff --git a/editor/icons/icon_style_box_empty.png b/editor/icons/icon_style_box_empty.png
new file mode 100644
index 0000000000..f595eaaa57
--- /dev/null
+++ b/editor/icons/icon_style_box_empty.png
Binary files differ
diff --git a/editor/icons/icon_style_box_flat.png b/editor/icons/icon_style_box_flat.png
new file mode 100644
index 0000000000..6ec6a6dd35
--- /dev/null
+++ b/editor/icons/icon_style_box_flat.png
Binary files differ
diff --git a/editor/icons/icon_style_box_texture.png b/editor/icons/icon_style_box_texture.png
new file mode 100644
index 0000000000..f649508418
--- /dev/null
+++ b/editor/icons/icon_style_box_texture.png
Binary files differ
diff --git a/editor/icons/icon_surface.png b/editor/icons/icon_surface.png
new file mode 100644
index 0000000000..e7af8e9444
--- /dev/null
+++ b/editor/icons/icon_surface.png
Binary files differ
diff --git a/editor/icons/icon_tab_container.png b/editor/icons/icon_tab_container.png
new file mode 100644
index 0000000000..7ff3081ec1
--- /dev/null
+++ b/editor/icons/icon_tab_container.png
Binary files differ
diff --git a/editor/icons/icon_tab_menu.png b/editor/icons/icon_tab_menu.png
new file mode 100644
index 0000000000..29edd02f01
--- /dev/null
+++ b/editor/icons/icon_tab_menu.png
Binary files differ
diff --git a/editor/icons/icon_tabs.png b/editor/icons/icon_tabs.png
new file mode 100644
index 0000000000..bef0f60660
--- /dev/null
+++ b/editor/icons/icon_tabs.png
Binary files differ
diff --git a/editor/icons/icon_test_cube.png b/editor/icons/icon_test_cube.png
new file mode 100644
index 0000000000..4d11a69c3e
--- /dev/null
+++ b/editor/icons/icon_test_cube.png
Binary files differ
diff --git a/editor/icons/icon_text_edit.png b/editor/icons/icon_text_edit.png
new file mode 100644
index 0000000000..7599e89eb1
--- /dev/null
+++ b/editor/icons/icon_text_edit.png
Binary files differ
diff --git a/editor/icons/icon_texture.png b/editor/icons/icon_texture.png
new file mode 100644
index 0000000000..7c4493395e
--- /dev/null
+++ b/editor/icons/icon_texture.png
Binary files differ
diff --git a/editor/icons/icon_texture_button.png b/editor/icons/icon_texture_button.png
new file mode 100644
index 0000000000..ea1d8235e1
--- /dev/null
+++ b/editor/icons/icon_texture_button.png
Binary files differ
diff --git a/editor/icons/icon_texture_progress.png b/editor/icons/icon_texture_progress.png
new file mode 100644
index 0000000000..ea3cc35da8
--- /dev/null
+++ b/editor/icons/icon_texture_progress.png
Binary files differ
diff --git a/editor/icons/icon_texture_rect.png b/editor/icons/icon_texture_rect.png
new file mode 100644
index 0000000000..84e4a90bfb
--- /dev/null
+++ b/editor/icons/icon_texture_rect.png
Binary files differ
diff --git a/editor/icons/icon_theme.png b/editor/icons/icon_theme.png
new file mode 100644
index 0000000000..55d799c722
--- /dev/null
+++ b/editor/icons/icon_theme.png
Binary files differ
diff --git a/editor/icons/icon_thumbnail_wait.png b/editor/icons/icon_thumbnail_wait.png
new file mode 100644
index 0000000000..96a7d424e3
--- /dev/null
+++ b/editor/icons/icon_thumbnail_wait.png
Binary files differ
diff --git a/editor/icons/icon_tile_map.png b/editor/icons/icon_tile_map.png
new file mode 100644
index 0000000000..0ba6276e25
--- /dev/null
+++ b/editor/icons/icon_tile_map.png
Binary files differ
diff --git a/editor/icons/icon_tile_set.png b/editor/icons/icon_tile_set.png
new file mode 100644
index 0000000000..a1c3fccddd
--- /dev/null
+++ b/editor/icons/icon_tile_set.png
Binary files differ
diff --git a/editor/icons/icon_time.png b/editor/icons/icon_time.png
new file mode 100644
index 0000000000..a8e97ea7b8
--- /dev/null
+++ b/editor/icons/icon_time.png
Binary files differ
diff --git a/editor/icons/icon_timer.png b/editor/icons/icon_timer.png
new file mode 100644
index 0000000000..d3eb6a4b49
--- /dev/null
+++ b/editor/icons/icon_timer.png
Binary files differ
diff --git a/editor/icons/icon_tool_button.png b/editor/icons/icon_tool_button.png
new file mode 100644
index 0000000000..b2f3f6103f
--- /dev/null
+++ b/editor/icons/icon_tool_button.png
Binary files differ
diff --git a/editor/icons/icon_tool_move.png b/editor/icons/icon_tool_move.png
new file mode 100644
index 0000000000..2b6984e8b2
--- /dev/null
+++ b/editor/icons/icon_tool_move.png
Binary files differ
diff --git a/editor/icons/icon_tool_pan.png b/editor/icons/icon_tool_pan.png
new file mode 100644
index 0000000000..a24545a6d4
--- /dev/null
+++ b/editor/icons/icon_tool_pan.png
Binary files differ
diff --git a/editor/icons/icon_tool_rotate.png b/editor/icons/icon_tool_rotate.png
new file mode 100644
index 0000000000..9303fabb9c
--- /dev/null
+++ b/editor/icons/icon_tool_rotate.png
Binary files differ
diff --git a/editor/icons/icon_tool_scale.png b/editor/icons/icon_tool_scale.png
new file mode 100644
index 0000000000..b389c40746
--- /dev/null
+++ b/editor/icons/icon_tool_scale.png
Binary files differ
diff --git a/editor/icons/icon_tool_select.png b/editor/icons/icon_tool_select.png
new file mode 100644
index 0000000000..dcf6fcd2c8
--- /dev/null
+++ b/editor/icons/icon_tool_select.png
Binary files differ
diff --git a/editor/icons/icon_tools.png b/editor/icons/icon_tools.png
new file mode 100644
index 0000000000..4db4c53796
--- /dev/null
+++ b/editor/icons/icon_tools.png
Binary files differ
diff --git a/editor/icons/icon_touch_screen_button.png b/editor/icons/icon_touch_screen_button.png
new file mode 100644
index 0000000000..6bd0af3f47
--- /dev/null
+++ b/editor/icons/icon_touch_screen_button.png
Binary files differ
diff --git a/editor/icons/icon_track_add_key.png b/editor/icons/icon_track_add_key.png
new file mode 100644
index 0000000000..02d92439a3
--- /dev/null
+++ b/editor/icons/icon_track_add_key.png
Binary files differ
diff --git a/editor/icons/icon_track_add_key_hl.png b/editor/icons/icon_track_add_key_hl.png
new file mode 100644
index 0000000000..0e857f5fe2
--- /dev/null
+++ b/editor/icons/icon_track_add_key_hl.png
Binary files differ
diff --git a/editor/icons/icon_track_continuous.png b/editor/icons/icon_track_continuous.png
new file mode 100644
index 0000000000..dabdc718d5
--- /dev/null
+++ b/editor/icons/icon_track_continuous.png
Binary files differ
diff --git a/editor/icons/icon_track_discrete.png b/editor/icons/icon_track_discrete.png
new file mode 100644
index 0000000000..3f580ac5fc
--- /dev/null
+++ b/editor/icons/icon_track_discrete.png
Binary files differ
diff --git a/editor/icons/icon_track_method.png b/editor/icons/icon_track_method.png
new file mode 100644
index 0000000000..1355c84e67
--- /dev/null
+++ b/editor/icons/icon_track_method.png
Binary files differ
diff --git a/editor/icons/icon_track_prop.png b/editor/icons/icon_track_prop.png
new file mode 100644
index 0000000000..de8f549cd2
--- /dev/null
+++ b/editor/icons/icon_track_prop.png
Binary files differ
diff --git a/editor/icons/icon_track_trigger.png b/editor/icons/icon_track_trigger.png
new file mode 100644
index 0000000000..e89f95561a
--- /dev/null
+++ b/editor/icons/icon_track_trigger.png
Binary files differ
diff --git a/editor/icons/icon_track_value.png b/editor/icons/icon_track_value.png
new file mode 100644
index 0000000000..5f5dc0d315
--- /dev/null
+++ b/editor/icons/icon_track_value.png
Binary files differ
diff --git a/editor/icons/icon_translation.png b/editor/icons/icon_translation.png
new file mode 100644
index 0000000000..abca359eea
--- /dev/null
+++ b/editor/icons/icon_translation.png
Binary files differ
diff --git a/editor/icons/icon_transparent.png b/editor/icons/icon_transparent.png
new file mode 100644
index 0000000000..07e9b52b5c
--- /dev/null
+++ b/editor/icons/icon_transparent.png
Binary files differ
diff --git a/editor/icons/icon_transpose.png b/editor/icons/icon_transpose.png
new file mode 100644
index 0000000000..7a126c8428
--- /dev/null
+++ b/editor/icons/icon_transpose.png
Binary files differ
diff --git a/editor/icons/icon_tree.png b/editor/icons/icon_tree.png
new file mode 100644
index 0000000000..50ec1df98b
--- /dev/null
+++ b/editor/icons/icon_tree.png
Binary files differ
diff --git a/editor/icons/icon_tween.png b/editor/icons/icon_tween.png
new file mode 100644
index 0000000000..36717c0922
--- /dev/null
+++ b/editor/icons/icon_tween.png
Binary files differ
diff --git a/editor/icons/icon_unbone.png b/editor/icons/icon_unbone.png
new file mode 100644
index 0000000000..919e13ad6b
--- /dev/null
+++ b/editor/icons/icon_unbone.png
Binary files differ
diff --git a/editor/icons/icon_ungroup.png b/editor/icons/icon_ungroup.png
new file mode 100644
index 0000000000..b4c2e01814
--- /dev/null
+++ b/editor/icons/icon_ungroup.png
Binary files differ
diff --git a/editor/icons/icon_uninstance.png b/editor/icons/icon_uninstance.png
new file mode 100644
index 0000000000..de8b2f9a40
--- /dev/null
+++ b/editor/icons/icon_uninstance.png
Binary files differ
diff --git a/editor/icons/icon_unlock.png b/editor/icons/icon_unlock.png
new file mode 100644
index 0000000000..d314aa46fe
--- /dev/null
+++ b/editor/icons/icon_unlock.png
Binary files differ
diff --git a/editor/icons/icon_up.png b/editor/icons/icon_up.png
new file mode 100644
index 0000000000..346c4cdba8
--- /dev/null
+++ b/editor/icons/icon_up.png
Binary files differ
diff --git a/editor/icons/icon_updown.png b/editor/icons/icon_updown.png
new file mode 100644
index 0000000000..3141dc56ae
--- /dev/null
+++ b/editor/icons/icon_updown.png
Binary files differ
diff --git a/editor/icons/icon_uv.png b/editor/icons/icon_uv.png
new file mode 100644
index 0000000000..f5d901ab91
--- /dev/null
+++ b/editor/icons/icon_uv.png
Binary files differ
diff --git a/editor/icons/icon_v_box_container.png b/editor/icons/icon_v_box_container.png
new file mode 100644
index 0000000000..4d9bdb67b8
--- /dev/null
+++ b/editor/icons/icon_v_box_container.png
Binary files differ
diff --git a/editor/icons/icon_v_button_array.png b/editor/icons/icon_v_button_array.png
new file mode 100644
index 0000000000..d7ea9cc375
--- /dev/null
+++ b/editor/icons/icon_v_button_array.png
Binary files differ
diff --git a/editor/icons/icon_v_scroll_bar.png b/editor/icons/icon_v_scroll_bar.png
new file mode 100644
index 0000000000..91e00f4619
--- /dev/null
+++ b/editor/icons/icon_v_scroll_bar.png
Binary files differ
diff --git a/editor/icons/icon_v_separator.png b/editor/icons/icon_v_separator.png
new file mode 100644
index 0000000000..f0122d197f
--- /dev/null
+++ b/editor/icons/icon_v_separator.png
Binary files differ
diff --git a/editor/icons/icon_v_slider.png b/editor/icons/icon_v_slider.png
new file mode 100644
index 0000000000..545c126d23
--- /dev/null
+++ b/editor/icons/icon_v_slider.png
Binary files differ
diff --git a/editor/icons/icon_v_split_container.png b/editor/icons/icon_v_split_container.png
new file mode 100644
index 0000000000..23093e334f
--- /dev/null
+++ b/editor/icons/icon_v_split_container.png
Binary files differ
diff --git a/editor/icons/icon_variant.png b/editor/icons/icon_variant.png
new file mode 100644
index 0000000000..1ae2812ff7
--- /dev/null
+++ b/editor/icons/icon_variant.png
Binary files differ
diff --git a/editor/icons/icon_vector.png b/editor/icons/icon_vector.png
new file mode 100644
index 0000000000..8dba948daf
--- /dev/null
+++ b/editor/icons/icon_vector.png
Binary files differ
diff --git a/editor/icons/icon_vector2.png b/editor/icons/icon_vector2.png
new file mode 100644
index 0000000000..f84052cda0
--- /dev/null
+++ b/editor/icons/icon_vector2.png
Binary files differ
diff --git a/editor/icons/icon_vehicle_body.png b/editor/icons/icon_vehicle_body.png
new file mode 100644
index 0000000000..c404218911
--- /dev/null
+++ b/editor/icons/icon_vehicle_body.png
Binary files differ
diff --git a/editor/icons/icon_vehicle_wheel.png b/editor/icons/icon_vehicle_wheel.png
new file mode 100644
index 0000000000..23299a0425
--- /dev/null
+++ b/editor/icons/icon_vehicle_wheel.png
Binary files differ
diff --git a/editor/icons/icon_video_player.png b/editor/icons/icon_video_player.png
new file mode 100644
index 0000000000..5fd3723b22
--- /dev/null
+++ b/editor/icons/icon_video_player.png
Binary files differ
diff --git a/editor/icons/icon_video_stream_theora.png b/editor/icons/icon_video_stream_theora.png
new file mode 100644
index 0000000000..3f019f9b61
--- /dev/null
+++ b/editor/icons/icon_video_stream_theora.png
Binary files differ
diff --git a/editor/icons/icon_view.png b/editor/icons/icon_view.png
new file mode 100644
index 0000000000..c7975ed461
--- /dev/null
+++ b/editor/icons/icon_view.png
Binary files differ
diff --git a/editor/icons/icon_viewport.png b/editor/icons/icon_viewport.png
new file mode 100644
index 0000000000..8b25ea8764
--- /dev/null
+++ b/editor/icons/icon_viewport.png
Binary files differ
diff --git a/editor/icons/icon_viewport_container.png b/editor/icons/icon_viewport_container.png
new file mode 100644
index 0000000000..c70dee3698
--- /dev/null
+++ b/editor/icons/icon_viewport_container.png
Binary files differ
diff --git a/editor/icons/icon_viewport_sprite.png b/editor/icons/icon_viewport_sprite.png
new file mode 100644
index 0000000000..9aefb471d6
--- /dev/null
+++ b/editor/icons/icon_viewport_sprite.png
Binary files differ
diff --git a/editor/icons/icon_viewport_texture.png b/editor/icons/icon_viewport_texture.png
new file mode 100644
index 0000000000..ae744cc407
--- /dev/null
+++ b/editor/icons/icon_viewport_texture.png
Binary files differ
diff --git a/editor/icons/icon_visibility_area.png b/editor/icons/icon_visibility_area.png
new file mode 100644
index 0000000000..f3ca05711b
--- /dev/null
+++ b/editor/icons/icon_visibility_area.png
Binary files differ
diff --git a/editor/icons/icon_visibility_enabler.png b/editor/icons/icon_visibility_enabler.png
new file mode 100644
index 0000000000..66dffd3483
--- /dev/null
+++ b/editor/icons/icon_visibility_enabler.png
Binary files differ
diff --git a/editor/icons/icon_visibility_enabler_2d.png b/editor/icons/icon_visibility_enabler_2d.png
new file mode 100644
index 0000000000..e198b9785b
--- /dev/null
+++ b/editor/icons/icon_visibility_enabler_2d.png
Binary files differ
diff --git a/editor/icons/icon_visibility_notifier.png b/editor/icons/icon_visibility_notifier.png
new file mode 100644
index 0000000000..624122fb4c
--- /dev/null
+++ b/editor/icons/icon_visibility_notifier.png
Binary files differ
diff --git a/editor/icons/icon_visibility_notifier_2d.png b/editor/icons/icon_visibility_notifier_2d.png
new file mode 100644
index 0000000000..f904223edf
--- /dev/null
+++ b/editor/icons/icon_visibility_notifier_2d.png
Binary files differ
diff --git a/editor/icons/icon_visible.png b/editor/icons/icon_visible.png
new file mode 100644
index 0000000000..4e79dd3245
--- /dev/null
+++ b/editor/icons/icon_visible.png
Binary files differ
diff --git a/editor/icons/icon_visual_script.png b/editor/icons/icon_visual_script.png
new file mode 100644
index 0000000000..1678998d17
--- /dev/null
+++ b/editor/icons/icon_visual_script.png
Binary files differ
diff --git a/editor/icons/icon_visual_shader_port.png b/editor/icons/icon_visual_shader_port.png
new file mode 100644
index 0000000000..27daedbdd0
--- /dev/null
+++ b/editor/icons/icon_visual_shader_port.png
Binary files differ
diff --git a/editor/icons/icon_volume.png b/editor/icons/icon_volume.png
new file mode 100644
index 0000000000..2ce013cb03
--- /dev/null
+++ b/editor/icons/icon_volume.png
Binary files differ
diff --git a/editor/icons/icon_vu_db.png b/editor/icons/icon_vu_db.png
new file mode 100644
index 0000000000..405a929e2a
--- /dev/null
+++ b/editor/icons/icon_vu_db.png
Binary files differ
diff --git a/editor/icons/icon_vu_empty.png b/editor/icons/icon_vu_empty.png
new file mode 100644
index 0000000000..b749e1f2ca
--- /dev/null
+++ b/editor/icons/icon_vu_empty.png
Binary files differ
diff --git a/editor/icons/icon_vu_full.png b/editor/icons/icon_vu_full.png
new file mode 100644
index 0000000000..cb2b30d397
--- /dev/null
+++ b/editor/icons/icon_vu_full.png
Binary files differ
diff --git a/editor/icons/icon_wait_no_preview.png b/editor/icons/icon_wait_no_preview.png
new file mode 100644
index 0000000000..5d20cd99ec
--- /dev/null
+++ b/editor/icons/icon_wait_no_preview.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_1.png b/editor/icons/icon_wait_preview_1.png
new file mode 100644
index 0000000000..0aab42e04a
--- /dev/null
+++ b/editor/icons/icon_wait_preview_1.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_2.png b/editor/icons/icon_wait_preview_2.png
new file mode 100644
index 0000000000..f476b9ce1f
--- /dev/null
+++ b/editor/icons/icon_wait_preview_2.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_3.png b/editor/icons/icon_wait_preview_3.png
new file mode 100644
index 0000000000..2775d1ef43
--- /dev/null
+++ b/editor/icons/icon_wait_preview_3.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_4.png b/editor/icons/icon_wait_preview_4.png
new file mode 100644
index 0000000000..2eaa86fec9
--- /dev/null
+++ b/editor/icons/icon_wait_preview_4.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_5.png b/editor/icons/icon_wait_preview_5.png
new file mode 100644
index 0000000000..6590644bc1
--- /dev/null
+++ b/editor/icons/icon_wait_preview_5.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_6.png b/editor/icons/icon_wait_preview_6.png
new file mode 100644
index 0000000000..307e412310
--- /dev/null
+++ b/editor/icons/icon_wait_preview_6.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_7.png b/editor/icons/icon_wait_preview_7.png
new file mode 100644
index 0000000000..b0edc94d93
--- /dev/null
+++ b/editor/icons/icon_wait_preview_7.png
Binary files differ
diff --git a/editor/icons/icon_wait_preview_8.png b/editor/icons/icon_wait_preview_8.png
new file mode 100644
index 0000000000..67a2f48ec3
--- /dev/null
+++ b/editor/icons/icon_wait_preview_8.png
Binary files differ
diff --git a/editor/icons/icon_warning.png b/editor/icons/icon_warning.png
new file mode 100644
index 0000000000..451beba820
--- /dev/null
+++ b/editor/icons/icon_warning.png
Binary files differ
diff --git a/editor/icons/icon_window_dialog.png b/editor/icons/icon_window_dialog.png
new file mode 100644
index 0000000000..8591b15613
--- /dev/null
+++ b/editor/icons/icon_window_dialog.png
Binary files differ
diff --git a/editor/icons/icon_world.png b/editor/icons/icon_world.png
new file mode 100644
index 0000000000..d54b979cad
--- /dev/null
+++ b/editor/icons/icon_world.png
Binary files differ
diff --git a/editor/icons/icon_world_2d.png b/editor/icons/icon_world_2d.png
new file mode 100644
index 0000000000..ebe54262ff
--- /dev/null
+++ b/editor/icons/icon_world_2d.png
Binary files differ
diff --git a/editor/icons/icon_world_environment.png b/editor/icons/icon_world_environment.png
new file mode 100644
index 0000000000..d9f1323386
--- /dev/null
+++ b/editor/icons/icon_world_environment.png
Binary files differ
diff --git a/editor/icons/icon_y_sort.png b/editor/icons/icon_y_sort.png
new file mode 100644
index 0000000000..585956983c
--- /dev/null
+++ b/editor/icons/icon_y_sort.png
Binary files differ
diff --git a/editor/icons/icon_zoom.png b/editor/icons/icon_zoom.png
new file mode 100644
index 0000000000..f3748803cf
--- /dev/null
+++ b/editor/icons/icon_zoom.png
Binary files differ
diff --git a/editor/icons/icon_zoom_less.png b/editor/icons/icon_zoom_less.png
new file mode 100644
index 0000000000..fd8ef9075e
--- /dev/null
+++ b/editor/icons/icon_zoom_less.png
Binary files differ
diff --git a/editor/icons/icon_zoom_more.png b/editor/icons/icon_zoom_more.png
new file mode 100644
index 0000000000..8e818db1ee
--- /dev/null
+++ b/editor/icons/icon_zoom_more.png
Binary files differ
diff --git a/editor/icons/icon_zoom_reset.png b/editor/icons/icon_zoom_reset.png
new file mode 100644
index 0000000000..fa8a9d197e
--- /dev/null
+++ b/editor/icons/icon_zoom_reset.png
Binary files differ
diff --git a/editor/icons/source/icon_accept_dialog.svg b/editor/icons/source/icon_accept_dialog.svg
new file mode 100644
index 0000000000..9f82b30c94
--- /dev/null
+++ b/editor/icons/source/icon_accept_dialog.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_confirmation_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_accept_dialog.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.3712909"
+ inkscape:cy="7.2310094"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.89543,1 1,1.8954 1,3 L 1,4 15,4 15,3 C 15,1.8954 14.104569,1 13,1 Z m 9,1 1,0 0,1 -1,0 z M 1,5 1,13 c 0,1.1046 0.89543,2 2,2 l 10,0 c 1.104569,0 2,-0.8954 2,-2 L 15,5 Z M 10.474609,6.6367188 11.888672,8.0507812 6.9394531,13 4.1113281,10.171875 5.5253906,8.7578125 6.9394531,10.171875 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccsssccccccssssccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_add_track.svg b/editor/icons/source/icon_add_track.svg
new file mode 100644
index 0000000000..d19448efb0
--- /dev/null
+++ b/editor/icons/source/icon_add_track.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_add_track.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="6.9909025"
+ inkscape:cy="7.4569962"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 7 1 L 7 7 L 1 7 L 1 9 L 7 9 L 7 15 L 9 15 L 9 9 L 15 9 L 15 7 L 9 7 L 9 1 L 7 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_anchor.svg b/editor/icons/source/icon_anchor.svg
new file mode 100644
index 0000000000..6b10be040b
--- /dev/null
+++ b/editor/icons/source/icon_anchor.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_anchor.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_anchor.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="12.991456"
+ inkscape:cy="8.2347656"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 3 3.0000043 0 0 0 5 4 A 3 3.0000043 0 0 0 7 6.8261719 L 7 7 L 5 7 L 5 9 L 7 9 L 7 12.898438 A 5.0000172 5.0000172 0 0 1 3.171875 9.2949219 L 1.2382812 9.8125 A 7 7 0 0 0 8 15 A 7 7 0 0 0 14.761719 9.8125 L 12.824219 9.2929688 A 5.0000172 5.0000172 0 0 1 9 12.896484 L 9 9 L 11 9 L 11 7 L 9 7 L 9 6.8242188 A 3 3.0000043 0 0 0 11 4 A 3 3.0000043 0 0 0 8 1 z M 8 3 A 1.000016 1.0000174 0 0 1 9 4 A 1.000016 1.0000174 0 0 1 8 5 A 1.000016 1.0000174 0 0 1 7 4 A 1.000016 1.0000174 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_animated_sprite.svg b/editor/icons/source/icon_animated_sprite.svg
new file mode 100644
index 0000000000..36ccd8bca2
--- /dev/null
+++ b/editor/icons/source/icon_animated_sprite.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animated_sprite.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_animated_sprite (copy).svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.8151157"
+ inkscape:cy="10.058181"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#c4d0f5;fill-opacity:0.39215687;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.5 0 A 5.5 5.4999914 0 0 0 5.1699219 4.1699219 A 5.5 5.4999914 0 0 1 6.5 4 A 5.5 5.4999914 0 0 1 12 9.5 A 5.5 5.4999914 0 0 1 11.830078 10.830078 A 5.5 5.4999914 0 0 0 16 5.5 A 5.5 5.4999914 0 0 0 10.5 0 z "
+ transform="translate(0,1036.3622)"
+ id="ellipse4157" />
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:0.58823532;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.5 2 A 5.5 5.4999914 0 0 0 3.7441406 4.7480469 A 5.5 5.4999914 0 0 1 6.5 4 A 5.5 5.4999914 0 0 1 12 9.5 A 5.5 5.4999914 0 0 1 11.255859 12.251953 A 5.5 5.4999914 0 0 0 14 7.5 A 5.5 5.4999914 0 0 0 8.5 2 z "
+ transform="translate(0,1036.3622)"
+ id="ellipse4155" />
+ <path
+ style="opacity:1;fill:#a5b7f0;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6.5 4 A 5.5 5.4999914 0 0 0 1 9.5 A 5.5 5.4999914 0 0 0 6.5 15 A 5.5 5.4999914 0 0 0 12 9.5 A 5.5 5.4999914 0 0 0 6.5 4 z M 4 8 A 1.0000174 1.0000174 0 0 1 5 9 A 1.0000174 1.0000174 0 0 1 4 10 A 1.0000174 1.0000174 0 0 1 3 9 A 1.0000174 1.0000174 0 0 1 4 8 z M 9 8 A 1.0000174 1.0000174 0 0 1 10 9 A 1.0000174 1.0000174 0 0 1 9 10 A 1.0000174 1.0000174 0 0 1 8 9 A 1.0000174 1.0000174 0 0 1 9 8 z M 4 11 L 9 11 A 2.5 1.9999825 0 0 1 7.75 12.732422 A 2.5 1.9999825 0 0 1 5.25 12.732422 A 2.5 1.9999825 0 0 1 4 11 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_animated_sprite_3d.svg b/editor/icons/source/icon_animated_sprite_3d.svg
new file mode 100644
index 0000000000..f088c9e32d
--- /dev/null
+++ b/editor/icons/source/icon_animated_sprite_3d.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animated_sprite.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_animated_sprite_3d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.5963657"
+ inkscape:cy="10.401931"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.39215687;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.5 0 A 5.5 5.4999914 0 0 0 5.1699219 4.1699219 A 5.5 5.4999914 0 0 1 6.5 4 A 5.5 5.4999914 0 0 1 12 9.5 A 5.5 5.4999914 0 0 1 11.830078 10.830078 A 5.5 5.4999914 0 0 0 16 5.5 A 5.5 5.4999914 0 0 0 10.5 0 z "
+ transform="translate(0,1036.3622)"
+ id="ellipse4157" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.58823532;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.5 2 A 5.5 5.4999914 0 0 0 3.7441406 4.7480469 A 5.5 5.4999914 0 0 1 6.5 4 A 5.5 5.4999914 0 0 1 12 9.5 A 5.5 5.4999914 0 0 1 11.255859 12.251953 A 5.5 5.4999914 0 0 0 14 7.5 A 5.5 5.4999914 0 0 0 8.5 2 z "
+ transform="translate(0,1036.3622)"
+ id="ellipse4155" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6.5 4 A 5.5 5.4999914 0 0 0 1 9.5 A 5.5 5.4999914 0 0 0 6.5 15 A 5.5 5.4999914 0 0 0 12 9.5 A 5.5 5.4999914 0 0 0 6.5 4 z M 4 8 A 1.0000174 1.0000174 0 0 1 5 9 A 1.0000174 1.0000174 0 0 1 4 10 A 1.0000174 1.0000174 0 0 1 3 9 A 1.0000174 1.0000174 0 0 1 4 8 z M 9 8 A 1.0000174 1.0000174 0 0 1 10 9 A 1.0000174 1.0000174 0 0 1 9 10 A 1.0000174 1.0000174 0 0 1 8 9 A 1.0000174 1.0000174 0 0 1 9 8 z M 4 11 L 9 11 A 2.5 1.9999825 0 0 1 7.75 12.732422 A 2.5 1.9999825 0 0 1 5.25 12.732422 A 2.5 1.9999825 0 0 1 4 11 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_animation.svg b/editor/icons/source/icon_animation.svg
new file mode 100644
index 0000000000..371979345f
--- /dev/null
+++ b/editor/icons/source/icon_animation.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animation.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_animation.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="9.2543315"
+ inkscape:cy="5.9550306"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 A 6 6 0 0 0 2 8 A 6 6 0 0 0 8 14 A 6 6 0 0 0 12 12.464844 L 12 14 L 12.001953 14 A 2 2 0 0 0 12.267578 15 A 2 2 0 0 0 14 16 L 15 16 L 15 15 L 15 14 L 14.5 14 A 0.5 0.4999913 0 0 1 14 13.5 L 14 13 L 14 8 A 6 6 0 0 0 8 2 z M 8 3 A 1 1 0 0 1 9 4 A 1 1 0 0 1 8 5 A 1 1 0 0 1 7 4 A 1 1 0 0 1 8 3 z M 11.441406 5 A 1 1 0 0 1 12.330078 5.5 A 1 1 0 0 1 11.964844 6.8652344 A 1 1 0 0 1 10.597656 6.5 A 1 1 0 0 1 10.964844 5.1347656 A 1 1 0 0 1 11.441406 5 z M 4.4882812 5.0019531 A 1 1 0 0 1 5.0351562 5.1347656 A 1 1 0 0 1 5.4023438 6.5 A 1 1 0 0 1 4.0351562 6.8652344 A 1 1 0 0 1 3.6699219 5.5 A 1 1 0 0 1 4.4882812 5.0019531 z M 4.5117188 9 A 1 1 0 0 1 5.4023438 9.5 A 1 1 0 0 1 5.0351562 10.865234 A 1 1 0 0 1 3.6699219 10.5 A 1 1 0 0 1 4.0351562 9.1347656 A 1 1 0 0 1 4.5117188 9 z M 11.416016 9.0019531 A 1 1 0 0 1 11.964844 9.1347656 A 1 1 0 0 1 12.330078 10.5 A 1 1 0 0 1 10.964844 10.865234 A 1 1 0 0 1 10.597656 9.5 A 1 1 0 0 1 11.416016 9.0019531 z M 8 11 A 1 1 0 0 1 9 12 A 1 1 0 0 1 8 13 A 1 1 0 0 1 7 12 A 1 1 0 0 1 8 11 z "
+ id="path4140"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_animation_player.svg b/editor/icons/source/icon_animation_player.svg
new file mode 100644
index 0000000000..add4d5ac42
--- /dev/null
+++ b/editor/icons/source/icon_animation_player.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animation_player.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_animation_player (copy).svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="8.7610995"
+ inkscape:cy="9.3751685"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e1cb50;fill-opacity:0.98431373;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1,1037.3622 0,14 1.1666666,0 0,-2 1.8333334,0 0,2 8,0 0,-2 2,0 0,2 1,0 0,-14 -1,0 0,2 -2,0 0,-2 -8,0 0,2 -1.8333334,0 0,-2 z m 1.1666666,4 1.8333334,0 0,2 -1.8333334,0 z m 9.8333334,0 2,0 0,2 -2,0 z m -9.8333334,4 1.8333334,0 0,2 -1.8333334,0 z m 9.8333334,0 2,0 0,2 -2,0 z"
+ id="rect4136"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_animation_tree_player.svg b/editor/icons/source/icon_animation_tree_player.svg
new file mode 100644
index 0000000000..ab81cb226a
--- /dev/null
+++ b/editor/icons/source/icon_animation_tree_player.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animation_tree_player.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_animation_tree_player (copy).svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254831"
+ inkscape:cx="9.7184474"
+ inkscape:cy="8.2407739"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e1cb50;fill-opacity:0.98431373;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 15 L 2.1660156 15 L 2.1660156 13 L 4 13 L 4 15 L 12 15 L 12 13 L 14 13 L 14 15 L 15 15 L 15 1 L 14 1 L 14 3 L 12 3 L 12 1 L 4 1 L 4 3 L 2.1660156 3 L 2.1660156 1 L 1 1 z M 2.1660156 5 L 4 5 L 4 7 L 2.1660156 7 L 2.1660156 5 z M 8 5 A 1 1 0 0 1 9 6 A 1 1 0 0 1 8.8339844 6.5507812 L 10.060547 9.0039062 A 1 1 0 0 1 11 10 A 1 1 0 0 1 10 11 A 1 1 0 0 1 9 10 A 1 1 0 0 1 9.1660156 9.4492188 L 8 7.1171875 L 6.8339844 9.4492188 A 1 1 0 0 1 7 10 A 1 1 0 0 1 6 11 A 1 1 0 0 1 5 10 A 1 1 0 0 1 5.9414062 9.0019531 L 7.1660156 6.5507812 A 1 1 0 0 1 7 6 A 1 1 0 0 1 8 5 z M 12 5 L 14 5 L 14 7 L 12 7 L 12 5 z M 2.1660156 9 L 4 9 L 4 11 L 2.1660156 11 L 2.1660156 9 z M 12 9 L 14 9 L 14 11 L 12 11 L 12 9 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_area.svg b/editor/icons/source/icon_area.svg
new file mode 100644
index 0000000000..d16ad26e23
--- /dev/null
+++ b/editor/icons/source/icon_area.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_area.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_area.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-2.7642608"
+ inkscape:cy="8.6580722"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 1 5 L 3 5 L 3 3 L 5 3 L 5 1 L 1 1 z M 11 1 L 11 3 L 13 3 L 13 5 L 15 5 L 15 1 L 11 1 z M 4 4 L 4 6 L 4 10 L 4 12 L 12 12 L 12 10 L 12 4 L 4 4 z M 6 6 L 10 6 L 10 10 L 6 10 L 6 6 z M 1 11 L 1 13 L 1 15 L 3 15 L 5 15 L 5 13 L 3 13 L 3 11 L 1 11 z M 13 11 L 13 13 L 11 13 L 11 15 L 15 15 L 15 13 L 15 11 L 13 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4148" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_area_2d.svg b/editor/icons/source/icon_area_2d.svg
new file mode 100644
index 0000000000..ef7b16dd06
--- /dev/null
+++ b/editor/icons/source/icon_area_2d.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_area.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_area_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="-1.5916523"
+ inkscape:cy="11.154772"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 1 5 L 3 5 L 3 3 L 5 3 L 5 1 L 1 1 z M 11 1 L 11 3 L 13 3 L 13 5 L 15 5 L 15 1 L 11 1 z M 4 4 L 4 6 L 4 10 L 4 12 L 12 12 L 12 10 L 12 4 L 4 4 z M 6 6 L 10 6 L 10 10 L 6 10 L 6 6 z M 1 11 L 1 13 L 1 15 L 3 15 L 5 15 L 5 13 L 3 13 L 3 11 L 1 11 z M 13 11 L 13 13 L 11 13 L 11 15 L 15 15 L 15 13 L 15 11 L 13 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4148" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_arrow_left.svg b/editor/icons/source/icon_arrow_left.svg
new file mode 100644
index 0000000000..75a9ef0d68
--- /dev/null
+++ b/editor/icons/source/icon_arrow_left.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_arrow_left.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="-0.2534386"
+ inkscape:cy="9.1352698"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 4 L 3.5 6 L 1 8 L 3.5 10 L 6 12 L 6 9 L 15 9 L 15 7 L 6 7 L 6 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4352" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_arrow_right.svg b/editor/icons/source/icon_arrow_right.svg
new file mode 100644
index 0000000000..a7600699f7
--- /dev/null
+++ b/editor/icons/source/icon_arrow_right.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_arrow_right.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="0.9028114"
+ inkscape:cy="9.2602698"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1048.3622 5,-4 -5,-4 0,3 -9,0 0,2 9,0 z"
+ id="rect4352"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_arrow_up.svg b/editor/icons/source/icon_arrow_up.svg
new file mode 100644
index 0000000000..c1839cd69e
--- /dev/null
+++ b/editor/icons/source/icon_arrow_up.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_arrow_up.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.7465614"
+ inkscape:cy="9.3227698"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12,1042.3622 -2,-2.5 -2,-2.5 -2,2.5 -2,2.5 3,0 0,9 2,0 0,-9 3,0 z"
+ id="rect4352"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_atlas_texture.svg b/editor/icons/source/icon_atlas_texture.svg
new file mode 100644
index 0000000000..10c8b745b6
--- /dev/null
+++ b/editor/icons/source/icon_atlas_texture.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_atlas_texture.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_atlas_texture (copy).svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.5596884"
+ inkscape:cy="8.8938998"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1037.3622 -5,2 0,12 5,-2 4,2 5,-2 0,-12 -5,2 z m 0,2 4,2 0,8 -4,-2 z"
+ id="rect4139"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_audio_stream_gibberish.svg b/editor/icons/source/icon_audio_stream_gibberish.svg
new file mode 100644
index 0000000000..82b48c7004
--- /dev/null
+++ b/editor/icons/source/icon_audio_stream_gibberish.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_audio_stream_gibberish.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="5.8942052"
+ inkscape:cy="11.683238"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99215686;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 2 A 2 1.9999913 0 0 0 1 4 L 1 9 A 2 1.9999913 0 0 0 3 11 L 13 11 A 2 1.9999913 0 0 0 15 9 L 15 4 A 2 1.9999913 0 0 0 13 2 L 3 2 z M 3 6 L 5 6 L 5 7 L 3 7 L 3 6 z M 8 6 A 1 1 0 0 1 9 7 L 9 8 A 1 1 0 0 1 8 9 A 1 1 0 0 1 7 8 L 7 7 A 1 1 0 0 1 8 6 z M 11 6 L 13 6 L 13 7 L 11 7 L 11 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ <path
+ style="fill:#e1e1e1;fill-opacity:0.99215686;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6,1047.3622 0,3 3,-3 z"
+ id="path4173"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_auto_play.svg b/editor/icons/source/icon_auto_play.svg
new file mode 100644
index 0000000000..d4e1068ebf
--- /dev/null
+++ b/editor/icons/source/icon_auto_play.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_auto_play.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.592521"
+ inkscape:cy="9.4268437"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2 2 A 1.0001 1.0001 0 0 0 1 3 L 1 13 A 1.0001 1.0001 0 0 0 2 14 L 10 14 A 1.0001 1.0001 0 0 0 10.78125 13.625 L 14.78125 8.625 A 1.0001 1.0001 0 0 0 14.78125 7.3769531 L 10.78125 2.3769531 A 1.0001 1.0001 0 0 0 10 2 L 2 2 z M 3 4 L 9.5195312 4 L 12.71875 8 L 9.5195312 12 L 3 12 L 3 4 z M 6 5 C 4.8954305 5 4 5.8954 4 7 L 4 11 L 5 11 L 5 9 L 7 9 L 7 11 L 8 11 L 8 7 C 8 5.8954 7.1045695 5 6 5 z M 6 6 A 1 1 0 0 1 7 7 L 7 8 L 5 8 L 5 7 A 1 1 0 0 1 6 6 z M 9 6 L 9 10 L 11 8 L 9 6 z "
+ transform="translate(0,1036.3622)"
+ id="path4164" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_back.svg b/editor/icons/source/icon_back.svg
new file mode 100644
index 0000000000..597a1c3068
--- /dev/null
+++ b/editor/icons/source/icon_back.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="16"
+ viewBox="0 0 8 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_back.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.4850647"
+ inkscape:cy="8.9717887"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 5.9707031,1037.3633 c -0.3235485,0.01 -0.622658,0.1743 -0.8027343,0.4433 l -4,6 c -0.22390586,0.3359 -0.22390586,0.7735 0,1.1094 l 4,6 C 5.716941,1051.7388 6.999645,1051.3504 7,1050.3613 l 0,-12 c -9.424e-4,-0.5631 -0.4664154,-1.0144 -1.0292969,-0.998 z"
+ id="path4159"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_back_buffer_copy.svg b/editor/icons/source/icon_back_buffer_copy.svg
new file mode 100644
index 0000000000..17d83ed73f
--- /dev/null
+++ b/editor/icons/source/icon_back_buffer_copy.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_back_buffer_copy.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_back_buffer_copy.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.8381635"
+ inkscape:cy="8.4004461"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 1 10 L 1 12 L 6 12 L 6 10 L 3 10 L 3 3 L 9 3 L 9 1 L 3 1 L 1 1 z M 7 4 L 7 6 L 7 15 L 9 15 L 15 15 L 15 13 L 15 6 L 15 4 L 7 4 z M 9 6 L 13 6 L 13 13 L 9 13 L 9 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4146" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bake.svg b/editor/icons/source/icon_bake.svg
new file mode 100644
index 0000000000..ca07bca379
--- /dev/null
+++ b/editor/icons/source/icon_bake.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bake.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-3.7193798"
+ inkscape:cy="12.893481"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 1 L 2 3 L 14 3 L 14 1 L 2 1 z M 1 4 L 1 13 A 2 2.0000174 0 0 0 3 15 L 13 15 A 2 2.0000174 0 0 0 15 13 L 15 4 L 1 4 z M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 z M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 z M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 z M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 z M 3 7 L 13 7 L 13 13 L 3 13 L 3 7 z M 6 8 L 6 9 L 10 9 L 10 8 L 6 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_baked_light.svg b/editor/icons/source/icon_baked_light.svg
new file mode 100644
index 0000000000..98dc3135f6
--- /dev/null
+++ b/editor/icons/source/icon_baked_light.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_baked_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.1801151"
+ inkscape:cy="10.551189"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 1 L 2 3 L 14 3 L 14 1 L 2 1 z M 1 4 L 1 13 A 2 2.0000174 0 0 0 3 15 L 13 15 A 2 2.0000174 0 0 0 15 13 L 15 4 L 1 4 z M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 z M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 z M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 z M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 z M 3 7 L 13 7 L 13 13 L 3 13 L 3 7 z M 6 8 L 6 9 L 10 9 L 10 8 L 6 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_baked_light_instance.svg b/editor/icons/source/icon_baked_light_instance.svg
new file mode 100644
index 0000000000..d854378f12
--- /dev/null
+++ b/editor/icons/source/icon_baked_light_instance.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_baked_light_instance.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="10.864698"
+ inkscape:cy="11.302491"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 1 L 2 3 L 14 3 L 14 1 L 2 1 z M 1 4 L 1 13 A 2 2.0000174 0 0 0 3 15 L 13 15 A 2 2.0000174 0 0 0 15 13 L 15 4 L 1 4 z M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 z M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 z M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 z M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 z M 3 7 L 13 7 L 13 13 L 3 13 L 3 7 z M 6 8 L 6 9 L 10 9 L 10 8 L 6 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_baked_light_sampler.svg b/editor/icons/source/icon_baked_light_sampler.svg
new file mode 100644
index 0000000000..2dc7c39621
--- /dev/null
+++ b/editor/icons/source/icon_baked_light_sampler.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_backed_light_sampler.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_baked_light_sampler.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.2162526"
+ inkscape:cy="7.9395501"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 1 L 2 3 L 14 3 L 14 1 L 2 1 z M 1 4 L 1 13 A 2 2.0000174 0 0 0 3 15 L 7 15 L 7 13 L 3 13 L 3 7 L 7 7 L 13 7 L 15 7 L 15 4 L 1 4 z M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 z M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 z M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 z M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 z M 6 8 L 6 9 L 7 9 L 7 8 L 6 8 z M 10 9 A 1 1 0 0 0 9 10 L 9 14 A 1 1 0 0 0 10 15 L 14 15 A 1 1 0 0 0 15 14 L 15 10 A 1 1 0 0 0 14 9 L 10 9 z M 13 10 A 1 1 0 0 1 14 11 A 1 1 0 0 1 13 12 A 1 1 0 0 1 12 11 A 1 1 0 0 1 13 10 z M 11 12 A 1 1 0 0 1 12 13 A 1 1 0 0 1 11 14 A 1 1 0 0 1 10 13 A 1 1 0 0 1 11 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bit_map.svg b/editor/icons/source/icon_bit_map.svg
new file mode 100644
index 0000000000..fbaf573af6
--- /dev/null
+++ b/editor/icons/source/icon_bit_map.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bit_map.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="-0.178935"
+ inkscape:cy="8.367044"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 3 3 L 3 1 L 1 1 z M 3 3 L 3 5 L 5 5 L 5 3 L 3 3 z M 5 3 L 7 3 L 7 1 L 5 1 L 5 3 z M 7 3 L 7 5 L 9 5 L 9 3 L 7 3 z M 9 3 L 11 3 L 11 1 L 9 1 L 9 3 z M 11 3 L 11 5 L 13 5 L 13 3 L 11 3 z M 13 3 L 15 3 L 15 1 L 13 1 L 13 3 z M 13 5 L 13 7 L 15 7 L 15 5 L 13 5 z M 13 7 L 11 7 L 11 9 L 13 9 L 13 7 z M 13 9 L 13 11 L 15 11 L 15 9 L 13 9 z M 13 11 L 11 11 L 11 13 L 13 13 L 13 11 z M 13 13 L 13 15 L 15 15 L 15 13 L 13 13 z M 11 13 L 9 13 L 9 15 L 11 15 L 11 13 z M 9 13 L 9 11 L 7 11 L 7 13 L 9 13 z M 7 13 L 5 13 L 5 15 L 7 15 L 7 13 z M 5 13 L 5 11 L 3 11 L 3 13 L 5 13 z M 3 13 L 1 13 L 1 15 L 3 15 L 3 13 z M 3 11 L 3 9 L 1 9 L 1 11 L 3 11 z M 3 9 L 5 9 L 5 7 L 3 7 L 3 9 z M 3 7 L 3 5 L 1 5 L 1 7 L 3 7 z M 5 7 L 7 7 L 7 5 L 5 5 L 5 7 z M 7 7 L 7 9 L 9 9 L 9 7 L 7 7 z M 9 7 L 11 7 L 11 5 L 9 5 L 9 7 z M 9 9 L 9 11 L 11 11 L 11 9 L 9 9 z M 7 9 L 5 9 L 5 11 L 7 11 L 7 9 z "
+ id="rect4170"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bitmap_font.svg b/editor/icons/source/icon_bitmap_font.svg
new file mode 100644
index 0000000000..70749923d5
--- /dev/null
+++ b/editor/icons/source/icon_bitmap_font.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bitmap_font.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.619442"
+ inkscape:cy="6.940754"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 1,1037.3622 0,2 0,2 1,0 0,-1 1,0 0,-1 4,0 0,3 0,5 0,2 -1,0 0,1 -1,0 0,1 6,0 0,-1 -1,0 0,-1 -1,0 0,-10 4,0 0,1 1,0 0,1 1,0 0,-2 0,-2 -13,0 -1,0 z"
+ id="rect4212"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_blend.svg b/editor/icons/source/icon_blend.svg
new file mode 100644
index 0000000000..64d2aeec83
--- /dev/null
+++ b/editor/icons/source/icon_blend.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_blend.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_blend.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="2.5037806"
+ inkscape:cy="10.535433"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="matrix(0,-1,1,0,-1021.3622,1033.3622)" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2.979185,1050.6622 4.2426407,-4.2 -1.4142136,-1.4 -4.2426407,4.1999 1.4142136,1.4001 z m 5.6568542,0 3.1819808,0.35 3.18198,0.35 -0.353553,-3.15 -0.353554,-3.15 -2.12132,2.1 -2.828427,-2.8 -1.4142136,-1.4 -4.9497474,-4.9 -1.4142136,1.4001 4.9497475,4.8999 1.4142135,1.4 2.8284276,2.7999 -2.1213208,2.1001 z m 1.4142138,-7 2.12132,-2.1 2.12132,2.1 0.353554,-3.15 0.353553,-3.15 -3.18198,0.35 -3.1819808,0.35 2.1213208,2.1001 -2.1213208,2.0999 1.4142138,1.4 z"
+ id="rect4352"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bone.svg b/editor/icons/source/icon_bone.svg
new file mode 100644
index 0000000000..c87902a336
--- /dev/null
+++ b/editor/icons/source/icon_bone.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bone.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="4.7029555"
+ inkscape:cy="10.983314"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10.477991,1037.3625 a 2.4664114,2.4663006 0 0 0 -1.780445,0.7205 2.4664114,2.4663006 0 0 0 -0.3140829,3.1041 l -3.5589636,3.5608 a 2.4664114,2.4663006 0 0 0 -3.1022911,0.3121 2.4664114,2.4663006 0 0 0 0,3.4876 2.4664114,2.4663006 0 0 0 1.3969945,0.6955 2.4664198,2.4663006 0 0 0 0.6956069,1.397 2.4664198,2.4663006 0 0 0 3.4876687,0 2.4664198,2.4663006 0 0 0 0.3140829,-3.1041 l 3.5608896,-3.5608 a 2.4664198,2.4663006 0 0 0 3.100365,-0.3102 2.4664198,2.4663006 0 0 0 0,-3.4875 2.4664198,2.4663006 0 0 0 -1.396994,-0.6974 2.4664114,2.4663006 0 0 0 -0.695607,-1.3971 2.4664114,2.4663006 0 0 0 -1.707224,-0.7205 z"
+ id="path4139"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bone_attachment.svg b/editor/icons/source/icon_bone_attachment.svg
new file mode 100644
index 0000000000..5cb85c3c17
--- /dev/null
+++ b/editor/icons/source/icon_bone_attachment.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bone_attachment.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="1.6535575"
+ inkscape:cy="9.9668477"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10.477991,1037.3625 a 2.4664114,2.4663006 0 0 0 -1.780445,0.7205 2.4664114,2.4663006 0 0 0 -0.3140829,3.1041 l -3.5589636,3.5608 a 2.4664114,2.4663006 0 0 0 -3.1022911,0.3121 2.4664114,2.4663006 0 0 0 0,3.4876 2.4664114,2.4663006 0 0 0 1.3969945,0.6955 2.4664198,2.4663006 0 0 0 0.6956069,1.397 2.4664198,2.4663006 0 0 0 3.4876687,0 2.4664198,2.4663006 0 0 0 0.3140829,-3.1041 l 3.5608896,-3.5608 a 2.4664198,2.4663006 0 0 0 3.100365,-0.3102 2.4664198,2.4663006 0 0 0 0,-3.4875 2.4664198,2.4663006 0 0 0 -1.396994,-0.6974 2.4664114,2.4663006 0 0 0 -0.695607,-1.3971 2.4664114,2.4663006 0 0 0 -1.707224,-0.7205 z"
+ id="path4139"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bone_track.svg b/editor/icons/source/icon_bone_track.svg
new file mode 100644
index 0000000000..cdaab7e34a
--- /dev/null
+++ b/editor/icons/source/icon_bone_track.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bone_track.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="9.2991496"
+ inkscape:cy="10.055236"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10.477991,1037.3625 a 2.4664114,2.4663006 0 0 0 -1.780445,0.7205 2.4664114,2.4663006 0 0 0 -0.3140829,3.1041 l -3.5589636,3.5608 a 2.4664114,2.4663006 0 0 0 -3.1022911,0.3121 2.4664114,2.4663006 0 0 0 0,3.4876 2.4664114,2.4663006 0 0 0 1.3969945,0.6955 2.4664198,2.4663006 0 0 0 0.6956069,1.397 2.4664198,2.4663006 0 0 0 3.4876687,0 2.4664198,2.4663006 0 0 0 0.3140829,-3.1041 l 3.5608896,-3.5608 a 2.4664198,2.4663006 0 0 0 3.100365,-0.3102 2.4664198,2.4663006 0 0 0 0,-3.4875 2.4664198,2.4663006 0 0 0 -1.396994,-0.6974 2.4664114,2.4663006 0 0 0 -0.695607,-1.3971 2.4664114,2.4663006 0 0 0 -1.707224,-0.7205 z"
+ id="path4139"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_bool.svg b/editor/icons/source/icon_bool.svg
new file mode 100644
index 0000000000..e471871adf
--- /dev/null
+++ b/editor/icons/source/icon_bool.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bool.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_bool.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="-0.0405559"
+ inkscape:cy="11.453214"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 L 3 3 L 4 3 L 4 13 L 3 13 L 3 15 L 11 15 L 11 13 L 6 13 L 6 3 L 9 3 L 9 1 L 3 1 z M 9 3 L 9 8 L 11 8 L 11 3 L 9 3 z M 11 8 L 11 13 L 13 13 L 13 8 L 11 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_box_shape.svg b/editor/icons/source/icon_box_shape.svg
new file mode 100644
index 0000000000..04aaf16ebc
--- /dev/null
+++ b/editor/icons/source/icon_box_shape.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_box_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="8.1852896"
+ inkscape:cx="7.1222113"
+ inkscape:zoom="45.254832"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8 1 L 1 4 L 1 12 L 8 15 L 15 12 L 15 4 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4151" />
+ <path
+ style="fill:#68b6ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1051.3622 -7,-3 0,-8 7,3 z"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4145"
+ d="m 8,1051.3622 7,-3 0,-8 -7,3 z"
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#a2d2ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1040.3622 7,3 7,-3 -7,-3 z"
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_button.svg b/editor/icons/source/icon_button.svg
new file mode 100644
index 0000000000..54644ecb9b
--- /dev/null
+++ b/editor/icons/source/icon_button.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.249456"
+ inkscape:cy="9.3054468"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 3 L 1 11 L 15 11 L 15 3 L 1 3 z M 4 5 L 7 5 L 7 9 L 4 9 L 4 5 z M 9 5 L 10 5 L 10 6 L 11 6 L 11 5 L 12 5 L 12 6 L 11 6 L 11 7 L 12 7 L 12 9 L 11 9 L 11 7 L 10 7 L 10 9 L 9 9 L 9 5 z M 5 6 L 5 8 L 6 8 L 6 6 L 5 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ <rect
+ transform="scale(1,-1)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="14"
+ height="2.0000522"
+ x="1"
+ y="-1049.3622" />
+ <rect
+ y="-1049.3622"
+ x="1"
+ height="2.0000522"
+ width="14"
+ id="rect4142"
+ style="opacity:1;fill:#000000;fill-opacity:0.07843138;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_button_group.svg b/editor/icons/source/icon_button_group.svg
new file mode 100644
index 0000000000..9d5df99deb
--- /dev/null
+++ b/editor/icons/source/icon_button_group.svg
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button_group.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_button_group.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.5392558"
+ inkscape:cy="8.9453899"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4172"
+ width="1"
+ height="10"
+ x="0"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="15"
+ height="10"
+ width="1"
+ id="rect4174"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4176"
+ sodipodi:type="arc"
+ sodipodi:cx="1"
+ sodipodi:cy="1049.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="0"
+ sodipodi:end="4.712389"
+ d="m 2,1049.3622 a 1,1 0 0 1 -0.6173166,0.9239 1,1 0 0 1 -1.08979019,-0.2168 1,1 0 0 1 -0.21677274,-1.0898 A 1,1 0 0 1 1,1048.3622 l 0,1 z" />
+ <rect
+ y="-15"
+ x="1049.3622"
+ height="14"
+ width="1"
+ id="rect4178"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <path
+ d="m -14,1049.3622 a 1,1 0 0 1 -0.617317,0.9239 1,1 0 0 1 -1.08979,-0.2168 1,1 0 0 1 -0.216773,-1.0898 1,1 0 0 1 0.92388,-0.6173 l 0,1 z"
+ sodipodi:end="4.712389"
+ sodipodi:start="0"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="1049.3622"
+ sodipodi:cx="-15"
+ sodipodi:type="arc"
+ id="path4180"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ d="m 2,-1039.3622 a 1,1 0 0 1 -0.6173166,0.9239 1,1 0 0 1 -1.08979019,-0.2168 1,1 0 0 1 -0.21677274,-1.0898 A 1,1 0 0 1 1,-1040.3622 l 0,1 z"
+ sodipodi:end="4.712389"
+ sodipodi:start="0"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="-1039.3622"
+ sodipodi:cx="1"
+ sodipodi:type="arc"
+ id="path4182"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <path
+ transform="scale(-1,-1)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4184"
+ sodipodi:type="arc"
+ sodipodi:cx="-15"
+ sodipodi:cy="-1039.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="0"
+ sodipodi:end="4.712389"
+ d="m -14,-1039.3622 a 1,1 0 0 1 -0.617317,0.9239 1,1 0 0 1 -1.08979,-0.2168 1,1 0 0 1 -0.216773,-1.0898 1,1 0 0 1 0.92388,-0.6173 l 0,1 z" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4186"
+ width="1"
+ height="14"
+ x="1038.3622"
+ y="-15" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4188"
+ width="4"
+ height="6.0000172"
+ x="3"
+ y="1041.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="6.0000172"
+ width="4"
+ id="rect4190"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1045.3622"
+ x="3"
+ height="1.9999998"
+ width="4"
+ id="rect4192"
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4194"
+ width="4"
+ height="1.9999998"
+ x="9"
+ y="1045.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_camera.svg b/editor/icons/source/icon_camera.svg
new file mode 100644
index 0000000000..55d4aa698d
--- /dev/null
+++ b/editor/icons/source/icon_camera.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_camera.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_camera.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="9.4597381"
+ inkscape:cy="7.3949222"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4144"
+ width="10"
+ height="5.0000172"
+ x="1"
+ y="1042.3622" />
+ <rect
+ y="1040.3622"
+ x="3"
+ height="9.0000172"
+ width="6"
+ id="rect4146"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4148"
+ cx="3"
+ cy="1042.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1047.3622"
+ cx="3"
+ id="circle4150"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4152"
+ cx="9"
+ cy="1042.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1047.3622"
+ cx="9"
+ id="circle4154"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 12,7 0,3 3,1 0,-5 z"
+ transform="translate(0,1036.3622)"
+ id="rect4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_camera_2d.svg b/editor/icons/source/icon_camera_2d.svg
new file mode 100644
index 0000000000..1be8c0f984
--- /dev/null
+++ b/editor/icons/source/icon_camera_2d.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_camera.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_camera_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="5.924204"
+ inkscape:cy="7.4391164"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4144"
+ width="10"
+ height="5.0000172"
+ x="1"
+ y="1042.3622" />
+ <rect
+ y="1040.3622"
+ x="3"
+ height="9.0000172"
+ width="6"
+ id="rect4146"
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4148"
+ cx="3"
+ cy="1042.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1047.3622"
+ cx="3"
+ id="circle4150"
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4152"
+ cx="9"
+ cy="1042.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1047.3622"
+ cx="9"
+ id="circle4154"
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 12,7 0,3 3,1 0,-5 z"
+ transform="translate(0,1036.3622)"
+ id="rect4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_item.svg b/editor/icons/source/icon_canvas_item.svg
new file mode 100644
index 0000000000..d15a9a71b7
--- /dev/null
+++ b/editor/icons/source/icon_canvas_item.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_canvas_item.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="-0.0099577907"
+ inkscape:cy="13.312585"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ sodipodi:nodetypes="cscsccccsssc"
+ inkscape:connector-curvature="0"
+ id="path4146"
+ d="m 2.920797,1046.3957 c -0.2637264,0.3 -0.4203983,0.7296 -0.4203983,1.2383 0,1.6277 -3.13814186,-0.1781 -0.337569,2.6703 0.8838207,0.899 2.6543881,0.6701 3.538224,-0.2288 0.8838352,-0.899 0.8838163,-2.3565 0,-3.2554 -1.1002211,-1.1191 -2.200058,-1.0845 -2.7802567,-0.4244 z m 2.3801743,-1.6103 2.4004918,2.4416 6.8013899,-6.9177 c 0.662863,-0.6742 0.662863,-1.7673 0,-2.4415 -0.662877,-0.6741 -1.737613,-0.6741 -2.400491,0 z"
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_item_material.svg b/editor/icons/source/icon_canvas_item_material.svg
new file mode 100644
index 0000000000..ce8fd4b7de
--- /dev/null
+++ b/editor/icons/source/icon_canvas_item_material.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_material.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_canvas_item_material.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4168">
+ <ellipse
+ style="opacity:1;fill:#ffffff;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4170"
+ cx="16.5"
+ cy="1036.3622"
+ rx="11.8125"
+ ry="10.499999" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="5.4471982"
+ inkscape:cy="10.694354"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4168)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_item_shader.svg b/editor/icons/source/icon_canvas_item_shader.svg
new file mode 100644
index 0000000000..6d1d7e6bb1
--- /dev/null
+++ b/editor/icons/source/icon_canvas_item_shader.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_canvas_item_shader.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4148">
+ <path
+ sodipodi:nodetypes="cscsccccsssc"
+ inkscape:connector-curvature="0"
+ id="path4150"
+ d="m 7.9288448,1039.4124 c -0.4450383,0.45 -0.7094221,1.0944 -0.7094221,1.8575 0,2.4415 -5.2956144,-0.2672 -0.5696477,4.0054 1.4914475,1.3485 4.47928,1.0052 5.970753,-0.3432 1.491472,-1.3485 1.49144,-3.5347 0,-4.8831 -1.856623,-1.6786 -3.7125978,-1.6267 -4.6916832,-0.6366 z m 4.0165442,-2.4154 4.05083,3.6624 11.477345,-10.3766 c 1.118582,-1.0113 1.118582,-2.6509 0,-3.6622 -1.118605,-1.0112 -2.932222,-1.0112 -4.050828,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.2934357"
+ inkscape:cy="8.7995586"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4148)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_item_shader_graph.svg b/editor/icons/source/icon_canvas_item_shader_graph.svg
new file mode 100644
index 0000000000..84575ad388
--- /dev/null
+++ b/editor/icons/source/icon_canvas_item_shader_graph.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_canvas_item_shader_graph.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="-2.8222537"
+ inkscape:cy="15.541098"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4196)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_layer.svg b/editor/icons/source/icon_canvas_layer.svg
new file mode 100644
index 0000000000..794d832eea
--- /dev/null
+++ b/editor/icons/source/icon_canvas_layer.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_canvas_layer.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-2.2677599"
+ inkscape:cy="10.08915"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 L 1 9 L 2 9 L 2 3 A 1.0000174 1.0000174 0 0 1 3 2 L 9 2 L 9 1 L 3 1 z M 13.302734 1 C 12.868331 1 12.433001 1.1688094 12.101562 1.5058594 L 5.3007812 8.4238281 L 7.7011719 10.865234 L 14.501953 3.9472656 C 15.164816 3.2730656 15.164816 2.1800594 14.501953 1.5058594 C 14.170515 1.1688094 13.737138 1 13.302734 1 z M 14 7 L 14 13 A 1.0000174 1.0000174 0 0 1 13 14 L 7 14 L 7 15 L 13 15 A 2 2 0 0 0 15 13 L 15 7 L 14 7 z M 4.1152344 9.578125 C 3.6302227 9.5294 3.2100212 9.7031531 2.9199219 10.033203 C 2.6561955 10.333203 2.5 10.762784 2.5 11.271484 C 2.5 12.899184 -0.63846349 11.093006 2.1621094 13.941406 C 3.0459301 14.840406 4.817336 14.611791 5.7011719 13.712891 C 6.5850071 12.813891 6.5849882 11.355931 5.7011719 10.457031 C 5.1510613 9.8974813 4.6002461 9.62685 4.1152344 9.578125 z "
+ transform="translate(0,1036.3622)"
+ id="path4146" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_canvas_modulate.svg b/editor/icons/source/icon_canvas_modulate.svg
new file mode 100644
index 0000000000..8f8bd55f82
--- /dev/null
+++ b/editor/icons/source/icon_canvas_modulate.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_modulate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_canvas_modulate.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4392">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ id="path4394"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ id="clipPath4196"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4198"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.091501"
+ inkscape:cy="9.4358129"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#a5b7f1;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 1,1037.3622 0,14 14,0 0,-14 z m 2,2 10,0 0,10 -10,0 z"
+ id="rect4280"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4183"
+ d="m 12,1048.3622 -5,0 5,-5 z"
+ style="fill:#70bfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:#ff7070;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 4,1040.3622 5,0 -5,5 z"
+ id="path4185"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4187"
+ d="m 4,1048.3622 0,-3 5,-5 3,0 0,3 -5,5 z"
+ style="fill:#7aff70;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_capsule_shape.svg b/editor/icons/source/icon_capsule_shape.svg
new file mode 100644
index 0000000000..dcc6e8c00f
--- /dev/null
+++ b/editor/icons/source/icon_capsule_shape.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_capsule_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_capsule_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="11.868879"
+ inkscape:cx="-0.54664689"
+ inkscape:zoom="11.313708"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="opacity:1;fill:#68b6ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4140"
+ width="6"
+ height="8.0000172"
+ x="5"
+ y="1040.3622" />
+ <circle
+ r="3"
+ cy="1040.3622"
+ cx="8"
+ id="circle4142"
+ style="fill:#68b6ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <circle
+ style="fill:#68b6ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="circle4144"
+ cx="8"
+ cy="1048.3622"
+ r="3" />
+ <circle
+ r="1.0000174"
+ cy="1039.3622"
+ cx="7"
+ id="circle4146"
+ style="fill:#a2d2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_capsule_shape_2d.svg b/editor/icons/source/icon_capsule_shape_2d.svg
new file mode 100644
index 0000000000..13c6648368
--- /dev/null
+++ b/editor/icons/source/icon_capsule_shape_2d.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_capsule_shape_2d.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_capsule_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="10.749987"
+ inkscape:cx="2.8752365"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#68b6ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 4 4 0 0 0 4 5 L 4 11 A 4 4 0 0 0 8 15 A 4 4 0 0 0 12 11 L 12 5 A 4 4 0 0 0 8 1 z M 8 3 A 2.0000174 2.0000174 0 0 1 10 5 L 10 11 A 2.0000174 2.0000174 0 0 1 8 13 A 2.0000174 2.0000174 0 0 1 6 11 L 6 5 A 2.0000174 2.0000174 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4135" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_center_container.svg b/editor/icons/source/icon_center_container.svg
new file mode 100644
index 0000000000..31262f8494
--- /dev/null
+++ b/editor/icons/source/icon_center_container.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_center_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="-1.8665209"
+ inkscape:cy="9.391154"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4161"
+ d="m 6,1040.3622 2,2 2,-2 z m -2,2 0,4 2,-2 z m 8,0 -2,2 2,2 z m -4,4 -2,2 4,0 z"
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_check_box.svg b/editor/icons/source/icon_check_box.svg
new file mode 100644
index 0000000000..1068b424bd
--- /dev/null
+++ b/editor/icons/source/icon_check_box.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_check_box.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_check_box.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.8008276"
+ inkscape:cy="9.8639842"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 2 C 1.8954305 2 1 2.8954305 1 4 L 1 13 C 1 14.104569 1.8954305 15 3 15 L 12 15 C 13.104569 15 14 14.104569 14 13 L 14 8.0722656 L 12 10.072266 L 12 13 L 3 13 L 3 4 L 9.5859375 4 L 11.585938 2 L 3 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4143" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4.5857864,1045.3622 6,1046.7764 l 1.4142136,1.4142 1.4142135,-1.4142 4.9497479,-4.9497 -1.414214,-1.4142 -4.9497474,4.9497 L 6,1043.948 l -1.4142136,1.4142 z"
+ id="rect4163"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-3.1819807"
+ inkscape:transform-center-y="-1.06065" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_check_button.svg b/editor/icons/source/icon_check_button.svg
new file mode 100644
index 0000000000..1dddc7bf43
--- /dev/null
+++ b/editor/icons/source/icon_check_button.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_check_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_check_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="5.7571127"
+ inkscape:cy="12.193142"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 5 4 A 4 4 0 0 0 1 8 A 4 4 0 0 0 5 12 L 11 12 L 11 10 L 5 10 A 2 2 0 0 1 3 8 A 2 2 0 0 1 5 6 L 11 6 L 11 4 L 5 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4143" />
+ <circle
+ r="4"
+ cy="1044.3622"
+ cx="11"
+ id="circle4147"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_circle_shape_2d.svg b/editor/icons/source/icon_circle_shape_2d.svg
new file mode 100644
index 0000000000..56ac538672
--- /dev/null
+++ b/editor/icons/source/icon_circle_shape_2d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_circle_shape_2d.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="10.942649"
+ inkscape:cx="-9.5148271"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#68b6ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1038.3622 a 6,6 0 0 0 -6,6 6,6 0 0 0 6,6 6,6 0 0 0 6,-6 6,6 0 0 0 -6,-6 z"
+ id="path4157"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_class_list.svg b/editor/icons/source/icon_class_list.svg
new file mode 100644
index 0000000000..326174e566
--- /dev/null
+++ b/editor/icons/source/icon_class_list.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_class_list.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_class_list.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="7.4511363"
+ inkscape:cy="9.3546504"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4148"
+ width="5"
+ height="0.9999826"
+ x="1"
+ y="1038.3622" />
+ <rect
+ y="1037.3622"
+ x="6"
+ height="3.0000174"
+ width="6"
+ id="rect4150"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1038.3622"
+ x="3"
+ height="11.000017"
+ width="1"
+ id="rect4152"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="5"
+ height="0.99999976"
+ x="4"
+ y="1043.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="6"
+ height="3.0000174"
+ x="9"
+ y="1042.3622" />
+ <rect
+ y="1048.3622"
+ x="4"
+ height="0.99999976"
+ width="5"
+ id="rect4158"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1047.3622"
+ x="9"
+ height="3.0000174"
+ width="6"
+ id="rect4160"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_close.svg b/editor/icons/source/icon_close.svg
new file mode 100644
index 0000000000..65b71ae860
--- /dev/null
+++ b/editor/icons/source/icon_close.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_close.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="3.3969834"
+ inkscape:cy="11.678255"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-4"
+ inkscape:label="Layer 1"
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-736.13242,311.54347)">
+ <rect
+ y="1043.3622"
+ x="1"
+ height="1.9999478"
+ width="14"
+ id="rect4137"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4158"
+ width="13.999966"
+ height="2.0000017"
+ x="1037.3622"
+ y="-9" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_collapse.svg b/editor/icons/source/icon_collapse.svg
new file mode 100644
index 0000000000..a1c55e92de
--- /dev/null
+++ b/editor/icons/source/icon_collapse.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collapse.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_collapse.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="7.0030445"
+ inkscape:cy="11.276359"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1040.3622 0,3.9375 6,5.0625 6,-5.0625 0,-3.9375 -12,0 z"
+ id="rect4174"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_collision_2d.svg b/editor/icons/source/icon_collision_2d.svg
new file mode 100644
index 0000000000..29905795bd
--- /dev/null
+++ b/editor/icons/source/icon_collision_2d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_collision_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="8.9698127"
+ inkscape:cy="10.623768"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#a5b7f2;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.98823529"
+ d="m 14,1050.3622 -12,0 0,-12 12,0 -6,6 z"
+ id="path4144"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_collision_polygon.svg b/editor/icons/source/icon_collision_polygon.svg
new file mode 100644
index 0000000000..41f20abb5f
--- /dev/null
+++ b/editor/icons/source/icon_collision_polygon.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_collision_polygon.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="3.5635625"
+ inkscape:cy="10.561268"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 14,1050.3622 -12,0 0,-12 12,0 -6,6 z"
+ id="path4144"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_collision_shape.svg b/editor/icons/source/icon_collision_shape.svg
new file mode 100644
index 0000000000..066e3bc0fd
--- /dev/null
+++ b/editor/icons/source/icon_collision_shape.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_collision_shape.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.1912719"
+ inkscape:cy="5.0517827"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-7"
+ inkscape:label="Layer 1"
+ transform="translate(0,1.1802001e-5)"
+ style="stroke:#fc9c9c;stroke-opacity:0.99607843">
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4139"
+ d="m 8,1050.3622 -6,-3 0,-6 6,-3 6,3 0,6 z"
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_collision_shape_2d.svg b/editor/icons/source/icon_collision_shape_2d.svg
new file mode 100644
index 0000000000..e0a750c946
--- /dev/null
+++ b/editor/icons/source/icon_collision_shape_2d.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_collision_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="6.937726"
+ inkscape:cy="8.4489005"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#a5b7f3;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98823529;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 14,1050.3622 -12,0 0,-12 12,0 z"
+ id="path4139"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color.svg b/editor/icons/source/icon_color.svg
new file mode 100644
index 0000000000..c46f64b8ed
--- /dev/null
+++ b/editor/icons/source/icon_color.svg
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_color.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4218">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 8,1037.3622 a 7.0000172,7.0000172 0 0 0 -7,7 7.0000172,7.0000172 0 0 0 7,7 7.0000172,7.0000172 0 0 0 7,-7 7.0000172,7.0000172 0 0 0 -7,-7 z m 0,3 a 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 z"
+ id="path4221"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="4.4710872"
+ inkscape:cy="8.9389443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4151"
+ cx="8"
+ cy="1044.3622"
+ r="8" />
+ <g
+ id="g4204"
+ clip-path="url(#clipPath4218)">
+ <path
+ inkscape:transform-center-y="-3.5000174"
+ d="m 6.1882667,1037.6007 a 7,7 0 0 1 3.6234668,0 L 8,1044.3622 Z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="1044.3622"
+ sodipodi:cx="8"
+ sodipodi:type="arc"
+ id="path4153"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ inkscape:transform-center-x="-2.4749025"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,0,0)"
+ style="opacity:1;fill:#ff4d00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4157"
+ sodipodi:type="arc"
+ sodipodi:cx="529.10931"
+ sodipodi:cy="900.44415"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m 527.29758,893.68267 a 7,7 0 0 1 3.62347,0 l -1.81174,6.76148 z"
+ inkscape:transform-center-y="-3.3807758" />
+ <path
+ inkscape:transform-center-y="-2.4748757"
+ d="m 906.63248,508.49139 a 7,7 0 0 1 3.62347,0 l -1.81174,6.76148 z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="515.25287"
+ sodipodi:cx="908.44421"
+ sodipodi:type="arc"
+ id="path4159"
+ style="opacity:1;fill:#ff9900;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"
+ inkscape:transform-center-x="-3.3807755" />
+ <path
+ inkscape:transform-center-x="-3.500017"
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#ffca00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4161"
+ sodipodi:type="arc"
+ sodipodi:cx="1044.3622"
+ sodipodi:cy="-8.0000172"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m 1042.5504,-14.761498 a 7,7 0 0 1 3.6235,0 l -1.8117,6.7614808 z"
+ inkscape:transform-center-y="-1.7222787e-05" />
+ <path
+ inkscape:transform-center-y="2.4749218"
+ d="m 898.63248,-535.87086 a 7,7 0 0 1 3.62347,0 l -1.81174,6.76149 z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="-529.10938"
+ sodipodi:cx="900.44421"
+ sodipodi:type="arc"
+ id="path4163"
+ style="opacity:1;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,0,0)"
+ inkscape:transform-center-x="-3.3807914" />
+ <path
+ inkscape:transform-center-x="-2.4748559"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,0,0)"
+ style="opacity:1;fill:#9fff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4165"
+ sodipodi:type="arc"
+ sodipodi:cx="515.25293"
+ sodipodi:cy="-908.44421"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m 513.4412,-915.20569 a 7,7 0 0 1 3.62346,0 l -1.81173,6.76148 z"
+ inkscape:transform-center-y="3.3807689" />
+ <path
+ inkscape:transform-center-y="3.4999826"
+ d="m -9.8117504,-1051.1237 a 7,7 0 0 1 3.6234668,0 l -1.8117336,6.7615 z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="-1044.3622"
+ sodipodi:cx="-8.0000172"
+ sodipodi:type="arc"
+ id="path4167"
+ style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,-1)"
+ inkscape:transform-center-x="-1.6750127e-05" />
+ <path
+ inkscape:transform-center-x="2.4749062"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)"
+ style="opacity:1;fill:#00ffaa;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4169"
+ sodipodi:type="arc"
+ sodipodi:cx="-529.10931"
+ sodipodi:cy="-900.44427"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m -530.92105,-907.20576 a 7,7 0 0 1 3.62347,0 l -1.81173,6.76149 z"
+ inkscape:transform-center-y="3.3808107" />
+ <path
+ inkscape:transform-center-y="2.4748493"
+ d="m -910.25589,-522.01441 a 7,7 0 0 1 3.62347,0 l -1.81173,6.76148 z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="-515.25293"
+ sodipodi:cx="-908.44415"
+ sodipodi:type="arc"
+ id="path4171"
+ style="opacity:1;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)"
+ inkscape:transform-center-x="3.3807887" />
+ <path
+ inkscape:transform-center-x="3.4999821"
+ transform="matrix(0,-1,1,0,0,0)"
+ style="opacity:1;fill:#9000ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4173"
+ sodipodi:type="arc"
+ sodipodi:cx="-1044.3622"
+ sodipodi:cy="8.0000181"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m -1046.1739,1.2385373 a 7,7 0 0 1 3.6235,1e-7 l -1.8118,6.7614807 z"
+ inkscape:transform-center-y="-1.7714781e-05" />
+ <path
+ inkscape:transform-center-y="-2.474887"
+ d="m -902.25595,522.34777 a 7,7 0 0 1 3.62347,0 l -1.81173,6.76148 z"
+ sodipodi:end="4.9741884"
+ sodipodi:start="4.4505896"
+ sodipodi:ry="7"
+ sodipodi:rx="7"
+ sodipodi:cy="529.10925"
+ sodipodi:cx="-900.44421"
+ sodipodi:type="arc"
+ id="path4175"
+ style="opacity:1;fill:#ff00ee;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"
+ inkscape:transform-center-x="3.3807952" />
+ <path
+ inkscape:transform-center-x="2.4748691"
+ transform="matrix(0.8660254,-0.5,0.5,0.8660254,0,0)"
+ style="opacity:1;fill:#ff009a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4177"
+ sodipodi:type="arc"
+ sodipodi:cx="-515.25287"
+ sodipodi:cy="908.44415"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ sodipodi:start="4.4505896"
+ sodipodi:end="4.9741884"
+ d="m -517.0646,901.68267 a 7,7 0 0 1 3.62346,0 l -1.81173,6.76148 z"
+ inkscape:transform-center-y="-3.3807953" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color_pick.svg b/editor/icons/source/icon_color_pick.svg
new file mode 100644
index 0000000000..bbb05fc6b6
--- /dev/null
+++ b/editor/icons/source/icon_color_pick.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_color_pick.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color_pick.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="4.443644"
+ inkscape:cy="9.1543192"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 13.050781 0.97851562 A 2 2 0 0 0 11.607422 1.5644531 L 10.193359 2.9785156 L 8.7773438 1.5644531 L 7.3632812 2.9785156 L 8.7773438 4.3925781 L 1.7070312 11.464844 L 1.3535156 13.232422 L 1 15 L 2.7675781 14.646484 L 4.5351562 14.292969 L 11.607422 7.2226562 L 13.021484 8.6367188 L 14.435547 7.2226562 L 13.021484 5.8066406 L 14.435547 4.3925781 A 2 2 0 0 0 14.435547 1.5644531 A 2 2 0 0 0 13.050781 0.97851562 z M 9.484375 5.0996094 L 10.900391 6.515625 L 3.828125 13.585938 L 3.1210938 12.878906 L 2.4140625 12.171875 L 9.484375 5.0996094 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color_picker.svg b/editor/icons/source/icon_color_picker.svg
new file mode 100644
index 0000000000..0efd276c50
--- /dev/null
+++ b/editor/icons/source/icon_color_picker.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_color_picker.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color_picker.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="4.7530032"
+ inkscape:cy="8.2262415"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 13.050781 0.97851562 A 2 2 0 0 0 11.607422 1.5644531 L 10.193359 2.9785156 L 8.7773438 1.5644531 L 7.3632812 2.9785156 L 8.7773438 4.3925781 L 1.7070312 11.464844 L 1.3535156 13.232422 L 1 15 L 2.7675781 14.646484 L 4.5351562 14.292969 L 11.607422 7.2226562 L 13.021484 8.6367188 L 14.435547 7.2226562 L 13.021484 5.8066406 L 14.435547 4.3925781 A 2 2 0 0 0 14.435547 1.5644531 A 2 2 0 0 0 13.050781 0.97851562 z M 9.484375 5.0996094 L 10.900391 6.515625 L 3.828125 13.585938 L 3.1210938 12.878906 L 2.4140625 12.171875 L 9.484375 5.0996094 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color_picker_button.svg b/editor/icons/source/icon_color_picker_button.svg
new file mode 100644
index 0000000000..4e4fb8cc1b
--- /dev/null
+++ b/editor/icons/source/icon_color_picker_button.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_color_picker_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color_picker_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.1313634"
+ inkscape:cy="7.6484362"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-4"
+ inkscape:label="Layer 1">
+ <path
+ id="rect4139"
+ transform="translate(0,1036.3622)"
+ d="M 13.050781,0.97851562 A 2,2 0 0 0 11.607422,1.5644531 L 10.193359,2.9785156 8.7773438,1.5644531 7.3632812,2.9785156 8.7773438,4.3925781 1.7070312,11.464844 1.3535156,13.232422 1,15 2.7675781,14.646484 4.5351562,14.292969 11.607422,7.2226562 13.021484,8.6367188 14.435547,7.2226562 13.021484,5.8066406 14.435547,4.3925781 a 2,2 0 0 0 0,-2.828125 2,2 0 0 0 -1.384766,-0.58593748 z M 9.484375,5.0996094 10.900391,6.515625 3.828125,13.585938 3.1210938,12.878906 2.4140625,12.171875 9.484375,5.0996094 Z"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 3 L 1 9.34375 L 5.9492188 4.3925781 L 4.5566406 3 L 1 3 z M 15 9.4863281 L 13.486328 11 L 12.556641 11 L 11.607422 10.050781 L 8.6582031 13 L 15 13 L 15 9.4863281 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139-4" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:0.07843137;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.658203 11 L 8.6582031 13 L 15 13 L 15 11 L 13.486328 11 L 12.556641 11 L 10.658203 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color_ramp.svg b/editor/icons/source/icon_color_ramp.svg
new file mode 100644
index 0000000000..ff23cdba8d
--- /dev/null
+++ b/editor/icons/source/icon_color_ramp.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_color_ramp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color_ramp.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#afff68;stop-opacity:1"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#ff6b6b;stop-opacity:1"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="linearGradient4145"
+ x1="4"
+ y1="14"
+ x2="30"
+ y2="14"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.51851852,0,0,0.7,-0.55555555,1034.5622)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.5771263"
+ inkscape:cy="10.144749"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:url(#linearGradient4145);fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 1,1051.3622 14,0 0,-14 z"
+ id="rect4141"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_color_rect.svg b/editor/icons/source/icon_color_rect.svg
new file mode 100644
index 0000000000..76bf6596a9
--- /dev/null
+++ b/editor/icons/source/icon_color_rect.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_color_rect.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.9050022"
+ inkscape:cy="11.383887"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1050.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="14"
+ height="14"
+ width="1"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#70bfff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 13,1049.3622 -6,0 6,-6 z"
+ id="path4168"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4170"
+ d="m 3,1039.3622 6,0 -6,6 z"
+ style="fill:#ff7070;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#7aff70;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3,1049.3622 0,-4 6,-6 4,0 0,4 -6,6 z"
+ id="path4172"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_concave_polygon_shape.svg b/editor/icons/source/icon_concave_polygon_shape.svg
new file mode 100644
index 0000000000..b0e0fe63ce
--- /dev/null
+++ b/editor/icons/source/icon_concave_polygon_shape.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_concave_polygon_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_concave_polygon_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="9.2011727"
+ inkscape:cx="7.5362507"
+ inkscape:zoom="22.627417"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8 1 L 1 4 L 1 12 L 8 15 L 15 12 L 15 4 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4194" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1037.3622 -7,3 0,8 7,3 7,-3 0,-8 -7,-3 z"
+ id="path4151" />
+ <path
+ style="fill:#2998ff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 3,1041.3622 0,6 5,2 5,-2 0,-6 -5,-2 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a2d2ff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 8,1049.3622 5,-2 -5,-2 -5,2 z"
+ id="path4164"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#68b6ff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 8,1045.3622 5,2 0,-6 -5,-2 z"
+ id="path4166"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a2d2ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8,1 1,4 3,5 8,3 13,5 15,4 Z"
+ transform="translate(0,1036.3622)"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#68b6ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 1,4 1,12 8,15 8,13 3,11 3,5 Z"
+ transform="translate(0,1036.3622)"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 15,4 -2,1 0,6 -5,2 0,2 7,-3 z"
+ transform="translate(0,1036.3622)"
+ id="path4145"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_concave_polygon_shape_2d.svg b/editor/icons/source/icon_concave_polygon_shape_2d.svg
new file mode 100644
index 0000000000..624105e5a8
--- /dev/null
+++ b/editor/icons/source/icon_concave_polygon_shape_2d.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_concave_polygon_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="9.3658684"
+ inkscape:cy="6.9741169"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1050.3622 -12,0 0,-12 6,6 6,-6 z"
+ id="path4139"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_cone_twist_joint.svg b/editor/icons/source/icon_cone_twist_joint.svg
new file mode 100644
index 0000000000..4799deb1d5
--- /dev/null
+++ b/editor/icons/source/icon_cone_twist_joint.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_area.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_cone_twist_joint.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.6908051"
+ inkscape:cy="11.390572"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:none;fill-opacity:0.99607843;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 L 2 11 A 6 3 0 0 0 5 13.597656 A 6 3 0 0 0 11 13.597656 A 6 3 0 0 0 14 11 L 8 2 z "
+ transform="translate(0,1036.3622)"
+ id="path4172" />
+ <ellipse
+ style="opacity:1;fill:none;fill-opacity:0.99607843;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4177"
+ cx="8"
+ cy="1047.3622"
+ rx="6"
+ ry="3" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1039.3622 0,8"
+ id="path4179"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_confirmation_dialog.svg b/editor/icons/source/icon_confirmation_dialog.svg
new file mode 100644
index 0000000000..49dbc21e92
--- /dev/null
+++ b/editor/icons/source/icon_confirmation_dialog.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_confirmation_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_confirmation_dialog.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="7.6980886"
+ inkscape:cy="13.203824"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.89543 1 1 1.8954 1 3 L 1 4 L 15 4 L 15 3 C 15 1.8954 14.104569 1 13 1 L 3 1 z M 12 2 L 13 2 L 13 3 L 12 3 L 12 2 z M 1 5 L 1 13 C 1 14.1046 1.89543 15 3 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 5 L 1 5 z M 2.5859375 8.8789062 L 4 10.292969 L 5.4140625 8.8789062 L 6.1210938 9.5859375 L 4.7070312 11 L 6.1210938 12.414062 L 5.4140625 13.121094 L 4 11.707031 L 2.5859375 13.121094 L 1.8789062 12.414062 L 3.2929688 11 L 1.8789062 9.5859375 L 2.5859375 8.8789062 z M 12.949219 8.8789062 L 13.65625 9.5859375 L 10.828125 12.414062 L 10.121094 13.121094 L 9.4140625 12.414062 L 8 11 L 8.7070312 10.292969 L 10.121094 11.707031 L 12.949219 8.8789062 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_connect.svg b/editor/icons/source/icon_connect.svg
new file mode 100644
index 0000000000..745d3cc436
--- /dev/null
+++ b/editor/icons/source/icon_connect.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_connect.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="0.78663326"
+ inkscape:cy="12.940707"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 7 2 A 2 2 0 0 0 5 4 L 5 7 L 1 7 L 1 9 L 5 9 L 5 12 A 2 2 0 0 0 7 14 L 11 14 L 11 12 L 14 12 L 14 10 L 11 10 L 11 6 L 14 6 L 14 4 L 11 4 L 11 2 L 7 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_connection_and_groups.svg b/editor/icons/source/icon_connection_and_groups.svg
new file mode 100644
index 0000000000..5468312b4b
--- /dev/null
+++ b/editor/icons/source/icon_connection_and_groups.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_connection_and_groups.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="-3.3764632"
+ inkscape:cy="12.578963"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 2 0 L 2 1 L 2 6 L 2 7 L 14 7 L 14 6 L 14 0 L 3 0 L 2 0 z M 3 1 L 13 1 L 13 6 L 3 6 L 3 1 z M 5.5 2 A 1.5 1.5000032 0 0 0 4 3.5 A 1.5 1.5000032 0 0 0 5.5 5 A 1.5 1.5000032 0 0 0 7 3.5 A 1.5 1.5000032 0 0 0 5.5 2 z M 10.5 2 A 1.5 1.5000032 0 0 0 9 3.5 A 1.5 1.5000032 0 0 0 10.5 5 A 1.5 1.5000032 0 0 0 12 3.5 A 1.5 1.5000032 0 0 0 10.5 2 z M 10 9 A 2 1.9999913 0 0 0 8 11 L 8 12 L 2 12 L 2 13 L 8 13 L 8 14 A 2 2 0 0 0 10 16 L 12 16 L 12 15 L 14 15 L 14 14 L 12 14 L 12 11 L 14 11 L 14 10 L 12 10 L 12 9 L 10 9 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_container.svg b/editor/icons/source/icon_container.svg
new file mode 100644
index 0000000000..2d39efafee
--- /dev/null
+++ b/editor/icons/source/icon_container.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="5.4993419"
+ inkscape:cy="7.9173851"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.8954305 1 1 1.8954305 1 3 L 3 3 L 3 1 z M 5 1 L 5 3 L 7 3 L 7 1 L 5 1 z M 9 1 L 9 3 L 11 3 L 11 1 L 9 1 z M 13 1 L 13 3 L 15 3 C 15 1.8954305 14.104569 1 13 1 z M 1 5 L 1 7 L 3 7 L 3 5 L 1 5 z M 13 5 L 13 7 L 15 7 L 15 5 L 13 5 z M 1 9 L 1 11 L 3 11 L 3 9 L 1 9 z M 13 9 L 13 11 L 15 11 L 15 9 L 13 9 z M 1 13 C 1 14.104569 1.8954305 15 3 15 L 3 13 L 1 13 z M 5 13 L 5 15 L 7 15 L 7 13 L 5 13 z M 9 13 L 9 15 L 11 15 L 11 13 L 9 13 z M 13 13 L 13 15 C 14.104569 15 15 14.104569 15 13 L 13 13 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control.svg b/editor/icons/source/icon_control.svg
new file mode 100644
index 0000000000..675a9f5c43
--- /dev/null
+++ b/editor/icons/source/icon_control.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_control.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="4.1094292"
+ inkscape:cy="4.5020156"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 A 6 6 0 0 0 2 8 A 6 6 0 0 0 8 14 A 6 6 0 0 0 14 8 A 6 6 0 0 0 8 2 z M 8 4 A 4 4 0 0 1 12 8 A 4 4 0 0 1 8 12 A 4 4 0 0 1 4 8 A 4 4 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_bottom_center.svg b/editor/icons/source/icon_control_align_bottom_center.svg
new file mode 100644
index 0000000000..d6c660bb2d
--- /dev/null
+++ b/editor/icons/source/icon_control_align_bottom_center.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_bottom_center.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="6"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_bottom_left.svg b/editor/icons/source/icon_control_align_bottom_left.svg
new file mode 100644
index 0000000000..7a234b10ad
--- /dev/null
+++ b/editor/icons/source/icon_control_align_bottom_left.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_bottom_right.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="2"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_bottom_right.svg b/editor/icons/source/icon_control_align_bottom_right.svg
new file mode 100644
index 0000000000..a4ba9a552a
--- /dev/null
+++ b/editor/icons/source/icon_control_align_bottom_right.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_bottom_left.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="10"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_bottom_wide.svg b/editor/icons/source/icon_control_align_bottom_wide.svg
new file mode 100644
index 0000000000..93352dd3f5
--- /dev/null
+++ b/editor/icons/source/icon_control_align_bottom_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_bottom_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="11.086775"
+ inkscape:cy="10.073373"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="12.000001"
+ height="4.0000172"
+ x="1.9999995"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_center.svg b/editor/icons/source/icon_control_align_center.svg
new file mode 100644
index 0000000000..0c34d13def
--- /dev/null
+++ b/editor/icons/source/icon_control_align_center.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_center.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="6"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_center_left.svg b/editor/icons/source/icon_control_align_center_left.svg
new file mode 100644
index 0000000000..ea62c9457d
--- /dev/null
+++ b/editor/icons/source/icon_control_align_center_left.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_center_left.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.103241"
+ inkscape:cy="11.222422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="6"
+ height="4.0000172"
+ x="2"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_center_right.svg b/editor/icons/source/icon_control_align_center_right.svg
new file mode 100644
index 0000000000..3212ce8538
--- /dev/null
+++ b/editor/icons/source/icon_control_align_center_right.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_center_right.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.103241"
+ inkscape:cy="11.222422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="6"
+ height="4.0000172"
+ x="8"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_left_center.svg b/editor/icons/source/icon_control_align_left_center.svg
new file mode 100644
index 0000000000..716b6a2fd0
--- /dev/null
+++ b/editor/icons/source/icon_control_align_left_center.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_left_center.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="2"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_left_wide.svg b/editor/icons/source/icon_control_align_left_wide.svg
new file mode 100644
index 0000000000..7092c78508
--- /dev/null
+++ b/editor/icons/source/icon_control_align_left_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_left_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="12.000017"
+ x="2"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_right_center.svg b/editor/icons/source/icon_control_align_right_center.svg
new file mode 100644
index 0000000000..7e7e4f2b23
--- /dev/null
+++ b/editor/icons/source/icon_control_align_right_center.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_right_center.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.103241"
+ inkscape:cy="11.222422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="4.0000172"
+ x="10"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_right_wide.svg b/editor/icons/source/icon_control_align_right_wide.svg
new file mode 100644
index 0000000000..ef2d105bd8
--- /dev/null
+++ b/editor/icons/source/icon_control_align_right_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_right_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="11.999983"
+ x="10"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_top_center.svg b/editor/icons/source/icon_control_align_top_center.svg
new file mode 100644
index 0000000000..a5b60846f4
--- /dev/null
+++ b/editor/icons/source/icon_control_align_top_center.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_top_center.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="3.999948"
+ x="6"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_top_left.svg b/editor/icons/source/icon_control_align_top_left.svg
new file mode 100644
index 0000000000..9f4631cf31
--- /dev/null
+++ b/editor/icons/source/icon_control_align_top_left.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_top_left.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="3.999948"
+ x="2"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_top_right.svg b/editor/icons/source/icon_control_align_top_right.svg
new file mode 100644
index 0000000000..d968ba3d09
--- /dev/null
+++ b/editor/icons/source/icon_control_align_top_right.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_top_right.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="4"
+ height="3.999948"
+ x="10"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_top_wide.svg b/editor/icons/source/icon_control_align_top_wide.svg
new file mode 100644
index 0000000000..886ef60fe0
--- /dev/null
+++ b/editor/icons/source/icon_control_align_top_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_top_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="12"
+ height="3.999948"
+ x="2"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_align_wide.svg b/editor/icons/source/icon_control_align_wide.svg
new file mode 100644
index 0000000000..3f58ed93b6
--- /dev/null
+++ b/editor/icons/source/icon_control_align_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_align_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.6179596"
+ inkscape:cy="10.824674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="12"
+ height="12.000017"
+ x="2"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_hcenter_wide.svg b/editor/icons/source/icon_control_hcenter_wide.svg
new file mode 100644
index 0000000000..3aafa0340e
--- /dev/null
+++ b/editor/icons/source/icon_control_hcenter_wide.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_hcenter_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.4389915"
+ inkscape:cy="4.9357422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="12"
+ height="3.9999824"
+ x="2"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_control_vcenter_wide.svg b/editor/icons/source/icon_control_vcenter_wide.svg
new file mode 100644
index 0000000000..96fd44f3c8
--- /dev/null
+++ b/editor/icons/source/icon_control_vcenter_wide.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_control_vcenter_wide.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.4389915"
+ inkscape:cy="4.9357422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#919191;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1038.3622"
+ x="1.9999826"
+ height="12.000034"
+ width="12.000034"
+ id="rect4169"
+ style="opacity:1;fill:#474747;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#d6d6d6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="12"
+ height="3.9999824"
+ x="1038.3622"
+ y="-9.9999914"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_convex_polygon_shape.svg b/editor/icons/source/icon_convex_polygon_shape.svg
new file mode 100644
index 0000000000..b867a58f6f
--- /dev/null
+++ b/editor/icons/source/icon_convex_polygon_shape.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_convex_polygon_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_convex_polygon_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1-6"
+ inkscape:document-units="px"
+ inkscape:cy="10.815092"
+ inkscape:cx="5.572433"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <g
+ inkscape:label="Layer 1"
+ id="layer1-6">
+ <path
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8 1 L 1 4 L 1 12 L 8 15 L 15 12 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4159" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4143"
+ d="m 8,1051.3622 -7,-3 0,-8 7,3 z"
+ style="fill:#68b6ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8,1 1,4 8,15 15,12 Z"
+ transform="translate(0,1036.3622)"
+ id="path4145"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_convex_polygon_shape_2d.svg b/editor/icons/source/icon_convex_polygon_shape_2d.svg
new file mode 100644
index 0000000000..3b55df7fba
--- /dev/null
+++ b/editor/icons/source/icon_convex_polygon_shape_2d.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_convex_polygon_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="3.9121254"
+ inkscape:cy="7.1557164"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1050.3622 -12,0 0,-6 6,-6 6,6 z"
+ id="path4139"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_copy_node_path.svg b/editor/icons/source/icon_copy_node_path.svg
new file mode 100644
index 0000000000..9f33c5e54d
--- /dev/null
+++ b/editor/icons/source/icon_copy_node_path.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/godotengine/godot/tools/editor/icons/con_script_create.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_copy_node_path.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="21.189633"
+ inkscape:cx="12.640765"
+ inkscape:cy="9.6848443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ cy="1048.3622"
+ cx="3"
+ id="ellipse4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ ry="1.0000174"
+ rx="1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 2 1 C 1.4477381 1.0001 1.0000552 1.4477 1 2 L 1 14 C 1.0000552 14.5523 1.4477381 14.9999 2 15 L 14 15 C 14.552262 14.9999 14.999945 14.5523 15 14 L 15 6 L 10 1 L 2 1 z M 3 3 L 9 3 L 9 6 C 9 6.554 9.4459905 7 10 7 L 13 7 L 13 13 L 3 13 L 3 3 z M 6 8 L 4 12 L 6 12 L 8 8 L 6 8 z M 10 8 L 8 12 L 10 12 L 12 8 L 10 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4178" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_create_new_scene_from.svg b/editor/icons/source/icon_create_new_scene_from.svg
new file mode 100644
index 0000000000..529553bbd3
--- /dev/null
+++ b/editor/icons/source/icon_create_new_scene_from.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_create_new_scene_from.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_create_new_scene_from.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-3.7255471"
+ inkscape:cy="8.1847434"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1,7 0,6 c 0,1.104569 0.8954305,2 2,2 l 7,0 0,-1 -2,0 0,-4 2,0 0,-2 4,0 0,2 1,0 0,-3 z"
+ transform="translate(0,1036.3622)"
+ id="rect4136"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssccccccccccc" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0.7112932,1040.3831 1,1042.3622 l 2.2438279,-0.3273 -0.8182578,-1.9018 -1.7142769,0.25 z m 3.6933293,-0.5387 0.8182578,1.9018 1.9790524,-0.2887 -0.8182579,-1.9018 -1.9790523,0.2887 z m 3.9581047,-0.5775 0.8182579,1.9018 1.9790519,-0.2887 -0.818257,-1.9018 -1.9790528,0.2887 z m 3.9581048,-0.5774 0.818258,1.9018 1.714277,-0.25 -0.288707,-1.9791 -2.243828,0.3273 z"
+ id="rect4138"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-6.7823301"
+ inkscape:transform-center-y="-2" />
+ <circle
+ r="0"
+ cy="1047.3622"
+ cx="-14"
+ id="ellipse4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4155"
+ d="m 13,1049.3622 2,0 0,-2 -2,0 0,-2 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 z"
+ style="fill:#84ffb1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_cube_map.svg b/editor/icons/source/icon_cube_map.svg
new file mode 100644
index 0000000000..4fd86b1233
--- /dev/null
+++ b/editor/icons/source/icon_cube_map.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_cube_map.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="11.01934"
+ inkscape:cx="19.581751"
+ inkscape:zoom="16"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="4"
+ height="4"
+ x="0"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4167"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="4"
+ height="4"
+ x="8"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="12"
+ height="4"
+ width="4"
+ id="rect4171"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4173"
+ width="4"
+ height="4"
+ x="4"
+ y="1038.3622" />
+ <rect
+ y="1046.3622"
+ x="4"
+ height="4"
+ width="4"
+ id="rect4175"
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_2d.svg b/editor/icons/source/icon_curve_2d.svg
new file mode 100644
index 0000000000..34719e37de
--- /dev/null
+++ b/editor/icons/source/icon_curve_2d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_curve_2d.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.8406355"
+ inkscape:cx="5.0331401"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 14,1037.3613 c -3.166667,0 -5.1044619,0.854 -6.0820312,2.3203 C 6.9403994,1041.148 7,1042.8613 7,1044.3613 c 0,1.5 -0.059601,2.7867 -0.5820312,3.5703 -0.5224307,0.7837 -1.5846355,1.4297 -4.4179688,1.4297 a 1.0001,1.0001 0 1 0 0,2 c 3.1666667,0 5.1044619,-0.8539 6.0820312,-2.3203 C 9.0596006,1047.5747 9,1045.8613 9,1044.3613 c 0,-1.5 0.059601,-2.7866 0.5820312,-3.5703 0.5224308,-0.7836 1.5846358,-1.4297 4.4179688,-1.4297 a 1.0001,1.0001 0 1 0 0,-2 z"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_3d.svg b/editor/icons/source/icon_curve_3d.svg
new file mode 100644
index 0000000000..66034968b2
--- /dev/null
+++ b/editor/icons/source/icon_curve_3d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_3d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.9774722"
+ inkscape:cy="7.1326353"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 8.0039062,1037.3555 a 1.0001,1.0001 0 0 0 -0.4511718,0.1113 l -6,3 a 1.0001,1.0001 0 0 0 0,1.7891 l 6,3 a 1.0001,1.0001 0 0 0 0.8945312,0 L 13,1042.9805 l 0,3.7636 -5,2.5 -5.5527344,-2.7773 a 1.0001331,1.0001331 0 0 0 -0.8945312,1.7891 l 6,3 a 1.0001,1.0001 0 0 0 0.8945312,0 l 6.0000004,-3 A 1.0001,1.0001 0 0 0 15,1047.3613 l 0,-6 a 1.0001,1.0001 0 0 0 -1.447266,-0.8945 L 8,1043.2441 l -3.7636719,-1.8828 4.2109375,-2.1054 a 1.0001,1.0001 0 0 0 -0.4433594,-1.9004 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_close.svg b/editor/icons/source/icon_curve_close.svg
new file mode 100644
index 0000000000..15909df7c8
--- /dev/null
+++ b/editor/icons/source/icon_curve_close.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_curve_close.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_close.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.6078006"
+ inkscape:cy="10.161674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1049.3622 c -2,-9 -1,-10 8,-8"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4149"
+ cx="5"
+ cy="1041.3622"
+ r="2" />
+ <rect
+ y="1044.3622"
+ x="7.9999828"
+ height="2.0000348"
+ width="2.0000348"
+ id="rect4159"
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="5"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="13"
+ id="circle4145"
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2.0000348"
+ height="2.0000348"
+ x="5.9999828"
+ y="1046.3622" />
+ <rect
+ y="1042.3622"
+ x="10"
+ height="2"
+ width="2"
+ id="rect4157"
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_constant.svg b/editor/icons/source/icon_curve_constant.svg
new file mode 100644
index 0000000000..6d9a7dc959
--- /dev/null
+++ b/editor/icons/source/icon_curve_constant.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_constant.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.5203812"
+ inkscape:cy="8.9341513"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1046.3622 8,0"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_create.svg b/editor/icons/source/icon_curve_create.svg
new file mode 100644
index 0000000000..8ab578e9a0
--- /dev/null
+++ b/editor/icons/source/icon_curve_create.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_curve_create.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_create.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.3157064"
+ inkscape:cy="11.760735"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1049.3622 c -2,-9 -1,-10 8,-8"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4149"
+ cx="5"
+ cy="1041.3622"
+ r="2" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="5"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="13"
+ id="circle4145"
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4139"
+ width="8"
+ height="2"
+ x="8"
+ y="1047.3622" />
+ <rect
+ y="-13"
+ x="1044.3622"
+ height="2"
+ width="8.0000172"
+ id="rect4141"
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_curve.svg b/editor/icons/source/icon_curve_curve.svg
new file mode 100644
index 0000000000..e3b6b64a4c
--- /dev/null
+++ b/editor/icons/source/icon_curve_curve.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_curve_curve.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_curve.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.0020857"
+ inkscape:cy="8.8914924"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1049.3622 c -2,-9 -1,-10 8,-8"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4149"
+ cx="5"
+ cy="1041.3622"
+ r="2" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="5"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="13"
+ id="circle4145"
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#84c2ff;fill-rule:evenodd;stroke:#84c2ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 1,1045.3622 8,-8"
+ id="path4263"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_delete.svg b/editor/icons/source/icon_curve_delete.svg
new file mode 100644
index 0000000000..f40dd1eeb1
--- /dev/null
+++ b/editor/icons/source/icon_curve_delete.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_curve_delete.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_delete.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.6676795"
+ inkscape:cy="7.1456593"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1049.3622 c -2,-9 -1,-10 8,-8"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4149"
+ cx="5"
+ cy="1041.3622"
+ r="2" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="5"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="13"
+ id="circle4145"
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.4644661,1046.2409 2.1213199,2.1213 -2.1213199,2.1213 1.4142136,1.4142 L 12,1049.7764 l 2.12132,2.1213 1.414214,-1.4142 -2.12132,-2.1213 2.12132,-2.1213 -1.414214,-1.4142 -2.12132,2.1213 -2.1213203,-2.1213 -1.4142136,1.4142 z"
+ id="rect4139"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_edit.svg b/editor/icons/source/icon_curve_edit.svg
new file mode 100644
index 0000000000..f695e96b8c
--- /dev/null
+++ b/editor/icons/source/icon_curve_edit.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_curve_edit.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.062239"
+ inkscape:cy="6.4210339"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1049.3622 c -2,-9 -1,-10 8,-8"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4149"
+ cx="5"
+ cy="1041.3622"
+ r="2" />
+ <circle
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="5"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="13"
+ id="circle4145"
+ style="opacity:1;fill:#f5f5f5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16,1047.6532 -8,-3.291 3.290998,8 0.947104,-2.8201 1.8836,1.8835 0.941801,-0.9418 -1.8836,-1.8835 z"
+ id="rect4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_in.svg b/editor/icons/source/icon_curve_in.svg
new file mode 100644
index 0000000000..9dc033aa95
--- /dev/null
+++ b/editor/icons/source/icon_curve_in.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_in.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.1532813"
+ inkscape:cy="10.367959"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 2,1050.3622 c 5,0 8,-3 8,-8"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_in_out.svg b/editor/icons/source/icon_curve_in_out.svg
new file mode 100644
index 0000000000..c68f906423
--- /dev/null
+++ b/editor/icons/source/icon_curve_in_out.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_in_out.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.5203812"
+ inkscape:cy="8.2466513"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 c 5,0 3,-8 8,-8"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_linear.svg b/editor/icons/source/icon_curve_linear.svg
new file mode 100644
index 0000000000..ae7a889a71
--- /dev/null
+++ b/editor/icons/source/icon_curve_linear.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_linear.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.1141312"
+ inkscape:cy="8.1841513"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 8,-8"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_out.svg b/editor/icons/source/icon_curve_out.svg
new file mode 100644
index 0000000000..080aa755dc
--- /dev/null
+++ b/editor/icons/source/icon_curve_out.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_out.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.5203812"
+ inkscape:cy="8.2466513"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 c 0,-5 3,-8 8,-8"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_curve_out_in.svg b/editor/icons/source/icon_curve_out_in.svg
new file mode 100644
index 0000000000..d2b4d06e5f
--- /dev/null
+++ b/editor/icons/source/icon_curve_out_in.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="12"
+ height="12"
+ viewBox="0 0 12 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_curve_out_in.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.1141312"
+ inkscape:cy="8.1841513"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 c 0,-5 8,-3 8,-8"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_damped_spring_joint_2d.svg b/editor/icons/source/icon_damped_spring_joint_2d.svg
new file mode 100644
index 0000000000..bf12810a6c
--- /dev/null
+++ b/editor/icons/source/icon_damped_spring_joint_2d.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_damped_spring_joint_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_damped_spring_joint_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="8.6860688"
+ inkscape:cy="11.920466"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4165"
+ transform="translate(0,1036.3622)"
+ d="m 4,3 0,2 8,3 0,-2 z m 0,5 0,2 8,3 0,-2 z"
+ style="opacity:1;fill:#708cea;fill-opacity:0.98823529;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5b7f2;fill-opacity:0.98823529;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 4,3 0,2 8,-2 0,-2 z m 0,5 0,2 8,-2 0,-2 z m 0,5 0,2 8,-2 0,-2 z"
+ transform="translate(0,1036.3622)"
+ id="rect4144"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_debug_continue.svg b/editor/icons/source/icon_debug_continue.svg
new file mode 100644
index 0000000000..5d9ccd5a7e
--- /dev/null
+++ b/editor/icons/source/icon_debug_continue.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_debug_continue.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="12.141752"
+ inkscape:cy="5.0854399"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4352"
+ width="6"
+ height="2.0000174"
+ x="5"
+ y="1043.3622" />
+ <g
+ id="layer1-2"
+ inkscape:label="Layer 1"
+ transform="matrix(-0.71428934,0,0,0.88888708,2.4999495,121.81991)"
+ style="fill:#ff8484;fill-opacity:1">
+ <path
+ inkscape:transform-center-x="1.1667546"
+ sodipodi:type="star"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-opacity:1"
+ id="path4435"
+ sodipodi:sides="3"
+ sodipodi:cx="5"
+ sodipodi:cy="-1038.3622"
+ sodipodi:r1="3.6055512"
+ sodipodi:r2="1.8027756"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 8.122499,-1036.5594 -3.122499,0 -3.122499,0 1.5612495,-2.7042 L 5,-1041.9677 l 1.5612495,2.7041 z"
+ inkscape:transform-center-y="-9.6789057e-05"
+ transform="matrix(0,1.4411577,1.2942939,0,1331.1125,1030.6564)" />
+ </g>
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ cx="4"
+ cy="1044.3622"
+ r="3" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_debug_next.svg b/editor/icons/source/icon_debug_next.svg
new file mode 100644
index 0000000000..4dd9bb8c4b
--- /dev/null
+++ b/editor/icons/source/icon_debug_next.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_debug_next.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.9909322"
+ inkscape:cy="6.93198"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4352"
+ width="9.9999828"
+ height="2.0000174"
+ x="1037.3622"
+ y="-5.0000086"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <g
+ id="layer1-2"
+ inkscape:label="Layer 1"
+ transform="matrix(0,-0.57143854,-0.66666446,0,695.90584,1041.362)"
+ style="fill:#ff8484;fill-opacity:1">
+ <path
+ inkscape:transform-center-x="1.1667546"
+ sodipodi:type="star"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-opacity:1"
+ id="path4435"
+ sodipodi:sides="3"
+ sodipodi:cx="5"
+ sodipodi:cy="-1038.3622"
+ sodipodi:r1="3.6055512"
+ sodipodi:r2="1.8027756"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 8.122499,-1036.5594 -3.122499,0 -3.122499,0 1.5612495,-2.7042 L 5,-1041.9677 l 1.5612495,2.7041 z"
+ inkscape:transform-center-y="-9.6789057e-05"
+ transform="matrix(0,1.4411577,1.2942939,0,1331.1125,1030.6564)" />
+ </g>
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4321"
+ width="8"
+ height="2"
+ x="7"
+ y="1037.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="2"
+ width="6"
+ id="rect4323"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4325"
+ width="6"
+ height="2"
+ x="9"
+ y="1045.3622" />
+ <rect
+ y="1049.3622"
+ x="7"
+ height="2"
+ width="8"
+ id="rect4327"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_debug_step.svg b/editor/icons/source/icon_debug_step.svg
new file mode 100644
index 0000000000..20d11f8710
--- /dev/null
+++ b/editor/icons/source/icon_debug_step.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_debug_step.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.5279345"
+ inkscape:cy="7.1918803"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4352"
+ width="9.9999828"
+ height="2.0000174"
+ x="1037.3622"
+ y="-3.0000174"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <g
+ id="layer1-2"
+ inkscape:label="Layer 1"
+ transform="matrix(-0.57143854,0,0,0.66666446,-2.0001146,354.45636)"
+ style="fill:#ff8484;fill-opacity:1">
+ <path
+ inkscape:transform-center-x="1.1667546"
+ sodipodi:type="star"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-opacity:1"
+ id="path4435"
+ sodipodi:sides="3"
+ sodipodi:cx="5"
+ sodipodi:cy="-1038.3622"
+ sodipodi:r1="3.6055512"
+ sodipodi:r2="1.8027756"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 8.122499,-1036.5594 -3.122499,0 -3.122499,0 1.5612495,-2.7042 L 5,-1041.9677 l 1.5612495,2.7041 z"
+ inkscape:transform-center-y="-9.6789057e-05"
+ transform="matrix(0,1.4411577,1.2942939,0,1331.1125,1030.6564)" />
+ </g>
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4321"
+ width="8"
+ height="2"
+ x="7"
+ y="1037.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="2"
+ width="6"
+ id="rect4323"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4325"
+ width="6"
+ height="2"
+ x="9"
+ y="1045.3622" />
+ <rect
+ y="1049.3622"
+ x="7"
+ height="2"
+ width="8"
+ id="rect4327"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-4"
+ x="1045.3622"
+ height="3"
+ width="1.9999654"
+ id="rect4348"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_changed.svg b/editor/icons/source/icon_dependency_changed.svg
new file mode 100644
index 0000000000..bbcd3f0c0a
--- /dev/null
+++ b/editor/icons/source/icon_dependency_changed.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_changed.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="6.9126947"
+ inkscape:cy="8.6287187"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 7 3 L 9 3 L 9 10 L 7 10 L 7 3 z M 7 11 L 9 11 L 9 13 L 7 13 L 7 11 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ <path
+ id="path4158"
+ transform="translate(0,1036.3622)"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 7 3 L 9 3 L 9 10 L 7 10 L 7 3 z M 7 11 L 9 11 L 9 13 L 7 13 L 7 11 z "
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_changed_hl.svg b/editor/icons/source/icon_dependency_changed_hl.svg
new file mode 100644
index 0000000000..54a37695ef
--- /dev/null
+++ b/editor/icons/source/icon_dependency_changed_hl.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_changed_hl.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="7.2709928"
+ inkscape:cy="8.1075579"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ cx="8"
+ cy="1044.3622"
+ r="7" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="2"
+ height="2"
+ x="7"
+ y="1047.3622" />
+ <rect
+ y="1039.3622"
+ x="7"
+ height="6.9999828"
+ width="2"
+ id="rect4158"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_local_changed.svg b/editor/icons/source/icon_dependency_local_changed.svg
new file mode 100644
index 0000000000..799d69c4e0
--- /dev/null
+++ b/editor/icons/source/icon_dependency_local_changed.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_local_changed.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="3.4517439"
+ inkscape:cy="8.2965936"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 4 4 0 0 1 12 7 A 4 4 0 0 1 9 10.867188 L 9 11 L 7 11 L 7 9 L 8 9 A 2 2 0 0 0 10 7 A 2 2 0 0 0 8 5 A 2 2 0 0 0 6 7 L 4 7 A 4 4 0 0 1 8 3 z M 7 12 L 9 12 L 9 14 L 7 14 L 7 12 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ <path
+ id="path4156"
+ transform="translate(0,1036.3622)"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 4 4 0 0 1 12 7 A 4 4 0 0 1 9 10.867188 L 9 11 L 7 11 L 7 9 L 8 9 A 2 2 0 0 0 10 7 A 2 2 0 0 0 8 5 A 2 2 0 0 0 6 7 L 4 7 A 4 4 0 0 1 8 3 z M 7 12 L 9 12 L 9 14 L 7 14 L 7 12 z "
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_local_changed_hl.svg b/editor/icons/source/icon_dependency_local_changed_hl.svg
new file mode 100644
index 0000000000..67c04c312a
--- /dev/null
+++ b/editor/icons/source/icon_dependency_local_changed_hl.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_local_changed_hl.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="3.4517439"
+ inkscape:cy="8.2965936"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 4 4 0 0 1 12 7 A 4 4 0 0 1 9 10.867188 L 9 11 L 7 11 L 7 9 L 8 9 A 2 2 0 0 0 10 7 A 2 2 0 0 0 8 5 A 2 2 0 0 0 6 7 L 4 7 A 4 4 0 0 1 8 3 z M 7 12 L 9 12 L 9 14 L 7 14 L 7 12 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_ok.svg b/editor/icons/source/icon_dependency_ok.svg
new file mode 100644
index 0000000000..76d7f54065
--- /dev/null
+++ b/editor/icons/source/icon_dependency_ok.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_ok.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="7.9274941"
+ inkscape:cy="10.170392"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 11.181641 4.9296875 L 12.595703 6.34375 L 8.3535156 10.585938 L 7.6464844 11.292969 L 6.9394531 12 L 3.4042969 8.4648438 L 4.8183594 7.0507812 L 6.9394531 9.171875 L 11.181641 4.9296875 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ <path
+ id="path4156"
+ transform="translate(0,1036.3622)"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 11.181641 4.9296875 L 12.595703 6.34375 L 8.3535156 10.585938 L 7.6464844 11.292969 L 6.9394531 12 L 3.4042969 8.4648438 L 4.8183594 7.0507812 L 6.9394531 9.171875 L 11.181641 4.9296875 z "
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dependency_ok_hl.svg b/editor/icons/source/icon_dependency_ok_hl.svg
new file mode 100644
index 0000000000..190458c532
--- /dev/null
+++ b/editor/icons/source/icon_dependency_ok_hl.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_dependency_ok_hl.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="3.5953448"
+ inkscape:cy="9.4537959"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 11.181641 4.9296875 L 12.595703 6.34375 L 8.3535156 10.585938 L 7.6464844 11.292969 L 6.9394531 12 L 3.4042969 8.4648438 L 4.8183594 7.0507812 L 6.9394531 9.171875 L 11.181641 4.9296875 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_directional_light.svg b/editor/icons/source/icon_directional_light.svg
new file mode 100644
index 0000000000..dbec755039
--- /dev/null
+++ b/editor/icons/source/icon_directional_light.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_directional_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="9.4601953"
+ inkscape:cy="9.2165454"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1040.3622 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 0,6.6667 c -3.5555555,1.7777 -1.7777778,0.8889 0,0 z"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssscc" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4192"
+ width="2"
+ height="2"
+ x="7"
+ y="1037.3622"
+ inkscape:transform-center-y="-6.0000174" />
+ <rect
+ inkscape:transform-center-y="-1.74e-05"
+ y="-15.000017"
+ x="1043.3622"
+ height="2"
+ width="2"
+ id="rect4194"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)"
+ inkscape:transform-center-x="-6.0000172" />
+ <rect
+ inkscape:transform-center-x="-1.72e-05"
+ transform="scale(-1,-1)"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4196"
+ width="2"
+ height="2"
+ x="-9.0000172"
+ y="-1051.3622"
+ inkscape:transform-center-y="5.9999826" />
+ <rect
+ inkscape:transform-center-y="-1.74e-05"
+ y="1.0000174"
+ x="-1045.3622"
+ height="2"
+ width="2"
+ id="rect4198"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="5.9999826" />
+ <rect
+ inkscape:transform-center-y="-4.2426533"
+ y="737.13245"
+ x="-733.81873"
+ height="2"
+ width="2"
+ id="rect4200"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-x="4.2426321" />
+ <rect
+ inkscape:transform-center-x="-4.2426493"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4202"
+ width="2"
+ height="2"
+ x="743.13245"
+ y="725.81873"
+ inkscape:transform-center-y="-4.2426534" />
+ <rect
+ inkscape:transform-center-y="4.242628"
+ y="-751.13245"
+ x="731.81873"
+ height="2"
+ width="2"
+ id="rect4204"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)"
+ inkscape:transform-center-x="-4.2426493" />
+ <rect
+ inkscape:transform-center-x="4.2426321"
+ transform="matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,0,0)"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4206"
+ width="2"
+ height="2"
+ x="-745.13245"
+ y="-739.81873"
+ inkscape:transform-center-y="4.242628" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_distraction_free.svg b/editor/icons/source/icon_distraction_free.svg
new file mode 100644
index 0000000000..4ae48b2fb6
--- /dev/null
+++ b/editor/icons/source/icon_distraction_free.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_distraction_free.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="10.344519"
+ inkscape:cy="8.9631686"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3.7578125 2.34375 L 2.34375 3.7578125 L 5.2929688 6.7070312 L 6.7070312 5.2929688 L 3.7578125 2.34375 z M 12.242188 2.34375 L 9.2929688 5.2929688 L 10.707031 6.7070312 L 13.65625 3.7578125 L 12.242188 2.34375 z M 5.2929688 9.2929688 L 2.34375 12.242188 L 3.7578125 13.65625 L 6.7070312 10.707031 L 5.2929688 9.2929688 z M 10.707031 9.2929688 L 9.2929688 10.707031 L 12.242188 13.65625 L 13.65625 12.242188 L 10.707031 9.2929688 z "
+ transform="translate(0,1036.3622)"
+ id="rect4137" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1051.3622 0,-5 5,5 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4158"
+ d="m 15,1051.3622 0,-5 -5,5 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 15,1037.3622 0,5 -5,-5 z"
+ id="path4160"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="m 1,1037.3622 0,5 5,-5 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_duplicate.svg b/editor/icons/source/icon_duplicate.svg
new file mode 100644
index 0000000000..b1d5544fc0
--- /dev/null
+++ b/editor/icons/source/icon_duplicate.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_duplicate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_duplicate.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.0305878"
+ inkscape:cy="8.942001"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4137"
+ width="2"
+ height="11.000017"
+ x="2"
+ y="1040.3622" />
+ <rect
+ y="1049.3622"
+ x="3"
+ height="2"
+ width="9"
+ id="rect4139"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ id="layer1-3"
+ inkscape:label="Layer 1"
+ transform="matrix(0.78571428,0,0,0.78571428,11.428571,223.29192)">
+ <g
+ transform="translate(0,-1.6949463e-5)"
+ inkscape:label="Layer 1"
+ id="layer1-8">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m -8.1818177,1036.0895 0,14 11.454546,0 0,-7.6364 -6.3636369,0 0,-6.3636 z m 6.3636364,0 0,5.0909 5.0909096,0 z"
+ id="rect4158-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dynamic_font.svg b/editor/icons/source/icon_dynamic_font.svg
new file mode 100644
index 0000000000..a40c0e3408
--- /dev/null
+++ b/editor/icons/source/icon_dynamic_font.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_duplicate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_dynamic_font.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.411248"
+ inkscape:cy="8.6761759"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ id="path4246"
+ d="m 1,1037.3622 0,2 0,1 1,0 a 1,1 0 0 1 1,-1 l 2,0 0,6 a 1,1 0 0 1 -1,1 l 0,1 1,0 2,0 1,0 0,-1 a 1,1 0 0 1 -1,-1 l 0,-6 2,0 a 1,1 0 0 1 1,1 l 1,0 0,-1 0,-2 -4,0 -2,0 -4,0 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#84c2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 5 L 4 7 L 4 8 L 5 8 A 1 1 0 0 1 6 7 L 8 7 L 8 13 A 1 1 0 0 1 7 14 L 7 15 L 8 15 L 10 15 L 11 15 L 11 14 A 1 1 0 0 1 10 13 L 10 7 L 12 7 A 1 1 0 0 1 13 8 L 14 8 L 14 7 L 14 5 L 10 5 L 8 5 L 4 5 z "
+ id="rect4177"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_dynamic_font_data.svg b/editor/icons/source/icon_dynamic_font_data.svg
new file mode 100644
index 0000000000..9f06172fef
--- /dev/null
+++ b/editor/icons/source/icon_dynamic_font_data.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_duplicate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_dynamic_font_data.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.4667889"
+ inkscape:cy="8.2902868"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 1 4 L 2 4 A 1 1 0 0 1 3 3 L 5 3 L 5 9 A 1 1 0 0 1 4 10 L 4 11 L 5 11 L 7 11 L 8 11 L 8 10 A 1 1 0 0 1 7 9 L 7 3 L 9 3 A 1 1 0 0 1 10 4 L 11 4 L 11 3 L 11 1 L 7 1 L 5 1 L 1 1 z M 1 6 L 1 8 L 3 8 L 3 6 L 1 6 z M 1 9 L 1 11 L 3 11 L 3 9 L 1 9 z M 1 12 L 1 14 L 3 14 L 3 12 L 1 12 z M 4 12 L 4 14 L 6 14 L 6 12 L 4 12 z "
+ transform="translate(0,1036.3622)"
+ id="path4246" />
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 5 L 4 7 L 4 8 L 5 8 A 1 1 0 0 1 6 7 L 8 7 L 8 13 A 1 1 0 0 1 7 14 L 7 15 L 8 15 L 10 15 L 11 15 L 11 14 A 1 1 0 0 1 10 13 L 10 7 L 12 7 A 1 1 0 0 1 13 8 L 14 8 L 14 7 L 14 5 L 10 5 L 8 5 L 4 5 z "
+ id="rect4177"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_edit.svg b/editor/icons/source/icon_edit.svg
new file mode 100644
index 0000000000..6da05a6603
--- /dev/null
+++ b/editor/icons/source/icon_edit.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="10.361255"
+ inkscape:cy="7.0279565"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1.7071068,1047.8266 1,1051.3622 l 3.5355339,-0.7071 7.7781741,-7.7782 -2.828427,-2.8284 z m 9.1923882,-9.1924 2.828427,2.8285 1.414214,-1.4142 -2.828428,-2.8285 z"
+ id="rect4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_edit_key.svg b/editor/icons/source/icon_edit_key.svg
new file mode 100644
index 0000000000..46795bef35
--- /dev/null
+++ b/editor/icons/source/icon_edit_key.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_edit_key.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="7.2649878"
+ inkscape:cy="7.6615896"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1.7071068,1047.8266 1,1051.3622 l 3.5355339,-0.7071 7.7781741,-7.7782 -2.828427,-2.8284 z m 9.1923882,-9.1924 2.828427,2.8285 1.414214,-1.4142 -2.828428,-2.8285 z"
+ id="rect4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <ellipse
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4135"
+ cx="3.5"
+ cy="1039.8622"
+ rx="2.5"
+ ry="2.5000086" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_edit_pivot.svg b/editor/icons/source/icon_edit_pivot.svg
new file mode 100644
index 0000000000..8ae55ad8b7
--- /dev/null
+++ b/editor/icons/source/icon_edit_pivot.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit_pivot.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_edit_pivot.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="13.221947"
+ inkscape:cy="4.9248867"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16,1047.6532 -8,-3.291 3.290998,8 0.947104,-2.8201 1.8836,1.8835 0.941801,-0.9418 -1.8836,-1.8835 z"
+ id="rect4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 5 L 9 5 L 9 1 L 7 1 z M 1 7 L 1 9 L 5 9 L 5 7 L 1 7 z M 11 7 L 11 7.6132812 L 14.371094 9 L 15 9 L 15 7 L 11 7 z M 7 11 L 7 15 L 9 15 L 9 14.375 L 7.6113281 11 L 7 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4158" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_edit_resource.svg b/editor/icons/source/icon_edit_resource.svg
new file mode 100644
index 0000000000..1950988ca2
--- /dev/null
+++ b/editor/icons/source/icon_edit_resource.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_edit_resource.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="63.999997"
+ inkscape:cx="1.8775976"
+ inkscape:cy="5.2018914"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1.9472656,1044.3555 a 1.0001,1.0001 0 0 0 -0.546875,1.8066 l 2.9335938,2.2012 -2.9335938,2.1992 a 1.0001,1.0001 0 1 0 1.1992188,1.5996 l 4,-3 a 1.0001,1.0001 0 0 0 0,-1.5996 l -4,-3 a 1.0001,1.0001 0 0 0 -0.6523438,-0.207 z"
+ id="path4137"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_editor_3d_handle.svg b/editor/icons/source/icon_editor_3d_handle.svg
new file mode 100644
index 0000000000..255d1801a9
--- /dev/null
+++ b/editor/icons/source/icon_editor_3d_handle.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_editor_3d_handle.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="-3.99911"
+ inkscape:cy="7.9772677"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ cx="8"
+ cy="1044.3622"
+ r="7" />
+ <circle
+ r="5.0000172"
+ cy="1044.3622"
+ cx="8"
+ id="circle4156"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_editor_handle.svg b/editor/icons/source/icon_editor_handle.svg
new file mode 100644
index 0000000000..17ed2a61e7
--- /dev/null
+++ b/editor/icons/source/icon_editor_handle.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_editor_handle.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="2.7092551"
+ inkscape:cy="4.8390476"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <ellipse
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ cx="4"
+ cy="1048.3622"
+ rx="4"
+ ry="3.9999914" />
+ <ellipse
+ cy="1048.3622"
+ cx="4"
+ id="circle4156"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ rx="2.8571527"
+ ry="2.8571465" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_editor_pivot.svg b/editor/icons/source/icon_editor_pivot.svg
new file mode 100644
index 0000000000..8ce7d48970
--- /dev/null
+++ b/editor/icons/source/icon_editor_pivot.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_editor_pivot.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="6.673653"
+ inkscape:cy="8.3546727"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#ffffff;fill-opacity:0.70588237;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 0 L 6 6 L 0 6 L 0 10 L 6 10 L 6 16 L 10 16 L 10 10 L 16 10 L 16 6 L 10 6 L 10 0 L 6 0 z M 7 7 L 9 7 L 9 9 L 7 9 L 7 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4170" />
+ <path
+ style="fill:#ff8484;fill-opacity:0.58823532;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 7 1 L 7 6 L 9 6 L 9 1 L 7 1 z M 1 7 L 1 9 L 6 9 L 6 7 L 1 7 z M 10 7 L 10 9 L 15 9 L 15 7 L 10 7 z M 7 10 L 7 15 L 9 15 L 9 10 L 7 10 z "
+ transform="translate(0,1036.3622)"
+ id="rect4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_editor_plugin.svg b/editor/icons/source/icon_editor_plugin.svg
new file mode 100644
index 0000000000..b9460de683
--- /dev/null
+++ b/editor/icons/source/icon_editor_plugin.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_editor_plugin.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-2.7705057"
+ inkscape:cy="8.7644499"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 2,1038.3622 0,8 8,0 0,-8 z"
+ id="path4195"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4197"
+ cx="13"
+ cy="1042.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1049.3622"
+ cx="6"
+ id="circle4199"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4201"
+ width="2"
+ height="2"
+ x="5"
+ y="1046.3622" />
+ <rect
+ y="1041.3622"
+ x="10"
+ height="2"
+ width="2"
+ id="rect4203"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_environment.svg b/editor/icons/source/icon_environment.svg
new file mode 100644
index 0000000000..45add2c7f7
--- /dev/null
+++ b/editor/icons/source/icon_environment.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_environment.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="10.741006"
+ inkscape:cy="10.690232"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e1e1e1;fill-opacity:0.99215686;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 7.0273438 2.0820312 C 6.3462908 2.6213949 5.3431503 3.5860946 4.6757812 5 L 2.8105469 5 A 6 6 0 0 1 7.0273438 2.0820312 z M 8.9785156 2.0859375 A 6 6 0 0 1 13.1875 5 L 11.324219 5 C 10.658501 3.5895934 9.6595492 2.6261235 8.9785156 2.0859375 z M 8 2.6054688 C 8.3858776 2.856627 9.3974911 3.6104334 10.185547 5 L 5.8144531 5 C 6.6025089 3.6104334 7.6141224 2.856627 8 2.6054688 z M 2.3515625 6 L 4.2949219 6 C 4.1145279 6.6059544 4 7.2695302 4 8 C 4 8.7306855 4.1144398 9.3938115 4.2949219 10 L 2.3496094 10 A 6 6 0 0 1 2 8 A 6 6 0 0 1 2.3515625 6 z M 5.3398438 6 L 10.660156 6 C 10.868048 6.5934731 11 7.2583063 11 8 C 11 8.7421382 10.866303 9.4061377 10.658203 10 L 5.3417969 10 C 5.1336971 9.4061377 5 8.7421382 5 8 C 5 7.2583063 5.1319522 6.5934731 5.3398438 6 z M 11.705078 6 L 13.650391 6 A 6 6 0 0 1 14 8 A 6 6 0 0 1 13.648438 10 L 11.705078 10 C 11.88556 9.3938115 12 8.7306855 12 8 C 12 7.2695302 11.885472 6.6059544 11.705078 6 z M 2.8125 11 L 4.6777344 11 C 5.343895 12.410381 6.3427806 13.374042 7.0234375 13.914062 A 6 6 0 0 1 2.8125 11 z M 5.8144531 11 L 10.185547 11 C 9.3971916 12.390235 8.3853773 13.145488 8 13.396484 C 7.6146227 13.145488 6.6028084 12.390235 5.8144531 11 z M 11.322266 11 L 13.189453 11 A 6 6 0 0 1 8.9707031 13.917969 C 9.651376 13.378771 10.654456 12.413873 11.322266 11 z "
+ transform="translate(0,1036.3622)"
+ id="path4158" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_error.svg b/editor/icons/source/icon_error.svg
new file mode 100644
index 0000000000..a0b04a98cb
--- /dev/null
+++ b/editor/icons/source/icon_error.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_error.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="5.542036"
+ inkscape:cy="14.568715"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="8"
+ height="8"
+ x="2.220446e-16"
+ y="1044.3622"
+ ry="1.0000174" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_error_sign.svg b/editor/icons/source/icon_error_sign.svg
new file mode 100644
index 0000000000..01c1dbb4d5
--- /dev/null
+++ b/editor/icons/source/icon_error_sign.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ viewBox="0 0 32 32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_error_sign.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="10.854335"
+ inkscape:cx="-0.43086145"
+ inkscape:cy="15.165332"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:#ff8484;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 10,1048.3622 12,0 6,-6 0,-12 -6,-6 -12,0 -6,6 0,12 z"
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="4"
+ height="9.0000172"
+ x="14"
+ y="1028.3622" />
+ <rect
+ y="1040.3622"
+ x="14"
+ height="4.0000172"
+ width="4"
+ id="rect4162"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_event_player.svg b/editor/icons/source/icon_event_player.svg
new file mode 100644
index 0000000000..3f5f7da693
--- /dev/null
+++ b/editor/icons/source/icon_event_player.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_rename.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_event_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.654979"
+ inkscape:cy="8.3200241"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 15 L 15 15 L 15 1 L 1 1 z M 3 3 L 13 3 L 13 13 L 3 13 L 3 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 5 3 L 5 9 L 7 9 L 7 3 L 5 3 z M 9 3 L 9 9 L 11 9 L 11 3 L 9 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4158" />
+ <rect
+ y="1039.3622"
+ x="5"
+ height="10.000017"
+ width="1"
+ id="rect4166"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4168"
+ width="1"
+ height="10.000017"
+ x="9"
+ y="1039.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_favorites.svg b/editor/icons/source/icon_favorites.svg
new file mode 100644
index 0000000000..12d4b56897
--- /dev/null
+++ b/editor/icons/source/icon_favorites.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_favorites.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_favorites.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="3.3144029"
+ inkscape:cy="13.991937"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.0000004,1038.0862 5.62591,1042.1835 1,1043.2813 l 3.2360991,3.4074 -0.3586608,4.6735 4.1388649,-1.9766 4.1572048,1.9421 -0.395342,-4.6532 3.221834,-3.3932 -4.625909,-1.0978 -2.3740906,-4.0973 z"
+ id="path4254"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_big.svg b/editor/icons/source/icon_file_big.svg
new file mode 100644
index 0000000000..38ad9b707a
--- /dev/null
+++ b/editor/icons/source/icon_file_big.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_new.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_big.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="32.899003"
+ inkscape:cy="32.88081"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1-8"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="translate(0,-1.6949463e-5)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10,5 0,54 44,0 0,-36 -18,0 0,-18 z m 31,0 0,13 13,0 z"
+ transform="translate(0,988.36222)"
+ id="rect4158"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_dialog.svg b/editor/icons/source/icon_file_dialog.svg
new file mode 100644
index 0000000000..9dee04c220
--- /dev/null
+++ b/editor/icons/source/icon_file_dialog.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_confirmation_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_dialog.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="2.7469423"
+ inkscape:cy="8.766806"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.89543 1 1 1.8954 1 3 L 1 4 L 15 4 L 15 3 C 15 1.8954 14.104569 1 13 1 L 3 1 z M 12 2 L 13 2 L 13 3 L 12 3 L 12 2 z M 1 5 L 1 13 C 1 14.1046 1.89543 15 3 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 5 L 1 5 z M 5 7 L 8 7 L 8 8 L 11 8 L 11 13 L 5 13 L 5 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_list.svg b/editor/icons/source/icon_file_list.svg
new file mode 100644
index 0000000000..82dad29aac
--- /dev/null
+++ b/editor/icons/source/icon_file_list.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_file_list.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_list.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="9.0213026"
+ inkscape:cy="13.513819"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4135"
+ width="2"
+ height="2.0000174"
+ x="2"
+ y="1038.3622" />
+ <rect
+ y="1038.3622"
+ x="6"
+ height="2.0000174"
+ width="8"
+ id="rect4159"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1043.3622"
+ x="2"
+ height="2.0000174"
+ width="2"
+ id="rect4169"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4171"
+ width="8"
+ height="2.0000174"
+ x="6"
+ y="1043.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4173"
+ width="2"
+ height="2.0000174"
+ x="2"
+ y="1048.3622" />
+ <rect
+ y="1048.3622"
+ x="6"
+ height="2.0000174"
+ width="8"
+ id="rect4175"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_server.svg b/editor/icons/source/icon_file_server.svg
new file mode 100644
index 0000000000..1e1f9b6e42
--- /dev/null
+++ b/editor/icons/source/icon_file_server.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_server.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="9.1396438"
+ inkscape:cy="11.33674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#c5c5c5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 8 L 1 11 L 15 11 L 15 8 L 1 8 z M 2 9 L 3 9 L 3 10 L 2 10 L 2 9 z M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 z M 1 12 L 1 15 L 15 15 L 15 12 L 1 12 z M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 z M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 z "
+ transform="translate(0,1036.3622)"
+ id="rect4160" />
+ <rect
+ style="opacity:1;fill:#c5c5c5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4173"
+ width="6"
+ height="4"
+ x="5"
+ y="1038.3622" />
+ <rect
+ style="opacity:1;fill:#c5c5c5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4175"
+ width="3"
+ height="1"
+ x="5"
+ y="1037.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_server_active.svg b/editor/icons/source/icon_file_server_active.svg
new file mode 100644
index 0000000000..f01ba578da
--- /dev/null
+++ b/editor/icons/source/icon_file_server_active.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_server_active.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="11.80766"
+ inkscape:cy="9.9439864"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 8 L 1 11 L 15 11 L 15 8 L 1 8 z M 2 9 L 3 9 L 3 10 L 2 10 L 2 9 z M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 z M 1 12 L 1 15 L 15 15 L 15 12 L 1 12 z M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 z M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 z "
+ transform="translate(0,1036.3622)"
+ id="rect4160" />
+ <rect
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4173"
+ width="6"
+ height="4"
+ x="5"
+ y="1038.3622" />
+ <rect
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4175"
+ width="3"
+ height="1"
+ x="5"
+ y="1037.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_file_thumbnail.svg b/editor/icons/source/icon_file_thumbnail.svg
new file mode 100644
index 0000000000..48d90dd3c6
--- /dev/null
+++ b/editor/icons/source/icon_file_thumbnail.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_file_thumbnail.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="13.370672"
+ inkscape:cy="8.243673"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="5"
+ height="5.0000172"
+ x="2"
+ y="1045.3622" />
+ <rect
+ y="1038.3622"
+ x="2"
+ height="5"
+ width="5"
+ id="rect4162"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1045.3622"
+ x="9"
+ height="5.0000172"
+ width="5"
+ id="rect4164"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4166"
+ width="5"
+ height="5"
+ x="9"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_fixed_material.svg b/editor/icons/source/icon_fixed_material.svg
new file mode 100644
index 0000000000..5be74f490d
--- /dev/null
+++ b/editor/icons/source/icon_fixed_material.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_material.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_fixed_material.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="6.3347915"
+ inkscape:cy="8.4073248"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4202"
+ d="m 8,1037.3622 a 7,7.0000001 0 0 0 -7,7 7,7.0000001 0 0 0 7,7 7,7.0000001 0 0 0 7,-7 7,7.0000001 0 0 0 -7,-7 z m -2,2 a 2,2 0 0 1 2,2 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_fixed_spatial_material.svg b/editor/icons/source/icon_fixed_spatial_material.svg
new file mode 100644
index 0000000000..7ae0f93ffc
--- /dev/null
+++ b/editor/icons/source/icon_fixed_spatial_material.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_fixed_spatial_material.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4189"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4191"
+ d="m 6.3750001,1025.8622 a 1.6876688,1.5001498 0 0 0 -1.6875,1.5 l 0,18 a 1.6876688,1.5001498 0 0 0 1.6875,1.5 l 10.1217039,0 c -0.747392,-0.8796 -1.304338,-1.8888 -1.562256,-3 l -6.8719479,0 0,-15 16.8749999,0 0,3.3486 a 3.4281247,3.0472216 0 0 1 1.282105,1.1279 c 0.537834,0.828 1.294284,1.677 2.092895,2.5723 l 0,-8.5488 a 1.6876688,1.5001498 0 0 0 -1.6875,-1.5 l -20.2499999,0 z m 11.8124999,4.5 0,1.5 -1.6875,0 0,1.5 -3.375,0 0,1.5 -1.6875,0 0,1.5 -1.6874999,0 0,1.5 3.3749999,0 3.375,0 0.02637,0 c 0.246127,-0.317 0.496441,-0.6239 0.738282,-0.9053 1.145331,-1.3327 2.270672,-2.4711 3.015746,-3.6182 a 3.4281247,3.0472216 0 0 1 1.282105,-1.1279 l 0,-0.3486 -1.6875,0 0,-1.5 -1.6875,0 z m 5.0625,4.5 c -1.948558,3 -5.0625,5.0146 -5.0625,7.5 0,2.4853 2.266559,4.5 5.0625,4.5 2.795941,0 5.0625,-2.0147 5.0625,-4.5 0,-2.4854 -3.113942,-4.5 -5.0625,-7.5 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </clipPath>
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4208">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 4.6875001,1042.3622 11.8124999,4.5 11.8125,-4.5 0,-12 -11.8125,-4.5 -11.8124999,4.5 z"
+ id="path4210"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="11.899872"
+ inkscape:cy="11.262807"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4199)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_folder.svg b/editor/icons/source/icon_folder.svg
new file mode 100644
index 0000000000..ca16a5737f
--- /dev/null
+++ b/editor/icons/source/icon_folder.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_folder.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="8.0935814"
+ inkscape:cy="8.7176878"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2,2 0,1 -1,0 0,2 0,6 0,2 1,0 0,1 12,0 0,-1 1,0 L 15,6 14,6 14,5 9,5 9,3 8,3 8,2 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4136"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccc" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4143"
+ cx="2"
+ cy="1039.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1049.3622"
+ cx="2"
+ id="circle4150"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4154"
+ cx="14"
+ cy="1049.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1042.3622"
+ cx="14"
+ id="circle4158"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4162"
+ cx="8"
+ cy="1039.3622"
+ r="1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1040.3622 0,1 1,0 a 1,1 0 0 1 -1,-1 z"
+ id="rect4166"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_folder_big.svg b/editor/icons/source/icon_folder_big.svg
new file mode 100644
index 0000000000..818eaa2ba3
--- /dev/null
+++ b/editor/icons/source/icon_folder_big.svg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder_big.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_folder_big.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="27.662311"
+ inkscape:cy="41.159533"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.3622)">
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4135"
+ cx="13"
+ cy="1039.3583"
+ r="5.0039101" />
+ <circle
+ r="5.0039101"
+ cy="1039.3583"
+ cx="50.99609"
+ id="circle4137"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ r="5.0039101"
+ cy="1005.3622"
+ cx="13"
+ id="circle4139"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4141"
+ cx="51"
+ cy="1013.3661"
+ r="5.0039101" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4143"
+ width="48"
+ height="26.000017"
+ x="8"
+ y="1013.3622" />
+ <rect
+ y="1008.3622"
+ x="13"
+ height="36"
+ width="38"
+ id="rect4145"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4147"
+ width="8"
+ height="8"
+ x="8"
+ y="1008.3622" />
+ <rect
+ y="1005.3622"
+ x="8"
+ height="2.9999311"
+ width="28"
+ id="rect4149"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4151"
+ cx="31"
+ cy="1005.3622"
+ r="5.0039101" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4153"
+ width="18"
+ height="6.9999485"
+ x="13"
+ y="1000.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 36,1004.3622 0,0.5 a 3.4999914,3.4999914 0 0 1 0.04102,-0.5 l -0.04102,0 z m 0,0.5 0,3.5 3.5,0 a 3.4999914,3.4999914 0 0 1 -3.5,-3.5 z m 3.5,3.5 0.5,0 0,-0.039 a 3.4999914,3.4999914 0 0 1 -0.5,0.039 z"
+ id="rect4155"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_font.svg b/editor/icons/source/icon_font.svg
new file mode 100644
index 0000000000..36567fe10c
--- /dev/null
+++ b/editor/icons/source/icon_font.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_font.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="11.223545"
+ inkscape:cy="5.7245794"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4212"
+ width="14"
+ height="2"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="7"
+ height="14.000017"
+ width="2"
+ id="rect4214"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4216"
+ width="6"
+ height="0.99999976"
+ x="5"
+ y="1050.3622" />
+ <rect
+ y="-1.9999998"
+ x="1037.3622"
+ height="0.99999976"
+ width="4"
+ id="rect4218"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4220"
+ width="4"
+ height="0.99999976"
+ x="1037.3622"
+ y="-15" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 2 3 L 2 5 A 2 2 0 0 1 4 3 L 2 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4224" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 12 3 A 2 2 0 0 1 14 5 L 14 3 L 12 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4226" />
+ <path
+ id="path4232"
+ d="m 5,1050.3622 a 2,2 0 0 0 2,-2 l 0,2 -2,0 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 11,1050.3622 a 2,2 0 0 1 -2,-2 l 0,2 2,0 z"
+ id="path4234" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_forward.svg b/editor/icons/source/icon_forward.svg
new file mode 100644
index 0000000000..f6cb351cc1
--- /dev/null
+++ b/editor/icons/source/icon_forward.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="16"
+ viewBox="0 0 8 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_forward.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.4850647"
+ inkscape:cy="8.9717887"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 2.0293363,1037.3633 c 0.3235485,0.01 0.622658,0.1743 0.8027343,0.4433 l 4,6 c 0.2239059,0.3359 0.2239059,0.7735 0,1.1094 l -4,6 c -0.5489722,0.8228 -1.8316762,0.4344 -1.8320312,-0.5547 l 0,-12 c 9.424e-4,-0.5631 0.4664154,-1.0144 1.0292969,-0.998 z"
+ id="path4159"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_g_d_script.svg b/editor/icons/source/icon_g_d_script.svg
new file mode 100644
index 0000000000..f2b8cd9343
--- /dev/null
+++ b/editor/icons/source/icon_g_d_script.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_g_d_script.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_g_d_script.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.7306265"
+ inkscape:cy="9.0071681"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 6.4355469 3.2578125 A 5.0000172 5.0000172 0 0 0 5.7460938 3.5371094 L 3.7578125 2.34375 L 2.34375 3.7578125 L 3.5390625 5.7519531 A 5.0000172 5.0000172 0 0 0 3.2539062 6.4375 L 1 7 L 1 9 L 3.2578125 9.5644531 A 5.0000172 5.0000172 0 0 0 3.5371094 10.251953 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.7519531 12.460938 A 5.0000172 5.0000172 0 0 0 6.4375 12.746094 L 7 15 L 9 15 L 9.5644531 12.742188 A 5.0000172 5.0000172 0 0 0 10.251953 12.462891 L 12.242188 13.65625 L 13.65625 12.242188 L 12.460938 10.248047 A 5.0000172 5.0000172 0 0 0 12.746094 9.5625 L 15 9 L 15 7 L 12.742188 6.4355469 A 5.0000172 5.0000172 0 0 0 12.462891 5.7480469 L 13.65625 3.7578125 L 12.242188 2.34375 L 10.248047 3.5390625 A 5.0000172 5.0000172 0 0 0 9.5625 3.2539062 L 9 1 L 7 1 z M 8 6 A 2.0000174 2.0000174 0 0 1 10 8 A 2.0000174 2.0000174 0 0 1 8 10 A 2.0000174 2.0000174 0 0 1 6 8 A 2.0000174 2.0000174 0 0 1 8 6 z "
+ transform="translate(0,1036.3622)"
+ id="path4176" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_g_i_probe.svg b/editor/icons/source/icon_g_i_probe.svg
new file mode 100644
index 0000000000..d803a5f63d
--- /dev/null
+++ b/editor/icons/source/icon_g_i_probe.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_g_i_probe.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.4024065"
+ inkscape:cy="8.249577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 11,1040.3622 a 3.9999826,3.9999826 0 0 0 -4,4 3.9999826,3.9999826 0 0 0 4,4 3.9999826,3.9999826 0 0 0 4,-4 3.9999826,3.9999826 0 0 0 -4,-4 z m 0,2 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ id="rect4265"
+ width="4"
+ height="2.0000348"
+ x="9"
+ y="1046.3622" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ id="rect4269"
+ width="2"
+ height="1.0000174"
+ x="10"
+ y="1050.3622" />
+ <rect
+ y="1047.3622"
+ x="9"
+ height="2.0000348"
+ width="4"
+ id="rect4274"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ ry="1.0000174" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1050.3622 -4,0 0,-12 10,0"
+ id="path4293"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_g_i_probe_data.svg b/editor/icons/source/icon_g_i_probe_data.svg
new file mode 100644
index 0000000000..96fa62723c
--- /dev/null
+++ b/editor/icons/source/icon_g_i_probe_data.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_g_i_probe_data.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="11.914815"
+ inkscape:cy="6.460794"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="M 11 4 A 3.9999826 3.9999826 0 0 0 7 8 A 3.9999826 3.9999826 0 0 0 9 11.458984 L 9 12 C 9 12.55401 9.4459904 13 10 13 L 12 13 C 12.55401 13 13 12.55401 13 12 L 13 11.458984 A 3.9999826 3.9999826 0 0 0 15 8 A 3.9999826 3.9999826 0 0 0 11 4 z M 11 6 A 2.0000174 2.0000174 0 0 1 13 8 A 2.0000174 2.0000174 0 0 1 11 10 A 2.0000174 2.0000174 0 0 1 9 8 A 2.0000174 2.0000174 0 0 1 11 6 z M 10 14 L 10 15 L 12 15 L 12 14 L 10 14 z "
+ transform="translate(0,1036.3622)"
+ id="path4255" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 2,1037.3613 a 1.0001,1.0001 0 0 0 -1,1 l 0,12 a 1.0001,1.0001 0 0 0 1,1 l 4,0 0,-2 -3,0 0,-10 9,0 0,-2 -10,0 z"
+ id="path4293"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4170"
+ width="2"
+ height="2"
+ x="4"
+ y="1040.3622" />
+ <rect
+ y="1043.3622"
+ x="4"
+ height="2"
+ width="2"
+ id="rect4172"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4174"
+ width="2"
+ height="2"
+ x="4"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_generic_6_d_o_f_joint.svg b/editor/icons/source/icon_generic_6_d_o_f_joint.svg
new file mode 100644
index 0000000000..485040c6dc
--- /dev/null
+++ b/editor/icons/source/icon_generic_6_d_o_f_joint.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_area.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_generic_6_dof_joint.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.4723042"
+ inkscape:cy="10.441783"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 3,1042.3622 10,5"
+ id="path4241"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.99607843;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:0.99607843"
+ d="m 8,1050.3622 0,-12"
+ id="path4243"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4245"
+ d="m 3,1047.3622 10,-5"
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_gizmo_directional_light.svg b/editor/icons/source/icon_gizmo_directional_light.svg
new file mode 100644
index 0000000000..65202877a0
--- /dev/null
+++ b/editor/icons/source/icon_gizmo_directional_light.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ viewBox="0 0 128 128"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_gizmo_directional_light.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360"
+ sodipodi:docname="icon_gizmo_directional_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4"
+ inkscape:cx="69.526732"
+ inkscape:cy="53.07939"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.3622)">
+ <circle
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4156"
+ cx="64"
+ cy="988.36218"
+ r="24.000017" />
+ <path
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 64,4 a 8.0000172,8.0000172 0 0 0 -8,8 l 0,12 a 7.9999828,7.9999828 0 0 0 8,8 7.9999828,7.9999828 0 0 0 8,-8 L 72,12 A 8.0000172,8.0000172 0 0 0 64,4 Z"
+ transform="translate(0,924.3622)"
+ id="rect4169"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-46" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4148"
+ d="m 124,988.3622 a 8.0000172,8.0000172 0 0 0 -8,-8 l -12,0 a 7.9999828,7.9999828 0 0 0 -8,8 7.9999828,7.9999828 0 0 0 8,8 l 12,0 a 8.0000172,8.0000172 0 0 0 8,-8 z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-46" />
+ <path
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 64,1048.3622 a 8.0000172,8.0000172 0 0 0 8,-8 l 0,-12 a 7.9999828,7.9999828 0 0 0 -8,-8 7.9999828,7.9999828 0 0 0 -8,8 l 0,12 a 8.0000172,8.0000172 0 0 0 8,8 z"
+ id="path4150"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="46" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4152"
+ d="m 4,988.3622 a 8.0000172,8.0000172 0 0 0 8,8 l 12,0 a 7.9999828,7.9999828 0 0 0 8,-8 7.9999828,7.9999828 0 0 0 -8,-8 l -12,0 a 8.0000172,8.0000172 0 0 0 -8,8 z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="46" />
+ <path
+ inkscape:transform-center-y="-32.526909"
+ inkscape:connector-curvature="0"
+ id="path4154"
+ d="m 106.42641,945.93579 a 8.0000172,8.0000172 0 0 0 -11.313712,0 l -8.485281,8.48528 a 7.9999828,7.9999828 0 0 0 0,11.31371 7.9999828,7.9999828 0 0 0 11.313708,0 l 8.485285,-8.48528 a 8.0000172,8.0000172 0 0 0 0,-11.31371 z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-32.526906" />
+ <path
+ inkscape:transform-center-x="-32.526906"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 106.42641,1030.7886 a 8.0000172,8.0000172 0 0 0 0,-11.3137 l -8.485285,-8.4853 a 7.9999828,7.9999828 0 0 0 -11.313708,0 7.9999828,7.9999828 0 0 0 0,11.3137 l 8.485281,8.4853 a 8.0000172,8.0000172 0 0 0 11.313712,0 z"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="32.526894" />
+ <path
+ inkscape:transform-center-y="32.526893"
+ inkscape:connector-curvature="0"
+ id="path4159"
+ d="m 21.573593,1030.7886 a 8.0000172,8.0000172 0 0 0 11.313709,0 l 8.485281,-8.4853 a 7.9999828,7.9999828 0 0 0 0,-11.3137 7.9999828,7.9999828 0 0 0 -11.313708,0 l -8.485282,8.4853 a 8.0000172,8.0000172 0 0 0 0,11.3137 z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="32.526905" />
+ <path
+ inkscape:transform-center-x="32.526905"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 21.573593,945.93579 a 8.0000172,8.0000172 0 0 0 0,11.31371 l 8.485282,8.48528 a 7.9999828,7.9999828 0 0 0 11.313708,0 7.9999828,7.9999828 0 0 0 0,-11.31371 l -8.485281,-8.48528 a 8.0000172,8.0000172 0 0 0 -11.313709,0 z"
+ id="path4161"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-32.526908" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_gizmo_light.svg b/editor/icons/source/icon_gizmo_light.svg
new file mode 100644
index 0000000000..c42d6e1f76
--- /dev/null
+++ b/editor/icons/source/icon_gizmo_light.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ viewBox="0 0 128 128"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_gizmo_light.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_gizmo_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.9999998"
+ inkscape:cx="47.738891"
+ inkscape:cy="58.814006"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.3622)">
+ <path
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 64,930.3622 a 40.000068,40.000068 0 0 0 -40,40 40.000068,40.000068 0 0 0 40,40 40.000068,40.000068 0 0 0 40,-40 40.000068,40.000068 0 0 0 -40,-40 z m 0,12 a 28,28 0 0 1 28,28 28,28 0 0 1 -28,28 28,28 0 0 1 -28,-28 28,28 0 0 1 28,-28 z"
+ id="path4162"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 48,1002.3622 0,20 a 8,8 0 0 0 8,8 l 16,0 a 8,8 0 0 0 8,-8 l 0,-20 -32,0 z"
+ id="rect4164"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4168"
+ width="16"
+ height="8.0000696"
+ x="56"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_gizmo_listener.svg b/editor/icons/source/icon_gizmo_listener.svg
new file mode 100644
index 0000000000..3667cbc69b
--- /dev/null
+++ b/editor/icons/source/icon_gizmo_listener.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ viewBox="0 0 128 128"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/2x/icon_gizmo_listener.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"
+ sodipodi:docname="icon_gizmo_listener.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.9999998"
+ inkscape:cx="53.348444"
+ inkscape:cy="75.110194"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4175"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.3622)">
+ <g
+ id="g4175"
+ transform="matrix(2,0,0,2,-16,-1040.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4274"
+ d="m 63.712867,990.36221 -6.953133,4.0152 a 24.000031,23.999015 0 0 1 3.242193,11.98399 24.000031,23.999015 0 0 1 -3.234381,11.9917 l 6.945321,4.0076 a 32.000041,31.998687 0 0 0 0,-31.99849 z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1034.3602"
+ x="19.999998"
+ height="7.9996719"
+ width="4.0000052"
+ id="rect4147"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path4149"
+ d="m 32.000015,986.3622 a 20.000026,19.999179 0 0 0 -20.000026,19.9992 l 8.00001,0 a 12.000015,11.999507 0 0 1 12.000016,-11.99959 12.000015,11.999507 0 0 1 12.000015,11.99959 l 8.00001,0 A 20.000026,19.999179 0 0 0 32.000015,986.3622 Z"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path4155"
+ d="m 48.000035,1006.3614 c 0,15.9993 -12.000015,15.9993 -12.000015,19.9993 0,11.9992 -8.00001,11.9992 -12.000016,11.9992"
+ style="fill:none;fill-rule:evenodd;stroke:#f7f5cf;stroke-width:7.99984121;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_gizmo_spatial_sample_player.svg b/editor/icons/source/icon_gizmo_spatial_sample_player.svg
new file mode 100644
index 0000000000..a734095268
--- /dev/null
+++ b/editor/icons/source/icon_gizmo_spatial_sample_player.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ viewBox="0 0 128 128"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_gizmo_spatial_sample_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="7.8244495"
+ inkscape:cy="69.465609"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.3622)">
+ <path
+ style="fill:#f7f5cf;fill-opacity:1;fill-rule:evenodd;stroke:#f7f5cf;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 64.000015,940.3622 0,96.0012 -31.999993,-32.0004 -15.999996,0 0,-32.00043 15.999996,0 z"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4145"
+ width="11.999997"
+ height="32.000439"
+ x="80.000008"
+ y="972.36255" />
+ <rect
+ y="948.36224"
+ x="104"
+ height="80.000717"
+ width="11.999997"
+ id="rect4147"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ cx="86"
+ cy="972.36218"
+ r="6" />
+ <circle
+ r="6"
+ cy="1002.3622"
+ cx="86"
+ id="circle4139"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4141"
+ cx="110"
+ cy="1028.3622"
+ r="6" />
+ <circle
+ r="6"
+ cy="948.36218"
+ cx="110"
+ id="circle4143"
+ style="opacity:1;fill:#f7f5cf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_gizmo_spatial_stream_player.svg b/editor/icons/source/icon_gizmo_spatial_stream_player.svg
new file mode 100644
index 0000000000..c333641249
--- /dev/null
+++ b/editor/icons/source/icon_gizmo_spatial_stream_player.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="128"
+ viewBox="0 0 128 128"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_gizmo_spatial_stream_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="102.18566"
+ inkscape:cy="68.674719"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-924.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f7f5cf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 99.765624,934.3602 a 8.0008,8.001126 0 0 0 -1.960936,0.296 l -56,16.0004 A 8.0008,8.001126 0 0 0 36,958.353 l 0,48.1192 a 18.000034,18.000768 0 0 0 -2,-0.116 18.000034,18.000768 0 0 0 -18,18.0008 18.000034,18.000768 0 0 0 18,18.0008 18.000034,18.000768 0 0 0 17.875,-16.0008 l 0.125,0 0,-2 0,-59.9632 40,-11.4304 0,37.5172 a 18,18.000734 0 0 0 -2,-0.124 18,18.000734 0 0 0 -18,18.0008 18,18.000734 0 0 0 18,18.0004 18,18.000734 0 0 0 17.875,-16.0004 l 0.125,0 0,-2 0,-66.0028 a 8.0008,8.001126 0 0 0 -8.234376,-7.9924 z"
+ id="path4187"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_godot.svg b/editor/icons/source/icon_godot.svg
new file mode 100644
index 0000000000..419f23125b
--- /dev/null
+++ b/editor/icons/source/icon_godot.svg
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_godot.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.8470361"
+ inkscape:cy="9.8599985"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.01724138,0,0,0.01724138,-0.82758647,1035.0456)"
+ id="layer1-5"
+ inkscape:label="Layer 1">
+ <g
+ transform="matrix(1.0688992,0,0,1.1334985,-45.061194,-81.689066)"
+ id="g4149">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ d="m 116.99388,715.36604 43.13957,-74.51381 75.99672,-171.42666 271.088,-13.63746 282.06373,14.1696 138.45065,255.56931 -25.0756,66.96734 -376.12685,53.39482 -367.70391,-40.32222 z"
+ id="path3239"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <g
+ id="g3412"
+ transform="matrix(12.995388,0,0,-12.995388,898.37246,704.73082)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z"
+ style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3414" />
+ </g>
+ <g
+ id="g3416"
+ transform="matrix(12.995388,0,0,-12.995388,140.10982,467.34929)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z"
+ style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3418" />
+ </g>
+ <g
+ id="g3420"
+ transform="matrix(12.995388,0,0,-12.995388,411.4457,567.42812)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3422" />
+ </g>
+ <g
+ id="g3424"
+ transform="matrix(12.995388,0,0,-12.995388,391.00655,572.46636)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0"
+ style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3426" />
+ </g>
+ <g
+ id="g3428"
+ transform="matrix(12.995388,0,0,-12.995388,526.30933,660.10985)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3430" />
+ </g>
+ <g
+ id="g3432"
+ transform="matrix(12.995388,0,0,-12.995388,641.18731,567.42812)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3434" />
+ </g>
+ <g
+ id="g3436"
+ transform="matrix(12.995388,0,0,-12.995388,661.63165,572.46636)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0"
+ style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3438" />
+ </g>
+ </g>
+ </g>
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436"
+ d="m 4,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z"
+ id="path4151"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4156"
+ d="m 12,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" />
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436"
+ id="rect4160"
+ width="4"
+ height="1"
+ x="6"
+ y="1043.3622"
+ ry="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_comment.svg b/editor/icons/source/icon_graph_comment.svg
new file mode 100644
index 0000000000..5ad8fc8253
--- /dev/null
+++ b/editor/icons/source/icon_graph_comment.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_comment.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="2.9377959"
+ inkscape:cy="8.9727512"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="2"
+ height="11.999983"
+ x="3"
+ y="1039.3622" />
+ <rect
+ y="1047.3622"
+ x="1"
+ height="1.999948"
+ width="12"
+ id="rect4172"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1039.3622"
+ x="9"
+ height="11.999983"
+ width="2"
+ id="rect4174"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4176"
+ width="12"
+ height="1.999948"
+ x="1"
+ y="1041.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_cube_uniform.svg b/editor/icons/source/icon_graph_cube_uniform.svg
new file mode 100644
index 0000000000..63774a7431
--- /dev/null
+++ b/editor/icons/source/icon_graph_cube_uniform.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_cube_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.6772247"
+ inkscape:cy="6.7867928"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#eac968;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 C 0.8954305 0 0 0.8954 0 2 L 0 12 C 0 13.1046 0.8954305 14 2 14 L 12 14 C 13.104569 14 14 13.1046 14 12 L 14 2 C 14 0.8954 13.104569 0 12 0 L 2 0 z M 6.9726562 2 A 0.71438238 0.71438238 0 0 1 7.3203125 2.0742188 L 11.605469 4.2167969 A 0.71438238 0.71438238 0 0 1 12 4.8574219 L 12 9.1425781 A 0.71438238 0.71438238 0 0 1 11.605469 9.78125 L 7.3203125 11.923828 A 0.71438238 0.71438238 0 0 1 6.6796875 11.923828 L 2.3945312 9.78125 A 0.71438238 0.71438238 0 0 1 2 9.1425781 L 2 4.8574219 A 0.71438238 0.71438238 0 0 1 2.3945312 4.2167969 L 6.6796875 2.0742188 A 0.71438238 0.71438238 0 0 1 6.9726562 2 z M 7 3.5136719 L 4.3105469 4.8574219 L 7 6.2011719 L 9.6894531 4.8574219 L 7 3.5136719 z M 3.4277344 6.0117188 L 3.4277344 8.7011719 L 6.2851562 10.128906 L 6.2851562 7.4414062 L 3.4277344 6.0117188 z M 10.572266 6.0117188 L 7.7148438 7.4414062 L 7.7148438 10.128906 L 10.572266 8.7011719 L 10.572266 6.0117188 z "
+ transform="translate(0,1038.3622)"
+ id="rect4147" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_curve_map.svg b/editor/icons/source/icon_graph_curve_map.svg
new file mode 100644
index 0000000000..6c3594cb1b
--- /dev/null
+++ b/editor/icons/source/icon_graph_curve_map.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_curve_map.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.7717442"
+ inkscape:cy="7.4133706"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-opacity:0;fill-rule:evenodd;stroke:#f6f6f6;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1049.3622 c 8,0 9,0 9,-9"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:1;fill:#68d0ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11 4 A 2 2 0 0 0 9 6 A 2 2 0 0 0 11 8 A 2 2 0 0 0 13 6 A 2 2 0 0 0 11 4 z M 6 9 A 2 2 0 0 0 4 11 A 2 2 0 0 0 6 13 A 2 2 0 0 0 8 11 A 2 2 0 0 0 6 9 z "
+ transform="translate(0,1038.3622)"
+ id="circle4176" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_default_texture.svg b/editor/icons/source/icon_graph_default_texture.svg
new file mode 100644
index 0000000000..8d1c78ddd7
--- /dev/null
+++ b/editor/icons/source/icon_graph_default_texture.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_default_texture.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="0.057070465"
+ inkscape:cy="7.746251"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#eae068;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 2 L 2 12 L 12 12 L 12 2 L 2 2 z M 11 4 L 11 9 L 3 9 L 5 6 L 7 8 L 11 4 z "
+ transform="translate(0,1038.3622)"
+ id="rect4220" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_edit.svg b/editor/icons/source/icon_graph_edit.svg
new file mode 100644
index 0000000000..30d3ad96f6
--- /dev/null
+++ b/editor/icons/source/icon_graph_edit.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="10.257036"
+ inkscape:cy="6.1065792"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 5 13 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 8.7929688 10.207031 L 10.207031 8.7929688 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 13 5 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4198" />
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ <g
+ id="layer1-0"
+ inkscape:label="Layer 1"
+ transform="matrix(0.50000003,0,0,0.50000003,7.5,525.68107)"
+ style="fill:#a5efac;fill-opacity:1">
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect4135"
+ d="M 1.7071068,1047.8266 1,1051.3622 l 3.5355339,-0.7071 7.7781741,-7.7782 -2.828427,-2.8284 z m 9.1923882,-9.1924 2.828427,2.8285 1.414214,-1.4142 -2.828428,-2.8285 z"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_input.svg b/editor/icons/source/icon_graph_input.svg
new file mode 100644
index 0000000000..265fb7279e
--- /dev/null
+++ b/editor/icons/source/icon_graph_input.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_input.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.3654942"
+ inkscape:cy="6.8821206"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <circle
+ style="opacity:1;fill:#f6f6f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4155"
+ cx="7"
+ cy="1045.3622"
+ r="6" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_node.svg b/editor/icons/source/icon_graph_node.svg
new file mode 100644
index 0000000000..078b0ffe9e
--- /dev/null
+++ b/editor/icons/source/icon_graph_node.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_node.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="8.3717103"
+ inkscape:cy="7.5028858"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 5 13 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 8.0859375 9.5 L 9.5 8.0859375 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 13 5 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4198" />
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ <circle
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4205"
+ cx="12.500009"
+ cy="1048.8622"
+ r="2.4999914" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_rgb.svg b/editor/icons/source/icon_graph_rgb.svg
new file mode 100644
index 0000000000..a00e97a104
--- /dev/null
+++ b/editor/icons/source/icon_graph_rgb.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_rgb.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="1.5006521"
+ inkscape:cy="11.075034"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1039.3622 a 4.0000172,4.0000172 0 0 0 -4,4 4.0000172,4.0000172 0 0 0 0.03906,0.5195 4.0000172,4.0000172 0 0 0 -2.039062,3.4805 4.0000172,4.0000172 0 0 0 4,4 4.0000172,4.0000172 0 0 0 1.998047,-0.541 4.0000172,4.0000172 0 0 0 2.001953,0.541 4.0000172,4.0000172 0 0 0 4,-4 4.0000172,4.0000172 0 0 0 -2.037109,-3.4824 4.0000172,4.0000172 0 0 0 0.03711,-0.5176 4.0000172,4.0000172 0 0 0 -4,-4 z"
+ id="circle4161"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1040.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 0.210937,1.1055 A 3,3 0 0 0 2,1047.3622 a 3,3 0 0 0 3,3 3,3 0 0 0 2,-0.7676 3,3 0 0 0 2,0.7676 3,3 0 0 0 3,-3 3,3 0 0 0 -2.2148438,-2.8906 A 3,3 0 0 0 10,1043.3622 a 3,3 0 0 0 -3,-3 z"
+ id="circle4268"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#ff0000;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4262"
+ cx="7"
+ cy="1043.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1047.3622"
+ cx="5"
+ id="circle4264"
+ style="opacity:1;fill:#0000ff;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#00ff00;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4266"
+ cx="9"
+ cy="1047.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1043.3622"
+ cx="7"
+ id="circle4281"
+ style="opacity:1;fill:#ff0000;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#0000ff;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4283"
+ cx="5"
+ cy="1047.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1047.3622"
+ cx="9"
+ id="circle4285"
+ style="opacity:1;fill:#00ff00;fill-opacity:0.39215686;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_rgb_op.svg b/editor/icons/source/icon_graph_rgb_op.svg
new file mode 100644
index 0000000000..fdd3d3a9f4
--- /dev/null
+++ b/editor/icons/source/icon_graph_rgb_op.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_rgb_op.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="0.48418609"
+ inkscape:cy="11.870529"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="m 4,1050.3622 6,0 0,-10 -6,0 z"
+ id="path4144"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="2"
+ height="2"
+ x="1"
+ y="1041.3622" />
+ <rect
+ y="1047.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="2"
+ height="2"
+ x="11"
+ y="1044.3622" />
+ <rect
+ style="opacity:1;fill:#ff4646;fill-opacity:0.8627451;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4163"
+ width="4"
+ height="2"
+ x="5"
+ y="1041.3622" />
+ <rect
+ y="1044.3622"
+ x="5"
+ height="2"
+ width="4"
+ id="rect4165"
+ style="opacity:1;fill:#46ff46;fill-opacity:0.8627451;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#4646ff;fill-opacity:0.8627451;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="4"
+ height="2"
+ x="5"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_rgb_uniform.svg b/editor/icons/source/icon_graph_rgb_uniform.svg
new file mode 100644
index 0000000000..359c86d61a
--- /dev/null
+++ b/editor/icons/source/icon_graph_rgb_uniform.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_rgb_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.0781037"
+ inkscape:cy="7.3277795"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2,1038.3622 c -1.10457,0 -2,0.8954 -2,2 l 0,10 c 0,1.1046 0.89543,2 2,2 l 10,0 c 1.104569,0 2,-0.8954 2,-2 l 0,-10 c 0,-1.1046 -0.895431,-2 -2,-2 z"
+ id="rect4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 2 A 3 3 0 0 0 4 5 A 3 3 0 0 0 4.2109375 6.1054688 A 3 3 0 0 0 2 9 A 3 3 0 0 0 5 12 A 3 3 0 0 0 7 11.232422 A 3 3 0 0 0 9 12 A 3 3 0 0 0 12 9 A 3 3 0 0 0 9.7851562 6.109375 A 3 3 0 0 0 10 5 A 3 3 0 0 0 7 2 z "
+ transform="translate(0,1038.3622)"
+ id="circle4268" />
+ <circle
+ style="opacity:1;fill:#ff0000;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4262"
+ cx="7"
+ cy="1043.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1047.3622"
+ cx="5"
+ id="circle4264"
+ style="opacity:1;fill:#0000ff;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#00ff00;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4266"
+ cx="9"
+ cy="1047.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1043.3622"
+ cx="7"
+ id="circle4281"
+ style="opacity:1;fill:#ff0000;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#0000ff;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4283"
+ cx="5"
+ cy="1047.3622"
+ r="3" />
+ <circle
+ r="3"
+ cy="1047.3622"
+ cx="9"
+ id="circle4285"
+ style="opacity:1;fill:#00ff00;fill-opacity:0.39215687;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_scalar.svg b/editor/icons/source/icon_graph_scalar.svg
new file mode 100644
index 0000000000..7a75ddba78
--- /dev/null
+++ b/editor/icons/source/icon_graph_scalar.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_scalar.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.1198735"
+ inkscape:cy="6.5048182"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6 2 C 4.3431458 2 3 3.3431 3 5 C 3 6.6569 4.3431458 8 6 8 L 8 8 A 1.0000174 1.0000174 0 0 1 9 9 A 1.0000174 1.0000174 0 0 1 8 10 L 3 10 L 3 12 L 8 12 C 9.6568542 12 11 10.6569 11 9 C 11 7.3431 9.6568542 6 8 6 L 6 6 A 1.0000174 1.0000174 0 0 1 5 5 A 1.0000174 1.0000174 0 0 1 6 4 L 11 4 L 11 2 L 6 2 z "
+ transform="translate(0,1038.3622)"
+ id="rect4348" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_scalar_interp.svg b/editor/icons/source/icon_graph_scalar_interp.svg
new file mode 100644
index 0000000000..47b619d608
--- /dev/null
+++ b/editor/icons/source/icon_graph_scalar_interp.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_scalar_interp.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="2.5036881"
+ inkscape:cy="7.3934142"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#cf68ea;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 2,1050.3622 10,-10"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_scalar_op.svg b/editor/icons/source/icon_graph_scalar_op.svg
new file mode 100644
index 0000000000..fcb54f9aa0
--- /dev/null
+++ b/editor/icons/source/icon_graph_scalar_op.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_scalar_op.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.1972896"
+ inkscape:cy="8.4316461"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cf68ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 4,1 C 3.4477381,1.0001 3.0000552,1.4477 3,2 l 0,10 c 5.52e-5,0.5523 0.4477381,0.9999 1,1 l 6,0 c 0.552262,-10e-5 0.999945,-0.4477 1,-1 L 11,2 C 10.999945,1.4477 10.552262,1.0001 10,1 Z m 1,3 4,3 -4,3 z"
+ transform="translate(0,1038.3622)"
+ id="path4144"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="2"
+ height="2"
+ x="1"
+ y="1041.3622" />
+ <rect
+ y="1047.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="2"
+ height="2"
+ x="11"
+ y="1044.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_scalar_uniform.svg b/editor/icons/source/icon_graph_scalar_uniform.svg
new file mode 100644
index 0000000000..e5e5edea9c
--- /dev/null
+++ b/editor/icons/source/icon_graph_scalar_uniform.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_scalar_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.0555126"
+ inkscape:cy="8.8981623"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 A 2 2 0 0 0 0 2 L 0 12 A 2 2 0 0 0 2 14 L 12 14 A 2 2 0 0 0 14 12 L 14 2 A 2 2 0 0 0 12 0 L 2 0 z M 6 2 L 11 2 L 11 4 L 6 4 A 1.0000174 1.0000174 0 0 0 5 5 A 1.0000174 1.0000174 0 0 0 6 6 L 8 6 C 9.6568542 6 11 7.3431 11 9 C 11 10.6569 9.6568542 12 8 12 L 3 12 L 3 10 L 8 10 A 1.0000174 1.0000174 0 0 0 9 9 A 1.0000174 1.0000174 0 0 0 8 8 L 6 8 C 4.3431458 8 3 6.6569 3 5 C 3 3.3431 4.3431458 2 6 2 z "
+ transform="translate(0,1038.3622)"
+ id="rect4147" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_scalars_to_vec.svg b/editor/icons/source/icon_graph_scalars_to_vec.svg
new file mode 100644
index 0000000000..0f2994a606
--- /dev/null
+++ b/editor/icons/source/icon_graph_scalars_to_vec.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_scalars_to_vec.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.4222736"
+ inkscape:cy="8.4198974"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1045.3622 5,0"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#cf68ea;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1040.3622 5,0 0,10 -5,0"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#cf68ea;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1045.3622 -5,0"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_texscreen.svg b/editor/icons/source/icon_graph_texscreen.svg
new file mode 100644
index 0000000000..89d000d7cb
--- /dev/null
+++ b/editor/icons/source/icon_graph_texscreen.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_texscreen.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="3.5348921"
+ inkscape:cy="8.3718235"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#f6f6f6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2,1041.3622 10,0 0,8 -10,0 z"
+ id="rect4154" />
+ <rect
+ style="opacity:1;fill:#f6f6f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="8"
+ height="1.0000174"
+ x="3"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_texture_uniform.svg b/editor/icons/source/icon_graph_texture_uniform.svg
new file mode 100644
index 0000000000..440f83642c
--- /dev/null
+++ b/editor/icons/source/icon_graph_texture_uniform.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_texture_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.372248"
+ inkscape:cy="6.4853857"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#eae068;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 C 0.8954305 0 0 0.8954 0 2 L 0 12 C 0 13.1046 0.8954305 14 2 14 L 12 14 C 13.104569 14 14 13.1046 14 12 L 14 2 C 14 0.8954 13.104569 0 12 0 L 2 0 z M 2 2 L 12 2 L 12 12 L 2 12 L 2 2 z M 11 4 L 7 8 L 5 6 L 3 9 L 11 9 L 11 4 z "
+ transform="translate(0,1038.3622)"
+ id="rect4147" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_time.svg b/editor/icons/source/icon_graph_time.svg
new file mode 100644
index 0000000000..77b80e920b
--- /dev/null
+++ b/editor/icons/source/icon_graph_time.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_time.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="2.306914"
+ inkscape:cy="7.4704168"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#f6f6f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="2"
+ height="3.9999652"
+ x="6"
+ y="1042.3622" />
+ <rect
+ y="1044.3622"
+ x="6"
+ height="1.9999652"
+ width="4"
+ id="rect4159"
+ style="opacity:1;fill:#f6f6f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-0.66666667"
+ inkscape:transform-center-y="-3.4787369e-05" />
+ <path
+ style="opacity:1;fill:#f6f6f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 0 A 7 7 0 0 0 0 7 A 7 7 0 0 0 7 14 A 7 7 0 0 0 14 7 A 7 7 0 0 0 7 0 z M 7 2 A 5.0000172 5.0000172 0 0 1 12 7 A 5.0000172 5.0000172 0 0 1 7 12 A 5.0000172 5.0000172 0 0 1 2 7 A 5.0000172 5.0000172 0 0 1 7 2 z "
+ transform="translate(0,1038.3622)"
+ id="path4166" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_dp.svg b/editor/icons/source/icon_graph_vec_dp.svg
new file mode 100644
index 0000000000..8994d8ce59
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_dp.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_dp.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="64"
+ inkscape:cx="4.9677869"
+ inkscape:cy="7.0295494"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 1,1042.3622 2,6 2,-6"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <circle
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4160"
+ cx="7"
+ cy="1046.3622"
+ r="1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path4171"
+ d="m 9,1042.3622 2,6 2,-6"
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_interp.svg b/editor/icons/source/icon_graph_vec_interp.svg
new file mode 100644
index 0000000000..885b342a54
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_interp.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_interp.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="2.5478823"
+ inkscape:cy="7.6364821"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 2,1050.3622 10,-10"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_length.svg b/editor/icons/source/icon_graph_vec_length.svg
new file mode 100644
index 0000000000..aa01e3ef2a
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_length.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_length.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="5.8031361"
+ inkscape:cy="7.1300276"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="12.000017"
+ x="0"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="12"
+ height="12.000017"
+ width="2"
+ id="rect4156"
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1043.3622 2,5 2,-5"
+ id="path4158"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_op.svg b/editor/icons/source/icon_graph_vec_op.svg
new file mode 100644
index 0000000000..da7540ce86
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_op.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_op.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.0410396"
+ inkscape:cy="8.8691461"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b8ea68;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 4 1 C 3.4477381 1.0001 3.0000552 1.4477 3 2 L 3 3 L 1 3 L 1 5 L 3 5 L 3 9 L 1 9 L 1 11 L 3 11 L 3 12 C 3.0000552 12.5523 3.4477381 12.9999 4 13 L 10 13 C 10.552262 12.9999 10.999945 12.5523 11 12 L 11 8 L 13 8 L 13 6 L 11 6 L 11 2 C 10.999945 1.4477 10.552262 1.0001 10 1 L 4 1 z M 5 4 L 9 7 L 5 10 L 5 4 z "
+ transform="translate(0,1038.3622)"
+ id="path4144" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_scalar_op.svg b/editor/icons/source/icon_graph_vec_scalar_op.svg
new file mode 100644
index 0000000000..aeb2626120
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_scalar_op.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_scalar_op.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.8222896"
+ inkscape:cy="9.2753961"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cf68ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 3 7 L 3 9 L 1 9 L 1 11 L 3 11 L 3 12 C 3.0000552 12.5523 3.4477381 12.9999 4 13 L 10 13 C 10.552262 12.9999 10.999945 12.5523 11 12 L 11 8 L 13 8 L 13 7 L 9 7 L 5 10 L 5 7 L 3 7 z "
+ transform="translate(0,1038.3622)"
+ id="path4233" />
+ <path
+ id="path4236"
+ d="m 3,1045.3622 0,-2 -2,0 0,-2 2,0 0,-1 c 5.52e-5,-0.5523 0.4477381,-0.9999 1,-1 l 6,0 c 0.552262,10e-5 0.999945,0.4477 1,1 l 0,4 2,0 0,1 -4,0 -4,-3 0,3 -2,0 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b8ea68;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vec_to_scalars.svg b/editor/icons/source/icon_graph_vec_to_scalars.svg
new file mode 100644
index 0000000000..fb58db9d78
--- /dev/null
+++ b/editor/icons/source/icon_graph_vec_to_scalars.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vec_to_scalars.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.4222736"
+ inkscape:cy="8.4198974"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1045.3622 -5,0"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#cf68ea;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12,1040.3622 -5,0 0,10 5,0"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#cf68ea;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1045.3622 5,0"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vecs_to_xform.svg b/editor/icons/source/icon_graph_vecs_to_xform.svg
new file mode 100644
index 0000000000..f8ba3eb4b8
--- /dev/null
+++ b/editor/icons/source/icon_graph_vecs_to_xform.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vecs_to_xform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.8910236"
+ inkscape:cy="10.294897"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ea686c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 7,1044.3613 a 1.0001,1.0001 0 1 0 0,2 l 5,0 a 1.0001,1.0001 0 1 0 0,-2 l -5,0 z"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b8ea68;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2 1 A 1.0001 1.0001 0 1 0 2 3 L 6 3 L 6 6 L 2 6 A 1.0001 1.0001 0 1 0 2 8 L 6 8 L 6 11 L 2 11 A 1.0001 1.0001 0 1 0 2 13 L 7 13 A 1.0001 1.0001 0 0 0 8 12 L 8 7.1679688 A 1.0001 1.0001 0 0 0 8 6.8398438 L 8 2 A 1.0001 1.0001 0 0 0 7 1 L 2 1 z "
+ transform="translate(0,1038.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vector.svg b/editor/icons/source/icon_graph_vector.svg
new file mode 100644
index 0000000000..e7f6bd927f
--- /dev/null
+++ b/editor/icons/source/icon_graph_vector.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vector.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.8941631"
+ inkscape:cy="7.6796075"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b8ea68;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 8,1038.3614 0,2 -5,0 0,2 5,0 0,2 3,-3 z m -3.65625,5.6289 -1.714844,1.0293 0.513672,0.8574 3,5 c 0.388501,0.647 1.326343,0.647 1.714844,0 l 3,-5 0.513672,-0.8574 -1.714844,-1.0293 -0.513672,0.8574 L 7,1048.418 4.857422,1044.8477 Z"
+ id="path4209"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_vector_uniform.svg b/editor/icons/source/icon_graph_vector_uniform.svg
new file mode 100644
index 0000000000..2310938af5
--- /dev/null
+++ b/editor/icons/source/icon_graph_vector_uniform.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_vector_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.2039653"
+ inkscape:cy="7.5980148"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2,0 C 0.8954305,0 0,0.8954305 0,2 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 14,2 C 14,0.8954305 13.104569,0 12,0 Z M 8,0 11,3 8,6 8,4 3,4 3,2 8,2 Z M 4.34375,5.6289062 4.8574219,6.4863281 7,10.056641 9.1425781,6.4863281 9.65625,5.6289062 l 1.714844,1.0292969 -0.513672,0.8574219 -3.0000001,5 c -0.3885014,0.647055 -1.3263424,0.647055 -1.7148438,0 l -3,-5 -0.5136719,-0.8574219 z"
+ transform="translate(0,1038.3622)"
+ id="rect4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssssssscccccccccccccccccccc" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 23,0 0,2 -5,0 0,2 5,0 0,2 3,-3 z m -3.65625,5.6289062 -1.714844,1.0292969 0.513672,0.8574219 3,5 c 0.388501,0.647056 1.326343,0.647056 1.714844,0 l 3,-5 L 26.371094,6.6582031 24.65625,5.6289062 24.142578,6.4863281 22,10.056641 19.857422,6.4863281 Z"
+ transform="translate(0,1038.3622)"
+ id="path4209"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform.svg b/editor/icons/source/icon_graph_xform.svg
new file mode 100644
index 0000000000..c9b027ee2d
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.4813283"
+ inkscape:cy="7.7204422"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="12"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="1"
+ height="1.0000174"
+ width="3"
+ id="rect4156"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="3"
+ height="1"
+ x="1"
+ y="1050.3622" />
+ <rect
+ y="1050.3622"
+ x="10"
+ height="1"
+ width="3"
+ id="rect4160"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="3"
+ height="1.0000174"
+ x="10"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="12"
+ height="12"
+ width="1"
+ id="rect4164"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ea686c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1049.3622 0,-7 3,3 3,-3 0,7"
+ id="path4166"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_mult.svg b/editor/icons/source/icon_graph_xform_mult.svg
new file mode 100644
index 0000000000..71fca83f3d
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_mult.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_mult.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="64"
+ inkscape:cx="6.8982224"
+ inkscape:cy="7.1692759"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ea686c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 1,1049.3622 0,-7 2,3 2,-3 0,7"
+ id="path4166"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4160"
+ d="m 9,1049.3622 0,-7 2,3 2,-3 0,7"
+ style="fill:none;fill-rule:evenodd;stroke:#ea686c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4162"
+ cx="7"
+ cy="1045.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_scalar_func.svg b/editor/icons/source/icon_graph_xform_scalar_func.svg
new file mode 100644
index 0000000000..45fd97a671
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_scalar_func.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_scalar_func.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.3566697"
+ inkscape:cy="9.063202"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="4.9999824"
+ x="6"
+ y="1042.3622" />
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 9.0703125 1 A 3 3 0 0 0 7.5 1.4023438 A 3 3 0 0 0 6 4 L 8 4 A 1 1 0 0 1 9 3 A 1 1 0 0 1 10 4 L 12 4 A 3 3 0 0 0 10.5 1.4023438 A 3 3 0 0 0 9.0703125 1 z "
+ transform="translate(0,1038.3622)"
+ id="path4164" />
+ <rect
+ y="1042.3622"
+ x="10"
+ height="1.0000174"
+ width="2"
+ id="rect4166"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 10 A 3 3 0 0 0 3.5 12.597656 A 3 3 0 0 0 6.5 12.597656 A 3 3 0 0 0 8 10 L 6 10 A 1 1 0 0 1 5 11 A 1 1 0 0 1 4 10 L 2 10 z "
+ transform="translate(0,1038.3622)"
+ id="path4170" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4172"
+ width="2"
+ height="1.0000174"
+ x="6"
+ y="-1048.3622"
+ transform="scale(1,-1)" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4176"
+ width="6"
+ height="2"
+ x="4"
+ y="1044.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_to_vecs.svg b/editor/icons/source/icon_graph_xform_to_vecs.svg
new file mode 100644
index 0000000000..cc113e72fd
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_to_vecs.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_to_vecs.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="-2.5152264"
+ inkscape:cy="10.232397"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ea686c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 7,1044.3613 a 1.0001,1.0001 0 1 1 0,2 l -5,0 a 1.0001,1.0001 0 1 1 0,-2 l 5,0 z"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b8ea68;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 12,1039.3622 a 1.0001,1.0001 0 1 1 0,2 l -4,0 0,3 4,0 a 1.0001,1.0001 0 1 1 0,2 l -4,0 0,3 4,0 a 1.0001,1.0001 0 1 1 0,2 l -5,0 a 1.0001,1.0001 0 0 1 -1,-1 l 0,-4.832 a 1.0001,1.0001 0 0 1 0,-0.3282 l 0,-4.8398 a 1.0001,1.0001 0 0 1 1,-1 l 5,0 z"
+ id="path4155"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_uniform.svg b/editor/icons/source/icon_graph_xform_uniform.svg
new file mode 100644
index 0000000000..f1cdcd408c
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_uniform.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_uniform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.0470074"
+ inkscape:cy="8.0773899"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 C 0.8954305 0 0 0.8954 0 2 L 0 12 C 0 13.1046 0.8954305 14 2 14 L 12 14 C 13.104569 14 14 13.1046 14 12 L 14 2 C 14 0.8954 13.104569 0 12 0 L 2 0 z M 1 1 L 2 1 L 4 1 L 4 2 L 2 2 L 2 12 L 4 12 L 4 13 L 2 13 L 1 13 L 1 12 L 1 2 L 1 1 z M 10 1 L 13 1 L 13 12 L 13 13 L 10 13 L 10 12 L 12 12 L 12 2 L 10 2 L 10 1 z M 9.9707031 3 A 1.0001 1.0001 0 0 1 11 4 L 11 11 L 9 11 L 9 6.4140625 L 7.7070312 7.7070312 A 1.0001 1.0001 0 0 1 6.2929688 7.7070312 L 5 6.4140625 L 5 11 L 3 11 L 3 4 A 1.0001 1.0001 0 0 1 3.984375 3.0019531 A 1.0001 1.0001 0 0 1 4.7070312 3.2929688 L 7 5.5859375 L 9.2929688 3.2929688 A 1.0001 1.0001 0 0 1 9.9707031 3 z "
+ transform="translate(0,1038.3622)"
+ id="rect4147" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_vec_func.svg b/editor/icons/source/icon_graph_xform_vec_func.svg
new file mode 100644
index 0000000000..0d141bc646
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_vec_func.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_vec_func.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.8879197"
+ inkscape:cy="10.406952"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="4.9999824"
+ x="6"
+ y="1042.3622" />
+ <path
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 9.0703125 1 A 3 3 0 0 0 7.5 1.4023438 A 3 3 0 0 0 6 4 L 8 4 A 1 1 0 0 1 9 3 A 1 1 0 0 1 10 4 L 12 4 A 3 3 0 0 0 10.5 1.4023438 A 3 3 0 0 0 9.0703125 1 z "
+ transform="translate(0,1038.3622)"
+ id="path4164" />
+ <rect
+ y="1042.3622"
+ x="10"
+ height="1.0000174"
+ width="2"
+ id="rect4166"
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 10 A 3 3 0 0 0 3.5 12.597656 A 3 3 0 0 0 6.5 12.597656 A 3 3 0 0 0 8 10 L 6 10 A 1 1 0 0 1 5 11 A 1 1 0 0 1 4 10 L 2 10 z "
+ transform="translate(0,1038.3622)"
+ id="path4170" />
+ <rect
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4172"
+ width="2"
+ height="1.0000174"
+ x="6"
+ y="-1048.3622"
+ transform="scale(1,-1)" />
+ <rect
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4176"
+ width="6"
+ height="2"
+ x="4"
+ y="1044.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_vec_imult.svg b/editor/icons/source/icon_graph_xform_vec_imult.svg
new file mode 100644
index 0000000000..74dc1ba7e3
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_vec_imult.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_vec_imult.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="3.9196664"
+ inkscape:cy="7.2417215"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 1,1042.3622 2,6 2,-6"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <circle
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4160"
+ cx="7"
+ cy="1046.3622"
+ r="1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4160-1"
+ d="m 9,1049.3622 0,-7 2,3 2,-3 0,7"
+ style="fill:none;fill-rule:evenodd;stroke:#ea686c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_graph_xform_vec_mult.svg b/editor/icons/source/icon_graph_xform_vec_mult.svg
new file mode 100644
index 0000000000..c3e59abd46
--- /dev/null
+++ b/editor/icons/source/icon_graph_xform_vec_mult.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_graph_xform_vec_mult.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="3.0118539"
+ inkscape:cy="7.2425107"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,1042.3622 2,6 2,-6"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <circle
+ style="opacity:1;fill:#b8ea68;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4160"
+ cx="7"
+ cy="1046.3622"
+ r="1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4160-1"
+ d="m 1,1049.3621 0,-7 2,3 2,-3 0,7"
+ style="fill:none;fill-rule:evenodd;stroke:#ea686c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_grid.svg b/editor/icons/source/icon_grid.svg
new file mode 100644
index 0000000000..2d9288de14
--- /dev/null
+++ b/editor/icons/source/icon_grid.svg
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_grid.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.9555256"
+ inkscape:cy="11.525163"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="10"
+ x="5"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="9"
+ height="10"
+ width="2"
+ id="rect4156"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="2"
+ height="10"
+ x="1041.3622"
+ y="-13"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-13"
+ x="1045.3622"
+ height="10"
+ width="2"
+ id="rect4160"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-15"
+ x="1037.3622"
+ height="14"
+ width="2"
+ id="rect4162"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4164"
+ width="2"
+ height="14"
+ x="1049.3622"
+ y="-15"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-1051.3622"
+ x="-15"
+ height="14"
+ width="2"
+ id="rect4166"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4168"
+ width="2"
+ height="14"
+ x="-3"
+ y="-1051.3622"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_grid_container.svg b/editor/icons/source/icon_grid_container.svg
new file mode 100644
index 0000000000..a27578f196
--- /dev/null
+++ b/editor/icons/source/icon_grid_container.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_grid_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="5.3680561"
+ inkscape:cy="9.3590913"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="10"
+ x="5"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="9"
+ height="10"
+ width="2"
+ id="rect4157"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1041.3622"
+ x="3"
+ height="1.9999826"
+ width="10"
+ id="rect4159"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="10"
+ height="1.9999826"
+ x="3"
+ y="1045.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_grid_map.svg b/editor/icons/source/icon_grid_map.svg
new file mode 100644
index 0000000000..5bbea0ff2c
--- /dev/null
+++ b/editor/icons/source/icon_grid_map.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_grid_map.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.49128"
+ inkscape:cy="9.6074202"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4170"
+ width="4"
+ height="4.0000172"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="11"
+ height="4.0000172"
+ width="4"
+ id="rect4172"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4174"
+ width="4"
+ height="4.0000172"
+ x="6"
+ y="1037.3622" />
+ <rect
+ y="1042.3622"
+ x="1"
+ height="4.0000172"
+ width="4"
+ id="rect4176"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4178"
+ width="4"
+ height="4.0000172"
+ x="11"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="6"
+ height="4.0000172"
+ width="4"
+ id="rect4180"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4182"
+ width="4"
+ height="4.0000172"
+ x="1"
+ y="1047.3622" />
+ <rect
+ y="1047.3622"
+ x="11"
+ height="4.0000172"
+ width="4"
+ id="rect4184"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4186"
+ width="4"
+ height="4.0000172"
+ x="6"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_groove_joint_2d.svg b/editor/icons/source/icon_groove_joint_2d.svg
new file mode 100644
index 0000000000..d05bebef48
--- /dev/null
+++ b/editor/icons/source/icon_groove_joint_2d.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_groove_joint_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="11.478928"
+ inkscape:cy="8.9552021"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 15,1037.3622 -5,0 0,6 -5,0 0,2 5,0 0,6 5,0 0,-14 z m -7,0 -5,0 -2,0 0,4 0,10 2,0 5,0 0,-4 -5,0 0,-6 5,0 0,-4 z"
+ id="rect4161"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_group.svg b/editor/icons/source/icon_group.svg
new file mode 100644
index 0000000000..a0a2f02af5
--- /dev/null
+++ b/editor/icons/source/icon_group.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_ungroup.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_group.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568543"
+ inkscape:cx="14.789684"
+ inkscape:cy="26.718572"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.39215687;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 L 7 7 L 3 7 C 3 6.9999766 2.554 7 2 7 C 1.446 7 1 6.9999766 1 7 L 1 9 L 1 13 C 1 13.000023 1.446 13 2 13 C 2.554 13 3 13.000023 3 13 L 3 9 L 7 9 L 7 13 L 3 13 C 2.9999766 13 3 13.446 3 14 C 3 14.554 2.9999766 15 3 15 L 7 15 C 7 15.000023 7.446 15 8 15 C 8.554 15 9 15.000023 9 15 L 9 13 L 9 9 L 13 9 C 13 9.0000234 13.446 9 14 9 C 14.554 9 15 9.0000234 15 9 L 15 7 L 15 3 C 15 2.9999766 14.554 3 14 3 C 13.446 3 13 2.9999766 13 3 L 13 7 L 9 7 L 9 3 L 13 3 C 13.000023 3 13 2.554 13 2 C 13 1.446 13.000023 1 13 1 L 9 1 C 9 0.99997659 8.554 1 8 1 C 7.446 1 7 0.99997659 7 1 z "
+ id="rect4697"
+ transform="translate(0,1036.3622)" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4679"
+ width="2"
+ height="1.9999826"
+ x="1"
+ y="1049.3622"
+ rx="2.5000134"
+ ry="4.2248896e-05" />
+ <rect
+ ry="4.224963e-05"
+ rx="2.5000134"
+ y="1037.3622"
+ x="1"
+ height="2.0000174"
+ width="2"
+ id="rect4681"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4693"
+ width="2"
+ height="2.0000174"
+ x="13"
+ y="1037.3622"
+ rx="2.5000134"
+ ry="4.224963e-05" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4726"
+ width="2"
+ height="2.0000174"
+ x="13"
+ y="1049.3622"
+ rx="2.5000134"
+ ry="4.224963e-05" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_groups.svg b/editor/icons/source/icon_groups.svg
new file mode 100644
index 0000000000..00249597a4
--- /dev/null
+++ b/editor/icons/source/icon_groups.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_groups.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.2323806"
+ inkscape:cy="8.9952486"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4242"
+ width="14"
+ height="8.0000172"
+ x="1"
+ y="1040.3622" />
+ <ellipse
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4246"
+ cx="5"
+ cy="1044.3622"
+ rx="2"
+ ry="2.0000043" />
+ <ellipse
+ ry="2.0000043"
+ rx="2"
+ cy="1044.3622"
+ cx="11"
+ id="ellipse4248"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_box_container.svg b/editor/icons/source/icon_h_box_container.svg
new file mode 100644
index 0000000000..f180dde93a
--- /dev/null
+++ b/editor/icons/source/icon_h_box_container.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_box_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.0508349"
+ inkscape:cy="9.1486534"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="10"
+ x="5"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="9"
+ height="10"
+ width="2"
+ id="rect4157"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_button_array.svg b/editor/icons/source/icon_h_button_array.svg
new file mode 100644
index 0000000000..9470aeb370
--- /dev/null
+++ b/editor/icons/source/icon_h_button_array.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_button_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="12.020131"
+ inkscape:cy="9.3264403"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="6"
+ height="5.9999828"
+ x="2"
+ y="1041.3622" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10,1041.3622 0,6 4,0 -1,-2 1,-2 -1,-2 -3,0 z"
+ id="rect4158"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1046.3622"
+ x="2"
+ height="0.99996543"
+ width="6"
+ id="rect4161"
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10,1046.3622 0,1 4,0 -0.5,-1 -3.5,0 z"
+ id="rect4163"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_scroll_bar.svg b/editor/icons/source/icon_h_scroll_bar.svg
new file mode 100644
index 0000000000..2f007c7c94
--- /dev/null
+++ b/editor/icons/source/icon_h_scroll_bar.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_scroll_bar.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.1371771"
+ inkscape:cy="7.8450604"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 0,2 10,0 0,6 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4181"
+ width="4"
+ height="4"
+ x="4"
+ y="1042.3622" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4187"
+ width="4"
+ height="4"
+ x="4"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_separator.svg b/editor/icons/source/icon_h_separator.svg
new file mode 100644
index 0000000000..461299731d
--- /dev/null
+++ b/editor/icons/source/icon_h_separator.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_separator.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.302565"
+ inkscape:cy="8.0967779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4156"
+ width="6"
+ height="3.0000174"
+ x="5"
+ y="1038.3622" />
+ <rect
+ y="-15"
+ x="-1045.3622"
+ height="14"
+ width="2"
+ id="rect4158"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ y="1047.3622"
+ x="5"
+ height="3.0000174"
+ width="6"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_slider.svg b/editor/icons/source/icon_h_slider.svg
new file mode 100644
index 0000000000..beee5f8b6a
--- /dev/null
+++ b/editor/icons/source/icon_h_slider.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_slider.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.3533577"
+ inkscape:cy="8.3875011"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 7 L 2 9 L 5.1738281 9 A 3 3 0 0 1 5 8 A 3 3 0 0 1 5.1757812 7 L 2 7 z M 10.826172 7 A 3 3 0 0 1 11 8 A 3 3 0 0 1 10.824219 9 L 14 9 L 14 7 L 10.826172 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4157" />
+ <circle
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4159"
+ cx="2"
+ cy="1044.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1044.3622"
+ cx="14"
+ id="circle4161"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4167"
+ cx="8"
+ cy="1044.3622"
+ r="2" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_split_container.svg b/editor/icons/source/icon_h_split_container.svg
new file mode 100644
index 0000000000..9ca2df0ff1
--- /dev/null
+++ b/editor/icons/source/icon_h_split_container.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_split_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.521964"
+ inkscape:cy="9.8091523"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="10"
+ x="7"
+ y="1039.3622" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,1042.3622 0,4 2,-2 z"
+ id="path4173"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1042.3622 -2,2 2,2 z"
+ id="path4171"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_h_t_t_p_request.svg b/editor/icons/source/icon_h_t_t_p_request.svg
new file mode 100644
index 0000000000..f43141dd7c
--- /dev/null
+++ b/editor/icons/source/icon_h_t_t_p_request.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_h_t_t_p_request.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_t_t_p_request.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="14.357316"
+ inkscape:cy="9.4289864"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4200"
+ width="1"
+ height="5"
+ x="1"
+ y="1046.3622" />
+ <rect
+ y="1048.3622"
+ x="1"
+ height="0.9999826"
+ width="2"
+ id="rect4202"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1046.3622"
+ x="3"
+ height="5"
+ width="1"
+ id="rect4204"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4206"
+ width="1"
+ height="5"
+ x="6"
+ y="1046.3622" />
+ <rect
+ y="1046.3622"
+ x="5"
+ height="1.0000174"
+ width="3"
+ id="rect4208"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1046.3622"
+ x="10"
+ height="5"
+ width="1"
+ id="rect4210"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4212"
+ width="3"
+ height="1.0000174"
+ x="9"
+ y="1046.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4214"
+ width="1"
+ height="5"
+ x="13"
+ y="1046.3622" />
+ <rect
+ y="1046.3622"
+ x="13"
+ height="1.0000174"
+ width="3"
+ id="rect4216"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4218"
+ width="1"
+ height="3.0000174"
+ x="15"
+ y="1046.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4220"
+ width="3"
+ height="1.0000174"
+ x="13"
+ y="1048.3622" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1041.3622 6,0 -3,-4 z"
+ id="path4279"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4281"
+ d="m 9,1040.3622 6,0 -3,4 z"
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4283"
+ width="2"
+ height="3"
+ x="3"
+ y="1041.3622" />
+ <rect
+ y="1037.3622"
+ x="11"
+ height="3"
+ width="2"
+ id="rect4285"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_headphones.svg b/editor/icons/source/icon_headphones.svg
new file mode 100644
index 0000000000..456a9b8d4e
--- /dev/null
+++ b/editor/icons/source/icon_headphones.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_listener.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_headphones.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="17.327656"
+ inkscape:cy="15.295288"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1,1046.3622 0,3 2,0 0,2 2,0 0,-5 -4,0 z"
+ id="rect4168"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11,1046.3622 0,5 2,0 0,-2 2,0 0,-3 -4,0 z"
+ id="rect4170"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1037.3622 a 7,7 0 0 0 -7,7 l 2,0 a 5,5 0 0 1 5,-5 5,5 0 0 1 5,5 l 2,0 a 7,7 0 0 0 -7,-7 z"
+ id="path4185"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4189"
+ width="2"
+ height="2"
+ x="1"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="13"
+ height="2"
+ width="2"
+ id="rect4191"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4194"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1049.3622"
+ cx="-13"
+ id="circle4198"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_help.svg b/editor/icons/source/icon_help.svg
new file mode 100644
index 0000000000..01e85e0f55
--- /dev/null
+++ b/editor/icons/source/icon_help.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_help.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_help.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="5.4018713"
+ inkscape:cy="8.2308388"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#f1f1f1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 4 A 4.0000172 4.0000172 0 0 1 12 8 A 4.0000172 4.0000172 0 0 1 8 12 A 4.0000172 4.0000172 0 0 1 4 8 A 4.0000172 4.0000172 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="circle4160" />
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1 0,3 c 1.1045715,-4.8e-6 2.104267,0.4480167 2.828125,1.171875 L 12.949219,3.0507812 C 11.68247,1.7840321 9.9329986,1.0000047 8,1 Z"
+ transform="translate(0,1036.3622)"
+ id="circle4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ inkscape:transform-center-x="-2.4746095"
+ inkscape:transform-center-y="-4.9140625" />
+ <path
+ inkscape:transform-center-y="2.4746"
+ inkscape:transform-center-x="-4.9140625"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4163"
+ d="m 15,1044.3622 -3,0 c 5e-6,1.1046 -0.448017,2.1043 -1.171875,2.8281 l 2.121094,2.1211 c 1.266749,-1.2667 2.050776,-3.0162 2.050781,-4.9492 z"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1051.3622 0,-3 c -1.1046,0 -2.1043,-0.448 -2.8281,-1.1719 l -2.1211,2.1211 c 1.2667,1.2668 3.0162,2.0508 4.9492,2.0508 z"
+ id="path4165"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ inkscape:transform-center-x="2.4746"
+ inkscape:transform-center-y="4.91405" />
+ <path
+ inkscape:transform-center-y="-2.4746"
+ inkscape:transform-center-x="4.91405"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4167"
+ d="m 1,1044.3622 3,0 c 0,-1.1046 0.448,-2.1043 1.1719,-2.8281 L 3.0508,1039.413 C 1.784,1040.6797 1,1042.4292 1,1044.3622 Z"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_hidden.svg b/editor/icons/source/icon_hidden.svg
new file mode 100644
index 0000000000..1d504f02fb
--- /dev/null
+++ b/editor/icons/source/icon_hidden.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_history.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_hidden.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.8497078"
+ inkscape:cy="4.519077"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 14,1044.3622 c -1,3.5 -4,5 -6,5 -2,0 -5,-1.5 -6,-5"
+ id="path4165"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4136"
+ width="2"
+ height="2"
+ x="7"
+ y="1049.3622" />
+ <rect
+ y="749.42535"
+ x="-733.11163"
+ height="2"
+ width="2"
+ id="rect4138"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-y="4.9497553"
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-x="-4.9497561" />
+ <rect
+ inkscape:transform-center-x="4.9497388"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-y="4.9497553"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4140"
+ width="2"
+ height="2"
+ x="742.42535"
+ y="738.11163" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_hinge_joint.svg b/editor/icons/source/icon_hinge_joint.svg
new file mode 100644
index 0000000000..767feac9d5
--- /dev/null
+++ b/editor/icons/source/icon_hinge_joint.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_area.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_hinge_joint.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.5772937"
+ inkscape:cy="8.9985765"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 4,1045.3622 a 3,2.9999826 0 0 0 -3,3 3,2.9999826 0 0 0 3,3 3,2.9999826 0 0 0 3,-3 3,2.9999826 0 0 0 -3,-3 z m 0,2 a 1.0000231,1.0000174 0 0 1 1,1 1.0000231,1.0000174 0 0 1 -1,1 1.0000231,1.0000174 0 0 1 -1,-1 1.0000231,1.0000174 0 0 1 1,-1 z"
+ id="path4145"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.2832031 1.328125 A 1.0001 1.0001 0 0 0 6.4023438 1.8398438 L 2.7128906 8.2304688 C 3.1188799 8.0916963 3.5469997 8 4 8 C 4.3704308 8 4.722062 8.0678727 5.0625 8.1621094 L 8.1347656 2.8398438 A 1.0001 1.0001 0 0 0 7.2832031 1.328125 z "
+ transform="translate(0,1036.3622)"
+ id="path4147" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1050.3622 10,0"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_history.svg b/editor/icons/source/icon_history.svg
new file mode 100644
index 0000000000..f81390f0f5
--- /dev/null
+++ b/editor/icons/source/icon_history.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_history.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_history.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="0.066428122"
+ inkscape:cy="12.678568"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 9 2 A 6.0000172 6.0000172 0 0 0 3 8 L 5 8 A 4 4 0 0 1 9 4 A 4 4 0 0 1 13 8 A 4 4 0 0 1 9 12 L 9 14 A 6.0000172 6.0000172 0 0 0 15 8 A 6.0000172 6.0000172 0 0 0 9 2 z "
+ transform="translate(0,1036.3622)"
+ id="path4138" />
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4142"
+ sodipodi:sides="3"
+ sodipodi:cx="3"
+ sodipodi:cy="1046.3622"
+ sodipodi:r1="2.236068"
+ sodipodi:r2="1.118034"
+ sodipodi:arg1="1.0471976"
+ sodipodi:arg2="2.0943951"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 4.1180339,1048.2987 -1.6770509,-0.9683 -1.67705101,-0.9682 1.67705101,-0.9683 1.6770511,-0.9682 -1e-7,1.9365 z"
+ inkscape:transform-center-x="0.00013164169"
+ transform="matrix(0,-1.1925797,1.5491989,0,-1617.0232,1049.2732)"
+ inkscape:transform-center-y="0.66664316" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4144"
+ width="2"
+ height="4"
+ x="7.9999828"
+ y="1041.3622" />
+ <rect
+ y="1043.3622"
+ x="7.9999828"
+ height="1.9999826"
+ width="4"
+ id="rect4146"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_hsize.svg b/editor/icons/source/icon_hsize.svg
new file mode 100644
index 0000000000..f24a630770
--- /dev/null
+++ b/editor/icons/source/icon_hsize.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_move.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_size.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.1680801"
+ inkscape:cy="7.9718121"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 4,7 0,-2 -3,3 3,3 0,-2 8,0 0,2 3,-3 -3,-3 0,2 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_image.svg b/editor/icons/source/icon_image.svg
new file mode 100644
index 0000000000..bb15e96251
--- /dev/null
+++ b/editor/icons/source/icon_image.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_image.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="12.684811"
+ inkscape:cy="8.4223992"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 2 1 A 1 1 0 0 0 1 2 L 1 14 A 1 1 0 0 0 2 15 L 14 15 A 1 1 0 0 0 15 14 L 15 2 A 1 1 0 0 0 14 1 L 2 1 z M 3 3 L 13 3 L 13 11 L 3 11 L 3 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4156" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 9 5 L 7.5 7.5 L 6.7988281 8.6679688 L 6.6992188 8.5 L 5.8007812 7 L 4.9003906 8.5 L 4 10 L 5.8007812 10 L 6 10 L 7.5996094 10 L 9 10 L 12 10 L 10.5 7.5 L 9 5 z "
+ transform="translate(0,1036.3622)"
+ id="path4172" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_image_sky_box.svg b/editor/icons/source/icon_image_sky_box.svg
new file mode 100644
index 0000000000..9a89c04e58
--- /dev/null
+++ b/editor/icons/source/icon_image_sky_box.svg
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_image_sky_box.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="9.413879"
+ inkscape:cx="10.701686"
+ inkscape:zoom="32"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4142">
+ <stop
+ style="stop-color:#84c2ff;stop-opacity:1"
+ offset="0"
+ id="stop4144" />
+ <stop
+ style="stop-color:#46a3ff;stop-opacity:1"
+ offset="1"
+ id="stop4146" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4142"
+ id="radialGradient4148"
+ cx="9.9399967"
+ cy="1051.0801"
+ fx="9.9399967"
+ fy="1051.0801"
+ r="7"
+ gradientTransform="matrix(1.3337828e-5,-1.9999995,1.5714282,2.7945105e-6,-1643.697,1071.2392)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="opacity:1;fill:url(#radialGradient4148);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4140"
+ width="14"
+ height="13.999983"
+ x="1"
+ y="1037.3622"
+ ry="2.0000174" />
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 4 A 1 1 0 0 0 5 5 A 1 1 0 0 0 6 6 A 1 1 0 0 0 7 5 A 1 1 0 0 0 6 4 z M 11 5 A 2 2 0 0 0 9 7 A 1 1 0 0 0 8 8 A 1 1 0 0 0 9 9 L 13 9 A 1 1 0 0 0 14 8 A 1 1 0 0 0 13 7 A 2 2 0 0 0 11 5 z M 3 9 A 1 1 0 0 0 2 10 A 1 1 0 0 0 3 11 L 5 11 A 1 1 0 0 0 4 12 A 1 1 0 0 0 5 13 L 8 13 A 1 1 0 0 0 9 12 A 1 1 0 0 0 8 11 L 6 11 A 1 1 0 0 0 7 10 A 1 1 0 0 0 6 9 L 3 9 z "
+ transform="translate(0,1036.3622)"
+ id="path4150" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_image_texture.svg b/editor/icons/source/icon_image_texture.svg
new file mode 100644
index 0000000000..39e88e592b
--- /dev/null
+++ b/editor/icons/source/icon_image_texture.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_image_texture.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.9365814"
+ inkscape:cy="6.4466253"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 2 1 A 1 1 0 0 0 1 2 L 1 14 A 1 1 0 0 0 2 15 L 14 15 A 1 1 0 0 0 15 14 L 15 2 A 1 1 0 0 0 14 1 L 2 1 z M 3 3 L 13 3 L 13 11 L 3 11 L 3 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4156" />
+ <rect
+ y="1043.3622"
+ x="6"
+ height="1"
+ width="2"
+ id="rect4197"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4199"
+ width="2"
+ height="2.0000174"
+ x="6"
+ y="1044.3622" />
+ <rect
+ y="1045.3622"
+ x="4"
+ height="1"
+ width="2"
+ id="rect4201"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4203"
+ width="2"
+ height="2.0000174"
+ x="8"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="10"
+ height="2.0000174"
+ width="2"
+ id="rect4205"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4207"
+ width="3"
+ height="2.0000174"
+ x="8"
+ y="1042.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="1"
+ width="1"
+ id="rect4217"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4219"
+ width="1"
+ height="1"
+ x="5"
+ y="1044.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_immediate_geometry.svg b/editor/icons/source/icon_immediate_geometry.svg
new file mode 100644
index 0000000000..54bc4766d9
--- /dev/null
+++ b/editor/icons/source/icon_immediate_geometry.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_immediate_geometry.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="18.615042"
+ inkscape:cy="6.562585"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ sodipodi:nodetypes="cscsccccsssc"
+ inkscape:connector-curvature="0"
+ id="path4146"
+ d="m 2.920797,1046.3957 c -0.2637264,0.3 -0.4203983,0.7296 -0.4203983,1.2383 0,1.6277 -3.13814186,-0.1781 -0.337569,2.6703 0.8838207,0.899 2.6543881,0.6701 3.538224,-0.2288 0.8838352,-0.899 0.8838163,-2.3565 0,-3.2554 -1.1002211,-1.1191 -2.200058,-1.0845 -2.7802567,-0.4244 z m 2.3801743,-1.6103 2.4004918,2.4416 6.8013899,-6.9177 c 0.662863,-0.6742 0.662863,-1.7673 0,-2.4415 -0.662877,-0.6741 -1.737613,-0.6741 -2.400491,0 z"
+ style="fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_import_check.svg b/editor/icons/source/icon_import_check.svg
new file mode 100644
index 0000000000..606236d82e
--- /dev/null
+++ b/editor/icons/source/icon_import_check.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_import_check.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.5874555"
+ inkscape:cy="7.2488455"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#84ffb1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ d="m 2,1044.3622 4,4 8,-8"
+ id="path4138"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_import_fail.svg b/editor/icons/source/icon_import_fail.svg
new file mode 100644
index 0000000000..b5d142f968
--- /dev/null
+++ b/editor/icons/source/icon_import_fail.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_folder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_import_fail.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.435875"
+ inkscape:cy="8.0921459"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff8484;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2.9902344 1.9902344 A 1.0001 1.0001 0 0 0 2.2929688 3.7070312 L 6.5859375 8 L 2.2929688 12.292969 A 1.0001 1.0001 0 1 0 3.7070312 13.707031 L 8 9.4140625 L 12.292969 13.707031 A 1.0001 1.0001 0 1 0 13.707031 12.292969 L 9.4140625 8 L 13.707031 3.7070312 A 1.0001 1.0001 0 0 0 12.980469 1.9921875 A 1.0001 1.0001 0 0 0 12.292969 2.2929688 L 8 6.5859375 L 3.7070312 2.2929688 A 1.0001 1.0001 0 0 0 2.9902344 1.9902344 z "
+ id="path4139"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_instance.svg b/editor/icons/source/icon_instance.svg
new file mode 100644
index 0000000000..f12e067e7a
--- /dev/null
+++ b/editor/icons/source/icon_instance.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_instance.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_instance_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="0.98066219"
+ inkscape:cy="8.8420536"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 5,1047.3622 6,-6"
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 11 1 C 8.8027056 1 7 2.8027 7 5 C 7 5.3547724 7.0623287 5.6932122 7.1503906 6.0214844 L 9.5449219 3.6269531 C 9.9079388 3.2418883 10.420555 3 11 3 C 12.116414 3 13 3.8836 13 5 C 13 5.5738779 12.763331 6.0828638 12.384766 6.4453125 L 9.9804688 8.8496094 C 10.308197 8.9373587 10.64588 9 11 9 C 13.197294 9 15 7.1973 15 5 C 15 2.8027 13.197294 1 11 1 z M 5 7 C 2.8027056 7 1 8.8027 1 11 C 1 13.1973 2.8027056 15 5 15 C 7.1972944 15 9 13.1973 9 11 C 9 10.645879 8.9373589 10.308197 8.8496094 9.9804688 L 6.4453125 12.384766 C 6.0828657 12.763333 5.5738851 13 5 13 C 3.8835859 13 3 12.1164 3 11 C 3 10.420562 3.24189 9.9079407 3.6269531 9.5449219 L 6.0214844 7.1503906 C 5.6932126 7.0623289 5.3547715 7 5 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_instance_options.svg b/editor/icons/source/icon_instance_options.svg
new file mode 100644
index 0000000000..a8c00bc43f
--- /dev/null
+++ b/editor/icons/source/icon_instance_options.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_instance_options.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.1966464"
+ inkscape:cy="5.5949101"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 7 L 1 13 C 1 14.104569 1.8954305 15 3 15 L 15 15 L 15 7 L 1 7 z M 5 9 L 11 9 L 8 13 L 5 9 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0.7112932,1040.3831 1,1042.3622 l 2.2438279,-0.3273 -0.8182578,-1.9018 -1.7142769,0.25 z m 3.6933293,-0.5387 0.8182578,1.9018 1.9790524,-0.2887 -0.8182579,-1.9018 -1.9790523,0.2887 z m 3.9581047,-0.5775 0.8182579,1.9018 1.9790519,-0.2887 -0.818257,-1.9018 -1.9790528,0.2887 z m 3.9581048,-0.5774 0.818258,1.9018 1.714277,-0.25 -0.288707,-1.9791 -2.243828,0.3273 z"
+ id="rect4138"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-6.7823301"
+ inkscape:transform-center-y="-2" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_integer.svg b/editor/icons/source/icon_integer.svg
new file mode 100644
index 0000000000..d4e7a9860a
--- /dev/null
+++ b/editor/icons/source/icon_integer.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_integer.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="0.4948735"
+ inkscape:cy="6.9110682"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="10"
+ x="6"
+ y="1040.3622" />
+ <rect
+ y="1039.3622"
+ x="4"
+ height="2.0000174"
+ width="6"
+ id="rect4156"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="6"
+ height="2.0000174"
+ x="4"
+ y="1049.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interp_cubic.svg b/editor/icons/source/icon_interp_cubic.svg
new file mode 100644
index 0000000000..7d8d5ef70d
--- /dev/null
+++ b/editor/icons/source/icon_interp_cubic.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interp_cubic.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.5633871"
+ inkscape:cy="5.0840195"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 c 3,0 3,-4 6,-4 3,0 3,4 6,4"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interp_linear.svg b/editor/icons/source/icon_interp_linear.svg
new file mode 100644
index 0000000000..7b1e4f2dd1
--- /dev/null
+++ b/editor/icons/source/icon_interp_linear.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interp_linear.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="64"
+ inkscape:cx="7.2389107"
+ inkscape:cy="6.3582428"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 6,-4 6,4"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interp_raw.svg b/editor/icons/source/icon_interp_raw.svg
new file mode 100644
index 0000000000..e2e2070449
--- /dev/null
+++ b/editor/icons/source/icon_interp_raw.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interp_raw.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.8686169"
+ inkscape:cy="5.8136992"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 3,0 0,-4 6,0 0,4 3,0"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interp_wrap_clamp.svg b/editor/icons/source/icon_interp_wrap_clamp.svg
new file mode 100644
index 0000000000..068e79ace0
--- /dev/null
+++ b/editor/icons/source/icon_interp_wrap_clamp.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interp_wrap_clamp.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.8989222"
+ inkscape:cy="4.5067976"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="5.9999828"
+ x="1"
+ y="1045.3622"
+ rx="1.7382812e-05"
+ ry="1.7382812e-05" />
+ <rect
+ ry="1.7382812e-05"
+ rx="1.7382812e-05"
+ y="1045.3622"
+ x="13"
+ height="5.9999828"
+ width="2"
+ id="rect4156"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 5,1048.3622 6,0"
+ id="path4158"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1046.3622 -2,2 2,2"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="m 10,1046.3622 2,2 -2,2"
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interp_wrap_loop.svg b/editor/icons/source/icon_interp_wrap_loop.svg
new file mode 100644
index 0000000000..bfca46331b
--- /dev/null
+++ b/editor/icons/source/icon_interp_wrap_loop.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interp_wrap_loop.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.8700453"
+ inkscape:cy="4.2719762"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 12 1 L 12 3 A 1.0000174 1.0000174 0 0 1 13 4 A 1.0000174 1.0000174 0 0 1 12 5 L 12 7 A 3 3 0 0 0 15 4 A 3 3 0 0 0 12 1 z "
+ id="path4159"
+ transform="translate(0,1044.3622)" />
+ <path
+ cx="12"
+ cy="1048.3622"
+ r="3"
+ id="path4161"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 4 1 A 3 3 0 0 0 1 4 A 3 3 0 0 0 4 7 L 4 5 A 1.0000174 1.0000174 0 0 1 3 4 A 1.0000174 1.0000174 0 0 1 4 3 L 4 1 z "
+ id="path4176"
+ transform="translate(0,1044.3622)" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4180"
+ width="3"
+ height="2"
+ x="9"
+ y="1045.3622"
+ rx="6.5185495e-06"
+ ry="1.7382799e-05" />
+ <rect
+ ry="1.7382799e-05"
+ rx="6.5185495e-06"
+ y="1049.3622"
+ x="4"
+ height="2"
+ width="3"
+ id="rect4182"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 7,1048.3622 0,4 3,-2 z"
+ id="path4186"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4190"
+ d="m 9,1044.3622 0,4 -3,-2 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_interpolated_camera.svg b/editor/icons/source/icon_interpolated_camera.svg
new file mode 100644
index 0000000000..16fc731c12
--- /dev/null
+++ b/editor/icons/source/icon_interpolated_camera.svg
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_camera.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_interpolated_camera.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.5491949"
+ inkscape:cy="8.618964"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4144"
+ width="10"
+ height="5.0000172"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1037.3622"
+ x="3"
+ height="9.0000172"
+ width="6"
+ id="rect4146"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4148"
+ cx="3"
+ cy="1039.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1044.3622"
+ cx="3"
+ id="circle4150"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4152"
+ cx="9"
+ cy="1039.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1044.3622"
+ cx="9"
+ id="circle4154"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 12,1040.3622 0,3 3,1 0,-5 z"
+ id="rect4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4141"
+ width="1"
+ height="4"
+ x="6"
+ y="1047.3622"
+ ry="0" />
+ <rect
+ ry="0"
+ y="1047.3622"
+ x="7"
+ height="1.0000174"
+ width="1"
+ id="rect4143"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4145"
+ width="1"
+ height="1.0000174"
+ x="7"
+ y="1049.3622"
+ ry="0" />
+ <rect
+ ry="0"
+ y="1048.3622"
+ x="8"
+ height="1.0000174"
+ width="1"
+ id="rect4147"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ ry="0"
+ y="1047.3622"
+ x="3"
+ height="4"
+ width="1"
+ id="rect4149"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ ry="0"
+ y="1048.3622"
+ x="10"
+ height="2.0000174"
+ width="1"
+ id="rect4157"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4159"
+ width="1"
+ height="1.0000174"
+ x="11"
+ y="1047.3622"
+ ry="0" />
+ <rect
+ ry="0"
+ y="1050.3622"
+ x="11"
+ height="1.0000174"
+ width="1"
+ id="rect4161"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4163"
+ width="1"
+ height="2.0000174"
+ x="12"
+ y="1048.3622"
+ ry="0" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4165"
+ sodipodi:type="arc"
+ sodipodi:cx="8"
+ sodipodi:cy="1048.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="0"
+ d="m 7,1048.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z" />
+ <path
+ d="m 7,-1049.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z"
+ sodipodi:end="0"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="-1049.3622"
+ sodipodi:cx="8"
+ sodipodi:type="arc"
+ id="path4167"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <path
+ transform="scale(1,-1)"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4169"
+ sodipodi:type="arc"
+ sodipodi:cx="11"
+ sodipodi:cy="-1050.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="0"
+ d="m 10,-1050.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z" />
+ <path
+ d="m 11,-1050.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z"
+ sodipodi:end="0"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="-1050.3622"
+ sodipodi:cx="12"
+ sodipodi:type="arc"
+ id="path4171"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <path
+ d="m 10,1048.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z"
+ sodipodi:end="0"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="1048.3622"
+ sodipodi:cx="11"
+ sodipodi:type="arc"
+ id="path4173"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4175"
+ sodipodi:type="arc"
+ sodipodi:cx="12"
+ sodipodi:cy="1048.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="0"
+ d="m 11,1048.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_invalid_key.svg b/editor/icons/source/icon_invalid_key.svg
new file mode 100644
index 0000000000..cbccff571a
--- /dev/null
+++ b/editor/icons/source/icon_invalid_key.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_invalid_key.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="6.3598525"
+ inkscape:cy="6.0587147"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 0.46446609,1046.2409 2.12132031,2.1213 -2.12132031,2.1213 1.41421361,1.4142 L 4,1049.7764 l 2.1213203,2.1213 1.4142136,-1.4142 -2.1213203,-2.1213 2.1213203,-2.1213 -1.4142136,-1.4142 L 4,1046.948 l -2.1213203,-2.1213 -1.41421361,1.4142 z"
+ id="rect4156"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_inverse_kinematics.svg b/editor/icons/source/icon_inverse_kinematics.svg
new file mode 100644
index 0000000000..227d22f911
--- /dev/null
+++ b/editor/icons/source/icon_inverse_kinematics.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_camera.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_inverse_kinematics.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="2.6199443"
+ inkscape:cy="8.0718327"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1039.3622 0,12"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4151"
+ cx="3"
+ cy="1039.3622"
+ r="2" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4153"
+ d="m 10,1039.3622 -7,0"
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+ <circle
+ r="2"
+ cy="1039.3622"
+ cx="11"
+ id="circle4155"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="6"
+ height="2"
+ x="8"
+ y="1044.3622" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 11,1039.3622 0,6"
+ id="path4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 10,1046.3622 0,4 -3,-2 1,-2 z"
+ id="path4165"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4167"
+ d="m 12,1046.3622 0,4 3,-2 -1,-2 z"
+ style="fill:#fc9c9c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_item_list.svg b/editor/icons/source/icon_item_list.svg
new file mode 100644
index 0000000000..943f6fe435
--- /dev/null
+++ b/editor/icons/source/icon_item_list.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_item_list.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.1722679"
+ inkscape:cy="6.5280035"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="2.0000174"
+ x="4"
+ y="1040.3622" />
+ <rect
+ y="1040.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4157"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4159"
+ width="2"
+ height="2.0000174"
+ x="10"
+ y="1040.3622" />
+ <rect
+ y="1043.3622"
+ x="4"
+ height="2.0000174"
+ width="2"
+ id="rect4161"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4163"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1043.3622" />
+ <rect
+ y="1043.3622"
+ x="10"
+ height="2.0000174"
+ width="2"
+ id="rect4165"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="2"
+ height="2.0000174"
+ x="4"
+ y="1046.3622" />
+ <rect
+ y="1046.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4169"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="2"
+ height="2.0000174"
+ x="10"
+ y="1046.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_joy_axis.svg b/editor/icons/source/icon_joy_axis.svg
new file mode 100644
index 0000000000..9313342a53
--- /dev/null
+++ b/editor/icons/source/icon_joy_axis.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_joy_axis.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="11.922691"
+ inkscape:cy="9.5384233"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4194"
+ width="7"
+ height="14"
+ x="27"
+ y="1038.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 L 1 13 A 2 2 0 0 0 3 15 L 15 15 L 15 1 L 3 1 z M 7 3 L 9 3 A 1 1 0 0 1 10 4 L 10 6 L 12 6 A 1 1 0 0 1 13 7 L 13 9 A 1 1 0 0 1 12 10 L 10 10 L 10 12 A 1 1 0 0 1 9 13 L 7 13 A 1 1 0 0 1 6 12 L 6 10 L 4 10 A 1 1 0 0 1 3 9 L 3 7 A 1 1 0 0 1 4 6 L 6 6 L 6 4 A 1 1 0 0 1 7 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4196" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4251"
+ cx="8"
+ cy="1044.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_joy_button.svg b/editor/icons/source/icon_joy_button.svg
new file mode 100644
index 0000000000..f6d4344807
--- /dev/null
+++ b/editor/icons/source/icon_joy_button.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_joy_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="4.6871235"
+ inkscape:cy="9.8655688"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4194"
+ width="7"
+ height="14"
+ x="27"
+ y="1038.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 3 C 15 1.8954 14.104569 1 13 1 L 1 1 z M 8 2 A 2 2 0 0 1 10 4 A 2 2 0 0 1 8 6 A 2 2 0 0 1 6 4 A 2 2 0 0 1 8 2 z M 4 6 A 2 2 0 0 1 6 8 A 2 2 0 0 1 4 10 A 2 2 0 0 1 2 8 A 2 2 0 0 1 4 6 z M 12 6 A 2 2 0 0 1 14 8 A 2 2 0 0 1 12 10 A 2 2 0 0 1 10 8 A 2 2 0 0 1 12 6 z M 8 10 A 2 2 0 0 1 10 12 A 2 2 0 0 1 8 14 A 2 2 0 0 1 6 12 A 2 2 0 0 1 8 10 z "
+ transform="translate(0,1036.3622)"
+ id="rect4196" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_joypad.svg b/editor/icons/source/icon_joypad.svg
new file mode 100644
index 0000000000..fb84462919
--- /dev/null
+++ b/editor/icons/source/icon_joypad.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_joypad.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="5.8962884"
+ inkscape:cy="8.9449522"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 1 3 C 0.4477381 3.0000552 5.52e-05 3.4477381 0 4 L 0 12 C 5.52e-05 12.552262 0.4477381 12.999945 1 13 L 15 13 C 15.552262 12.999945 15.999945 12.552262 16 12 L 16 4 C 15.999945 3.4477381 15.552262 3.0000552 15 3 L 1 3 z M 3 5 L 5 5 L 5 7 L 7 7 L 7 9 L 5 9 L 5 11 L 3 11 L 3 9 L 1 9 L 1 7 L 3 7 L 3 5 z M 13.5 5 A 1.5 1.5 0 0 1 15 6.5 A 1.5 1.5 0 0 1 13.5 8 A 1.5 1.5 0 0 1 12 6.5 A 1.5 1.5 0 0 1 13.5 5 z M 10.5 8 A 1.4999913 1.4999913 0 0 1 12 9.5 A 1.4999913 1.4999913 0 0 1 10.5 11 A 1.4999913 1.4999913 0 0 1 9 9.5 A 1.4999913 1.4999913 0 0 1 10.5 8 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key.svg b/editor/icons/source/icon_key.svg
new file mode 100644
index 0000000000..f5d7b85381
--- /dev/null
+++ b/editor/icons/source/icon_key.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_key.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254836"
+ inkscape:cx="8.7548948"
+ inkscape:cy="9.2532814"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11 4 A 4 4.0000024 0 0 0 7 8 A 4 4.0000024 0 0 0 11 12 A 4 4.0000024 0 0 0 15 8 A 4 4.0000024 0 0 0 11 4 z M 11 6 A 2.0000174 2.0000174 0 0 1 13 8 A 2.0000174 2.0000174 0 0 1 11 10 A 2.0000174 2.0000174 0 0 1 9 8 A 2.0000174 2.0000174 0 0 1 11 6 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4141"
+ width="8"
+ height="2"
+ x="1"
+ y="1043.3622" />
+ <rect
+ y="1045.3622"
+ x="2"
+ height="2"
+ width="3"
+ id="rect4144"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_hover.svg b/editor/icons/source/icon_key_hover.svg
new file mode 100644
index 0000000000..c3f34a781b
--- /dev/null
+++ b/editor/icons/source/icon_key_hover.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_key_hover.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="0.40602789"
+ inkscape:cy="4.9542089"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#8fdeef;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 0 A 4 3.9999914 0 0 0 0 4 A 4 3.9999914 0 0 0 4 8 A 4 3.9999914 0 0 0 8 4 A 4 3.9999914 0 0 0 4 0 z "
+ transform="translate(0,1044.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_invalid.svg b/editor/icons/source/icon_key_invalid.svg
new file mode 100644
index 0000000000..b6407dc178
--- /dev/null
+++ b/editor/icons/source/icon_key_invalid.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key_invalid.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_key_invalid.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="0.95360267"
+ inkscape:cy="5.9962147"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 0.46446609,1046.2409 2.12132031,2.1213 -2.12132031,2.1213 1.41421361,1.4142 L 4,1049.7764 l 2.1213203,2.1213 1.4142136,-1.4142 -2.1213203,-2.1213 2.1213203,-2.1213 -1.4142136,-1.4142 L 4,1046.948 l -2.1213203,-2.1213 -1.41421361,1.4142 z"
+ id="rect4156"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_next.svg b/editor/icons/source/icon_key_next.svg
new file mode 100644
index 0000000000..942245305c
--- /dev/null
+++ b/editor/icons/source/icon_key_next.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_key_next.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.9672408"
+ inkscape:cy="7.1977527"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11 9 L 11 11 L 9 11 L 9 13 L 11 13 L 11 15 L 13 15 L 13 13 L 15 13 L 15 11 L 13 11 L 13 9 L 11 9 z "
+ transform="translate(0,1036.3622)"
+ id="rect4156" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11 1 A 4 4.0000024 0 0 0 7.1308594 4 L 1 4 L 1 6 L 2 6 L 2 8 L 5 8 L 5 6 L 7.1328125 6 A 4 4.0000024 0 0 0 10 8.8691406 L 10 8 L 13.638672 8 A 4 4.0000024 0 0 0 15 5 A 4 4.0000024 0 0 0 11 1 z M 11 3 A 2.0000174 2.0000174 0 0 1 13 5 A 2.0000174 2.0000174 0 0 1 11 7 A 2.0000174 2.0000174 0 0 1 9 5 A 2.0000174 2.0000174 0 0 1 11 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4137-6" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_selected.svg b/editor/icons/source/icon_key_selected.svg
new file mode 100644
index 0000000000..c3f01dbec8
--- /dev/null
+++ b/editor/icons/source/icon_key_selected.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_key_selected.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="3.4232555"
+ inkscape:cy="4.5626603"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#e7e7e7;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 0 A 4 3.9999914 0 0 0 0 4 A 4 3.9999914 0 0 0 4 8 A 4 3.9999914 0 0 0 8 4 A 4 3.9999914 0 0 0 4 0 z "
+ transform="translate(0,1044.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_value.svg b/editor/icons/source/icon_key_value.svg
new file mode 100644
index 0000000000..5e6333e54b
--- /dev/null
+++ b/editor/icons/source/icon_key_value.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_key_value.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="3.2850619"
+ inkscape:cy="5.046338"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#3da9bf;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 0 A 4 3.9999914 0 0 0 0 4 A 4 3.9999914 0 0 0 4 8 A 4 3.9999914 0 0 0 8 4 A 4 3.9999914 0 0 0 4 0 z "
+ transform="translate(0,1044.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_key_xform.svg b/editor/icons/source/icon_key_xform.svg
new file mode 100644
index 0000000000..06a282f705
--- /dev/null
+++ b/editor/icons/source/icon_key_xform.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_key_xform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.417341"
+ inkscape:cx="3.2850619"
+ inkscape:cy="5.046338"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="opacity:1;fill:#bf523c;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 0 A 4 3.9999914 0 0 0 0 4 A 4 3.9999914 0 0 0 4 8 A 4 3.9999914 0 0 0 8 4 A 4 3.9999914 0 0 0 4 0 z "
+ transform="translate(0,1044.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_keyboard.svg b/editor/icons/source/icon_keyboard.svg
new file mode 100644
index 0000000000..a03798e4a4
--- /dev/null
+++ b/editor/icons/source/icon_keyboard.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_keyboard.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="8.7357101"
+ inkscape:cy="7.1330996"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 4 L 1 13 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 4 L 14 4 L 14 13 A 0.9999826 0.9999826 0 0 1 13 14 L 3 14 A 1 1 0 0 1 2 13 L 2 4 L 1 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4194"
+ width="7"
+ height="14"
+ x="27"
+ y="1038.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 2 A 1 1 0 0 0 3 3 L 3 12.083984 A 1 0.91666667 0 0 0 4 13 L 12 13 A 1 0.91666667 0 0 0 13 12.083984 L 13 3 A 1 1 0 0 0 12 2 L 4 2 z M 5 4 L 7 4 L 7 7 L 9 4 L 11 4 L 9 7 L 11 11 L 9 11 L 7 7 L 7 11 L 5 11 L 5 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4163" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_kinematic_body.svg b/editor/icons/source/icon_kinematic_body.svg
new file mode 100644
index 0000000000..6a4c8965ab
--- /dev/null
+++ b/editor/icons/source/icon_kinematic_body.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite_3d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_kinematic_body.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.6970468"
+ inkscape:cy="8.9585231"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 4 L 4 5 L 5 5 L 5 4 L 4 4 z M 5 5 L 5 6 L 4 6 L 4 7 L 3 7 L 3 8 L 2 8 L 2 9 L 2 11 L 3 11 L 3 9 L 4 9 L 4 10 L 4 11 L 5 11 L 5 10 L 10 10 L 10 11 L 11 11 L 11 9 L 12 9 L 12 11 L 13 11 L 13 9 L 13 8 L 12 8 L 12 7 L 11 7 L 11 6 L 10 6 L 10 5 L 9 5 L 9 6 L 6 6 L 6 5 L 5 5 z M 10 5 L 11 5 L 11 4 L 10 4 L 10 5 z M 10 11 L 8 11 L 8 12 L 10 12 L 10 11 z M 5 11 L 5 12 L 7 12 L 7 11 L 5 11 z M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 z M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_kinematic_body_2d.svg b/editor/icons/source/icon_kinematic_body_2d.svg
new file mode 100644
index 0000000000..04f140b930
--- /dev/null
+++ b/editor/icons/source/icon_kinematic_body_2d.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite_3d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_kinematic_body_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.6970468"
+ inkscape:cy="8.9585231"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 4 L 4 5 L 5 5 L 5 4 L 4 4 z M 5 5 L 5 6 L 4 6 L 4 7 L 3 7 L 3 8 L 2 8 L 2 9 L 2 11 L 3 11 L 3 9 L 4 9 L 4 10 L 4 11 L 5 11 L 5 10 L 10 10 L 10 11 L 11 11 L 11 9 L 12 9 L 12 11 L 13 11 L 13 9 L 13 8 L 12 8 L 12 7 L 11 7 L 11 6 L 10 6 L 10 5 L 9 5 L 9 6 L 6 6 L 6 5 L 5 5 z M 10 5 L 11 5 L 11 4 L 10 4 L 10 5 z M 10 11 L 8 11 L 8 12 L 10 12 L 10 11 z M 5 11 L 5 12 L 7 12 L 7 11 L 5 11 z M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 z M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_label.svg b/editor/icons/source/icon_label.svg
new file mode 100644
index 0000000000..ac9b52be6f
--- /dev/null
+++ b/editor/icons/source/icon_label.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_label.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="5.6511357"
+ inkscape:cy="8.5870222"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5efac;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 6 3 A 1.0001 1.0001 0 0 0 5.2929688 3.2929688 L 1.2929688 7.2929688 A 1.0001 1.0001 0 0 0 1.2929688 8.7070312 L 5.2929688 12.707031 A 1.0001 1.0001 0 0 0 6 13 L 14 13 A 1.0001 1.0001 0 0 0 15 12 L 15 4 A 1.0001 1.0001 0 0 0 14 3 L 6 3 z M 5 7 A 1 1 0 0 1 6 8 A 1 1 0 0 1 5 9 A 1 1 0 0 1 4 8 A 1 1 0 0 1 5 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4164" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_large_texture.svg b/editor/icons/source/icon_large_texture.svg
new file mode 100644
index 0000000000..4db0342041
--- /dev/null
+++ b/editor/icons/source/icon_large_texture.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_large_texture.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.856598"
+ inkscape:cy="8.2673025"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 1 1 L 1 2 L 1 4 L 2 4 L 2 2 L 4 2 L 4 1 L 1 1 z M 12 1 L 12 2 L 14 2 L 14 4 L 15 4 L 15 1 L 12 1 z M 9 6 L 9 7 L 8 7 L 8 8 L 6 8 L 6 9 L 5 9 L 5 10 L 4 10 L 4 11 L 6 11 L 8 11 L 10 11 L 12 11 L 12 9 L 11 9 L 11 8 L 11 7 L 10 7 L 10 6 L 9 6 z M 1 12 L 1 14 L 1 15 L 4 15 L 4 14 L 2 14 L 2 12 L 1 12 z M 14 12 L 14 14 L 12 14 L 12 15 L 15 15 L 15 14 L 15 12 L 14 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_light_2d.svg b/editor/icons/source/icon_light_2d.svg
new file mode 100644
index 0000000000..27e07a649a
--- /dev/null
+++ b/editor/icons/source/icon_light_2d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_light_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="9.9569833"
+ inkscape:cy="9.5332545"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 5 5 0 0 0 3 6 A 5 5 0 0 0 6 10.576172 L 6 13 L 10 13 L 10 10.580078 A 5 5 0 0 0 13 6 A 5 5 0 0 0 8 1 z M 8 3 A 3 3 0 0 1 11 6 A 3 3 0 0 1 8 9 A 3 3 0 0 1 5 6 A 3 3 0 0 1 8 3 z M 7 14 L 7 15 L 9 15 L 9 14 L 7 14 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_light_occluder_2d.svg b/editor/icons/source/icon_light_occluder_2d.svg
new file mode 100644
index 0000000000..3558f3f2da
--- /dev/null
+++ b/editor/icons/source/icon_light_occluder_2d.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_light_occluder_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="6.2930917"
+ inkscape:cy="8.3953902"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4187"
+ width="14"
+ height="2"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1042.3622"
+ x="1"
+ height="2"
+ width="14"
+ id="rect4189"
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4191"
+ width="14"
+ height="2"
+ x="1"
+ y="1045.3622" />
+ <rect
+ y="1048.3622"
+ x="1"
+ height="2"
+ width="14"
+ id="rect4193"
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4195"
+ width="1"
+ height="14"
+ x="2"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="13"
+ height="14"
+ width="1"
+ id="rect4197"
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1037.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4199"
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_line_2d.svg b/editor/icons/source/icon_line_2d.svg
new file mode 100644
index 0000000000..7f833f4a9c
--- /dev/null
+++ b/editor/icons/source/icon_line_2d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="D:\PROJETS\INFO\GODOT\ENGINE\godot_fork\tools\editor\icons\2x\icon_line_2d.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"
+ sodipodi:docname="icon_line_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="7.5587317"
+ inkscape:cy="9.1781644"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ inkscape:snap-grids="true"
+ inkscape:object-nodes="true"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#a5b7f3;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.98823529"
+ d="m 2,1045.3622 3,4 3,-10 3,6 3,-2"
+ id="path4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_line_edit.svg b/editor/icons/source/icon_line_edit.svg
new file mode 100644
index 0000000000..61ba1ebe7e
--- /dev/null
+++ b/editor/icons/source/icon_line_edit.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_line_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="4.4635244"
+ inkscape:cy="8.6660933"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 0,2 10,0 0,6 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="1"
+ height="4.0000172"
+ x="4"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_line_shape_2d.svg b/editor/icons/source/icon_line_shape_2d.svg
new file mode 100644
index 0000000000..6a8ab39ef3
--- /dev/null
+++ b/editor/icons/source/icon_line_shape_2d.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_line_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="0.66215304"
+ inkscape:cy="8.0069586"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#68b6ff;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.39215687;fill-opacity:1"
+ d="m 1,1037.3622 14,14"
+ id="path4139"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 3,1039.3622 10,10"
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.58823532" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1041.3622 6,6"
+ id="path4203"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_link_button.svg b/editor/icons/source/icon_link_button.svg
new file mode 100644
index 0000000000..3872e43b29
--- /dev/null
+++ b/editor/icons/source/icon_link_button.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_link_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="5.7987745"
+ inkscape:cy="9.6365238"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6 7 A 0.9999826 0.9999826 0 0 0 5 8 A 0.9999826 0.9999826 0 0 0 6 9 L 10 9 A 0.9999826 0.9999826 0 0 0 11 8 A 0.9999826 0.9999826 0 0 0 10 7 L 6 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4244" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6 3 A 5 5 0 0 0 1.6699219 5.5 A 5 5 0 0 0 1.6699219 10.5 A 5 5 0 0 0 6 13 L 7 13 L 7 11 L 6 11 A 3 3 0 0 1 3 8 A 3 3 0 0 1 6 5 L 7 5 L 7 3 L 6 3 z M 9 3 L 9 5 L 10 5 A 3 3 0 0 1 13 8 A 3 3 0 0 1 10 11 L 9 11 L 9 13 L 10 13 A 5 5 0 0 0 14.330078 10.5 A 5 5 0 0 0 14.330078 5.5 A 5 5 0 0 0 10 3 L 9 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4225" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_list_select.svg b/editor/icons/source/icon_list_select.svg
new file mode 100644
index 0000000000..569a0c6fea
--- /dev/null
+++ b/editor/icons/source/icon_list_select.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_list_select.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_list_select.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="27.124914"
+ inkscape:cx="6.2157972"
+ inkscape:cy="6.8765984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.63636994,0,0,0.63636994,11.81847,382.85245)"
+ inkscape:label="Layer 1"
+ id="g4515"
+ style="stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 15 L 9.2578125 15 L 8.4355469 13 L 3 13 L 3 11 L 7.6113281 11 L 6.7890625 9 L 3 9 L 3 7 L 6.8867188 7 A 1.50015 1.50015 0 0 1 7.984375 6.5019531 L 7.984375 6.5 A 1.50015 1.50015 0 0 1 8.5703125 6.6113281 L 9.515625 7 L 10 7 L 10 7.1992188 L 12 8.0214844 L 12 1 L 1 1 z M 3 3 L 10 3 L 10 5 L 3 5 L 3 3 z M 10.755859 10.755859 L 11.279297 12.029297 A 1.50015 1.50015 0 0 1 11.759766 11.759766 A 1.50015 1.50015 0 0 1 12 11.320312 L 12 11.269531 L 10.755859 10.755859 z "
+ transform="translate(0,1036.3622)"
+ id="rect4138" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16,1047.6532 -8,-3.291 3.290998,8 0.947104,-2.8201 1.8836,1.8835 0.941801,-0.9418 -1.8836,-1.8835 z"
+ id="rect4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_listener.svg b/editor/icons/source/icon_listener.svg
new file mode 100644
index 0000000000..f815cb842a
--- /dev/null
+++ b/editor/icons/source/icon_listener.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_listener.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_listener.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254831"
+ inkscape:cx="10.056734"
+ inkscape:cy="9.0499711"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.928203,1038.3622 -1.738281,1.0039 a 6,6 0 0 1 0.810547,2.9961 6,6 0 0 1 -0.808594,2.998 l 1.736328,1.002 a 8,8 0 0 0 0,-8 z"
+ id="path4274"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4147"
+ width="1"
+ height="2"
+ x="3"
+ y="1049.3622" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6 1 A 5 5 0 0 0 1 6 L 3 6 A 3 3 0 0 1 6 3 A 3 3 0 0 1 9 6 L 11 6 A 5 5 0 0 0 6 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4149" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1042.3622 c 0,4 -3,4 -3,5 0,3 -2,3 -3,3"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_load.svg b/editor/icons/source/icon_load.svg
new file mode 100644
index 0000000000..395a5c1b8a
--- /dev/null
+++ b/editor/icons/source/icon_load.svg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/godotengine/godot/tools/editor/icons/2x/icon_load.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"
+ sodipodi:docname="icon_load.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.3187685"
+ inkscape:cy="7.6629717"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ spacingx="1"
+ spacingy="1"
+ empspacing="2" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4153"
+ width="1"
+ height="8.9999657"
+ x="1"
+ y="1040.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1038.3622 c -1.1045695,0 -2,0.8954 -2,2 l 1,0 c 0,-0.5523 0.4477153,-1 1,-1 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6,6 C 5.643017,6.0002824 5.313257,6.1908435 5.1347656,6.5 5.0426478,6.6588009 4.9960226,6.8398957 5,7.0234375 L 4,13 c -0.091144,0.544728 -0.4477153,1 -1,1 l 0,1 9,0 c 1.10457,0 1.818405,-0.910429 2,-2 L 15,7 C 15.003977,6.8164581 14.957352,6.6588009 14.865234,6.5 14.686743,6.1908437 14.356983,6.0002826 14,6 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4159"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccsccsscccc" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4182"
+ width="2"
+ height="1"
+ x="3"
+ y="1038.3622" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4184"
+ d="m 5,1038.3622 c 1.10457,0 2,0.8954 2,2 l -1,0 c 0,-0.5523 -0.4477153,-1 -1,-1 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4188"
+ d="m 3,1051.3622 c -1.1045695,0 -2,-0.8954 -2,-2 l 1,0 c 0,0.5523 0.4477153,1 1,1 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1040.3622"
+ x="7"
+ height="1"
+ width="4"
+ id="rect4192"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 7,1041.3622 A 1,1 0 0 1 6.2928932,1041.0693 1,1 0 0 1 6,1040.3622 l 1,0 z"
+ sodipodi:end="3.1415927"
+ sodipodi:start="1.5707963"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="1040.3622"
+ sodipodi:cx="7"
+ sodipodi:type="arc"
+ id="path4208"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4210"
+ sodipodi:type="arc"
+ sodipodi:cx="-11"
+ sodipodi:cy="-1041.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="1.5707963"
+ sodipodi:end="3.1415927"
+ d="m -11,-1040.3622 a 1,1 0 0 1 -0.707107,-0.2929 A 1,1 0 0 1 -12,-1041.3622 l 1,0 z"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_lock.svg b/editor/icons/source/icon_lock.svg
new file mode 100644
index 0000000000..140b073e83
--- /dev/null
+++ b/editor/icons/source/icon_lock.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_lock.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_lock.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="7.4297739"
+ inkscape:cy="8.7439404"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="false"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-others="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.63636994,0,0,0.63636994,11.81847,382.85245)"
+ inkscape:label="Layer 1"
+ id="g4515"
+ style="stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 8 L 2 15 L 14 15 L 14 8 L 2 8 z M 7 10 L 9 10 L 9 13 L 7 13 L 7 10 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 5 5 0 0 0 3 6 L 5 6 A 3 3 0 0 1 8 3 A 3 3 0 0 1 11 6 L 13 6 A 5 5 0 0 0 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4141" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4145"
+ width="2"
+ height="2"
+ x="3"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="11"
+ height="2"
+ width="2"
+ id="rect4147"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_loop.svg b/editor/icons/source/icon_loop.svg
new file mode 100644
index 0000000000..fe7f648648
--- /dev/null
+++ b/editor/icons/source/icon_loop.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_loop.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_loop.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="4.2604173"
+ inkscape:cy="8.1780194"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="matrix(0,-1,1,0,-1021.3622,1033.3622)" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 L 8 3 L 6 3 A 5 5 0 0 0 1 8 A 5 5 0 0 0 2.0039062 10.996094 L 3.4394531 9.5605469 A 3.0000174 3.0000174 0 0 1 3 8 A 3.0000174 3.0000174 0 0 1 6 5 L 8 5 L 8 7 L 10 5.5 L 12 4 L 10 2.5 L 8 1 z M 13.996094 5.0039062 L 12.560547 6.4394531 A 3.0000174 3.0000174 0 0 1 13 8 A 3.0000174 3.0000174 0 0 1 10 11 L 8 11 L 8 9 L 6 10.5 L 4 12 L 6 13.5 L 8 15 L 8 13 L 10 13 A 5 5 0 0 0 15 8 A 5 5 0 0 0 13.996094 5.0039062 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_loop_interpolation.svg b/editor/icons/source/icon_loop_interpolation.svg
new file mode 100644
index 0000000000..3733acb253
--- /dev/null
+++ b/editor/icons/source/icon_loop_interpolation.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_loop_interpolation.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_loop_interpolation.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.8522581"
+ inkscape:cy="6.9411054"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="matrix(0,-1,1,0,-1021.3622,1033.3622)" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4155"
+ cx="3"
+ cy="1048.3622"
+ r="2" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 4 3 A 2 2 0 0 0 2.2675781 4 A 2 2 0 0 0 2.0019531 5 L 2 5 L 2 5.046875 L 2 12 L 4 12 L 4 7 L 4 5 L 6 5 L 6 3 L 4 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6,1037.3622 0,6 4,-3 z"
+ id="path4159"
+ inkscape:connector-curvature="0" />
+ <circle
+ r="2"
+ cy="1040.3622"
+ cx="13"
+ id="circle4161"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 12 4 L 12 9 L 12 11 L 10 11 L 10 13 L 12 13 A 2 2 0 0 0 13.732422 12 A 2 2 0 0 0 13.998047 11 L 14 11 L 14 4 L 12 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4163" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4165"
+ d="m 10,1045.3622 0,6 -4,-3 z"
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_main_play.svg b/editor/icons/source/icon_main_play.svg
new file mode 100644
index 0000000000..0fb48bb155
--- /dev/null
+++ b/editor/icons/source/icon_main_play.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_main_play.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="15.834447"
+ inkscape:cy="8.0362747"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#f0f0f0;fill-rule:evenodd;stroke:#f0f0f0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="m 4,1048.3622 0,-8 7,4 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_main_stop.svg b/editor/icons/source/icon_main_stop.svg
new file mode 100644
index 0000000000..9d01bd5cf5
--- /dev/null
+++ b/editor/icons/source/icon_main_stop.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_main_stop.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.8738646"
+ inkscape:cy="9.1632261"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#f0f0f0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1048.3622 0,-8 8,0 0,8 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_margin_container.svg b/editor/icons/source/icon_margin_container.svg
new file mode 100644
index 0000000000..68a6971bd7
--- /dev/null
+++ b/editor/icons/source/icon_margin_container.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_margin_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.7167766"
+ inkscape:cy="8.4381827"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4161"
+ d="m 4,1042.3622 0,4 2,-2 z"
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_cube.svg b/editor/icons/source/icon_material_preview_cube.svg
new file mode 100644
index 0000000000..2e8e5a6457
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_cube.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_preview_cube.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="10.554008"
+ inkscape:cx="9.2398162"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#d5d5d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8 1 L 1 4 L 1 12 L 8 15 L 15 12 L 15 4 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4151" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1040.3622 7,3 7,-3 -7,-3 z"
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1051.3622 -7,-3 0,-8 7,3 z"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4145"
+ d="m 8,1051.3622 7,-3 0,-8 -7,3 z"
+ style="fill:#d5d5d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_cube_off.svg b/editor/icons/source/icon_material_preview_cube_off.svg
new file mode 100644
index 0000000000..e03905ed05
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_cube_off.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_preview_cube_off.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="9.0822476"
+ inkscape:cx="11.618357"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#d5d5d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 8 1 L 1 4 L 1 12 L 8 15 L 15 12 L 15 4 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4151" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1040.3622 7,3 7,-3 -7,-3 z"
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1051.3622 -7,-3 0,-8 7,3 z"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4145"
+ d="m 8,1051.3622 7,-3 0,-8 -7,3 z"
+ style="fill:#d5d5d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ id="path4191"
+ d="m 8,1037.3622 -7,3 0,8 7,3 7,-3 0,-8 -7,-3 z"
+ style="fill:#000000;fill-opacity:0.23529412;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_light_1.svg b/editor/icons/source/icon_material_preview_light_1.svg
new file mode 100644
index 0000000000..d8335641f6
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_light_1.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_light_1.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.8395758"
+ inkscape:cx="9.8577371"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 3.7578125 2.34375 L 2.34375 3.7578125 L 3.7578125 5.171875 L 5.171875 3.7578125 L 3.7578125 2.34375 z M 12.242188 2.34375 L 10.828125 3.7578125 L 12.242188 5.171875 L 13.65625 3.7578125 L 12.242188 2.34375 z M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 7 5 L 9 5 L 9 6 L 9 11 L 8 11 L 8 6 L 7 6 L 7 5 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 13 7 L 13 9 L 15 9 L 15 7 L 13 7 z M 3.7578125 10.828125 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.171875 12.242188 L 3.7578125 10.828125 z M 12.242188 10.828125 L 10.828125 12.242188 L 12.242188 13.65625 L 13.65625 12.242188 L 12.242188 10.828125 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_light_1_off.svg b/editor/icons/source/icon_material_preview_light_1_off.svg
new file mode 100644
index 0000000000..c387b1845b
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_light_1_off.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_light_1_off.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.8395758"
+ inkscape:cx="9.8577371"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 3.7578125 2.34375 L 2.34375 3.7578125 L 3.7578125 5.171875 L 5.171875 3.7578125 L 3.7578125 2.34375 z M 12.242188 2.34375 L 10.828125 3.7578125 L 12.242188 5.171875 L 13.65625 3.7578125 L 12.242188 2.34375 z M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 7 5 L 9 5 L 9 6 L 9 11 L 8 11 L 8 6 L 7 6 L 7 5 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 13 7 L 13 9 L 15 9 L 15 7 L 13 7 z M 3.7578125 10.828125 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.171875 12.242188 L 3.7578125 10.828125 z M 12.242188 10.828125 L 10.828125 12.242188 L 12.242188 13.65625 L 13.65625 12.242188 L 12.242188 10.828125 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_light_2.svg b/editor/icons/source/icon_material_preview_light_2.svg
new file mode 100644
index 0000000000..f192c19959
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_light_2.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_light_2.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.4131842"
+ inkscape:cx="7.6431783"
+ inkscape:zoom="45.254832"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 3.7578125 2.34375 L 2.34375 3.7578125 L 3.7578125 5.171875 L 5.171875 3.7578125 L 3.7578125 2.34375 z M 12.242188 2.34375 L 10.828125 3.7578125 L 12.242188 5.171875 L 13.65625 3.7578125 L 12.242188 2.34375 z M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 7 5 L 9 5 L 9 7 L 9 8 L 7 8 L 7 9 L 9 9 L 9 10 L 7 10 L 6 10 L 6 8 L 6 7 L 8 7 L 8 6 L 7 6 L 7 5 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 13 7 L 13 9 L 15 9 L 15 7 L 13 7 z M 3.7578125 10.828125 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.171875 12.242188 L 3.7578125 10.828125 z M 12.242188 10.828125 L 10.828125 12.242188 L 12.242188 13.65625 L 13.65625 12.242188 L 12.242188 10.828125 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_light_2_off.svg b/editor/icons/source/icon_material_preview_light_2_off.svg
new file mode 100644
index 0000000000..9d71248cba
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_light_2_off.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_light_2_off.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.4131842"
+ inkscape:cx="7.6431783"
+ inkscape:zoom="45.254832"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 3.7578125 2.34375 L 2.34375 3.7578125 L 3.7578125 5.171875 L 5.171875 3.7578125 L 3.7578125 2.34375 z M 12.242188 2.34375 L 10.828125 3.7578125 L 12.242188 5.171875 L 13.65625 3.7578125 L 12.242188 2.34375 z M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 7 5 L 9 5 L 9 7 L 9 8 L 7 8 L 7 9 L 9 9 L 9 10 L 7 10 L 6 10 L 6 8 L 6 7 L 8 7 L 8 6 L 7 6 L 7 5 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 13 7 L 13 9 L 15 9 L 15 7 L 13 7 z M 3.7578125 10.828125 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.171875 12.242188 L 3.7578125 10.828125 z M 12.242188 10.828125 L 10.828125 12.242188 L 12.242188 13.65625 L 13.65625 12.242188 L 12.242188 10.828125 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ <path
+ id="path4176"
+ transform="translate(0,1036.3622)"
+ d="M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 3.7578125 2.34375 L 2.34375 3.7578125 L 3.7578125 5.171875 L 5.171875 3.7578125 L 3.7578125 2.34375 z M 12.242188 2.34375 L 10.828125 3.7578125 L 12.242188 5.171875 L 13.65625 3.7578125 L 12.242188 2.34375 z M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 7 5 L 9 5 L 9 7 L 9 8 L 7 8 L 7 9 L 9 9 L 9 10 L 7 10 L 6 10 L 6 8 L 6 7 L 8 7 L 8 6 L 7 6 L 7 5 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 13 7 L 13 9 L 15 9 L 15 7 L 13 7 z M 3.7578125 10.828125 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.171875 12.242188 L 3.7578125 10.828125 z M 12.242188 10.828125 L 10.828125 12.242188 L 12.242188 13.65625 L 13.65625 12.242188 L 12.242188 10.828125 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_sphere.svg b/editor/icons/source/icon_material_preview_sphere.svg
new file mode 100644
index 0000000000..76a6ec97bd
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_sphere.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_sphere.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.280687"
+ inkscape:cx="4.325506"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 6 3 A 2 2 0 0 1 8 5 A 2 2 0 0 1 6 7 A 2 2 0 0 1 4 5 A 2 2 0 0 1 6 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_material_preview_sphere_off.svg b/editor/icons/source/icon_material_preview_sphere_off.svg
new file mode 100644
index 0000000000..f9c8cadb34
--- /dev/null
+++ b/editor/icons/source/icon_material_preview_sphere_off.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_material_preview_sphere_off.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="7.561937"
+ inkscape:cx="7.8880061"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 6 3 A 2 2 0 0 1 8 5 A 2 2 0 0 1 6 7 A 2 2 0 0 1 4 5 A 2 2 0 0 1 6 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_matrix.svg b/editor/icons/source/icon_matrix.svg
new file mode 100644
index 0000000000..eacf2cdc9d
--- /dev/null
+++ b/editor/icons/source/icon_matrix.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_matrix.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.6294931"
+ inkscape:cy="6.9144846"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="12"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="1"
+ height="1.0000174"
+ width="3"
+ id="rect4156"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="3"
+ height="1"
+ x="1"
+ y="1050.3622" />
+ <rect
+ y="1050.3622"
+ x="10"
+ height="1"
+ width="3"
+ id="rect4160"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="3"
+ height="1.0000174"
+ x="10"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="12"
+ height="12"
+ width="1"
+ id="rect4164"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="2"
+ height="2"
+ x="3"
+ y="1041.3622" />
+ <rect
+ y="1041.3622"
+ x="6"
+ height="2"
+ width="2"
+ id="rect4163"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4165"
+ width="2"
+ height="2"
+ x="9"
+ y="1041.3622" />
+ <rect
+ y="1044.3622"
+ x="3"
+ height="2"
+ width="2"
+ id="rect4167"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4169"
+ width="2"
+ height="2"
+ x="6"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="9"
+ height="2"
+ width="2"
+ id="rect4171"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4173"
+ width="2"
+ height="2"
+ x="3"
+ y="1047.3622" />
+ <rect
+ y="1047.3622"
+ x="6"
+ height="2"
+ width="2"
+ id="rect4175"
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ea686c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4177"
+ width="2"
+ height="2"
+ x="9"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_menu_button.svg b/editor/icons/source/icon_menu_button.svg
new file mode 100644
index 0000000000..9cfbf2d502
--- /dev/null
+++ b/editor/icons/source/icon_menu_button.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_menu_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="7.4706473"
+ inkscape:cy="10.780886"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 5 L 15 5 L 15 1 L 1 1 z M 6 2 L 10 2 L 8 4 L 6 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4156" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 6 A 1 1 0 0 0 1 7 L 1 14 A 1 1 0 0 0 2 15 L 14 15 A 1 1 0 0 0 15 14 L 15 7 A 1 1 0 0 0 14 6 L 2 6 z M 3 8 L 13 8 L 13 10 L 3 10 L 3 8 z M 3 11 L 13 11 L 13 13 L 3 13 L 3 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4161" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mesh.svg b/editor/icons/source/icon_mesh.svg
new file mode 100644
index 0000000000..f3c33a37b1
--- /dev/null
+++ b/editor/icons/source/icon_mesh.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_mesh.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="5.2137269"
+ inkscape:cy="10.663006"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 11.271484 14 A 2 2 0 0 0 13 15 A 2 2 0 0 0 15 13 A 2 2 0 0 0 13.96875 11.25 L 14 11.25 L 14 4.7285156 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z M 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7304688 L 12 10.585938 L 5.4140625 4 z M 4 5.4140625 L 10.585938 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mesh_instance.svg b/editor/icons/source/icon_mesh_instance.svg
new file mode 100644
index 0000000000..51e6447eb2
--- /dev/null
+++ b/editor/icons/source/icon_mesh_instance.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_mesh_instance.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="8.6608726"
+ inkscape:cy="8.8510443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4162"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <rect
+ y="1039.3622"
+ x="2"
+ height="8.4999828"
+ width="2"
+ id="rect4164"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ r="2"
+ cy="1039.3622"
+ cx="3"
+ id="circle4166"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4168"
+ width="2"
+ height="8.4999828"
+ x="1038.3622"
+ y="-11.499983"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4170"
+ cx="13"
+ cy="1039.3622"
+ r="2" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4172"
+ width="2"
+ height="8.4999828"
+ x="12"
+ y="1039.1122" />
+ <circle
+ r="2"
+ cy="1049.3622"
+ cx="13"
+ id="circle4174"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-12.249991"
+ x="1048.3622"
+ height="8.4999828"
+ width="2"
+ id="rect4176"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 3,1039.3622 10,10"
+ id="path4178"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mesh_library.svg b/editor/icons/source/icon_mesh_library.svg
new file mode 100644
index 0000000000..b908a4db6e
--- /dev/null
+++ b/editor/icons/source/icon_mesh_library.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_mesh_library.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="10.839298"
+ inkscape:cy="6.916789"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 7 14 L 7 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 7 8.4140625 L 7 8 A 2.0002 2.0002 0 0 1 7.8085938 6.3945312 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7304688 L 12 6 A 2.0002 2.0002 0 0 1 12.998047 6.2714844 A 2.0002 2.0002 0 0 1 14 6 L 14 4.7285156 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z M 9 8 L 9 9 L 9 14 L 9 15 L 14 15 C 14.552285 15 15 14.5523 15 14 L 15 9 C 15 8.4477 14.552285 8 14 8 L 14 12 L 13 11 L 12 12 L 12 8 L 9 8 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_aabb.svg b/editor/icons/source/icon_mini_aabb.svg
new file mode 100644
index 0000000000..ebfd505bea
--- /dev/null
+++ b/editor/icons/source/icon_mini_aabb.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_aabb.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="5.0272453"
+ inkscape:cy="5.132155"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#ee7991;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 l 2,0 0,-6 -2,0 z m 0,2 0,2 a 1.0000174,1.0000174 0 0 1 -1,-1 1.0000174,1.0000174 0 0 1 1,-1 z"
+ id="path4893"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f39bad;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1046.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 l 2,0 0,-6 -2,0 z m 0,2 0,2 a 1.0000174,1.0000174 0 0 1 -1,-1 1.0000174,1.0000174 0 0 1 1,-1 z"
+ id="path4234"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4145"
+ d="m 12.999983,1043.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#ee7991;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ee7991;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12.999983,1049.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ id="path4147" />
+ <rect
+ transform="matrix(0,1,1,0,0,0)"
+ y="11"
+ x="1041.3622"
+ height="2.0000002"
+ width="8.0000172"
+ id="rect4149"
+ style="fill:#ee7991;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#f39bad;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1044.3622 0,8 2,0 a 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 l 0,-2 -2,0 z m 2,4 a 1.0000174,1.0000174 0 0 1 1,1 1.0000174,1.0000174 0 0 1 -1,1 l 0,-2 z"
+ id="path4151"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_array.svg b/editor/icons/source/icon_mini_array.svg
new file mode 100644
index 0000000000..a0a2014fbb
--- /dev/null
+++ b/editor/icons/source/icon_mini_array.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="9.4953495"
+ inkscape:cy="4.8350599"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4245"
+ width="2"
+ height="2.999984"
+ x="11"
+ y="1047.3622" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4253"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1047.3622"
+ x="7"
+ height="2.999984"
+ width="2"
+ id="rect4150"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4152"
+ d="m 10,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path4849"
+ d="m 4,1050.3625 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1044.3625 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4851" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="4"
+ height="6.0000014"
+ width="2"
+ id="rect4853"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4141"
+ width="1"
+ height="2.0000174"
+ x="10"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="14"
+ height="2.0000174"
+ width="1"
+ id="rect4143"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_boolean.svg b/editor/icons/source/icon_mini_boolean.svg
new file mode 100644
index 0000000000..eb17279a62
--- /dev/null
+++ b/editor/icons/source/icon_mini_boolean.svg
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_boolean.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="3.4941399"
+ inkscape:cy="6.2480463"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4364"
+ width="2"
+ height="5.9999666"
+ x="-2"
+ y="1044.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1044.3622"
+ x="-2"
+ height="2.0000174"
+ width="1"
+ id="rect4368"
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1044.3623 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4370"
+ inkscape:connector-curvature="0" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1047.3622"
+ x="13"
+ height="5"
+ width="2"
+ id="rect4374"
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4378"
+ d="m 2,1050.3623 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(-1,1)"
+ y="1042.3622"
+ x="-2"
+ height="3.9999492"
+ width="2"
+ id="rect4384"
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16,1050.3623 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4392"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1044.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,2 a 1.0000174,1.0000174 0 0 1 1,1 1.0000174,1.0000174 0 0 1 -1,1 1.0000174,1.0000174 0 0 1 -1,-1 1.0000174,1.0000174 0 0 1 1,-1 z"
+ id="path4148"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#8da6f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 11,1044.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,2 a 1.0000174,1.0000174 0 0 1 1,1 1.0000174,1.0000174 0 0 1 -1,1 1.0000174,1.0000174 0 0 1 -1,-1 1.0000174,1.0000174 0 0 1 1,-1 z"
+ id="path4174"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_color.svg b/editor/icons/source/icon_mini_color.svg
new file mode 100644
index 0000000000..cdc176e00c
--- /dev/null
+++ b/editor/icons/source/icon_mini_color.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_color.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4392">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ id="path4394"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ id="clipPath4196"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4198"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="5.4869016"
+ inkscape:cy="6.8192689"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 4 4 A 3 3 0 0 0 1 7 A 3 3 0 0 0 4 10 L 5 10 L 5 8 L 4 8 A 1.0000174 1.0000174 0 0 1 3 7 A 1.0000174 1.0000174 0 0 1 4 6 L 5 6 L 5 4 L 4 4 z "
+ transform="translate(0,1040.3622)"
+ id="rect4667" />
+ <path
+ style="fill:#70bfff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 14 4 A 3 3 0 0 0 11 7 L 11 10 L 13 10 L 13 7 A 1.0000174 1.0000174 0 0 1 14 6 L 15 6 L 15 4 L 14 4 z "
+ transform="translate(0,1040.3622)"
+ id="rect4245" />
+ <path
+ style="fill:#7aff70;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 2 L 6 7 A 3 3 0 0 0 9 10 L 10 10 L 10 8 L 9 8 A 1.0000174 1.0000174 0 0 1 8 7 L 8 2 L 6 2 z "
+ transform="translate(0,1040.3622)"
+ id="rect4815" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_color_array.svg b/editor/icons/source/icon_mini_color_array.svg
new file mode 100644
index 0000000000..2ec0e186b5
--- /dev/null
+++ b/editor/icons/source/icon_mini_color_array.svg
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_color_array.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-7">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-5"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-5"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-6"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-2"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-9">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-1"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-75">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-3"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-5">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-6"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-2"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-9"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-1">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-2"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="2.3647109"
+ inkscape:cy="10.148485"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1050.3622"
+ x="0"
+ height="1.9999826"
+ width="4"
+ id="rect4158"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="12.000017"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4162"
+ width="4"
+ height="2.0000174"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4155"
+ width="4"
+ height="1.9999826"
+ x="-16"
+ y="1050.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="12.000017"
+ width="2"
+ id="rect4157"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="2.0000174"
+ width="4"
+ id="rect4159"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 3.5 A 3 3 0 0 0 3 6.5 A 3 3 0 0 0 6 9.5 L 7 9.5 L 7 7.5 L 6 7.5 A 1.0000174 1.0000174 0 0 1 5 6.5 A 1.0000174 1.0000174 0 0 1 6 5.5 L 7 5.5 L 7 3.5 L 6 3.5 z "
+ transform="translate(0,1040.3622)"
+ id="rect4667" />
+ <rect
+ style="fill:#70bfff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4245"
+ width="2"
+ height="2.999984"
+ x="10"
+ y="1046.8622" />
+ <path
+ style="fill:#70bfff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1043.8622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4253"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#7aff70;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 7 1.5 L 7 6.5 A 3 3 0 0 0 10 9.5 L 10 7.5 A 1.0000174 1.0000174 0 0 1 9 6.5 L 9 1.5 L 7 1.5 z "
+ transform="translate(0,1040.3622)"
+ id="rect4815" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_dictionary.svg b/editor/icons/source/icon_mini_dictionary.svg
new file mode 100644
index 0000000000..813ba97613
--- /dev/null
+++ b/editor/icons/source/icon_mini_dictionary.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_dictionary.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="4.4726786"
+ inkscape:cy="6.5768127"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4607"
+ width="2"
+ height="4.9999828"
+ x="13"
+ y="-1047.3623" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1046.3623"
+ x="15"
+ height="2.0000174"
+ width="1"
+ id="rect4609"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4611"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 11,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4617"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4621"
+ d="m 11,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4412"
+ width="2"
+ height="3.9999492"
+ x="6"
+ y="1046.3623" />
+ <rect
+ y="1042.3623"
+ x="6"
+ height="1.9999928"
+ width="2"
+ id="rect4432"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1044.362 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4843" />
+ <path
+ id="path4845"
+ d="m 3,1050.362 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4847"
+ width="2"
+ height="7.9999843"
+ x="3"
+ y="1042.3622" />
+ <rect
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4144"
+ width="1"
+ height="1.9999928"
+ x="11"
+ y="1044.3622" />
+ <rect
+ y="1048.3622"
+ x="11"
+ height="1.9999928"
+ width="1"
+ id="rect4146"
+ style="fill:#77edb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_float.svg b/editor/icons/source/icon_mini_float.svg
new file mode 100644
index 0000000000..1007955ea9
--- /dev/null
+++ b/editor/icons/source/icon_mini_float.svg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_float.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="5.8021561"
+ inkscape:cy="5.7934213"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1045.3623"
+ x="0"
+ height="4.9999828"
+ width="2"
+ id="rect4498"
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4500"
+ width="2"
+ height="2.0000174"
+ x="2"
+ y="1046.3623" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4502"
+ d="m 3,1042.3623 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4504"
+ width="2"
+ height="5"
+ x="6"
+ y="-1047.3622"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4506"
+ d="m 9,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="-1047.3623"
+ x="12"
+ height="4.9999828"
+ width="2"
+ id="rect4508"
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4512"
+ d="m 15,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#61daf4;fill-opacity:1;stroke:none"
+ id="rect4142"
+ width="1"
+ height="2"
+ x="9"
+ y="1048.3622" />
+ <rect
+ y="1044.3622"
+ x="14"
+ height="2"
+ width="2"
+ id="rect4144"
+ style="fill:#61daf4;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#61daf4;fill-opacity:1;stroke:none"
+ id="rect4146"
+ width="1"
+ height="2"
+ x="15"
+ y="1048.3622" />
+ <rect
+ y="1042.3622"
+ x="3"
+ height="2"
+ width="1"
+ id="rect4148"
+ style="fill:#61daf4;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_float_array.svg b/editor/icons/source/icon_mini_float_array.svg
new file mode 100644
index 0000000000..86807ca731
--- /dev/null
+++ b/editor/icons/source/icon_mini_float_array.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_float_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="64.000006"
+ inkscape:cx="5.0069742"
+ inkscape:cy="7.9592671"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1050.3622"
+ x="0"
+ height="2.0000174"
+ width="4"
+ id="rect4158"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="12.000017"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4162"
+ width="4"
+ height="2.0000174"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4170"
+ width="4"
+ height="2.0000174"
+ x="-16"
+ y="1050.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="12.000017"
+ width="2"
+ id="rect4172"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="2.0000174"
+ width="4"
+ id="rect4175"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1042.3622 a 3,3 0 0 0 -3,3 l 0,5 2,0 0,-2 1,0 0,-2 -1,0 0,-1 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4146" />
+ <path
+ style="fill:#61daf4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1042.3622 0,5 a 3,3 0 0 0 3,3 l 0,-2 a 1.0000174,1.0000174 0 0 1 -1,-1 l 0,-1 1,0 0,-2 -1,0 0,-2 -2,0 z"
+ id="rect4498"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#c6f2fb;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1042.3622 0,5 a 3,3 0 0 0 3,3 l 0,-2 a 1.0000174,1.0000174 0 0 1 -1,-1 l 0,-5 -2,0 z"
+ id="rect4504"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_image.svg b/editor/icons/source/icon_mini_image.svg
new file mode 100644
index 0000000000..57faded5c8
--- /dev/null
+++ b/editor/icons/source/icon_mini_image.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_image.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="3.9410412"
+ inkscape:cy="6.0438587"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4412"
+ width="2"
+ height="3.9999492"
+ x="0"
+ y="1045.3622" />
+ <rect
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4414"
+ width="2"
+ height="5.9999843"
+ x="3"
+ y="1043.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4428"
+ d="m 5,1043.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1046.3622"
+ x="6"
+ height="3.0000174"
+ width="2"
+ id="rect4430"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1041.3622"
+ x="0"
+ height="1.9999928"
+ width="2"
+ id="rect4432"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1043.3622"
+ x="6"
+ height="5.9999843"
+ width="2"
+ id="rect4175"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1043.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4177"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4179"
+ width="2"
+ height="3.0000174"
+ x="9"
+ y="1046.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1049.3624 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4843" />
+ <path
+ id="path4845"
+ d="m 14,1043.3624 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4847"
+ width="2"
+ height="6.0000014"
+ x="14"
+ y="-1049.3622"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1052.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ id="path4408" />
+ <rect
+ style="fill:#93f1b9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4410"
+ width="1"
+ height="2"
+ x="12"
+ y="1050.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_input.svg b/editor/icons/source/icon_mini_input.svg
new file mode 100644
index 0000000000..9e966f77d1
--- /dev/null
+++ b/editor/icons/source/icon_mini_input.svg
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_input.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="2.8417629"
+ inkscape:cy="8.0681941"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ id="path4809"
+ d="m 10,1050.3625 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1044.3625 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4811" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-1052.3622"
+ x="-10"
+ height="7.9999843"
+ width="2"
+ id="rect4813"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4412"
+ width="2"
+ height="3.9999492"
+ x="0"
+ y="1046.3625" />
+ <rect
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4414"
+ width="2"
+ height="5.9999843"
+ x="3"
+ y="1044.3624" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4428"
+ d="m 5,1044.3625 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1047.3624"
+ x="6"
+ height="3.0000174"
+ width="2"
+ id="rect4430"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1042.3625"
+ x="0"
+ height="1.9999928"
+ width="2"
+ id="rect4432"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4455"
+ width="2"
+ height="4.9999828"
+ x="13"
+ y="-1047.3625" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1046.3625"
+ x="15"
+ height="2.0000174"
+ width="1"
+ id="rect4457"
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#adf18f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16,1050.3625 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4459"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_int_array.svg b/editor/icons/source/icon_mini_int_array.svg
new file mode 100644
index 0000000000..23b086d5e1
--- /dev/null
+++ b/editor/icons/source/icon_mini_int_array.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_int_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="4.3434649"
+ inkscape:cy="6.0813959"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 0 0 L 0 2 L 0 10 L 0 12 L 2 12 L 4 12 L 4 10 L 2 10 L 2 2 L 4 2 L 4 0 L 0 0 z M 12 0 L 12 2 L 14 2 L 14 10 L 12 10 L 12 12 L 16 12 L 16 10 L 16 2 L 16 0 L 14 0 L 12 0 z "
+ transform="translate(0,1040.3622)"
+ id="rect4158" />
+ <path
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 2 L 3 4 L 5 4 L 5 2 L 3 2 z M 3 6 L 3 10 L 5 10 L 5 6 L 3 6 z "
+ id="rect4412"
+ transform="translate(0,1040.3622)" />
+ <path
+ style="fill:#c8e7f9;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 5 4 L 5 10 L 7 10 L 7 6 A 1.0000174 1.0000174 0 0 1 8 7 L 8 10 L 10 10 L 10 7 A 3 3 0 0 0 7 4 L 5 4 z "
+ transform="translate(0,1040.3622)"
+ id="rect4414" />
+ <path
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 10 2 L 10 7 A 3 3 0 0 0 13 10 L 13 8 A 1.0000174 1.0000174 0 0 1 12 7 L 12 6 L 13 6 L 13 4 L 12 4 L 12 2 L 10 2 z "
+ id="rect4455"
+ transform="translate(0,1040.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_integer.svg b/editor/icons/source/icon_mini_integer.svg
new file mode 100644
index 0000000000..c21322adb2
--- /dev/null
+++ b/editor/icons/source/icon_mini_integer.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_integer.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254837"
+ inkscape:cx="7.0145943"
+ inkscape:cy="6.0949691"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4412"
+ width="2"
+ height="3.9999492"
+ x="1"
+ y="1046.3622" />
+ <rect
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4414"
+ width="2"
+ height="5.9999843"
+ x="4"
+ y="1044.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4428"
+ d="m 7,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1047.3622"
+ x="8"
+ height="3.0000174"
+ width="2"
+ id="rect4430"
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1042.3622"
+ x="1"
+ height="1.9999928"
+ width="2"
+ id="rect4432"
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4455"
+ width="2"
+ height="4.9999828"
+ x="12"
+ y="-1047.3622" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1046.3622"
+ x="14"
+ height="2.0000174"
+ width="2"
+ id="rect4457"
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 15,1050.3621 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4459"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4142"
+ width="2"
+ height="1.9999928"
+ x="5"
+ y="1044.3622" />
+ <rect
+ style="fill:#7dc6ef;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4144"
+ width="1"
+ height="2.0000174"
+ x="15"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_matrix3.svg b/editor/icons/source/icon_mini_matrix3.svg
new file mode 100644
index 0000000000..592230d13c
--- /dev/null
+++ b/editor/icons/source/icon_mini_matrix3.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_matrix3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="4.071303"
+ inkscape:cy="4.582959"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12.00042,1044.3622 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0.226563,-2.5 l -2.824219,0 z"
+ id="path4753"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4757"
+ d="m 12.00042,1046.3622 0,2 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0,-3 3,3 0 0 0 -2.597656,-1.5 z"
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4771"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="-1050.3622"
+ x="4"
+ height="3"
+ width="2"
+ id="rect4773"
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4775"
+ width="2"
+ height="5.9999828"
+ x="1"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="4"
+ height="5.9999828"
+ width="2"
+ id="rect4777"
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4779"
+ d="m 6,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4781"
+ width="2"
+ height="3.0000002"
+ x="7"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4783"
+ width="4.0004196"
+ height="2"
+ x="11"
+ y="1043.3622" />
+ <rect
+ y="1050.3622"
+ x="11"
+ height="2"
+ width="1"
+ id="rect4173"
+ style="fill:#e3ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_matrix32.svg b/editor/icons/source/icon_mini_matrix32.svg
new file mode 100644
index 0000000000..5159ea0b87
--- /dev/null
+++ b/editor/icons/source/icon_mini_matrix32.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_matrix32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="1.5471383"
+ inkscape:cy="5.978497"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#ddf4aa;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 8 2 L 8 4 L 9 4 L 10 4 A 1 1 0 0 1 9 5 L 9 7 A 1 1 0 0 1 10 8 A 1 1 0 0 1 9 9 L 8 9 L 8 11 L 9 11 A 3 3 0 0 0 11.597656 9.5 A 3 3 0 0 0 11.597656 6.5 A 3 3 0 0 0 11.232422 5.9980469 A 3 3 0 0 0 11.597656 5.5 A 3 3 0 0 0 11.994141 4 L 12 4 L 12 2 L 9 2 L 8 2 z "
+ transform="translate(0,1040.3622)"
+ id="path4753" />
+ <rect
+ y="1048.3622"
+ x="11"
+ height="2"
+ width="5"
+ id="rect4763"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:open="true"
+ d="m 13,1050.3622 a 2,2 0 0 1 -1.732051,-1 2,2 0 0 1 0,-2 2,2 0 0 1 1.732051,-1"
+ sodipodi:end="4.712389"
+ sodipodi:start="1.5707963"
+ sodipodi:ry="2"
+ sodipodi:rx="2"
+ sodipodi:cy="1048.3622"
+ sodipodi:cx="13"
+ sodipodi:type="arc"
+ id="path4765"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4767"
+ d="m 13,1042.3622 0,2 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0,-3 3,3 0 0 0 -2.597656,-1.5 z"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4771"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="-1050.3622"
+ x="3"
+ height="3"
+ width="2"
+ id="rect4773"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4775"
+ width="2"
+ height="5.9999828"
+ x="0"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="3"
+ height="5.9999828"
+ width="2"
+ id="rect4777"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4779"
+ d="m 5,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#c4ec69;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4781"
+ width="2"
+ height="3.0000002"
+ x="6"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_object.svg b/editor/icons/source/icon_mini_object.svg
new file mode 100644
index 0000000000..380be34903
--- /dev/null
+++ b/editor/icons/source/icon_mini_object.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_object.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254836"
+ inkscape:cx="1.4141272"
+ inkscape:cy="5.8428771"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1050.3622 a 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 l 0,-2 -2,0 0,8 2,0 z m 0,-2 0,-2 a 1.0000174,1.0000174 0 0 1 1,1 1.0000174,1.0000174 0 0 1 -1,1 z"
+ id="path4843"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4849"
+ d="m 3,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4851" />
+ <path
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 15,1044.3622 0,5 a 3,3 0 0 1 -3,3 l 0,-2 a 1.0000174,1.0000174 0 0 0 1,-1 l 0,-5 2,0 z"
+ id="rect4293-6"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1050.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ id="path4174" />
+ <path
+ id="path4176"
+ d="m 3,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#79f3e8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4140"
+ width="1"
+ height="2"
+ x="11"
+ y="1050.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_path.svg b/editor/icons/source/icon_mini_path.svg
new file mode 100644
index 0000000000..ef247b8b8c
--- /dev/null
+++ b/editor/icons/source/icon_mini_path.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_path.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="8.9618505"
+ inkscape:cy="5.9123718"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="-1047.3622"
+ x="6"
+ height="4.9999828"
+ width="2"
+ id="rect4293"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4295"
+ width="2"
+ height="2.0000174"
+ x="8"
+ y="-1046.3622"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4297"
+ d="m 9,1050.3621 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4299"
+ width="2"
+ height="7.9999828"
+ x="11"
+ y="-1050.3622" />
+ <path
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4301"
+ inkscape:connector-curvature="0" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="14"
+ height="3.0000348"
+ width="2"
+ id="rect4303"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1048.3625 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ id="path4461" />
+ <path
+ id="path4463"
+ d="m 2,1042.3625 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4465"
+ width="2"
+ height="7.9999843"
+ x="-2"
+ y="-1050.3622"
+ transform="scale(-1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="9"
+ height="2.0000174"
+ width="1"
+ id="rect4143"
+ style="fill:#6993ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_plane.svg b/editor/icons/source/icon_mini_plane.svg
new file mode 100644
index 0000000000..bc3992cdd6
--- /dev/null
+++ b/editor/icons/source/icon_mini_plane.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_plane.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="5.5391662"
+ inkscape:cy="7.4683409"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ id="path4809"
+ d="m 3,1048.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1042.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4811" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-1050.3619"
+ x="-3"
+ height="7.9999843"
+ width="2"
+ id="rect4813"
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4815"
+ width="2"
+ height="4.9999828"
+ x="7"
+ y="-1047.3623" />
+ <path
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4819"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1044.3622"
+ x="11"
+ height="5.9999843"
+ width="2"
+ id="rect4324"
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4342"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#f77070;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4344"
+ width="2"
+ height="3.0000174"
+ x="14"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_quat.svg b/editor/icons/source/icon_mini_quat.svg
new file mode 100644
index 0000000000..27188a3410
--- /dev/null
+++ b/editor/icons/source/icon_mini_quat.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_quat.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254836"
+ inkscape:cx="7.0330887"
+ inkscape:cy="6.0717303"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1049.3625 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4843" />
+ <path
+ id="path4845"
+ d="m 3,1043.3625 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4847"
+ width="2"
+ height="7.9999843"
+ x="3"
+ y="-1051.3622"
+ transform="scale(1,-1)" />
+ <rect
+ y="-1046.3623"
+ x="13"
+ height="4.9999828"
+ width="2"
+ id="rect4293-6"
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4295-2"
+ width="1"
+ height="2.0000174"
+ x="15"
+ y="-1045.3623"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4297-9"
+ d="m 16,1049.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#f298c0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1043.3622 0,3 a 3,3 0 0 0 3,3 l 2,0 0,-6 -2,0 0,4 a 1.0000174,1.0000174 0 0 1 -1,-1 l 0,-3 -2,0 z"
+ id="rect4366"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ec69a3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 11 3 A 3 3 0 0 0 8 6 A 3 3 0 0 0 11 9 L 13 9 L 13 3 L 11 3 z M 11 5 L 11 7 A 1.0000174 1.0000174 0 0 1 10 6 A 1.0000174 1.0000174 0 0 1 11 5 z "
+ transform="translate(0,1040.3622)"
+ id="path4849" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_raw_array.svg b/editor/icons/source/icon_mini_raw_array.svg
new file mode 100644
index 0000000000..cb735b5615
--- /dev/null
+++ b/editor/icons/source/icon_mini_raw_array.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_raw_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="-2.5947078"
+ inkscape:cy="7.7867435"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 0 0 L 0 2 L 0 10 L 0 12 L 4 12 L 4 10 L 2 10 L 2 2 L 4 2 L 4 0 L 2 0 L 0 0 z M 12 0 L 12 2 L 14 2 L 14 10 L 12 10 L 12 12 L 16 12 L 16 10 L 16 2 L 16 0 L 14 0 L 12 0 z "
+ transform="translate(0,1040.3622)"
+ id="rect4158" />
+ <rect
+ style="fill:#69ec9e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4245"
+ width="2"
+ height="2.999984"
+ x="2"
+ y="1046.3622" />
+ <rect
+ y="1043.3622"
+ x="5"
+ height="2.0000174"
+ width="1"
+ id="rect4251"
+ style="fill:#69ec9e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#69ec9e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1043.3623 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4253"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#aaf4c8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1049.3622 0,-6 2,0 0,4 a 1.0000174,1.0000174 0 0 0 1,-1 l 0,-3 2,0 0,3 0,1 a 1.0000174,1.0000174 0 0 0 1,-1 l 0,-3 2,0 0,3 a 3,3 0 0 1 -3,3 l -2,0 0,-0.1758 a 3,3 0 0 1 -1,0.1758 l -2,0 z"
+ id="path4771"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_rect2.svg b/editor/icons/source/icon_mini_rect2.svg
new file mode 100644
index 0000000000..ded27f049f
--- /dev/null
+++ b/editor/icons/source/icon_mini_rect2.svg
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_rect2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="2.7000496"
+ inkscape:cy="5.1067461"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1047.3622"
+ x="0"
+ height="2.999984"
+ width="2"
+ id="rect4601"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4605"
+ d="m 3,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4607"
+ width="2"
+ height="4.9999828"
+ x="13"
+ y="-1047.3622" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1046.3622"
+ x="15"
+ height="2.0000174"
+ width="1"
+ id="rect4609"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16,1050.3621 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4611"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4617"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4619"
+ width="1"
+ height="2.0000174"
+ x="7"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4621"
+ d="m 7,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4144"
+ width="1"
+ height="2.0000174"
+ x="12"
+ y="1044.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4146"
+ d="m 12,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="12"
+ height="2.0000174"
+ width="1"
+ id="rect4148"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4150"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4152"
+ d="m 7,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="1"
+ x="6"
+ y="1046.3622" />
+ <rect
+ style="fill:#f191a5;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4156"
+ width="1"
+ height="2.0000174"
+ x="3"
+ y="-1046.3622"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_rid.svg b/editor/icons/source/icon_mini_rid.svg
new file mode 100644
index 0000000000..6df13ae43d
--- /dev/null
+++ b/editor/icons/source/icon_mini_rid.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_rid.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254836"
+ inkscape:cx="8.577775"
+ inkscape:cy="6.6679205"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-nodes="true"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4245"
+ width="2"
+ height="2.999984"
+ x="1"
+ y="1047.3622" />
+ <rect
+ y="1042.3623"
+ x="7"
+ height="1.9998953"
+ width="2"
+ id="rect4247"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4249"
+ width="2"
+ height="4.0000014"
+ x="7"
+ y="1046.3622" />
+ <rect
+ y="1044.3622"
+ x="4"
+ height="2.0000174"
+ width="1"
+ id="rect4251"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4253"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4260"
+ d="m 13,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4262" />
+ <rect
+ y="1042.3622"
+ x="14"
+ height="7.9999843"
+ width="2"
+ id="rect4264"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4142"
+ width="1"
+ height="2.0000174"
+ x="13"
+ y="1044.3622" />
+ <rect
+ y="1048.3622"
+ x="13"
+ height="2.0000174"
+ width="1"
+ id="rect4144"
+ style="fill:#69ec9a;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_string.svg b/editor/icons/source/icon_mini_string.svg
new file mode 100644
index 0000000000..a655f70d33
--- /dev/null
+++ b/editor/icons/source/icon_mini_string.svg
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_string.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4392">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ id="path4394"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ id="clipPath4196"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4198"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4253-75"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255-3"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199-5"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201-6"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4392-2">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ id="path4394-9"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ id="clipPath4196-1"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4198-2"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4253-7"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255-5"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199-3"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201-5"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4392-6">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ id="path4394-2"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ id="clipPath4196-9"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4198-1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.223117"
+ inkscape:cy="7.0200789"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 5,1042.3622 a 3,3 0 0 0 -3,3 l 0,2 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 3,-3 l 0,-2 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4534"
+ inkscape:connector-curvature="0" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4540"
+ width="2"
+ height="4.9999828"
+ x="7"
+ y="-1047.3623" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1046.3623"
+ x="9"
+ height="2.0000174"
+ width="2"
+ id="rect4542"
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4544"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 15 4 A 3 3 0 0 0 12 7 L 12 10 L 14 10 L 14 7 A 1.0000174 1.0000174 0 0 1 15 6 L 16 6 L 16 4 L 15 4 z "
+ transform="translate(0,1040.3622)"
+ id="rect4245-5" />
+ <rect
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4208"
+ width="1"
+ height="2"
+ x="0"
+ y="1048.3622" />
+ <rect
+ y="1042.3622"
+ x="5"
+ height="2"
+ width="1"
+ id="rect4210"
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4165"
+ width="1"
+ height="2.0000174"
+ x="10"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_string_array.svg b/editor/icons/source/icon_mini_string_array.svg
new file mode 100644
index 0000000000..cd2e850c49
--- /dev/null
+++ b/editor/icons/source/icon_mini_string_array.svg
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_string_array.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-7">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-5"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-5"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-6"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-2"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-9">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-1"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-753">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-56"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-2">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-9"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-1"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-27"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-0">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-9"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-75">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-3"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-5">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-6"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-2"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-9"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-1">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-2"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253-7-3">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255-5-6"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199-3-0">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201-5-6"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4392-6-2"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4394-2-6"
+ d="m 8.072266,1041.3622 a 5,5 0 0 0 -3.607422,1.4648 5,5 0 0 0 0,7.0704 5,5 0 0 0 7.070312,0 l -1.416015,-1.4161 A 3,3 0 0 1 8,1049.3622 a 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 3,3 0 0 1 2.119141,0.8809 l 1.416015,-1.4161 a 5,5 0 0 0 -3.46289,-1.4648 z"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4196-9-1">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0624999,1025.8622 a 3.375,2.9999997 0 0 0 -3.375,3 3.375,2.9999997 0 0 0 1.6875,2.5957 l 0,9.8115 a 3.375,2.9999997 0 0 0 -1.6875,2.5928 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.3750001,-3 3.375,2.9999997 0 0 0 -1.6875001,-2.5957 l 0,-8.7832 11.9311511,10.6054 a 3.375,2.9999997 0 0 0 -0.118651,0.7735 3.375,2.9999997 0 0 0 3.375,3 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -0.873413,0.1025 l -11.927857,-10.6025 9.884399,0 a 3.375,2.9999997 0 0 0 2.916871,1.5 3.375,2.9999997 0 0 0 3.375,-3 3.375,2.9999997 0 0 0 -3.375,-3 3.375,2.9999997 0 0 0 -2.920166,1.5 l -11.037964,0 a 3.375,2.9999997 0 0 0 -2.9168701,-1.5 z"
+ id="path4198-1-8"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254838"
+ inkscape:cx="8.8695857"
+ inkscape:cy="6.6197"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 0 0 L 0 2 L 0 10 L 0 12 L 2 12 L 4 12 L 4 10 L 2 10 L 2 2 L 4 2 L 4 0 L 2 0 L 0 0 z M 12 0 L 12 2 L 14 2 L 14 10 L 12 10 L 12 12 L 16 12 L 16 10 L 16 0 L 12 0 z "
+ transform="translate(0,1040.3622)"
+ id="rect4158" />
+ <path
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1042.3622 a 3,3 0 0 0 -3,3 l 0,2 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 3,-3 l 0,-2 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4184"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1044.3622 a 3,3 0 0 0 -3,3 l 0,3 2,0 0,-3 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4534"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#b5d3f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1042.3622 0,5 a 3,3 0 0 0 3,3 l 0,-2 a 1.0000174,1.0000174 0 0 1 -1,-1 l 0,-1 1,0 0,-2 -1,0 0,-2 -2,0 z"
+ id="rect4540"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none"
+ id="rect4184"
+ width="1"
+ height="2"
+ x="7"
+ y="1042.3622" />
+ <rect
+ y="1048.3622"
+ x="2"
+ height="2"
+ width="1"
+ id="rect4186"
+ style="fill:#6ba7ec;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_transform.svg b/editor/icons/source/icon_mini_transform.svg
new file mode 100644
index 0000000000..6da4eb806d
--- /dev/null
+++ b/editor/icons/source/icon_mini_transform.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_transform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.2643591"
+ inkscape:cy="7.6152896"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#f6a86e;fill-opacity:1;stroke:none;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 4,1042.3622 3.0917969,1044.5438 2,1042.3622 l -2,0 2,4 -2,4 2,0 0.9082031,-2.1816 L 4,1050.3622 l 2,0 -2,-4 2,-4 z"
+ id="rect4214"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#f8bf95;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,1042.3622 a 3,3 0 0 0 -3,3 l 0,5 2,0 0,-2 1,0 0,-2 -1,0 0,-1 a 1.0000174,1.0000174 0 0 1 1,-1 l 1,0 0,-2 -1,0 z"
+ id="rect4455"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f6a86e;fill-opacity:1;stroke:none;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 10 4 L 10 6 L 10 8 L 10 10 L 12 10 L 12 8 L 13 9 L 14 8 L 14 10 L 16 10 L 16 8 L 16 6 L 16 4 L 14 4 L 13 6 L 12 4 L 10 4 z "
+ transform="translate(0,1040.3622)"
+ id="rect4231" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_variant.svg b/editor/icons/source/icon_mini_variant.svg
new file mode 100644
index 0000000000..6883baa584
--- /dev/null
+++ b/editor/icons/source/icon_mini_variant.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_variant.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="5.8864792"
+ inkscape:cy="6.2518921"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1044.3622"
+ x="3"
+ height="5.9999666"
+ width="2"
+ id="rect4320"
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1044.3622"
+ x="6"
+ height="5.9999843"
+ width="2"
+ id="rect4324"
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4326"
+ width="1"
+ height="2.0000174"
+ x="3"
+ y="1044.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4328"
+ d="m 3,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 14,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4330" />
+ <rect
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4334"
+ width="2"
+ height="7.9999843"
+ x="14"
+ y="-1052.3622"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4338"
+ width="2"
+ height="2.9999826"
+ x="11"
+ y="-1047.3622"
+ transform="scale(1,-1)" />
+ <path
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4340"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1044.3622 a 3,3 0 0 1 3,3 l -2,0 a 1.0000174,1.0000174 0 0 0 -1,-1 l 0,-2 z"
+ id="path4342"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#69ecbd;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4344"
+ width="2"
+ height="3.0000174"
+ x="9"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_vector2.svg b/editor/icons/source/icon_mini_vector2.svg
new file mode 100644
index 0000000000..5c9aaeccff
--- /dev/null
+++ b/editor/icons/source/icon_mini_vector2.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_vector2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="-0.61809703"
+ inkscape:cy="8.3891446"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1050.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ id="path4301"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1044.3622"
+ x="4"
+ height="3"
+ width="2"
+ id="rect4303"
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dcc5f8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4159"
+ width="5"
+ height="2"
+ x="11"
+ y="1048.3622" />
+ <rect
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4661"
+ width="2"
+ height="5.9999828"
+ x="1"
+ y="1044.3622" />
+ <rect
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4667"
+ width="1"
+ height="2.0000174"
+ x="9"
+ y="1044.3622" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4669"
+ d="m 9,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(1,-1)"
+ y="-1050.3622"
+ x="9"
+ height="2.0000174"
+ width="1"
+ id="rect4671"
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ id="path4673"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#dcc5f8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4677"
+ sodipodi:type="arc"
+ sodipodi:cx="13"
+ sodipodi:cy="1048.3622"
+ sodipodi:rx="2"
+ sodipodi:ry="2"
+ sodipodi:start="1.5707963"
+ sodipodi:end="4.712389"
+ d="m 13,1050.3622 a 2,2 0 0 1 -1.732051,-1 2,2 0 0 1 0,-2 2,2 0 0 1 1.732051,-1"
+ sodipodi:open="true" />
+ <path
+ style="fill:#dcc5f8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13,1042.3622 0,2 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0,-3 3,3 0 0 0 -2.597656,-1.5 z"
+ id="path4679"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1042.3622"
+ x="12"
+ height="2"
+ width="1"
+ id="rect4684"
+ style="fill:#dcc5f8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_vector2_array.svg b/editor/icons/source/icon_mini_vector2_array.svg
new file mode 100644
index 0000000000..03850f7c86
--- /dev/null
+++ b/editor/icons/source/icon_mini_vector2_array.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_vector2_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="7.5779741"
+ inkscape:cy="8.910903"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1050.3622"
+ x="0"
+ height="2.0000174"
+ width="4"
+ id="rect4158"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="12.000017"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4162"
+ width="4"
+ height="2.0000174"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4170"
+ width="4"
+ height="2.0000174"
+ x="-16"
+ y="1050.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="12.000017"
+ width="2"
+ id="rect4172"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="2.0000174"
+ width="4"
+ id="rect4175"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:#bd91f1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 3 L 3 9 L 5 9 A 3 3 0 0 0 8 6 L 8 3 L 6 3 L 6 6 A 1.0000174 1.0000174 0 0 1 5 7 L 5 3 L 3 3 z "
+ transform="translate(0,1040.3622)"
+ id="path4301" />
+ <path
+ style="fill:#dcc5f8;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.9999969,1042.3622 0,2 1.0000001,0 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 2,2 0 0 0 -1.732422,1 2,2 0 0 0 -0.265625,1 l -0.00195,0 0,0.047 0,1.9531 2,0 3,0 0,-2 -3,0 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0,-3 3,3 0 0 0 -2.597659,-1.5001 l -1.0000001,0 z"
+ id="rect4159"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_vector3.svg b/editor/icons/source/icon_mini_vector3.svg
new file mode 100644
index 0000000000..e99a211ae0
--- /dev/null
+++ b/editor/icons/source/icon_mini_vector3.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_vector3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="5.3282118"
+ inkscape:cy="6.0229362"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4705"
+ d="m 3.0004202,1050.3622 a 3,3 0 0 0 3,-3 l -2,0 a 1.0000174,1.0000174 0 0 1 -1,1 l 0,2 z"
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4707"
+ width="2"
+ height="3"
+ x="4.0004206"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="1.0004202"
+ height="5.9999828"
+ width="2"
+ id="rect4711"
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1044.3622"
+ x="9.0004196"
+ height="2.0000174"
+ width="1"
+ id="rect4713"
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9.0004202,1044.3622 a 3,3 0 0 0 -3,3 l 2,0 a 1.0000174,1.0000174 0 0 1 1,-1 l 0,-2 z"
+ id="path4715"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4717"
+ width="1"
+ height="2.0000174"
+ x="9.0004196"
+ y="-1050.3622"
+ transform="scale(1,-1)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4719"
+ d="m 9.0004202,1050.3622 a 3,3 0 0 1 -3,-3 l 2,0 a 1.0000174,1.0000174 0 0 0 1,1 l 0,2 z"
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#eeb9f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 13 2 L 13 3 A 1 1 0 0 1 14 4 A 1 1 0 0 1 13 5 L 13 7 A 3 3 0 0 0 15.597656 5.5 A 3 3 0 0 0 15.597656 2.5 A 3 3 0 0 0 15.234375 2 L 13 2 z "
+ transform="translate(0,1040.3622)"
+ id="path4723" />
+ <rect
+ style="fill:#eeb9f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4725"
+ width="3.9995804"
+ height="2"
+ x="12.00042"
+ y="1042.3622" />
+ <path
+ style="fill:#eeb9f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 13.00042,1045.3622 0,2 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 l 0,2 a 3,3 0 0 0 2.597656,-1.5 3,3 0 0 0 0,-3 3,3 0 0 0 -2.597656,-1.5 z"
+ id="path4727"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="1049.3622"
+ x="12.00042"
+ height="2"
+ width="1"
+ id="rect4729"
+ style="fill:#eeb9f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mini_vector3_array.svg b/editor/icons/source/icon_mini_vector3_array.svg
new file mode 100644
index 0000000000..bbac554614
--- /dev/null
+++ b/editor/icons/source/icon_mini_vector3_array.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_mini_vector3_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="4.9242706"
+ inkscape:cy="8.3355467"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <rect
+ y="1050.3622"
+ x="0"
+ height="2.0000174"
+ width="4"
+ id="rect4158"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="12.000017"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4162"
+ width="4"
+ height="2.0000174"
+ x="0"
+ y="1040.3622" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4170"
+ width="4"
+ height="2.0000174"
+ x="-16"
+ y="1050.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="12.000017"
+ width="2"
+ id="rect4172"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <rect
+ y="1040.3622"
+ x="-16"
+ height="2.0000174"
+ width="4"
+ id="rect4175"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ <path
+ style="fill:#e286f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 3 L 3 9 L 5 9 A 3 3 0 0 0 8 6 L 8 3 L 6 3 L 6 6 A 1.0000174 1.0000174 0 0 1 5 7 L 5 3 L 3 3 z "
+ transform="translate(0,1040.3622)"
+ id="path4705" />
+ <path
+ style="fill:#eeb9f6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 8 1 L 8 3 L 9 3 L 10 3 A 1 1 0 0 1 9 4 L 9 6 A 1 1 0 0 1 10 7 A 1 1 0 0 1 9 8 L 8 8 L 8 10 L 9 10 A 3 3 0 0 0 11.597656 8.5 A 3 3 0 0 0 11.597656 5.5 A 3 3 0 0 0 11.232422 4.9980469 A 3 3 0 0 0 11.597656 4.5 A 3 3 0 0 0 11.996094 3 L 12 3 L 12 1 L 11.234375 1 L 9 1 L 8 1 z "
+ transform="translate(0,1040.3622)"
+ id="path4723" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mirror_x.svg b/editor/icons/source/icon_mirror_x.svg
new file mode 100644
index 0000000000..f24a630770
--- /dev/null
+++ b/editor/icons/source/icon_mirror_x.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_move.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_size.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.1680801"
+ inkscape:cy="7.9718121"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 4,7 0,-2 -3,3 3,3 0,-2 8,0 0,2 3,-3 -3,-3 0,2 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mirror_y.svg b/editor/icons/source/icon_mirror_y.svg
new file mode 100644
index 0000000000..bb913b84af
--- /dev/null
+++ b/editor/icons/source/icon_mirror_y.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_move.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_mirror_y.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.7618301"
+ inkscape:cy="7.9093121"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1048.3622 -2,0 3,3 3,-3 -2,0 0,-8 2,0 -3,-3 -3,3 2,0 z"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_mouse.svg b/editor/icons/source/icon_mouse.svg
new file mode 100644
index 0000000000..731ceeefd8
--- /dev/null
+++ b/editor/icons/source/icon_mouse.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_mouse.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.1067779"
+ inkscape:cy="6.9900832"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1.1015625 A 5 5 0 0 0 3 6 L 7 6 L 7 1.1015625 z M 9 1.1054688 L 9 6 L 13 6 A 5 5 0 0 0 9 1.1054688 z M 3 8 L 3 10 A 5 5 0 0 0 8 15 A 5 5 0 0 0 13 10 L 13 8 L 3 8 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_move_down.svg b/editor/icons/source/icon_move_down.svg
new file mode 100644
index 0000000000..e83a69ad50
--- /dev/null
+++ b/editor/icons/source/icon_move_down.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_move_down.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="4.2997855"
+ inkscape:cy="8.3620593"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 8,1051.3622 -6,-7 4,0 0,-7 4,0 0,7 4,0 -6,7 z"
+ id="path4135"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_move_point.svg b/editor/icons/source/icon_move_point.svg
new file mode 100644
index 0000000000..c951d6b90a
--- /dev/null
+++ b/editor/icons/source/icon_move_point.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit_pivot.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_move_point.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="25.84375"
+ inkscape:cx="8.9607405"
+ inkscape:cy="10.687849"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 9.2128906 14.892578 L 6.6132812 8.5722656 A 1.50015 1.50015 0 0 1 7.984375 6.5019531 L 7.984375 6.5 A 1.50015 1.50015 0 0 1 8.5703125 6.6113281 L 14.888672 9.2109375 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 10.755859 10.755859 L 11.279297 12.029297 A 1.50015 1.50015 0 0 1 11.759766 11.759766 A 1.50015 1.50015 0 0 1 12.029297 11.28125 L 10.755859 10.755859 z "
+ transform="translate(0,1036.3622)"
+ id="path4137" />
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 3 A 5.0000172 5.0000172 0 0 0 3 8 A 5.0000172 5.0000172 0 0 0 8 13 A 5.0000172 5.0000172 0 0 0 8.4257812 12.978516 L 6.6132812 8.5722656 A 1.50015 1.50015 0 0 1 7.984375 6.5019531 L 7.984375 6.5 A 1.50015 1.50015 0 0 1 8.5703125 6.6113281 L 12.978516 8.4238281 A 5.0000172 5.0000172 0 0 0 13 8 A 5.0000172 5.0000172 0 0 0 8 3 z M 10.755859 10.755859 L 11.199219 11.835938 A 5.0000172 5.0000172 0 0 0 11.837891 11.203125 L 10.755859 10.755859 z "
+ transform="translate(0,1036.3622)"
+ id="circle4156" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16,1047.6532 -8,-3.291 3.290998,8 0.947104,-2.8201 1.8836,1.8835 0.941801,-0.9418 -1.8836,-1.8835 z"
+ id="rect4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_move_up.svg b/editor/icons/source/icon_move_up.svg
new file mode 100644
index 0000000000..8f671a0d72
--- /dev/null
+++ b/editor/icons/source/icon_move_up.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_arrow_left.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_move_up.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="4.2997855"
+ inkscape:cy="8.3620593"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="M 8 1 L 2 8 L 6 8 L 6 15 L 10 15 L 10 8 L 14 8 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4135" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_multi_edit.svg b/editor/icons/source/icon_multi_edit.svg
new file mode 100644
index 0000000000..ef63861e97
--- /dev/null
+++ b/editor/icons/source/icon_multi_edit.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_multi_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000002"
+ inkscape:cx="5.8408976"
+ inkscape:cy="8.1515472"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1.7071068,1047.8266 1,1051.3622 l 3.5355339,-0.7071 7.7781741,-7.7782 -2.828427,-2.8284 z m 9.1923882,-9.1924 2.828427,2.8285 1.414214,-1.4142 -2.828428,-2.8285 z"
+ id="rect4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="2"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1041.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4156"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="2"
+ height="2"
+ x="5"
+ y="1037.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_multi_line.svg b/editor/icons/source/icon_multi_line.svg
new file mode 100644
index 0000000000..542e311286
--- /dev/null
+++ b/editor/icons/source/icon_multi_line.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_multi_line.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="8.0670393"
+ inkscape:cy="9.3567993"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4137"
+ width="5"
+ height="1.9999478"
+ x="10"
+ y="1037.3622" />
+ <rect
+ y="-8"
+ x="1037.3622"
+ height="7.000001"
+ width="2.0000174"
+ id="rect4158"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ y="1041.3622"
+ x="1"
+ height="1.9999478"
+ width="11"
+ id="rect4155"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4157"
+ width="4"
+ height="1.9999478"
+ x="1"
+ y="1045.3622" />
+ <rect
+ y="1045.3622"
+ x="7"
+ height="1.9999478"
+ width="8"
+ id="rect4159"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="13"
+ height="1.9999478"
+ x="1"
+ y="1049.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_multi_mesh.svg b/editor/icons/source/icon_multi_mesh.svg
new file mode 100644
index 0000000000..22f843a686
--- /dev/null
+++ b/editor/icons/source/icon_multi_mesh.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_multi_mesh.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="19.153224"
+ inkscape:cy="8.0775961"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 6 14 L 6 13 L 6 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 7.5859375 9 L 9 9 L 9 8 L 9 7.5859375 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7265625 L 12 6 L 14 6 L 14 4.7304688 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z M 11 8 L 11 9.5859375 L 11 11 L 9.5859375 11 L 8 11 L 8 12 L 8 13 L 11 13 L 11 14 L 11 16 L 13 16 L 13 15 L 13 13 L 15 13 L 16 13 L 16 11 L 14 11 L 13 11 L 13 8 L 12 8 L 11 8 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_multi_mesh_instance.svg b/editor/icons/source/icon_multi_mesh_instance.svg
new file mode 100644
index 0000000000..deceae5a03
--- /dev/null
+++ b/editor/icons/source/icon_multi_mesh_instance.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_multi_mesh_instance.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="7.9179235"
+ inkscape:cy="7.0878016"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 6 14 L 6 13 L 6 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 7.5859375 9 L 9 9 L 9 8 L 9 7.5859375 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7265625 L 12 6 L 14 6 L 14 4.7304688 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z M 12 8 L 12 10.585938 L 11 9.5859375 L 11 11 L 9.5859375 11 L 10.585938 12 L 8 12 L 8 13 L 9 13 L 11 13 L 11 14 L 11.271484 14 A 2 2 0 0 0 13 15 L 13 13 L 15 13 A 2 2 0 0 0 13.96875 11.25 L 14 11.25 L 14 11 L 13 11 L 13 8 L 12 8 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 11,1044.3622 0,3 -3,0 0,2 3,0 0,3 2,0 0,-3 3,0 0,-2 -3,0 0,-3 -2,0 z"
+ id="rect4199"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation.svg b/editor/icons/source/icon_navigation.svg
new file mode 100644
index 0000000000..42e8f59165
--- /dev/null
+++ b/editor/icons/source/icon_navigation.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="4.4490623"
+ inkscape:cy="7.6851407"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3,1050.3622 5,-2 5,2 -5,-12 -5,12 z"
+ id="path4155"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation_2d.svg b/editor/icons/source/icon_navigation_2d.svg
new file mode 100644
index 0000000000..5252541e70
--- /dev/null
+++ b/editor/icons/source/icon_navigation_2d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="4.4490623"
+ inkscape:cy="7.6851407"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#a5b7f5;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3,1050.3622 5,-2 5,2 -5,-12 -5,12 z"
+ id="path4155"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation_mesh.svg b/editor/icons/source/icon_navigation_mesh.svg
new file mode 100644
index 0000000000..31ab5df8ad
--- /dev/null
+++ b/editor/icons/source/icon_navigation_mesh.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation_mesh.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="9.4708391"
+ inkscape:cy="9.3796697"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 7.2382812 14 L 7.9882812 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 8.6972656 10.111328 L 9.46875 8.0546875 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7304688 L 12 5.0019531 A 2.0002 2.0002 0 0 1 12.023438 5.0019531 A 2.0002 2.0002 0 0 1 13.873047 6.2988281 L 14 6.6367188 L 14 4.7285156 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z M 12 7 L 9 15 L 12 13 L 15 15 L 12 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation_mesh_instance.svg b/editor/icons/source/icon_navigation_mesh_instance.svg
new file mode 100644
index 0000000000..5c4e0f1579
--- /dev/null
+++ b/editor/icons/source/icon_navigation_mesh_instance.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation_mesh_instance.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="9.8145891"
+ inkscape:cy="8.1609197"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 7.2382812 14 L 7.9882812 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 8.6972656 10.111328 L 9.46875 8.0546875 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 12 4.7304688 L 12 5.0019531 A 2.0002 2.0002 0 0 1 12.023438 5.0019531 A 2.0002 2.0002 0 0 1 13.873047 6.2988281 L 14 6.6367188 L 14 4.7285156 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ <path
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.99607843"
+ d="m 15,1051.3622 -3,-8 -3,8 3,-2 z"
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4177"
+ width="2"
+ height="1"
+ x="12"
+ y="1040.3622" />
+ <rect
+ y="1040.3622"
+ x="12"
+ height="1"
+ width="2"
+ id="rect4179"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation_polygon.svg b/editor/icons/source/icon_navigation_polygon.svg
new file mode 100644
index 0000000000..f3b6fcbcc3
--- /dev/null
+++ b/editor/icons/source/icon_navigation_polygon.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation_polygon.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="11.686357"
+ inkscape:cy="9.3308993"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-5"
+ inkscape:label="Layer 1"
+ style="fill:#e0e0e0;fill-opacity:1">
+ <path
+ id="path4144-6"
+ transform="translate(0,1036.3622)"
+ d="M 2,1 A 1.0001,1.0001 0 0 0 1,2 l 0,12 a 1.0001,1.0001 0 0 0 1,1 l 4.9023438,0 A 2.1002099,2.1002099 0 0 1 7.0332031,14.263672 L 7.5078125,13 3,13 3,3 11.585938,3 7.2929688,7.2929688 a 1.0001,1.0001 0 0 0 0,1.4140624 L 8.6191406,10.033203 10.033203,6.2636719 a 2.1002099,2.1002099 0 0 1 1.992188,-1.3613281 2.1002099,2.1002099 0 0 1 0.435547,0.050781 L 14.707031,2.7070312 A 1.0001,1.0001 0 0 0 14,1 L 2,1 Z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4163"
+ d="m 15,1051.3622 -3,-8 -3,8 3,-2 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_navigation_polygon_instance.svg b/editor/icons/source/icon_navigation_polygon_instance.svg
new file mode 100644
index 0000000000..5153227b15
--- /dev/null
+++ b/editor/icons/source/icon_navigation_polygon_instance.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_navigation_polygon_instance.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="7.2564029"
+ inkscape:cy="7.9852618"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5b7f2;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2 1 A 1.0001 1.0001 0 0 0 1 2 L 1 14 A 1.0001 1.0001 0 0 0 2 15 L 6.9023438 15 A 2.1002099 2.1002099 0 0 1 7.0332031 14.263672 L 7.5078125 13 L 3 13 L 3 3 L 11.585938 3 L 7.2929688 7.2929688 A 1.0001 1.0001 0 0 0 7.2929688 8.7070312 L 8.6191406 10.033203 L 10.033203 6.2636719 A 2.1002099 2.1002099 0 0 1 12.025391 4.9023438 A 2.1002099 2.1002099 0 0 1 12.460938 4.953125 L 14.707031 2.7070312 A 1.0001 1.0001 0 0 0 14 1 L 2 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4144" />
+ <path
+ style="fill:#a5b7f6;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.98823529"
+ d="m 15,1051.3622 -3,-8 -3,8 3,-2 z"
+ id="path4163"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_new.svg b/editor/icons/source/icon_new.svg
new file mode 100644
index 0000000000..a37ba1be3f
--- /dev/null
+++ b/editor/icons/source/icon_new.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_new.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_new.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="0.22745062"
+ inkscape:cy="11.330333"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1-8"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="translate(0,-1.6949463e-5)">
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect4158"
+ d="m 2,1037.3622 0,14 12,0 0,-9 -5,0 0,-5 z m 8,0 0,4 4,0 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_nine_patch_rect.svg b/editor/icons/source/icon_nine_patch_rect.svg
new file mode 100644
index 0000000000..f12789c19e
--- /dev/null
+++ b/editor/icons/source/icon_nine_patch_rect.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_patch_9_frame.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.35114"
+ inkscape:cy="9.1140348"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1050.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="14"
+ height="14"
+ width="1"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1040.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4162"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4164"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1047.3622" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4166"
+ width="14"
+ height="0.9999826"
+ x="1037.3622"
+ y="-5"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-12"
+ x="1037.3622"
+ height="0.9999826"
+ width="14"
+ id="rect4168"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_node.svg b/editor/icons/source/icon_node.svg
new file mode 100644
index 0000000000..02e2774669
--- /dev/null
+++ b/editor/icons/source/icon_node.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_node.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="4.1094292"
+ inkscape:cy="4.5020156"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 A 6 6 0 0 0 2 8 A 6 6 0 0 0 8 14 A 6 6 0 0 0 14 8 A 6 6 0 0 0 8 2 z M 8 4 A 4 4 0 0 1 12 8 A 4 4 0 0 1 8 12 A 4 4 0 0 1 4 8 A 4 4 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_node_2d.svg b/editor/icons/source/icon_node_2d.svg
new file mode 100644
index 0000000000..e546f68539
--- /dev/null
+++ b/editor/icons/source/icon_node_2d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_node_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="4.2420117"
+ inkscape:cy="6.0488117"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f3;fill-opacity:0.98823529;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 A 6 6 0 0 0 2 8 A 6 6 0 0 0 8 14 A 6 6 0 0 0 14 8 A 6 6 0 0 0 8 2 z M 8 4 A 4 4 0 0 1 12 8 A 4 4 0 0 1 8 12 A 4 4 0 0 1 4 8 A 4 4 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_node_warning.svg b/editor/icons/source/icon_node_warning.svg
new file mode 100644
index 0000000000..89d3663fb0
--- /dev/null
+++ b/editor/icons/source/icon_node_warning.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_new.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_node_warning.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="6.468104"
+ inkscape:cy="5.5071727"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1-8"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-8"
+ inkscape:label="Layer 1"
+ transform="translate(0,-1.6949463e-5)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffd684;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 8.0292969 2.0019531 A 1.0001 1.0001 0 0 0 7.1425781 2.4863281 L 1.1425781 12.486328 A 1.0001 1.0001 0 0 0 2 14 L 14 14 A 1.0001 1.0001 0 0 0 14.857422 12.486328 L 8.8574219 2.4863281 A 1.0001 1.0001 0 0 0 8.0292969 2.0019531 z M 7 5 L 9 5 L 9 10 L 7 10 L 7 5 z M 7 11 L 9 11 L 9 13 L 7 13 L 7 11 z "
+ id="path4155"
+ transform="translate(0,1036.3622)" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_non_favorite.svg b/editor/icons/source/icon_non_favorite.svg
new file mode 100644
index 0000000000..54fcb8577e
--- /dev/null
+++ b/editor/icons/source/icon_non_favorite.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_favorites.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_non_favorite.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.1165833"
+ inkscape:cy="7.8879933"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1.7246094 L 5.625 5.8222656 L 1 6.9199219 L 4.2363281 10.326172 L 3.8769531 15 L 8.015625 13.023438 L 12.173828 14.964844 L 11.777344 10.3125 L 15 6.9199219 L 10.375 5.8222656 L 8 1.7246094 z M 8 4 L 9.6582031 6.7773438 L 12.890625 7.5214844 L 10.640625 9.8222656 L 10.916016 12.976562 L 8.0117188 11.660156 L 5.1191406 13 L 5.3710938 9.8320312 L 3.109375 7.5214844 L 6.3417969 6.7773438 L 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4254" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_object.svg b/editor/icons/source/icon_object.svg
new file mode 100644
index 0000000000..6b36b61168
--- /dev/null
+++ b/editor/icons/source/icon_object.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_object.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.0308283"
+ inkscape:cy="7.6625569"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1043.8622 0,6 6,-3 0,-6 z"
+ id="path4135"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 8 3.1191406 L 11.763672 5 L 8 6.8828125 L 4.2363281 5 L 8 3.1191406 z M 3 6.6171875 L 7 8.6171875 L 7 12.382812 L 3 10.382812 L 3 6.6171875 z M 13 6.6171875 L 13 10.382812 L 9 12.382812 L 9 8.6171875 L 13 6.6171875 z "
+ id="path4139"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_occluder_polygon_2d.svg b/editor/icons/source/icon_occluder_polygon_2d.svg
new file mode 100644
index 0000000000..8ae6dc176d
--- /dev/null
+++ b/editor/icons/source/icon_occluder_polygon_2d.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_occluder_polygon_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="15.209065"
+ inkscape:cy="9.8176368"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#3552b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1045.3622 6,6 8,0 0,-8 -6,-6 -8,0 z"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#a5b7f3;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.98823529"
+ d="m 1,1037.3622 8,0 -3,4 3,4 -8,0 z"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_omni_light.svg b/editor/icons/source/icon_omni_light.svg
new file mode 100644
index 0000000000..e1049d0039
--- /dev/null
+++ b/editor/icons/source/icon_omni_light.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_omni_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="2.3113909"
+ inkscape:cy="9.4448661"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 5 5 0 0 0 3 6 A 5 5 0 0 0 6 10.576172 L 6 13 L 10 13 L 10 10.580078 A 5 5 0 0 0 13 6 A 5 5 0 0 0 8 1 z M 8 3 A 3 3 0 0 1 11 6 A 3 3 0 0 1 8 9 A 3 3 0 0 1 5 6 A 3 3 0 0 1 8 3 z M 7 14 L 7 15 L 9 15 L 9 14 L 7 14 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_option_button.svg b/editor/icons/source/icon_option_button.svg
new file mode 100644
index 0000000000..4537b14616
--- /dev/null
+++ b/editor/icons/source/icon_option_button.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_option_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="3.751238"
+ inkscape:cy="7.999659"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 L 9,13 9,3 Z m 7,0 0,10 3,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 1,4 3,0 -1.5,2 z"
+ id="rect4140"
+ transform="translate(0,1036.3622)"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssccsccssssccccc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4181"
+ width="4"
+ height="4"
+ x="4"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_override.svg b/editor/icons/source/icon_override.svg
new file mode 100644
index 0000000000..b7948c531c
--- /dev/null
+++ b/editor/icons/source/icon_override.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_override.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="9.4650176"
+ inkscape:cy="7.2694249"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#f3f3f3;fill-opacity:1;stroke:#e4e4e4;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4135"
+ r="3"
+ cy="1041.3622"
+ cx="4" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 5 1 C 3.8919904 1 3 1.8919904 3 3 L 3 4 L 7 4 L 7 3 L 9 3 L 9 4 L 13 4 L 13 3 C 13 1.8919904 12.10801 1 11 1 L 5 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4212" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 6 C 1.8919904 6 1 6.8919904 1 8 L 1 13 C 1 14.10801 1.8919904 15 3 15 L 13 15 C 14.10801 15 15 14.10801 15 13 L 15 8 C 15 6.8919904 14.10801 6 13 6 L 9 6 L 9 9 L 11 9 L 8 13 L 5 9 L 7 9 L 7 6 L 3 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4214" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_packed_data_container.svg b/editor/icons/source/icon_packed_data_container.svg
new file mode 100644
index 0000000000..70aed22f2c
--- /dev/null
+++ b/editor/icons/source/icon_packed_data_container.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_packed_data_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="17.645108"
+ inkscape:cy="9.7856584"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 2,1038.3622 0,12 12,0 0,-12 z"
+ id="path4154"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4167"
+ width="2"
+ height="2.0000174"
+ x="4"
+ y="1040.3622" />
+ <rect
+ y="1043.3622"
+ x="4"
+ height="2.0000174"
+ width="2"
+ id="rect4183"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4185"
+ width="2"
+ height="2.0000174"
+ x="4"
+ y="1046.3622" />
+ <rect
+ y="1040.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4187"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4189"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1043.3622" />
+ <rect
+ y="1046.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4191"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4193"
+ width="2"
+ height="2.0000174"
+ x="10"
+ y="1040.3622" />
+ <rect
+ y="1043.3622"
+ x="10"
+ height="2.0000174"
+ width="2"
+ id="rect4195"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_packed_scene.svg b/editor/icons/source/icon_packed_scene.svg
new file mode 100644
index 0000000000..910a274841
--- /dev/null
+++ b/editor/icons/source/icon_packed_scene.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_packed_scene.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.5714695"
+ inkscape:cy="9.9612352"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 7 L 1 13 L 3 13 L 3 15 L 15 15 L 15 7 L 1 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0.7112932,1040.3831 1,1042.3622 l 2.2438279,-0.3273 -0.8182578,-1.9018 -1.7142769,0.25 z m 3.6933293,-0.5387 0.8182578,1.9018 1.9790524,-0.2887 -0.8182579,-1.9018 -1.9790523,0.2887 z m 3.9581047,-0.5775 0.8182579,1.9018 1.9790519,-0.2887 -0.818257,-1.9018 -1.9790528,0.2887 z m 3.9581048,-0.5774 0.818258,1.9018 1.714277,-0.25 -0.288707,-1.9791 -2.243828,0.3273 z"
+ id="rect4138"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-6.7823301"
+ inkscape:transform-center-y="-2" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4150"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1049.3622"
+ cx="13"
+ id="circle4152"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panel.svg b/editor/icons/source/icon_panel.svg
new file mode 100644
index 0000000000..28921c4031
--- /dev/null
+++ b/editor/icons/source/icon_panel.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panel.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.4355266"
+ inkscape:cy="6.9694327"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panel_container.svg b/editor/icons/source/icon_panel_container.svg
new file mode 100644
index 0000000000..decf220705
--- /dev/null
+++ b/editor/icons/source/icon_panel_container.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panel_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="1.3105266"
+ inkscape:cy="8.3756827"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_1.svg b/editor/icons/source/icon_panels_1.svg
new file mode 100644
index 0000000000..fa8bbe9fad
--- /dev/null
+++ b/editor/icons/source/icon_panels_1.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_2.svg b/editor/icons/source/icon_panels_2.svg
new file mode 100644
index 0000000000..f00cc4b339
--- /dev/null
+++ b/editor/icons/source/icon_panels_2.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="7.0000172"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1045.3622"
+ x="0"
+ height="7.0000172"
+ width="16"
+ id="rect4195"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_2_alt.svg b/editor/icons/source/icon_panels_2_alt.svg
new file mode 100644
index 0000000000..cc3a634a3e
--- /dev/null
+++ b/editor/icons/source/icon_panels_2_alt.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_2_alt.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ y="1036.3622"
+ x="9"
+ height="16"
+ width="7"
+ id="rect4195"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4216"
+ width="7"
+ height="16"
+ x="0"
+ y="1036.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_3.svg b/editor/icons/source/icon_panels_3.svg
new file mode 100644
index 0000000000..04517c5a66
--- /dev/null
+++ b/editor/icons/source/icon_panels_3.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="16"
+ height="7.0000172"
+ x="0"
+ y="1036.3622" />
+ <rect
+ y="1045.3622"
+ x="9"
+ height="7.0000172"
+ width="7"
+ id="rect4195"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4216"
+ width="7"
+ height="7.0000172"
+ x="0"
+ y="1045.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_3_alt.svg b/editor/icons/source/icon_panels_3_alt.svg
new file mode 100644
index 0000000000..e5a9493287
--- /dev/null
+++ b/editor/icons/source/icon_panels_3_alt.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_3_alt.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4216"
+ width="7"
+ height="7.0000172"
+ x="0"
+ y="1045.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4237"
+ width="7"
+ height="16.000017"
+ x="9"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="0"
+ height="7.0000172"
+ width="7"
+ id="rect4239"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_panels_4.svg b/editor/icons/source/icon_panels_4.svg
new file mode 100644
index 0000000000..6d07a0b6d5
--- /dev/null
+++ b/editor/icons/source/icon_panels_4.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_panels_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.854542"
+ inkscape:cy="9.2778779"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ y="1045.3622"
+ x="9"
+ height="7.0000172"
+ width="7"
+ id="rect4195"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4216"
+ width="7"
+ height="7.0000172"
+ x="0"
+ y="1045.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4237"
+ width="7"
+ height="7.0000172"
+ x="9"
+ y="1036.3622" />
+ <rect
+ y="1036.3622"
+ x="0"
+ height="7.0000172"
+ width="7"
+ id="rect4239"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_parallax_background.svg b/editor/icons/source/icon_parallax_background.svg
new file mode 100644
index 0000000000..e1b6a4fb2f
--- /dev/null
+++ b/editor/icons/source/icon_parallax_background.svg
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_parallax_background.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="5.3916748"
+ inkscape:cy="8.33855"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4232"
+ sodipodi:type="arc"
+ sodipodi:cx="2"
+ sodipodi:cy="1039.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="4.712389"
+ d="m 1,1039.3622 a 1,1 0 0 1 1,-1 l 0,1 z" />
+ <path
+ d="m -15,1039.3622 a 1,1 0 0 1 1,-1 l 0,1 z"
+ sodipodi:end="4.712389"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="1039.3622"
+ sodipodi:cx="-14"
+ sodipodi:type="arc"
+ id="path4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4236"
+ width="12"
+ height="1"
+ x="2"
+ y="1038.3622" />
+ <rect
+ y="1049.3622"
+ x="2"
+ height="1"
+ width="12"
+ id="rect4238"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ d="m 1,-1049.3622 a 1,1 0 0 1 1,-1 l 0,1 z"
+ sodipodi:end="4.712389"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="-1049.3622"
+ sodipodi:cx="2"
+ sodipodi:type="arc"
+ id="path4242"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(1,-1)" />
+ <path
+ transform="scale(-1,-1)"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4244"
+ sodipodi:type="arc"
+ sodipodi:cx="-14"
+ sodipodi:cy="-1049.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="4.712389"
+ d="m -15,-1049.3622 a 1,1 0 0 1 1,-1 l 0,1 z" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4246"
+ width="1"
+ height="10.000017"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1039.3622"
+ x="14"
+ height="10"
+ width="1"
+ id="rect4248"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 7,1041.3622 -3,3 3,3 z"
+ id="path4250"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4252"
+ d="m 9,1041.3622 3,3 -3,3 z"
+ style="fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_parallax_layer.svg b/editor/icons/source/icon_parallax_layer.svg
new file mode 100644
index 0000000000..022fdd5339
--- /dev/null
+++ b/editor/icons/source/icon_parallax_layer.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_parallax_layer.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="10.053658"
+ inkscape:cy="6.9687954"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ <path
+ style="fill:#a5b7f8;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 7,1041.3622 -3,3 3,3 z"
+ id="path4250"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4252"
+ d="m 9,1041.3622 3,3 -3,3 z"
+ style="fill:#a5b7f8;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,1 10,0 c 0.552281,9.6e-6 0.99999,0.4477192 1,1 l 0,10 c -10e-6,0.552281 -0.447719,0.99999 -1,1 L 3,14 C 2.4477192,13.99999 2.0000096,13.552281 2,13 L 2,3 c 9.6e-6,-0.5522808 0.4477192,-0.9999904 1,-1 z"
+ transform="translate(0,1036.3622)"
+ id="path4160"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_particle_attractor_2d.svg b/editor/icons/source/icon_particle_attractor_2d.svg
new file mode 100644
index 0000000000..f755d7fc37
--- /dev/null
+++ b/editor/icons/source/icon_particle_attractor_2d.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_particle_attractor_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="8.9614257"
+ inkscape:cy="5.6970686"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 A 3 7 0 0 0 5 8 A 3 7 0 0 0 8 15 A 3 7 0 0 0 11 8 A 3 7 0 0 0 8 1 z M 8 2 A 2 5.9999828 0 0 1 10 8 A 2 5.9999828 0 0 1 8 14 A 2 5.9999828 0 0 1 6 8 A 2 5.9999828 0 0 1 8 2 z "
+ transform="translate(0,1036.3622)"
+ id="path4143" />
+ <path
+ id="path4148"
+ d="m 1,1044.3622 a 7,3 0 0 0 7,3 7,3 0 0 0 7,-3 7,3 0 0 0 -7,-3 7,3 0 0 0 -7,3 z m 1,0 a 5.9999828,2 0 0 1 6,-2 5.9999828,2 0 0 1 6,2 5.9999828,2 0 0 1 -6,2 5.9999828,2 0 0 1 -6,-2 z"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 3.0502525,1049.3119 a 3,7 45 0 0 7.0710675,-2.8284 3,7 45 0 0 2.828427,-7.071 3,7 45 0 0 -7.0710673,2.8284 3,7 45 0 0 -2.8284272,7.071 z m 0.7071068,-0.7071 a 2,5.9999828 45 0 1 2.8284271,-5.6568 2,5.9999828 45 0 1 5.6568546,-2.8284 2,5.9999828 45 0 1 -2.8284274,5.6568 2,5.9999828 45 0 1 -5.6568543,2.8284 z"
+ id="path4150" />
+ <path
+ id="path4152"
+ d="m 12.9497,1049.3119 a 7,3 45 0 0 -2.8284,-7.071 7,3 45 0 0 -7.0710003,-2.8284 7,3 45 0 0 2.8284,7.071 7,3 45 0 0 7.0710003,2.8284 z m -0.7071,-0.7071 a 5.9999828,2 45 0 1 -5.6568003,-2.8284 5.9999828,2 45 0 1 -2.8284,-5.6568 5.9999828,2 45 0 1 5.6568,2.8284 5.9999828,2 45 0 1 2.8284003,5.6568 z"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4154"
+ cx="8"
+ cy="1044.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_particles.svg b/editor/icons/source/icon_particles.svg
new file mode 100644
index 0000000000..f48929a7ef
--- /dev/null
+++ b/editor/icons/source/icon_particles.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_particles.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="5.0589841"
+ inkscape:cy="5.0441142"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4138"
+ cx="4"
+ cy="1044.3622"
+ r="3" />
+ <ellipse
+ cy="1042.3622"
+ cx="8"
+ id="circle4140"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ rx="4.4999948"
+ ry="4.9999847" />
+ <path
+ style="fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 4,1047.3622 8,0 0,-4 -8,0 z"
+ id="path4142"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <circle
+ r="3"
+ cy="1044.3622"
+ cx="12"
+ id="circle4146"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4148"
+ cx="4"
+ cy="1049.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1049.3622"
+ cx="12"
+ id="circle4150"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="circle4152"
+ cx="8"
+ cy="1050.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_particles_2d.svg b/editor/icons/source/icon_particles_2d.svg
new file mode 100644
index 0000000000..1ad1d511f8
--- /dev/null
+++ b/editor/icons/source/icon_particles_2d.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_particles_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="10.042274"
+ inkscape:cy="6.8827763"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4138"
+ cx="4"
+ cy="1044.3622"
+ r="3" />
+ <ellipse
+ cy="1042.3622"
+ cx="8"
+ id="circle4140"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ rx="4.4999948"
+ ry="4.9999847" />
+ <path
+ style="fill:#a5b7f5;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 4,1047.3622 8,0 0,-4 -8,0 z"
+ id="path4142"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <circle
+ r="3"
+ cy="1044.3622"
+ cx="12"
+ id="circle4146"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4148"
+ cx="4"
+ cy="1049.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1049.3622"
+ cx="12"
+ id="circle4150"
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="circle4152"
+ cx="8"
+ cy="1050.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_particles_shader.svg b/editor/icons/source/icon_particles_shader.svg
new file mode 100644
index 0000000000..b4c2ef7ccd
--- /dev/null
+++ b/editor/icons/source/icon_particles_shader.svg
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_particles_shader.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4199">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4201"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4208">
+ <path
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8,1037.3622 A 4.4999948,4.9999847 0 0 0 3.5859375,1041.3934 3,3 0 0 0 1,1044.3622 a 3,3 0 0 0 3,3 l 8,0 a 3,3 0 0 0 3,-3 3,3 0 0 0 -2.589844,-2.9668 A 4.4999948,4.9999847 0 0 0 8,1037.3622 Z m -4,11 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z m 8,0 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z m -4,1 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z"
+ id="path4210"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="8.2922739"
+ inkscape:cy="6.6952763"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4271"
+ clip-path="url(#clipPath4208)"
+ transform="translate(0,1.8694115e-5)">
+ <rect
+ y="1037.3622"
+ x="0"
+ height="2.0000031"
+ width="16"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="16"
+ height="2.0000029"
+ x="0"
+ y="1039.3622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="16"
+ height="1.9999999"
+ x="0"
+ y="1041.3622" />
+ <rect
+ y="1043.3622"
+ x="0"
+ height="2.0000024"
+ width="16"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1045.3622"
+ x="0"
+ height="2.0000021"
+ width="16"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="16"
+ height="1.9999987"
+ x="0"
+ y="1049.3622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="16"
+ height="2.0000021"
+ x="0"
+ y="1047.3622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_patch_9_rect.svg b/editor/icons/source/icon_patch_9_rect.svg
new file mode 100644
index 0000000000..c5a09603a6
--- /dev/null
+++ b/editor/icons/source/icon_patch_9_rect.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_patch_9_rect.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.35114"
+ inkscape:cy="9.1140348"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1050.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="14"
+ height="14"
+ width="1"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1040.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4162"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4164"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1047.3622" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4166"
+ width="14"
+ height="0.9999826"
+ x="1037.3622"
+ y="-5"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-12"
+ x="1037.3622"
+ height="0.9999826"
+ width="14"
+ id="rect4168"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_path.svg b/editor/icons/source/icon_path.svg
new file mode 100644
index 0000000000..39c63eac8a
--- /dev/null
+++ b/editor/icons/source/icon_path.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_path.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="5.2482063"
+ inkscape:cy="13.715698"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4154"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1039.3622"
+ cx="13"
+ id="circle4165"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
+ d="m 3,1049.3622 c 0,-9 10,-1 10,-10"
+ id="path4167"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_path_2d.svg b/editor/icons/source/icon_path_2d.svg
new file mode 100644
index 0000000000..6887834048
--- /dev/null
+++ b/editor/icons/source/icon_path_2d.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_path_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="6.9717791"
+ inkscape:cy="15.350883"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4154"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1039.3622"
+ cx="13"
+ id="circle4165"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 12,1039.3613 c 0,2.0648 -0.492456,2.8244 -1.136719,3.2754 -0.644262,0.451 -1.7128904,0.6055 -2.9628904,0.7305 -1.25,0.125 -2.681372,0.2205 -3.9121094,1.082 C 2.7575439,1045.3107 2,1046.9261 2,1049.3613 l 2,0 c 0,-2.0648 0.4924561,-2.8224 1.1367188,-3.2734 0.6442626,-0.451 1.7128906,-0.6055 2.9628906,-0.7305 1.25,-0.125 2.6813716,-0.2205 3.9121096,-1.082 C 13.242456,1043.4139 14,1041.7965 14,1039.3613 l -2,0 z"
+ id="path4167"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_path_follow.svg b/editor/icons/source/icon_path_follow.svg
new file mode 100644
index 0000000000..6999df33de
--- /dev/null
+++ b/editor/icons/source/icon_path_follow.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_path_follow.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="16.455225"
+ inkscape:cy="0.74140894"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4154"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 12,1039.3613 c 0,2.0648 -0.492456,2.8244 -1.136719,3.2754 -0.644262,0.451 -1.7128904,0.6055 -2.9628904,0.7305 -1.25,0.125 -2.681372,0.2205 -3.9121094,1.082 C 2.7575439,1045.3107 2,1046.9261 2,1049.3613 l 2,0 c 0,-2.0648 0.4924561,-2.8224 1.1367188,-3.2734 0.6442626,-0.451 1.7128906,-0.6055 2.9628906,-0.7305 1.25,-0.125 2.6813716,-0.2205 3.9121096,-1.082 C 13.242456,1043.4139 14,1041.7965 14,1039.3613 l -2,0 z"
+ id="path4167"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.99607843"
+ d="m 10,1040.3622 6,0 -3,-4 z"
+ id="path4238"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_path_follow_2d.svg b/editor/icons/source/icon_path_follow_2d.svg
new file mode 100644
index 0000000000..020a094c0a
--- /dev/null
+++ b/editor/icons/source/icon_path_follow_2d.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_path_follow_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="9.0298197"
+ inkscape:cy="11.306698"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4154"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 12,1039.3613 c 0,2.0648 -0.492456,2.8244 -1.136719,3.2754 -0.644262,0.451 -1.7128904,0.6055 -2.9628904,0.7305 -1.25,0.125 -2.681372,0.2205 -3.9121094,1.082 C 2.7575439,1045.3107 2,1046.9261 2,1049.3613 l 2,0 c 0,-2.0648 0.4924561,-2.8224 1.1367188,-3.2734 0.6442626,-0.451 1.7128906,-0.6055 2.9628906,-0.7305 1.25,-0.125 2.6813716,-0.2205 3.9121096,-1.082 C 13.242456,1043.4139 14,1041.7965 14,1039.3613 l -2,0 z"
+ id="path4167"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a5b7f9;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.98823529"
+ d="m 10,1040.3622 6,0 -3,-4 z"
+ id="path4238"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_pause.svg b/editor/icons/source/icon_pause.svg
new file mode 100644
index 0000000000..411f1b22da
--- /dev/null
+++ b/editor/icons/source/icon_pause.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_pause.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="11.023552"
+ inkscape:cy="7.2928145"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 4 3 A 1.0001 1.0001 0 0 0 3 4 L 3 12 A 1.0001 1.0001 0 0 0 4 13 L 6 13 L 6 12 L 7 12 L 7 4 L 6 4 L 6 3 L 4 3 z M 10 3 L 10 4 L 9 4 L 9 12 L 10 12 L 10 13 L 12 13 A 1.0001 1.0001 0 0 0 13 12 L 13 4 A 1.0001 1.0001 0 0 0 12 3 L 10 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ <circle
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4169"
+ cx="6"
+ cy="1040.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1040.3622"
+ cx="10"
+ id="circle4181"
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <circle
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="circle4183"
+ cx="10"
+ cy="1048.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1048.3622"
+ cx="6"
+ id="circle4185"
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_pin.svg b/editor/icons/source/icon_pin.svg
new file mode 100644
index 0000000000..8281b6438b
--- /dev/null
+++ b/editor/icons/source/icon_pin.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_pin.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="2.044657"
+ inkscape:cy="7.8674742"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 3,1046.3622 10,0 -2,-3 -6,0 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 4 1 L 4 2 L 5 3 L 5 6 L 11 6 L 11 3 L 12 2 L 12 1 L 4 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4173"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1047.3622" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 7,1049.3622 1,2 1,-2 -2,0 z"
+ id="path4175"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_pin_joint.svg b/editor/icons/source/icon_pin_joint.svg
new file mode 100644
index 0000000000..47dbe6be60
--- /dev/null
+++ b/editor/icons/source/icon_pin_joint.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_pin_joint.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="5.6333089"
+ inkscape:cy="6.8938532"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#fc9c9c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 1.9289328,1043.2912 9,1050.3622 l 0.7071066,-3.5355 -4.2426399,-4.2426 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fc9c9c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 9,1037.6343 -0.7071061,0.7071 0,1.4142 -2.1213204,2.1214 4.2426405,4.2426 2.12132,-2.1213 1.414214,0 0.707107,-0.7071 L 9,1037.6343 Z"
+ id="path4162"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4173"
+ width="2"
+ height="2.0000174"
+ x="743.08221"
+ y="737.35425"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
+ <path
+ style="fill:#fc9c9c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2.6360396,1048.2409 -0.7071068,2.1213 2.1213204,-0.7071 -1.4142136,-1.4142 z"
+ id="path4175"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_pin_joint_2d.svg b/editor/icons/source/icon_pin_joint_2d.svg
new file mode 100644
index 0000000000..90e1579903
--- /dev/null
+++ b/editor/icons/source/icon_pin_joint_2d.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_pin_joint_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999998"
+ inkscape:cx="5.6333089"
+ inkscape:cy="6.8938532"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#a5b7f6;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 1.9289328,1043.2912 9,1050.3622 l 0.7071066,-3.5355 -4.2426399,-4.2426 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a5b7f6;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 9,1037.6343 -0.7071061,0.7071 0,1.4142 -2.1213204,2.1214 4.2426405,4.2426 2.12132,-2.1213 1.414214,0 0.707107,-0.7071 L 9,1037.6343 Z"
+ id="path4162"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4173"
+ width="2"
+ height="2.0000174"
+ x="743.08221"
+ y="737.35425"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
+ <path
+ style="fill:#a5b7f6;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2.6360396,1048.2409 -0.7071068,2.1213 2.1213204,-0.7071 -1.4142136,-1.4142 z"
+ id="path4175"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_pin_pressed.svg b/editor/icons/source/icon_pin_pressed.svg
new file mode 100644
index 0000000000..8281b6438b
--- /dev/null
+++ b/editor/icons/source/icon_pin_pressed.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_pin.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="2.044657"
+ inkscape:cy="7.8674742"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 3,1046.3622 10,0 -2,-3 -6,0 z"
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 4 1 L 4 2 L 5 3 L 5 6 L 11 6 L 11 3 L 12 2 L 12 1 L 4 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4162" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4173"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1047.3622" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 7,1049.3622 1,2 1,-2 -2,0 z"
+ id="path4175"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_plane.svg b/editor/icons/source/icon_plane.svg
new file mode 100644
index 0000000000..de5b5efc82
--- /dev/null
+++ b/editor/icons/source/icon_plane.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_plane.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="8.9877784"
+ inkscape:cx="6.5696062"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1044.3622 7,3 7,-3 -7,-3 z"
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_plane_shape.svg b/editor/icons/source/icon_plane_shape.svg
new file mode 100644
index 0000000000..b2d5e18b8f
--- /dev/null
+++ b/editor/icons/source/icon_plane_shape.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_plane_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="6.0267957"
+ inkscape:cx="3.664842"
+ inkscape:zoom="31.999999"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#a2d2ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1044.3622 7,3 7,-3 -7,-3 z"
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play.svg b/editor/icons/source/icon_play.svg
new file mode 100644
index 0000000000..9d3beab97d
--- /dev/null
+++ b/editor/icons/source/icon_play.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="10.275"
+ inkscape:cy="7.6146693"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="m 4,1048.3622 0,-8 7,4 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play_backwards.svg b/editor/icons/source/icon_play_backwards.svg
new file mode 100644
index 0000000000..d93d529dd8
--- /dev/null
+++ b/editor/icons/source/icon_play_backwards.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play_backwards.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.9052441"
+ inkscape:cy="8.136551"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 12,1048.3622 0,-8 -6.9999995,4 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play_custom.svg b/editor/icons/source/icon_play_custom.svg
new file mode 100644
index 0000000000..62ff7fe710
--- /dev/null
+++ b/editor/icons/source/icon_play_custom.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play_custom_scene.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.359274"
+ inkscape:cy="4.5476192"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 7 L 1 13 A 2 2 0 0 0 3 15 L 15 15 L 15 7 L 1 7 z M 4 8 L 8 8 L 8 9 L 12 9 L 12 14 L 8 14 L 4 14 L 4 9 L 4 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0.7112932,1040.3831 1,1042.3622 l 2.2438279,-0.3273 -0.8182578,-1.9018 -1.7142769,0.25 z m 3.6933293,-0.5387 0.8182578,1.9018 1.9790524,-0.2887 -0.8182579,-1.9018 -1.9790523,0.2887 z m 3.9581047,-0.5775 0.8182579,1.9018 1.9790519,-0.2887 -0.818257,-1.9018 -1.9790528,0.2887 z m 3.9581048,-0.5774 0.818258,1.9018 1.714277,-0.25 -0.288707,-1.9791 -2.243828,0.3273 z"
+ id="rect4138"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-6.7823301"
+ inkscape:transform-center-y="-2" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play_scene.svg b/editor/icons/source/icon_play_scene.svg
new file mode 100644
index 0000000000..599cd14981
--- /dev/null
+++ b/editor/icons/source/icon_play_scene.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play_scene.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-0.47309035"
+ inkscape:cy="3.0665228"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 7 L 1 13 L 3 13 L 3 15 L 15 15 L 15 7 L 1 7 z M 6 8 L 11 11 L 6 14 L 6 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0.7112932,1040.3831 1,1042.3622 l 2.2438279,-0.3273 -0.8182578,-1.9018 -1.7142769,0.25 z m 3.6933293,-0.5387 0.8182578,1.9018 1.9790524,-0.2887 -0.8182579,-1.9018 -1.9790523,0.2887 z m 3.9581047,-0.5775 0.8182579,1.9018 1.9790519,-0.2887 -0.818257,-1.9018 -1.9790528,0.2887 z m 3.9581048,-0.5774 0.818258,1.9018 1.714277,-0.25 -0.288707,-1.9791 -2.243828,0.3273 z"
+ id="rect4138"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-6.7823301"
+ inkscape:transform-center-y="-2" />
+ <circle
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4150"
+ cx="3"
+ cy="1049.3622"
+ r="2" />
+ <circle
+ r="2"
+ cy="1049.3622"
+ cx="13"
+ id="circle4152"
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play_start.svg b/editor/icons/source/icon_play_start.svg
new file mode 100644
index 0000000000..7157f59f35
--- /dev/null
+++ b/editor/icons/source/icon_play_start.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play_start.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.4322492"
+ inkscape:cy="9.0261053"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7.000102,1048.3622 0,-8 7,4 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 3,1039.3622 c 0.552262,10e-5 0.999945,0.4477 1,1 l 0,8 c -5.5e-5,0.5523 -0.447738,0.9999 -1,1 l -1,0 0,-1 -1,0 0,-8 1,0 0,-1 z"
+ id="path4155-8"
+ sodipodi:nodetypes="ccccccccccc" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4169"
+ cx="-2"
+ cy="1040.3622"
+ r="1"
+ transform="scale(-1,1)" />
+ <circle
+ r="1"
+ cy="1048.3622"
+ cx="-2"
+ id="circle4185"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_play_start_backwards.svg b/editor/icons/source/icon_play_start_backwards.svg
new file mode 100644
index 0000000000..06998f1043
--- /dev/null
+++ b/editor/icons/source/icon_play_start_backwards.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_play_start_backwards.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.9936216"
+ inkscape:cy="6.940039"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.999898,1048.3622 0,-8 -6.9999995,4 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 13,1039.3622 c -0.552262,10e-5 -0.999945,0.4477 -1,1 l 0,8 c 5.5e-5,0.5523 0.447738,0.9999 1,1 l 1,0 0,-1 1,0 0,-8 -1,0 0,-1 z"
+ id="path4155-8"
+ sodipodi:nodetypes="ccccccccccc" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4169"
+ cx="14"
+ cy="1040.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1048.3622"
+ cx="14"
+ id="circle4185"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_polygon_path_finder.svg b/editor/icons/source/icon_polygon_path_finder.svg
new file mode 100644
index 0000000000..c2f8d80c3d
--- /dev/null
+++ b/editor/icons/source/icon_polygon_path_finder.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_polygon_path_finder.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="4.2632138"
+ inkscape:cy="9.710537"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2 1 C 1.4477381 1.0000552 1.0000552 1.4477381 1 2 L 1 3 L 3 3 L 3 1 L 2 1 z M 5 1 L 5 3 L 7 3 L 7 1 L 5 1 z M 9 1 L 9 3 L 11 3 L 11 1 L 9 1 z M 13 1 L 13 3 L 14.414062 3 L 14.707031 2.7070312 C 15.336587 2.0770367 14.890637 1.0003496 14 1 L 13 1 z M 1 5 L 1 7 L 3 7 L 3 5 L 1 5 z M 12 7 L 9 15 L 12 13 L 15 15 L 12 7 z M 1 9 L 1 11 L 3 11 L 3 9 L 1 9 z M 1 13 L 1 14 C 1.0000552 14.552262 1.4477381 14.999945 2 15 L 3 15 L 3 13 L 1 13 z M 5 13 L 5 15 L 6.9023438 15 C 6.9015603 14.748705 6.9458828 14.499309 7.0332031 14.263672 L 7.5078125 13 L 5 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4144" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_popup.svg b/editor/icons/source/icon_popup.svg
new file mode 100644
index 0000000000..1681e537f6
--- /dev/null
+++ b/editor/icons/source/icon_popup.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_popup.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.3021198"
+ inkscape:cy="5.264507"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.8954305 1 1 1.8954305 1 3 L 1 13 C 1 14.104569 1.8954305 15 3 15 L 13 15 C 14.104569 15 15 14.104569 15 13 L 15 3 C 15 1.8954305 14.104569 1 13 1 L 3 1 z M 7 3 L 9 3 L 9 9 L 7 9 L 7 3 z M 7 11 L 9 11 L 9 13 L 7 13 L 7 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_popup_dialog.svg b/editor/icons/source/icon_popup_dialog.svg
new file mode 100644
index 0000000000..54e14accc7
--- /dev/null
+++ b/editor/icons/source/icon_popup_dialog.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_confirmation_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_popup_dialog.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.6244901"
+ inkscape:cy="5.7391918"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.89543 1 1 1.8954 1 3 L 1 4 L 15 4 L 15 3 C 15 1.8954 14.104569 1 13 1 L 3 1 z M 12 2 L 13 2 L 13 3 L 12 3 L 12 2 z M 1 5 L 1 13 C 1 14.1046 1.89543 15 3 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 5 L 1 5 z M 7 6 L 9 6 L 9 11 L 7 11 L 7 6 z M 7 12 L 9 12 L 9 14 L 7 14 L 7 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_popup_menu.svg b/editor/icons/source/icon_popup_menu.svg
new file mode 100644
index 0000000000..e812ca695b
--- /dev/null
+++ b/editor/icons/source/icon_popup_menu.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_popup_menu.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="7.7434649"
+ inkscape:cy="5.0774028"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 6 A 1 1 0 0 0 1 7 L 1 14 A 1 1 0 0 0 2 15 L 14 15 A 1 1 0 0 0 15 14 L 15 7 A 1 1 0 0 0 14 6 L 2 6 z M 3 8 L 13 8 L 13 10 L 3 10 L 3 8 z M 3 11 L 13 11 L 13 13 L 3 13 L 3 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4161" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 5 L 7 5 L 7 1 L 1 1 z M 2 2 L 6 2 L 4 4 L 2 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_popup_panel.svg b/editor/icons/source/icon_popup_panel.svg
new file mode 100644
index 0000000000..c307257efe
--- /dev/null
+++ b/editor/icons/source/icon_popup_panel.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_popup_panel.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.4838665"
+ inkscape:cy="2.9150134"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2,6 C 1.4477153,6 1,6.4477153 1,7 l 0,7 c 0,0.552285 0.4477153,1 1,1 l 12,0 c 0.552285,0 1,-0.447715 1,-1 L 15,7 C 15,6.4477153 14.552285,6 14,6 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4161"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 5 L 7 5 L 7 1 L 1 1 z M 2 2 L 6 2 L 4 4 L 2 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_portal.svg b/editor/icons/source/icon_portal.svg
new file mode 100644
index 0000000000..2f3d22025f
--- /dev/null
+++ b/editor/icons/source/icon_portal.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_portal.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="3.4176446"
+ inkscape:cy="5.4395319"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 5 7 0 0 0 3 8 A 5 7 0 0 0 8 15 A 5 7 0 0 0 13 8 A 5 7 0 0 0 8 1 z M 8 3 A 2.9999998 5.0000172 0 0 1 11 8 A 2.9999998 5.0000172 0 0 1 8 13 A 2.9999998 5.0000172 0 0 1 5 8 A 2.9999998 5.0000172 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_position_2d.svg b/editor/icons/source/icon_position_2d.svg
new file mode 100644
index 0000000000..4dbb2c188a
--- /dev/null
+++ b/editor/icons/source/icon_position_2d.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_position_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="2.4660493"
+ inkscape:cy="9.4601984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="4"
+ height="2"
+ x="1"
+ y="1043.3622" />
+ <rect
+ y="1043.3622"
+ x="11"
+ height="2"
+ width="4"
+ id="rect4156"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="2"
+ height="4.0000172"
+ x="7"
+ y="1037.3622" />
+ <rect
+ y="1047.3622"
+ x="7"
+ height="4.0000172"
+ width="2"
+ id="rect4160"
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_position_3d.svg b/editor/icons/source/icon_position_3d.svg
new file mode 100644
index 0000000000..b735af4ac3
--- /dev/null
+++ b/editor/icons/source/icon_position_3d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_position.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="13.15355"
+ inkscape:cy="10.553948"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 5 L 9 5 L 9 1 L 7 1 z M 1 7 L 1 9 L 5 9 L 5 7 L 1 7 z M 11 7 L 11 9 L 15 9 L 15 7 L 11 7 z M 7 11 L 7 15 L 9 15 L 9 11 L 7 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_1.svg b/editor/icons/source/icon_progress_1.svg
new file mode 100644
index 0000000000..4b4694d0d4
--- /dev/null
+++ b/editor/icons/source/icon_progress_1.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="4.1004505"
+ inkscape:cy="7.8700042"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_2.svg b/editor/icons/source/icon_progress_2.svg
new file mode 100644
index 0000000000..1edad60e03
--- /dev/null
+++ b/editor/icons/source/icon_progress_2.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_3.svg b/editor/icons/source/icon_progress_3.svg
new file mode 100644
index 0000000000..405a16854e
--- /dev/null
+++ b/editor/icons/source/icon_progress_3.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_4.svg b/editor/icons/source/icon_progress_4.svg
new file mode 100644
index 0000000000..26e97928ee
--- /dev/null
+++ b/editor/icons/source/icon_progress_4.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_5.svg b/editor/icons/source/icon_progress_5.svg
new file mode 100644
index 0000000000..024190e9fd
--- /dev/null
+++ b/editor/icons/source/icon_progress_5.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_6.svg b/editor/icons/source/icon_progress_6.svg
new file mode 100644
index 0000000000..3783c528e7
--- /dev/null
+++ b/editor/icons/source/icon_progress_6.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_7.svg b/editor/icons/source/icon_progress_7.svg
new file mode 100644
index 0000000000..2a2c744b5b
--- /dev/null
+++ b/editor/icons/source/icon_progress_7.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_8.svg b/editor/icons/source/icon_progress_8.svg
new file mode 100644
index 0000000000..2331aee2e7
--- /dev/null
+++ b/editor/icons/source/icon_progress_8.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_wait_preview_8.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_progress_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.2105087"
+ inkscape:cy="9.593577"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1037.4403 0,3.0547 a 4,4 0 0 1 1.027344,0.4258 l 2.158203,-2.1582 A 7,7 0 0 0 9,1037.4403 Z"
+ id="path4179" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.4423 a 7,7 0 0 0 -3.1855469,1.3203 l 2.1582031,2.1582 A 4,4 0 0 1 7,1040.4931 l 0,-3.0508 z"
+ id="path4177" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 2.4003906,1040.1767 a 7,7 0 0 0 -1.3222656,3.1855 l 3.0546875,0 a 4,4 0 0 1 0.4257813,-1.0273 l -2.1582032,-2.1582 z"
+ id="path4175" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.599609,1040.1767 -2.158203,2.1582 a 4,4 0 0 1 0.427735,1.0273 l 3.050781,0 a 7,7 0 0 0 -1.320313,-3.1855 z"
+ id="path4173" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1.0800781,1045.3622 a 7,7 0 0 0 1.3203125,3.1855 l 2.1582032,-2.1582 a 4,4 0 0 1 -0.4277344,-1.0273 l -3.0507813,0 z"
+ id="path4171" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.867188,1045.3622 a 4,4 0 0 1 -0.425782,1.0273 l 2.158203,2.1582 a 7,7 0 0 0 1.322266,-3.1855 l -3.054687,0 z"
+ id="path4169" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 5.9726562,1047.8036 -2.1582031,2.1582 A 7,7 0 0 0 7,1051.2841 l 0,-3.0547 a 4,4 0 0 1 -1.0273438,-0.4258 z"
+ id="path4167" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.19607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.027344,1047.8036 A 4,4 0 0 1 9,1048.2313 l 0,3.0508 a 7,7 0 0 0 3.185547,-1.3203 l -2.158203,-2.1582 z"
+ id="path4142" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_progress_bar.svg b/editor/icons/source/icon_progress_bar.svg
new file mode 100644
index 0000000000..1a5458080b
--- /dev/null
+++ b/editor/icons/source/icon_progress_bar.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_progress_bar.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="8.6672289"
+ inkscape:cy="7.9294918"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 0,2 10,0 0,6 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="1"
+ height="4.0000172"
+ x="4"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="6"
+ height="4.0000172"
+ width="1"
+ id="rect4155"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="1"
+ height="4.0000172"
+ x="8"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_proximity_group.svg b/editor/icons/source/icon_proximity_group.svg
new file mode 100644
index 0000000000..041d0c5ee2
--- /dev/null
+++ b/editor/icons/source/icon_proximity_group.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_proximity_group.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="6.6334983"
+ inkscape:cy="8.2009021"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="1"
+ height="2.0000174"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="-1051.3622"
+ x="-15"
+ height="14"
+ width="2"
+ id="rect4158"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,-1)" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="14"
+ height="2.0000174"
+ x="-15"
+ y="-1051.3622"
+ transform="scale(-1,-1)" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4162"
+ cx="10.499991"
+ cy="1041.8622"
+ r="1.5000087" />
+ <circle
+ r="1.4999913"
+ cy="1046.8622"
+ cx="5.4999914"
+ id="circle4164"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ r="1.5000087"
+ cy="1046.8622"
+ cx="10.499991"
+ id="circle4166"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_quad.svg b/editor/icons/source/icon_quad.svg
new file mode 100644
index 0000000000..86bb1979e7
--- /dev/null
+++ b/editor/icons/source/icon_quad.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_quad.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="10.348747"
+ inkscape:cy="8.3955541"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 1 13 L 1 15 L 3 15 L 15 15 L 15 13 L 15 1 L 3 1 L 1 1 z M 4.4140625 3 L 13 3 L 13 11.585938 L 4.4140625 3 z M 3 4.4140625 L 11.585938 13 L 3 13 L 3 4.4140625 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_quat.svg b/editor/icons/source/icon_quat.svg
new file mode 100644
index 0000000000..36560d9d8f
--- /dev/null
+++ b/editor/icons/source/icon_quat.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_quat.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627418"
+ inkscape:cx="2.0756935"
+ inkscape:cy="11.847423"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 7 1 L 7 7 L 9 7 L 9 1 L 7 1 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="rect4137" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11,1039.7528 0,2.0137 a 5,2.0000043 0 0 1 2,1.5957 5,2.0000043 0 0 1 -5,2 5,2.0000043 0 0 1 -5,-2 5,2.0000043 0 0 1 2,-1.5977 l 0,-2.0097 a 7,3.9999957 0 0 0 -4,3.6074 7,3.9999957 0 0 0 7,4 7,3.9999957 0 0 0 7,-4 7,3.9999957 0 0 0 -4,-3.6094 z"
+ id="path4190"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_range.svg b/editor/icons/source/icon_range.svg
new file mode 100644
index 0000000000..1dd857ff32
--- /dev/null
+++ b/editor/icons/source/icon_range.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_range.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.7342772"
+ inkscape:cy="7.7859674"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4158"
+ width="2"
+ height="10.000017"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1043.3622"
+ x="1"
+ height="2.0000348"
+ width="13"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1039.3622"
+ x="13"
+ height="9.9999657"
+ width="2"
+ id="rect4162"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4137"
+ width="2"
+ height="6.0000172"
+ x="5"
+ y="1041.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="6"
+ width="2"
+ id="rect4139"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rating_no_star.svg b/editor/icons/source/icon_rating_no_star.svg
new file mode 100644
index 0000000000..09a9efa112
--- /dev/null
+++ b/editor/icons/source/icon_rating_no_star.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_favorites.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rating_no_star.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.5847936"
+ inkscape:cy="10.189102"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-7"
+ inkscape:label="Layer 1"
+ style="fill:#c3ae65;fill-opacity:1">
+ <path
+ id="path4254-1"
+ transform="translate(0,1036.3622)"
+ d="M 8,1.7246094 5.625,5.8222656 1,6.9199219 4.2363281,10.326172 3.8769531,15 8.015625,13.023438 12.173828,14.964844 11.777344,10.3125 15,6.9199219 10.375,5.8222656 8,1.7246094 Z M 8,4 l 1.6582031,2.7773438 3.2324219,0.7441406 -2.25,2.3007812 0.275391,3.1542964 L 8.0117188,11.660156 5.1191406,13 5.3710938,9.8320312 3.109375,7.5214844 6.3417969,6.7773438 8,4 Z"
+ style="opacity:1;fill:#c3ae65;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rating_star.svg b/editor/icons/source/icon_rating_star.svg
new file mode 100644
index 0000000000..7ed3f9fbfa
--- /dev/null
+++ b/editor/icons/source/icon_rating_star.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_favorites.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rating_star.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.1543493"
+ inkscape:cy="6.6898808"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ffe484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.0000004,1038.0862 5.62591,1042.1835 1,1043.2813 l 3.2360991,3.4074 -0.3586608,4.6735 4.1388649,-1.9766 4.1572048,1.9421 -0.395342,-4.6532 3.221834,-3.3932 -4.625909,-1.0978 -2.3740906,-4.0973 z"
+ id="path4254"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_ray_cast.svg b/editor/icons/source/icon_ray_cast.svg
new file mode 100644
index 0000000000..b8cab72d07
--- /dev/null
+++ b/editor/icons/source/icon_ray_cast.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_ray_cast.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="7.3699208"
+ inkscape:cy="8.6534602"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="9"
+ x="7"
+ y="1037.3622" />
+ <path
+ style="fill:#fc9c9c;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.99607843"
+ d="m 4,1046.3622 8,0 -4,5 z"
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_ray_cast_2d.svg b/editor/icons/source/icon_ray_cast_2d.svg
new file mode 100644
index 0000000000..faadd41a17
--- /dev/null
+++ b/editor/icons/source/icon_ray_cast_2d.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_ray_cast_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="7.3699208"
+ inkscape:cy="8.6534602"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f5;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="9"
+ x="7"
+ y="1037.3622" />
+ <path
+ style="fill:#a5b7f5;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.98823529"
+ d="m 4,1046.3622 8,0 -4,5 z"
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_ray_shape.svg b/editor/icons/source/icon_ray_shape.svg
new file mode 100644
index 0000000000..0e0f2940ae
--- /dev/null
+++ b/editor/icons/source/icon_ray_shape.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_ray_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="10.045124"
+ inkscape:cx="1.7215967"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ style="fill:#a2d2ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1051.3622 -2,-2 0,-7 2,2 z"
+ id="path4161"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4165"
+ d="m 8,1047.8622 -2,-1.5 0,-4 2,2 z"
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#a2d2ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 8,1037.3622 -6,5 6,4 z"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4163"
+ d="m 8,1051.3622 2,-2 0,-7 -2,2 z"
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4159"
+ d="m 8,1037.3622 6,5 -6,4 z"
+ style="fill:#2998ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_ray_shape_2d.svg b/editor/icons/source/icon_ray_shape_2d.svg
new file mode 100644
index 0000000000..7ffc2ff3b5
--- /dev/null
+++ b/editor/icons/source/icon_ray_shape_2d.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_ray_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="-3.626492"
+ inkscape:cy="10.256723"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8,1038.3622 0,12"
+ id="path4203"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path4224"
+ d="m 5,1047.3622 3,3 3,-3"
+ style="fill:none;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rayito.svg b/editor/icons/source/icon_rayito.svg
new file mode 100644
index 0000000000..56988b9e4f
--- /dev/null
+++ b/editor/icons/source/icon_rayito.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rayito.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254833"
+ inkscape:cx="7.3867117"
+ inkscape:cy="10.060119"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="7"
+ height="7.0710845"
+ x="152.19386"
+ y="1047.8939"
+ transform="matrix(1,0,-0.14142068,0.98994959,0,0)" />
+ <path
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 6,1043.3622 8,0 -9,8 z"
+ id="rect4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_real.svg b/editor/icons/source/icon_real.svg
new file mode 100644
index 0000000000..1a3406ed48
--- /dev/null
+++ b/editor/icons/source/icon_real.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_real.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="4.517927"
+ inkscape:cy="5.7292687"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="11.000017"
+ x="3"
+ y="1040.3622" />
+ <rect
+ y="1039.3622"
+ x="3"
+ height="2.0000174"
+ width="4"
+ id="rect4156"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 7 3 A 2 2.0000055 0 0 1 9 5 A 2 2.0000055 0 0 1 7 7 L 7 9 A 4 4 0 0 0 11 5 A 4 4 0 0 0 7 1 z "
+ transform="translate(0,1038.3622)"
+ id="path4156" />
+ <rect
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="4"
+ height="2.0000174"
+ x="3"
+ y="1045.3622" />
+ <rect
+ y="-12"
+ x="1049.3622"
+ height="2.0000174"
+ width="1.9999652"
+ id="rect4162"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <path
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 7 L 8 9 A 2 2.0000055 0 0 1 10 11 L 12 11 A 4 4 0 0 0 8 7 z "
+ transform="translate(0,1038.3622)"
+ id="path4164" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#cf68ea;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4168"
+ width="1.9999652"
+ height="2.0000174"
+ x="1045.3622"
+ y="-8.0000086" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rectangle_shape_2d.svg b/editor/icons/source/icon_rectangle_shape_2d.svg
new file mode 100644
index 0000000000..d362944e7a
--- /dev/null
+++ b/editor/icons/source/icon_rectangle_shape_2d.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rectangle_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="52.6875"
+ inkscape:cx="4.6595492"
+ inkscape:cy="7.9620403"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:0.98823529;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4226"
+ width="12"
+ height="7.9999824"
+ x="2"
+ y="1040.3622"
+ rx="1.7382812e-05"
+ ry="1.7382812e-05" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_reference_rect.svg b/editor/icons/source/icon_reference_rect.svg
new file mode 100644
index 0000000000..cee814360d
--- /dev/null
+++ b/editor/icons/source/icon_reference_rect.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_reference_rect.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.94489"
+ inkscape:cy="9.0515348"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1050.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="14"
+ height="14"
+ width="1"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_reflection_probe.svg b/editor/icons/source/icon_reflection_probe.svg
new file mode 100644
index 0000000000..64b6493d6d
--- /dev/null
+++ b/editor/icons/source/icon_reflection_probe.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_reflection_probe.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.348015"
+ inkscape:cy="11.115501"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 7 3.6191406 L 7 12.382812 L 3 10.382812 L 3 5.6191406 L 7 3.6191406 z M 9 3.6191406 L 13 5.6191406 L 13 10.382812 L 9 12.382812 L 9 3.6191406 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_region_edit.svg b/editor/icons/source/icon_region_edit.svg
new file mode 100644
index 0000000000..b42a53e88d
--- /dev/null
+++ b/editor/icons/source/icon_region_edit.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_region_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="5.9007098"
+ inkscape:cy="9.4003021"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4165"
+ width="6"
+ height="6"
+ x="6"
+ y="1042.3622" />
+ <rect
+ y="1037.3622"
+ x="6"
+ height="4.0000348"
+ width="6"
+ id="rect4167"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4169"
+ width="4"
+ height="4.0000348"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1042.3622"
+ x="1"
+ height="6.0000348"
+ width="4"
+ id="rect4171"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4173"
+ width="4"
+ height="2.0000174"
+ x="1"
+ y="1049.3622" />
+ <rect
+ y="1049.3622"
+ x="6"
+ height="2.0000174"
+ width="6"
+ id="rect4175"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4177"
+ width="2"
+ height="6.0000348"
+ x="13"
+ y="1042.3622" />
+ <rect
+ y="1037.3622"
+ x="13"
+ height="4.0000348"
+ width="2"
+ id="rect4179"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.32549021;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4181"
+ width="2"
+ height="2.0000174"
+ x="13"
+ y="1049.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_reload_small.svg b/editor/icons/source/icon_reload_small.svg
new file mode 100644
index 0000000000..2d891c2238
--- /dev/null
+++ b/editor/icons/source/icon_reload_small.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="14"
+ height="14"
+ viewBox="0 0 14 14"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_reload_small.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.859062"
+ inkscape:cy="8.1812057"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1038.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1039.3622 a 6.0000172,6.0000172 0 0 0 -6,6 l 2,0 a 4,4 0 0 1 4,-4 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 l 0,2 a 6.0000172,6.0000172 0 0 0 6,-6 6.0000172,6.0000172 0 0 0 -6,-6 z"
+ id="path4138"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4142"
+ sodipodi:sides="3"
+ sodipodi:cx="3"
+ sodipodi:cy="1046.3622"
+ sodipodi:r1="2.236068"
+ sodipodi:r2="1.118034"
+ sodipodi:arg1="1.0471976"
+ sodipodi:arg2="2.0943951"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 4.1180339,1048.2987 -1.6770509,-0.9683 -1.67705101,-0.9682 1.67705101,-0.9683 1.6770511,-0.9682 -1e-7,1.9365 z"
+ inkscape:transform-center-x="0.00013164169"
+ transform="matrix(0,-1.1925797,1.5491989,0,-1618.0232,1050.2732)"
+ inkscape:transform-center-y="0.66664316" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_remote.svg b/editor/icons/source/icon_remote.svg
new file mode 100644
index 0000000000..f5b458c348
--- /dev/null
+++ b/editor/icons/source/icon_remote.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_packed_scene.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_remote.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.572511"
+ inkscape:cy="7.1227734"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4157"
+ cx="8"
+ cy="1043.3622"
+ r="2.0000174" />
+ <rect
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4159"
+ width="2"
+ height="7"
+ x="7"
+ y="1044.3622" />
+ <path
+ style="opacity:1;fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.0878906 1 A 6.0000172 6.0000172 0 0 0 3.7578125 2.7578125 A 6.0000172 6.0000172 0 0 0 3.7578125 11.242188 L 5.1738281 9.8261719 A 4.0000172 4.0000172 0 0 1 4 7 A 4.0000172 4.0000172 0 0 1 8 3 A 4.0000172 4.0000172 0 0 1 12 7 A 4.0000172 4.0000172 0 0 1 10.826172 9.8261719 L 12.242188 11.242188 A 6.0000172 6.0000172 0 0 0 12.242188 2.7578125 A 6.0000172 6.0000172 0 0 0 8.0878906 1 z "
+ transform="translate(0,1036.3622)"
+ id="circle4163" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_remote_transform.svg b/editor/icons/source/icon_remote_transform.svg
new file mode 100644
index 0000000000..fbbfacf629
--- /dev/null
+++ b/editor/icons/source/icon_remote_transform.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_remote_transform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="7.0691739"
+ inkscape:cy="9.3738931"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1680"
+ inkscape:window-height="1050"
+ inkscape:window-x="1366"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4155"
+ sodipodi:type="arc"
+ sodipodi:cx="744.13245"
+ sodipodi:cy="734.23291"
+ sodipodi:rx="4"
+ sodipodi:ry="4"
+ sodipodi:start="0"
+ sodipodi:end="3.1415927"
+ d="m 748.13245,734.23291 a 4,4 0 0 1 -2,3.4641 4,4 0 0 1 -4,0 4,4 0 0 1 -2,-3.4641 l 4,0 z"
+ inkscape:transform-center-y="0.58575321"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-x="0.58575732" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4159"
+ cx="7"
+ cy="1045.3622"
+ r="1" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.242641,1039.1196 a 6.0000172,6.0000172 0 0 0 -8.4852817,0 l 0.7071068,0.7071 a 5.0000172,5.0000172 0 0 1 7.0710679,0 5.0000172,5.0000172 0 0 1 0,7.071 l 0.707107,0.7071 a 6.0000172,6.0000172 0 0 0 0,-8.4852 z"
+ id="circle4163"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.87867618"
+ inkscape:transform-center-x="-0.8786559" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.828427,1040.5338 a 4.0000172,4.0000172 0 0 0 -5.6568541,0 l 0.7071068,0.7071 a 3.0000174,3.0000174 0 0 1 4.2426403,0 3.0000174,3.0000174 0 0 1 0,4.2426 l 0.707107,0.7071 a 4.0000172,4.0000172 0 0 0 0,-5.6568 z"
+ id="circle4168"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.58578284"
+ inkscape:transform-center-x="-0.58576926" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10.414214,1041.948 a 2,2 0 0 0 -2.8284276,0 l 0.7071068,0.7071 a 1.0000174,1.0000174 0 0 1 1.4142136,0 1.0000174,1.0000174 0 0 1 0,1.4142 l 0.7071072,0.7071 a 2,2 0 0 0 0,-2.8284 z"
+ id="circle4172"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.29289334"
+ inkscape:transform-center-x="-0.29288664" />
+ <path
+ style="fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1051.3622 4,-5 1,0 0,5 z"
+ id="path4181"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_remote_transform_2d.svg b/editor/icons/source/icon_remote_transform_2d.svg
new file mode 100644
index 0000000000..479cc0eb25
--- /dev/null
+++ b/editor/icons/source/icon_remote_transform_2d.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_remote_transform.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="6.9441739"
+ inkscape:cy="9.4988931"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4155"
+ sodipodi:type="arc"
+ sodipodi:cx="744.13245"
+ sodipodi:cy="734.23291"
+ sodipodi:rx="4"
+ sodipodi:ry="4"
+ sodipodi:start="0"
+ sodipodi:end="3.1415927"
+ d="m 748.13245,734.23291 a 4,4 0 0 1 -2,3.4641 4,4 0 0 1 -4,0 4,4 0 0 1 -2,-3.4641 l 4,0 z"
+ inkscape:transform-center-y="0.58575321"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-x="0.58575732" />
+ <circle
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4159"
+ cx="7"
+ cy="1045.3622"
+ r="1" />
+ <path
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13.242641,1039.1196 a 6.0000172,6.0000172 0 0 0 -8.4852817,0 l 0.7071068,0.7071 a 5.0000172,5.0000172 0 0 1 7.0710679,0 5.0000172,5.0000172 0 0 1 0,7.071 l 0.707107,0.7071 a 6.0000172,6.0000172 0 0 0 0,-8.4852 z"
+ id="circle4163"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.87867618"
+ inkscape:transform-center-x="-0.8786559" />
+ <path
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 11.828427,1040.5338 a 4.0000172,4.0000172 0 0 0 -5.6568541,0 l 0.7071068,0.7071 a 3.0000174,3.0000174 0 0 1 4.2426403,0 3.0000174,3.0000174 0 0 1 0,4.2426 l 0.707107,0.7071 a 4.0000172,4.0000172 0 0 0 0,-5.6568 z"
+ id="circle4168"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.58578284"
+ inkscape:transform-center-x="-0.58576926" />
+ <path
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 10.414214,1041.948 a 2,2 0 0 0 -2.8284276,0 l 0.7071068,0.7071 a 1.0000174,1.0000174 0 0 1 1.4142136,0 1.0000174,1.0000174 0 0 1 0,1.4142 l 0.7071072,0.7071 a 2,2 0 0 0 0,-2.8284 z"
+ id="circle4172"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="-0.29289334"
+ inkscape:transform-center-x="-0.29288664" />
+ <path
+ style="fill:#a5b7f6;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1051.3622 4,-5 1,0 0,5 z"
+ id="path4181"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_remove.svg b/editor/icons/source/icon_remove.svg
new file mode 100644
index 0000000000..9d75f1e921
--- /dev/null
+++ b/editor/icons/source/icon_remove.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_remove.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_remove.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="7.6907159"
+ inkscape:cy="8.3329344"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 5 L 2 13 A 2 2 0 0 0 4 15 L 12 15 A 2 2 0 0 0 14 13 L 14 5 L 2 5 z M 3 7 L 5 7 L 5 13 L 3 13 L 3 7 z M 7 7 L 9 7 L 9 13 L 7 13 L 7 7 z M 11 7 L 13 7 L 13 13 L 11 13 L 11 7 z "
+ transform="translate(0,1036.3622)"
+ id="rect4136" />
+ <rect
+ y="1038.3622"
+ x="1"
+ height="2.0000174"
+ width="14"
+ id="rect4138"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4140"
+ width="6"
+ height="2.0000174"
+ x="5"
+ y="1037.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rename.svg b/editor/icons/source/icon_rename.svg
new file mode 100644
index 0000000000..41eb10c7fc
--- /dev/null
+++ b/editor/icons/source/icon_rename.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_rename.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rename.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="8.1124598"
+ inkscape:cy="7.4898959"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 5 2 L 5 4 L 7 4 L 7 12 L 5 12 L 5 14 L 7 14 C 7.5522847 14 8 13.5523 8 13 C 8 13.5523 8.4477153 14 9 14 L 11 14 L 11 12 L 9 12 L 9 4 L 11 4 L 11 2 L 9 2 C 8.4477153 2 8 2.4477153 8 3 C 8 2.4477153 7.5522847 2 7 2 L 5 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4138" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_reparent.svg b/editor/icons/source/icon_reparent.svg
new file mode 100644
index 0000000000..79543fe066
--- /dev/null
+++ b/editor/icons/source/icon_reparent.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_edit.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_reparent.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="11.980115"
+ inkscape:cy="8.5519429"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 2 A 2 2 0 0 0 1 4 A 2 2 0 0 0 2 5.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 4.7304688 14 L 11.271484 14 A 2 2 0 0 0 13 15 A 2 2 0 0 0 15 13 A 2 2 0 0 0 13 11 A 2 2 0 0 0 11.269531 12 L 4.7285156 12 A 2 2 0 0 0 4 11.269531 L 4 5.7285156 A 2 2 0 0 0 5 4 A 2 2 0 0 0 3 2 z "
+ transform="translate(0,1036.3622)"
+ id="circle4277" />
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 9 1 L 5 4 L 9 7 L 9 5 A 3 3 0 0 1 12 8 L 12 10 L 14 10 L 14 8 A 5.0000172 5.0000172 0 0 0 9 3 L 9 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4289" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_resource_preloader.svg b/editor/icons/source/icon_resource_preloader.svg
new file mode 100644
index 0000000000..bab1bb4e1e
--- /dev/null
+++ b/editor/icons/source/icon_resource_preloader.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_resource_preloader.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="5.6052155"
+ inkscape:cy="14.599536"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1-2"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ inkscape:label="Layer 1"
+ id="layer1-2">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 8 3.1191406 L 11.763672 5 L 8 6.8828125 L 4.2363281 5 L 8 3.1191406 z M 3 6.6191406 L 7 8.6191406 L 7 12.382812 L 3 10.382812 L 3 6.6191406 z M 13 6.6191406 L 13 10.382812 L 9 12.382812 L 9 8.6191406 L 13 6.6191406 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 11,1042.3622 -6,-3 -3,2 6,3 z"
+ id="path4214"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rich_text_label.svg b/editor/icons/source/icon_rich_text_label.svg
new file mode 100644
index 0000000000..4a77dbe672
--- /dev/null
+++ b/editor/icons/source/icon_rich_text_label.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rich_text_label.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="9.3773364"
+ inkscape:cy="8.3725226"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="8"
+ height="2"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1041.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4161"
+ width="4"
+ height="2"
+ x="5"
+ y="1041.3622" />
+ <rect
+ y="1045.3622"
+ x="1"
+ height="2"
+ width="8"
+ id="rect4163"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4165"
+ width="4"
+ height="2"
+ x="1"
+ y="1049.3622" />
+ <rect
+ y="1049.3622"
+ x="7"
+ height="2"
+ width="2"
+ id="rect4167"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 12,1048.3622 -2,0 3,3 3,-3 -2,0 0,-8 2,0 -3,-3 -3,3 2,0 z"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rigid_body.svg b/editor/icons/source/icon_rigid_body.svg
new file mode 100644
index 0000000000..6bebb5250f
--- /dev/null
+++ b/editor/icons/source/icon_rigid_body.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animated_sprite.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rigid_body.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="5.8981998"
+ inkscape:cy="3.2693775"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 1.0351562 8.6992188 A 7 7 0 0 0 1.3125 10.068359 A 7 7 0 0 0 2.2226562 11.953125 A 7 7 0 0 0 2.5253906 12.361328 C 2.5261756 12.358768 2.5265573 12.356076 2.5273438 12.353516 A 7 7 0 0 0 8 15 A 7 7 0 0 0 11.242188 14.197266 C 11.243563 14.197659 11.244719 14.198826 11.246094 14.199219 A 7 7 0 0 0 11.28125 14.177734 A 7 7 0 0 0 11.707031 13.927734 A 7 7 0 0 0 11.876953 13.824219 A 7 7 0 0 0 12.246094 13.554688 A 7 7 0 0 0 12.451172 13.398438 A 7 7 0 0 0 12.792969 13.089844 A 7 7 0 0 0 12.957031 12.935547 A 7 7 0 0 0 13.287109 12.574219 A 7 7 0 0 0 13.427734 12.414062 A 7 7 0 0 0 13.705078 12.041016 A 7 7 0 0 0 13.84375 11.845703 A 7 7 0 0 0 14.0625 11.484375 A 7 7 0 0 0 14.205078 11.234375 A 7 7 0 0 0 14.361328 10.900391 A 7 7 0 0 0 14.5 10.589844 A 7 7 0 0 0 14.607422 10.28125 A 7 7 0 0 0 14.726562 9.9277344 A 7 7 0 0 0 14.814453 9.5585938 A 7 7 0 0 0 14.880859 9.265625 A 7 7 0 0 0 14.9375 8.8652344 A 7 7 0 0 0 14.974609 8.5527344 A 7 7 0 0 0 15 8 A 7 7 0 0 0 10.615234 1.5117188 A 7 7 0 0 0 10.607422 1.5078125 A 7 7 0 0 0 10.605469 1.5078125 A 7 7 0 0 0 9.9902344 1.2949219 A 7 7 0 0 0 9.9453125 1.2792969 A 7 7 0 0 0 9.9394531 1.2773438 A 7 7 0 0 0 9.3886719 1.1464844 A 7 7 0 0 0 9.2480469 1.1152344 A 7 7 0 0 0 8.6972656 1.0429688 A 7 7 0 0 0 8.5546875 1.0253906 A 7 7 0 0 0 8 1 z M 9.9511719 2.3339844 A 6 6 0 0 1 14 8 L 7 8 A 1.9999826 1.9999826 0 0 1 6.0507812 9.6992188 C 7.3958011 11.726012 8.6521082 12.963726 9.9472656 13.667969 A 6 6 0 0 1 8 14 A 6 6 0 0 1 2.9453125 11.230469 C 3.1830255 10.651966 3.4486773 10.090161 3.7714844 9.5742188 A 1.9999826 1.9999826 0 0 1 3 8 L 2 8 A 6 6 0 0 1 3.1230469 4.5136719 C 3.2693647 5.1646014 3.4808033 5.7970038 3.8066406 6.3984375 A 1.9999826 1.9999826 0 0 1 5 6 A 1.9999826 1.9999826 0 0 1 6.0507812 6.3007812 C 7.397198 4.2718995 8.6545329 3.0376638 9.9511719 2.3339844 z "
+ transform="translate(0,1036.3622)"
+ id="circle4189" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4195"
+ cx="5"
+ cy="1044.3622"
+ r="2" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rigid_body_2d.svg b/editor/icons/source/icon_rigid_body_2d.svg
new file mode 100644
index 0000000000..9c8309ecfb
--- /dev/null
+++ b/editor/icons/source/icon_rigid_body_2d.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_animated_sprite.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rigid_body_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.941452"
+ inkscape:cy="2.9508684"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1037.3622 a 7,7 0 0 0 -7,7 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 z m 0,1 a 6,6 0 0 1 6,6 6,6 0 0 1 -6,6 6,6 0 0 1 -6,-6 6,6 0 0 1 6,-6 z"
+ id="circle4189"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#a5b7f1;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8,1037.3622 a 7,7 0 0 0 -5.087891,2.2051 c 0.104949,1.1207 0.354173,2.1959 0.894532,3.1933 A 1.9999826,1.9999826 0 0 1 5,1042.3622 a 1.9999826,1.9999826 0 0 1 1.050781,0.3008 c 1.787275,-2.6932 3.418131,-3.9904 5.191407,-4.4981 A 7,7 0 0 0 8,1037.3622 Z m -7,7 a 7,7 0 0 0 1.525391,4.3613 c 0.302809,-0.9877 0.71628,-1.9403 1.246093,-2.7871 A 1.9999826,1.9999826 0 0 1 3,1044.3622 l -2,0 z m 6,0 a 1.9999826,1.9999826 0 0 1 -0.949219,1.6992 c 1.788654,2.6953 3.420447,3.9932 5.195313,4.5 A 7,7 0 0 0 15,1044.3622 l -8,0 z"
+ id="path4174"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#a5b7f2;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4195"
+ cx="5"
+ cy="1044.3622"
+ r="2" />
+ <path
+ style="opacity:1;fill:#a5b7f2;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 45,1037.3585 a 7,7 0 0 0 -7,7 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 z m 0,1 a 6.0000172,6.0000172 0 0 1 6,6 6.0000172,6.0000172 0 0 1 -6,6 6.0000172,6.0000172 0 0 1 -6,-6 6.0000172,6.0000172 0 0 1 6,-6 z"
+ id="path4199"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a5b7f3;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 38,1044.3585 c 5,0.01 9,0.01 14,0 -2,-2.9934 -5,-4 -7,-4 -2,0 -5,1.0066 -7,4 z"
+ id="path4204"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsc" />
+ <path
+ style="opacity:1;fill:#a3b6f2;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 38,1044.3585 c 0,3.866 3.134007,7 7,7 3.865993,0 7,-3.134 7,-7 -2,2.9933 -5,4 -7,4 -2,0 -5,-1.0067 -7,-4 z"
+ id="path4224"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#a3b6f2;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m -9,1037.3622 a 7,7 0 0 0 -7,7 7,7 0 0 0 7,7 7,7 0 0 0 7,-7 7,7 0 0 0 -7,-7 z m 0,1 a 6,6 0 0 1 6,6 6,6 0 0 1 -6,6 6,6 0 0 1 -6,-6 6,6 0 0 1 6,-6 z"
+ id="path4230"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#a3b6f2;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4235"
+ cx="-9"
+ cy="1044.3622"
+ r="2" />
+ <path
+ style="opacity:1;fill:#a3b6f2;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m -9,1037.3622 a 7,7 0 0 0 -3.5,0.9375 l 3.5,6.0625 3.5,-6.0625 a 7,7 0 0 0 -3.5,-0.9375 z m 0,7 3.5,6.0625 a 7,7 0 0 0 2.5625,-2.5625 7,7 0 0 0 0.9375,-3.5 l -7,0 z m 0,0 -7,0 a 7,7 0 0 0 0.9375,3.5 7,7 0 0 0 2.5625,2.5625 l 3.5,-6.0625 z"
+ id="path4237"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_room.svg b/editor/icons/source/icon_room.svg
new file mode 100644
index 0000000000..599bbeb770
--- /dev/null
+++ b/editor/icons/source/icon_room.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_room.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="11.166681"
+ inkscape:cy="6.6297847"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 9 3.6191406 L 13 5.6191406 L 13 9.3828125 L 9 7.3828125 L 9 3.6191406 z M 8 9.1191406 L 11.763672 11 L 8 12.882812 L 4.2363281 11 L 8 9.1191406 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_room_bounds.svg b/editor/icons/source/icon_room_bounds.svg
new file mode 100644
index 0000000000..8f7e6e6c83
--- /dev/null
+++ b/editor/icons/source/icon_room_bounds.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_room_bounds.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="9.5548877"
+ inkscape:cy="9.0516113"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 1 1 L 1 2 L 1 3 L 2 3 L 2 2 L 3 2 L 3 1 L 2 1 L 1 1 z M 13 1 L 13 2 L 14 2 L 14 3 L 15 3 L 15 2 L 15 1 L 14 1 L 13 1 z M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 9 3.6191406 L 13 5.6191406 L 13 9.3828125 L 9 7.3828125 L 9 3.6191406 z M 8 9.1191406 L 11.763672 11 L 8 12.882812 L 4.2363281 11 L 8 9.1191406 z M 1 13 L 1 14 L 1 15 L 2 15 L 3 15 L 3 14 L 2 14 L 2 13 L 1 13 z M 14 13 L 14 14 L 13 14 L 13 15 L 14 15 L 15 15 L 15 14 L 15 13 L 14 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rotate_0.svg b/editor/icons/source/icon_rotate_0.svg
new file mode 100644
index 0000000000..710edc8fee
--- /dev/null
+++ b/editor/icons/source/icon_rotate_0.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rotate_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.0020505"
+ inkscape:cy="9.5378523"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="7.0000172"
+ x="7"
+ y="1038.3622" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 5 5 0 0 1 13 8 A 5 5 0 0 1 8 13 A 5 5 0 0 1 3 8 A 5 5 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rotate_180.svg b/editor/icons/source/icon_rotate_180.svg
new file mode 100644
index 0000000000..ba44fa295d
--- /dev/null
+++ b/editor/icons/source/icon_rotate_180.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rotate_180.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.9698535"
+ inkscape:cy="9.9922105"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0000001,1038.3622 a 6,6 0 0 1 5.9999999,6 l -6,0 z"
+ id="path4183" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="7.0000172"
+ x="7"
+ y="1038.3622"
+ inkscape:transform-center-y="-2.5000088" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 5 5 0 0 1 13 8 A 5 5 0 0 1 8 13 A 5 5 0 0 1 3 8 A 5 5 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ <rect
+ inkscape:transform-center-y="2.499974"
+ y="-1050.3622"
+ x="-9.0000172"
+ height="7.0000172"
+ width="2"
+ id="rect4181"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,-1)"
+ inkscape:transform-center-x="-1.7183069e-05" />
+ <path
+ id="path4205"
+ d="m 14,1044.3622 a 6,6 0 0 1 -6,6 l 0,-6 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-3"
+ inkscape:transform-center-y="3" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rotate_270.svg b/editor/icons/source/icon_rotate_270.svg
new file mode 100644
index 0000000000..403321cb89
--- /dev/null
+++ b/editor/icons/source/icon_rotate_270.svg
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rotate_270.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.9698535"
+ inkscape:cy="9.9922105"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0000001,1038.3622 a 6,6 0 0 1 5.9999999,6 l -6,0 z"
+ id="path4183" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="7.0000172"
+ x="7"
+ y="1038.3622"
+ inkscape:transform-center-y="-2.5000088" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 5 5 0 0 1 13 8 A 5 5 0 0 1 8 13 A 5 5 0 0 1 3 8 A 5 5 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ <rect
+ inkscape:transform-center-y="-1.7416931e-05"
+ y="2.0000174"
+ x="-1045.3622"
+ height="7.0000172"
+ width="2"
+ id="rect4181"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="2.499974" />
+ <path
+ id="path4205"
+ d="m 8,1050.3622 a 6,6 0 0 1 -6,-6 l 6,0 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="3"
+ inkscape:transform-center-y="2.9999999" />
+ <path
+ inkscape:transform-center-y="2.9999999"
+ inkscape:transform-center-x="-3"
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 14,1044.3622 a 6,6 0 0 1 -6.0000001,6 l 0,-6 z"
+ id="path4226" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_rotate_90.svg b/editor/icons/source/icon_rotate_90.svg
new file mode 100644
index 0000000000..f6b7d84032
--- /dev/null
+++ b/editor/icons/source/icon_rotate_90.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_rotate_90.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.9698535"
+ inkscape:cy="9.9922105"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 8.0000001,1038.3622 a 6,6 0 0 1 5.9999999,6 l -6,0 z"
+ id="path4183" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="7.0000172"
+ x="7"
+ y="1038.3622"
+ inkscape:transform-center-y="-2.5000088" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 5 5 0 0 1 13 8 A 5 5 0 0 1 8 13 A 5 5 0 0 1 3 8 A 5 5 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4157" />
+ <rect
+ inkscape:transform-center-y="-1.7383069e-05"
+ y="-14.000017"
+ x="1043.3622"
+ height="7.0000172"
+ width="2"
+ id="rect4181"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)"
+ inkscape:transform-center-x="-2.5000086" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sample.svg b/editor/icons/source/icon_sample.svg
new file mode 100644
index 0000000000..782e07a012
--- /dev/null
+++ b/editor/icons/source/icon_sample.svg
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_sample.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="10.421269"
+ inkscape:cy="6.7982798"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4156"
+ width="1"
+ height="1.999948"
+ x="-14"
+ y="1043.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1039.3622"
+ x="-12"
+ height="10.000017"
+ width="1"
+ id="rect4158"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4160"
+ width="1"
+ height="7.9999475"
+ x="-10"
+ y="1040.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1037.3622"
+ x="-8"
+ height="13.999949"
+ width="1"
+ id="rect4162"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4164"
+ width="1"
+ height="12.000017"
+ x="-6"
+ y="1038.3622"
+ transform="scale(-1,1)" />
+ <rect
+ y="1041.3622"
+ x="-4"
+ height="6.0000172"
+ width="1"
+ id="rect4166"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4168"
+ width="1"
+ height="1.9999824"
+ x="-2"
+ y="1043.3622"
+ transform="scale(-1,1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sample_library.svg b/editor/icons/source/icon_sample_library.svg
new file mode 100644
index 0000000000..78b01430c2
--- /dev/null
+++ b/editor/icons/source/icon_sample_library.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_sample_library.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="21.70867"
+ inkscape:cx="6.3137691"
+ inkscape:cy="6.7376711"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,8 0,1 0,5 0,1 5,0 c 0.552285,0 1,-0.447715 1,-1 L 15,9 C 15,8.4477153 14.552285,8 14,8 l 0,4 -1,-1 -1,1 0,-4 z"
+ transform="translate(0,1036.3622)"
+ id="rect4161"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccssscccccc" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff8484;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 7.0214844,1037.3633 a 1.0001,1.0001 0 0 0 -1,0.875 l -0.5898438,4.7226 -0.5234375,-1.0468 a 1.0001,1.0001 0 0 0 -0.8945312,-0.5528 l -2,0 a 1.0001,1.0001 0 1 0 0,2 l 1.3828125,0 1.7226562,3.4473 a 1.0001,1.0001 0 0 0 1.8867188,-0.3223 l 0.5898437,-4.7226 0.5234375,1.0449 a 1.0001,1.0001 0 0 0 0.8945313,0.5527 l 3.0000001,0 a 1.0001,1.0001 0 1 0 0,-2 l -2.3808595,0 -1.7246094,-3.4472 a 1.0001,1.0001 0 0 0 -0.8867187,-0.5508 z"
+ id="path4181"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sample_player.svg b/editor/icons/source/icon_sample_player.svg
new file mode 100644
index 0000000000..2254718a9b
--- /dev/null
+++ b/editor/icons/source/icon_sample_player.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_sample_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="10.445016"
+ inkscape:cy="6.2884774"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 L 4 6 L 1 6 L 1 10 L 4 10 L 8 15 L 8 1 z M 13 3 L 13 13 L 14 13 L 14 3 L 13 3 z M 10 6 L 10 11 L 11 11 L 11 6 L 10 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sample_player_2d.svg b/editor/icons/source/icon_sample_player_2d.svg
new file mode 100644
index 0000000000..33a7eba019
--- /dev/null
+++ b/editor/icons/source/icon_sample_player_2d.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_sample_player_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="8.6950163"
+ inkscape:cy="7.1009775"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 L 4 6 L 1 6 L 1 10 L 4 10 L 8 15 L 8 1 z M 13 3 L 13 13 L 14 13 L 14 3 L 13 3 z M 10 6 L 10 11 L 11 11 L 11 6 L 10 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_save.svg b/editor/icons/source/icon_save.svg
new file mode 100644
index 0000000000..9307537d4b
--- /dev/null
+++ b/editor/icons/source/icon_save.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_save.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_save.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="12.546235"
+ inkscape:cy="8.6646398"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 11,1 Z m 0,0 8,0 0,6 -8,0 z m 5,8 c 1.1045695,0 2,0.8954305 2,2 0,1.104569 -0.8954305,2 -2,2 C 6.8954305,13 6,12.104569 6,11 6,9.8954305 6.8954305,9 8,9 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssssccscccccsssss" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4143"
+ width="3"
+ height="4.9999828"
+ x="4"
+ y="1037.3622" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 11,1037.3622 1,0 3,3 0,2 -4,0 z"
+ id="path4145"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_script.svg b/editor/icons/source/icon_script.svg
new file mode 100644
index 0000000000..8073692ce8
--- /dev/null
+++ b/editor/icons/source/icon_script.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_script.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254833"
+ inkscape:cx="2.4359625"
+ inkscape:cy="9.1567888"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 L 6 2 A 1 1 0 0 0 5 3 L 5 13 L 4 13 L 4 11 L 2 11 L 2 13 A 1 1 0 0 0 2.5 13.865234 A 1 1 0 0 0 3 14 L 3 15 L 10 15 A 2 2 0 0 0 12 13 L 12 5 L 15 5 L 15 3 A 2 2 0 0 0 13 1 L 6 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4255" />
+ <path
+ style="opacity:1;fill:#b4b4b4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 C 4.8954305 1 4 1.8954305 4 3 L 4 10 L 2 10 L 1 10 L 1 11 L 1 13 C 1 14.104569 1.8954305 15 3 15 C 4.1045695 15 5 14.104569 5 13 L 5 3 C 5 2.4477153 5.4477153 2 6 2 C 6.5522847 2 7 2.4477153 7 3 L 7 4 L 7 5 L 7 6 L 8 6 L 12 6 L 12 5 L 8 5 L 8 4 L 8 3 C 8 1.8954305 7.1045695 1 6 1 z M 2 11 L 4 11 L 4 13 C 4 13.552285 3.5522847 14 3 14 C 2.4477153 14 2 13.552285 2 13 L 2 11 z "
+ transform="translate(0,1036.3622)"
+ id="path4265" />
+ <circle
+ cy="1048.3622"
+ cx="3"
+ id="ellipse4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ ry="1.0000174"
+ rx="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_script_create.svg b/editor/icons/source/icon_script_create.svg
new file mode 100644
index 0000000000..0cf16a9c3b
--- /dev/null
+++ b/editor/icons/source/icon_script_create.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/godotengine/godot/tools/editor/icons/con_script_create.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_script_create.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="21.189633"
+ inkscape:cx="7.8202901"
+ inkscape:cy="11.917121"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 L 6 2 C 5.4477153 2 5 2.4477153 5 3 L 5 13 L 4 13 L 4 11 L 2 11 L 2 13 C 2.0002826 13.356983 2.1908437 13.686743 2.5 13.865234 C 2.6519425 13.953279 2.8243914 13.999759 3 14 L 3 15 L 8 15 L 9 15 L 9 14 L 8 14 L 8 10 L 10 10 L 10 8 L 12 8 L 12 5 L 15 5 L 15 3 C 15 1.8954305 14.104569 1 13 1 L 6 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4255" />
+ <path
+ style="opacity:1;fill:#b4b4b4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 C 4.8954305 1 4 1.8954305 4 3 L 4 10 L 2 10 L 1 10 L 1 11 L 1 13 C 1 14.104569 1.8954305 15 3 15 C 4.1045695 15 5 14.104569 5 13 L 5 3 C 5 2.4477153 5.4477153 2 6 2 C 6.5522847 2 7 2.4477153 7 3 L 7 4 L 7 5 L 7 6 L 8 6 L 12 6 L 12 5 L 8 5 L 8 4 L 8 3 C 8 1.8954305 7.1045695 1 6 1 z M 2 11 L 4 11 L 4 13 C 4 13.552285 3.5522847 14 3 14 C 2.4477153 14 2 13.552285 2 13 L 2 11 z "
+ id="path4265"
+ transform="translate(0,1036.3622)" />
+ <circle
+ cy="1048.3622"
+ cx="3"
+ id="ellipse4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ ry="1.0000174"
+ rx="1" />
+ <path
+ style="fill:#84ffb1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 13,1049.3622 2,0 0,-2 -2,0 0,-2 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 z"
+ id="path8069"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_script_remove.svg b/editor/icons/source/icon_script_remove.svg
new file mode 100644
index 0000000000..1a0a0eebe3
--- /dev/null
+++ b/editor/icons/source/icon_script_remove.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/godotengine/godot/tools/editor/icons/con_script_create.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_script_remove.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="42.379266"
+ inkscape:cx="6.774667"
+ inkscape:cy="6.9870579"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 L 6 2 C 5.4477153 2 5 2.4477153 5 3 L 5 13 L 4 13 L 4 11 L 2 11 L 2 13 C 2.0002826 13.356983 2.1908437 13.686743 2.5 13.865234 C 2.6519425 13.953279 2.8243914 13.999759 3 14 L 3 15 L 8.6347656 15 L 7.0507812 13.416016 L 8.4648438 12.001953 L 7.0507812 10.585938 L 10.585938 7.0507812 L 12 8.4648438 L 12 8 L 12 5 L 15 5 L 15 3 C 15 1.8954305 14.104569 1 13 1 L 6 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4255" />
+ <path
+ style="opacity:1;fill:#b4b4b4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 C 4.8954305 1 4 1.8954305 4 3 L 4 10 L 2 10 L 1 10 L 1 11 L 1 13 C 1 14.104569 1.8954305 15 3 15 C 4.1045695 15 5 14.104569 5 13 L 5 3 C 5 2.4477153 5.4477153 2 6 2 C 6.5522847 2 7 2.4477153 7 3 L 7 4 L 7 5 L 7 6 L 8 6 L 12 6 L 12 5 L 8 5 L 8 4 L 8 3 C 8 1.8954305 7.1045695 1 6 1 z M 2 11 L 4 11 L 4 13 C 4 13.552285 3.5522847 14 3 14 C 2.4477153 14 2 13.552285 2 13 L 2 11 z "
+ id="path4265"
+ transform="translate(0,1036.3622)" />
+ <circle
+ cy="1048.3622"
+ cx="3"
+ id="ellipse4234"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ ry="1.0000174"
+ rx="1" />
+ <path
+ style="fill:#ff8484;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 13.414214,1048.3622 1.414213,-1.4142 -1.414213,-1.4142 L 12,1046.948 l -1.414214,-1.4142 -1.4142131,1.4142 1.4142131,1.4142 -1.4142131,1.4142 1.4142131,1.4142 1.414214,-1.4142 1.414214,1.4142 1.414213,-1.4142 z"
+ id="path8069"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_scroll_bar.svg b/editor/icons/source/icon_scroll_bar.svg
new file mode 100644
index 0000000000..2f007c7c94
--- /dev/null
+++ b/editor/icons/source/icon_scroll_bar.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_h_scroll_bar.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.1371771"
+ inkscape:cy="7.8450604"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 0,2 10,0 0,6 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4181"
+ width="4"
+ height="4"
+ x="4"
+ y="1042.3622" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4187"
+ width="4"
+ height="4"
+ x="4"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_scroll_container.svg b/editor/icons/source/icon_scroll_container.svg
new file mode 100644
index 0000000000..d694b646e0
--- /dev/null
+++ b/editor/icons/source/icon_scroll_container.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_scroll_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.2189611"
+ inkscape:cy="10.454966"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4161"
+ d="m 10,1042.3622 0,4 2,-2 z"
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1042.3622 0,4 -2,-2 z"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1042.3622 4,0 -2,-2 z"
+ id="path4157"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4159"
+ d="m 6,1046.3622 4,0 -2,2 z"
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_segment_shape_2d.svg b/editor/icons/source/icon_segment_shape_2d.svg
new file mode 100644
index 0000000000..b509a31362
--- /dev/null
+++ b/editor/icons/source/icon_segment_shape_2d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_segment_shape_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="52.6875"
+ inkscape:cx="5.5326216"
+ inkscape:cy="8.6453144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#68b6ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ d="m 2,1050.3622 12,-12"
+ id="path4268"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_shader.svg b/editor/icons/source/icon_shader.svg
new file mode 100644
index 0000000000..1a2393fec2
--- /dev/null
+++ b/editor/icons/source/icon_shader.svg
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_material.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_shader.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4253">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ id="path4255"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4207">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 6.3749999,1025.8622 c -0.931942,10e-5 -1.6874069,0.6715 -1.6875,1.5 l 0,18 c 9.31e-5,0.8284 0.755558,1.4998 1.6875,1.5 l 20.2500001,0 c 0.931942,-2e-4 1.687407,-0.6716 1.6875,-1.5 l 0,-12 -8.4375,-7.5 z m 1.6875,3 10.1250001,0 0,4.5 c 0,0.831 0.752609,1.5 1.6875,1.5 l 5.0625,0 0,9 -16.8750001,0 z"
+ id="path4209"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccc" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="20.042938"
+ inkscape:cy="7.6712905"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4207)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_short_cut.svg b/editor/icons/source/icon_short_cut.svg
new file mode 100644
index 0000000000..05069e8ea1
--- /dev/null
+++ b/editor/icons/source/icon_short_cut.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_short_cut.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="7.0902833"
+ inkscape:cy="8.378548"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 4 2 C 3.4477153 2 3 2.4477 3 3 L 3 12.083984 C 3.0004015 12.589984 3.4479991 13 4 13 L 12 13 C 12.552001 13 12.999599 12.589984 13 12.083984 L 13 3 C 13 2.4477 12.552285 2 12 2 L 4 2 z M 1 4 L 1 13 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 4 L 14 4 L 14 13 A 0.9999826 0.9999826 0 0 1 13 14 L 3 14 A 1 1 0 0 1 2 13 L 2 4 L 1 4 z M 7 4 L 10 4 L 9 7 L 11 7 L 7 11 L 8 8 L 6 8 L 7 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4194"
+ width="7"
+ height="14"
+ x="27"
+ y="1038.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_signal.svg b/editor/icons/source/icon_signal.svg
new file mode 100644
index 0000000000..b4d3ff5ac8
--- /dev/null
+++ b/editor/icons/source/icon_signal.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_signal.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="21.70867"
+ inkscape:cx="11.546427"
+ inkscape:cy="8.2846975"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4352"
+ width="6"
+ height="2.0000174"
+ x="5"
+ y="1043.3622" />
+ <path
+ transform="matrix(0,1.2810265,-0.92450034,0,-948.29952,1037.9571)"
+ inkscape:transform-center-y="-9.6789057e-05"
+ d="m 8.122499,-1036.5594 -3.122499,0 -3.122499,0 1.5612495,-2.7042 L 5,-1041.9677 l 1.5612495,2.7041 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5707963"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="1.8027756"
+ sodipodi:r1="3.6055512"
+ sodipodi:cy="-1038.3622"
+ sodipodi:cx="5"
+ sodipodi:sides="3"
+ id="path4435"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-opacity:1"
+ sodipodi:type="star"
+ inkscape:transform-center-x="1.1667546" />
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4176"
+ width="2"
+ height="10"
+ x="1"
+ y="1039.3622" />
+ <rect
+ y="1047.3622"
+ x="3"
+ height="2.0000174"
+ width="4"
+ id="rect4178"
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4180"
+ width="4"
+ height="2.0000174"
+ x="3"
+ y="1039.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_skeleton.svg b/editor/icons/source/icon_skeleton.svg
new file mode 100644
index 0000000000..2850b0331d
--- /dev/null
+++ b/editor/icons/source/icon_skeleton.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_skeleton.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="8.1423285"
+ inkscape:cy="8.6304475"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 2 A 4 4 0 0 0 2 6 A 4 4 0 0 0 5 9.8691406 L 5 9 L 6 9 L 6 10 L 7 10 L 7 9 L 8 9 L 9 9 L 9 10 L 10 10 L 10 9 L 11 9 L 11 9.8671875 A 4 4 0 0 0 14 6 A 4 4 0 0 0 10 2 L 6 2 z M 5 5 A 1.0000174 1.0000174 0 0 1 6 6 A 1.0000174 1.0000174 0 0 1 5 7 A 1.0000174 1.0000174 0 0 1 4 6 A 1.0000174 1.0000174 0 0 1 5 5 z M 11 5 A 1.0000174 1.0000174 0 0 1 12 6 A 1.0000174 1.0000174 0 0 1 11 7 A 1.0000174 1.0000174 0 0 1 10 6 A 1.0000174 1.0000174 0 0 1 11 5 z M 7 7 L 9 7 L 9 8 L 7 8 L 7 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4204" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 4 9 L 4 13 L 5 13 L 5 9 L 4 9 z M 11 9 L 11 13 L 12 13 L 12 9 L 11 9 z M 6 12 L 6 13 L 6 15 L 10 15 L 10 13 L 10 12 L 9 12 L 9 13 L 7 13 L 7 12 L 6 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4222" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4238"
+ sodipodi:type="arc"
+ sodipodi:cx="6"
+ sodipodi:cy="1049.3622"
+ sodipodi:rx="2"
+ sodipodi:ry="2"
+ sodipodi:start="0"
+ sodipodi:end="3.1415927"
+ d="m 8,1049.3622 a 2,2 0 0 1 -1,1.732 2,2 0 0 1 -2.0000001,0 A 2,2 0 0 1 4,1049.3622 l 2,0 z" />
+ <path
+ d="m 12,1049.3622 a 2,2 0 0 1 -1,1.732 2,2 0 0 1 -2.0000001,0 A 2,2 0 0 1 8,1049.3622 l 2,0 z"
+ sodipodi:end="3.1415927"
+ sodipodi:start="0"
+ sodipodi:ry="2"
+ sodipodi:rx="2"
+ sodipodi:cy="1049.3622"
+ sodipodi:cx="10"
+ sodipodi:type="arc"
+ id="path4248"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_slider_joint.svg b/editor/icons/source/icon_slider_joint.svg
new file mode 100644
index 0000000000..021a295186
--- /dev/null
+++ b/editor/icons/source/icon_slider_joint.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_slider_joint.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.8333359"
+ inkscape:cy="8.8668138"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 15,1037.3622 -5,0 0,6 -5,0 0,2 5,0 0,6 5,0 0,-14 z m -7,0 -5,0 -2,0 0,4 0,10 2,0 5,0 0,-4 -5,0 0,-6 5,0 0,-4 z"
+ id="rect4161"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_slot.svg b/editor/icons/source/icon_slot.svg
new file mode 100644
index 0000000000..d613f1e1a4
--- /dev/null
+++ b/editor/icons/source/icon_slot.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_slot.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="21.70867"
+ inkscape:cx="9.141828"
+ inkscape:cy="9.2467418"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4352"
+ width="6"
+ height="2.0000174"
+ x="1"
+ y="1043.3622" />
+ <path
+ transform="matrix(0,1.2810265,-0.92450034,0,-952.29952,1037.9571)"
+ inkscape:transform-center-y="-9.6789057e-05"
+ d="m 8.122499,-1036.5594 -3.122499,0 -3.122499,0 1.5612495,-2.7042 L 5,-1041.9677 l 1.5612495,2.7041 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5707963"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="1.8027756"
+ sodipodi:r1="3.6055512"
+ sodipodi:cy="-1038.3622"
+ sodipodi:cx="5"
+ sodipodi:sides="3"
+ id="path4435"
+ style="fill:#84ffb1;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-opacity:1"
+ sodipodi:type="star"
+ inkscape:transform-center-x="1.1667546" />
+ <path
+ style="opacity:1;fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 15,1039.3622 0,10 -2,0 -4,0 0,-2 4,0 0,-6 -4,0 0,-2 4,0 2,0 z"
+ id="rect4176"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_snap.svg b/editor/icons/source/icon_snap.svg
new file mode 100644
index 0000000000..321dedf6b6
--- /dev/null
+++ b/editor/icons/source/icon_snap.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_snap.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="3.5856659"
+ inkscape:cy="9.0785551"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#f3f3f3;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 3,1036.3622 0,3 -3,0 0,2 3,0 0,4 -3,0 0,2 3,0 0,3 2,0 0,-3 0,-2 0,-4 4,0 2,0 3,0 0,-2 -3,0 0,-3 -2,0 0,3 -4,0 0,-3 -2,0 z"
+ id="rect4139"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 11,1043.3622 a 4,4 0 0 0 -4,4 l 2,0 a 2.0000174,2.0000174 0 0 1 2,-2 2.0000174,2.0000174 0 0 1 2,2 l 2,0 a 4,4 0 0 0 -4,-4 z"
+ id="path4151"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="2"
+ x="7"
+ y="1047.3622" />
+ <rect
+ y="1047.3622"
+ x="13"
+ height="2"
+ width="2"
+ id="rect4157"
+ style="fill:#ff8484;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1049.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4161"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4163"
+ width="2"
+ height="2.0000174"
+ x="13"
+ y="1049.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sound_room_params.svg b/editor/icons/source/icon_sound_room_params.svg
new file mode 100644
index 0000000000..a71c126ddc
--- /dev/null
+++ b/editor/icons/source/icon_sound_room_params.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_sound_room_params.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="6.3922684"
+ inkscape:cy="10.780991"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 8,1037.3622 -4,5 -3,0 0,4 3,0 4,5 0,-14 z"
+ id="path4158" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 13,1039.3622 0,10 1,0 0,-10 -1,0 z"
+ id="path4156" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 10,1039.3622 0,10 1,0 0,-10 -1,0 z"
+ id="rect4154"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4160"
+ width="3"
+ height="1"
+ x="9"
+ y="1041.3622" />
+ <rect
+ y="1046.3622"
+ x="12"
+ height="1"
+ width="3"
+ id="rect4162"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spatial.svg b/editor/icons/source/icon_spatial.svg
new file mode 100644
index 0000000000..0d03754016
--- /dev/null
+++ b/editor/icons/source/icon_spatial.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spatial.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="5.5236428"
+ inkscape:cy="6.3139768"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 2 A 6 6 0 0 0 2 8 A 6 6 0 0 0 8 14 A 6 6 0 0 0 14 8 A 6 6 0 0 0 8 2 z M 8 4 A 4 4 0 0 1 12 8 A 4 4 0 0 1 8 12 A 4 4 0 0 1 4 8 A 4 4 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spatial_sample_player.svg b/editor/icons/source/icon_spatial_sample_player.svg
new file mode 100644
index 0000000000..9b5f5d9af6
--- /dev/null
+++ b/editor/icons/source/icon_spatial_sample_player.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spatial_sample_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="10.757516"
+ inkscape:cy="7.2259775"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 L 4 6 L 1 6 L 1 10 L 4 10 L 8 15 L 8 1 z M 13 3 L 13 13 L 14 13 L 14 3 L 13 3 z M 10 6 L 10 11 L 11 11 L 11 6 L 10 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4154" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spatial_shader.svg b/editor/icons/source/icon_spatial_shader.svg
new file mode 100644
index 0000000000..329354b716
--- /dev/null
+++ b/editor/icons/source/icon_spatial_shader.svg
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spatial_shader.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath4253"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4255"
+ d="m 16.458984,1024.37 a 12.000027,12.000027 0 0 0 -3.564453,0.4004 12.000027,12.000027 0 0 0 -8.4863279,14.6973 12.000027,12.000027 0 0 0 14.6972659,8.4863 12.000027,12.000027 0 0 0 8.486328,-14.6973 12.000027,12.000027 0 0 0 -11.132813,-8.8867 z M 16.25,1029.8212 a 6.5451717,6.5451717 0 0 1 6.072266,4.8476 6.5451717,6.5451717 0 0 1 -4.628907,8.0157 6.5451717,6.5451717 0 0 1 -8.0156246,-4.6289 6.5451717,6.5451717 0 0 1 4.6289066,-8.0157 6.5451717,6.5451717 0 0 1 1.943359,-0.2187 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </clipPath>
+ <clipPath
+ id="clipPath4199"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 16.5,1025.8622 a 11.8125,10.499999 0 0 0 -11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125001,10.5 11.8125,10.499999 0 0 0 11.8125,-10.5 11.8125,10.499999 0 0 0 -11.8125,-10.5 z m -3.375,3 a 3.375,2.9999997 0 0 1 3.375,3 3.375,2.9999997 0 0 1 -3.375,3 3.375,2.9999997 0 0 1 -3.3750001,-3 3.375,2.9999997 0 0 1 3.3750001,-3 z"
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4280">
+ <g
+ id="g4282"
+ inkscape:label="Layer 1"
+ transform="translate(0,1.1802001e-5)"
+ style="stroke:#fc9c9c;stroke-opacity:0.99607843">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906,1.0019531 A 1.0001,1.0001 0 0 0 7.5527344,1.1054688 l -6,3 A 1.0001,1.0001 0 0 0 1,5 l 0,6 a 1.0001,1.0001 0 0 0 0.5527344,0.894531 l 6,3 a 1.0001,1.0001 0 0 0 0.8945312,0 l 6.0000004,-3 A 1.0001,1.0001 0 0 0 15,11 L 15,5 A 1.0001,1.0001 0 0 0 14.447266,4.1054688 l -6.0000004,-3 A 1.0001,1.0001 0 0 0 7.9628906,1.0019531 Z M 8,3.1191406 11.763672,5 8,6.8828125 4.2363281,5 8,3.1191406 Z m -5,3.5 4,2 0,3.7636714 -4,-2 0,-3.7636714 z m 10,0 0,3.7636714 -4,2 0,-3.7636714 4,-2 z"
+ transform="translate(0,1036.3622)"
+ id="path4284"
+ inkscape:connector-curvature="0" />
+ </g>
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="7.8442401"
+ inkscape:cy="13.929239"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4271"
+ clip-path="url(#clipPath4280)">
+ <rect
+ y="1037.3622"
+ x="0"
+ height="2.0000031"
+ width="16"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="16"
+ height="2.0000029"
+ x="0"
+ y="1039.3622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="16"
+ height="1.9999999"
+ x="0"
+ y="1041.3622" />
+ <rect
+ y="1043.3622"
+ x="0"
+ height="2.0000024"
+ width="16"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1045.3622"
+ x="0"
+ height="2.0000021"
+ width="16"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="16"
+ height="1.9999987"
+ x="0"
+ y="1049.3622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="16"
+ height="2.0000021"
+ x="0"
+ y="1047.3622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spatial_stream_player.svg b/editor/icons/source/icon_spatial_stream_player.svg
new file mode 100644
index 0000000000..bd081a3dc2
--- /dev/null
+++ b/editor/icons/source/icon_spatial_stream_player.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spatial_stream_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="14.523046"
+ inkscape:cy="8.8504614"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 5,2 C 4.4477153,2 4,2.4477153 4,3 l 0,1 0,7 -2,0 c -0.5522847,0 -1,0.447715 -1,1 l 0,2 c 0,0.552285 0.4477153,1 1,1 l 2,0 1,0 c 0.5522847,0 1,-0.447715 1,-1 l 0,-3 0,-7 6,0 0,5 -2,0 C 9.4477153,9 9,9.4477153 9,10 l 0,2 c 0,0.552285 0.4477153,1 1,1 l 3,0 c 0.552285,0 1,-0.447715 1,-1 L 14,9 14,3 C 14,2.4477153 13.552285,2 13,2 L 6,2 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccsssscssccccsssssscsscs" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sphere_shape.svg b/editor/icons/source/icon_sphere_shape.svg
new file mode 100644
index 0000000000..b1bca49f97
--- /dev/null
+++ b/editor/icons/source/icon_sphere_shape.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="icon_sphere_shape.svg"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_box_shape.png"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 16 16"
+ height="16"
+ width="16">
+ <sodipodi:namedview
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-paths="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ units="px"
+ showgrid="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="11.119425"
+ inkscape:cx="5.7321635"
+ inkscape:zoom="22.627416"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base">
+ <inkscape:grid
+ id="grid3336"
+ type="xygrid"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <circle
+ style="opacity:1;fill:#68b6ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4157"
+ cx="8"
+ cy="1044.3622"
+ r="7" />
+ <circle
+ r="2"
+ cy="1041.3622"
+ cx="6"
+ id="circle4159"
+ style="opacity:1;fill:#a2d2ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spin_box.svg b/editor/icons/source/icon_spin_box.svg
new file mode 100644
index 0000000000..e0086ed12e
--- /dev/null
+++ b/editor/icons/source/icon_spin_box.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spin_box.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="3.8344268"
+ inkscape:cy="10.33806"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 7,0 0,-2 -7,0 0,-6 7,0 0,-2 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssccccccs" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4157"
+ width="2"
+ height="6"
+ x="8"
+ y="1041.3622" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 11,1043.3622 4,0 -2,-3 z"
+ id="path4159"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4164"
+ d="m 11,1045.3622 4,0 -2,3 z"
+ style="fill:#a5efac;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_spot_light.svg b/editor/icons/source/icon_spot_light.svg
new file mode 100644
index 0000000000..04f5b42f4d
--- /dev/null
+++ b/editor/icons/source/icon_spot_light.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_spot_light.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="-0.26188668"
+ inkscape:cy="8.5536108"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 6 1 A 1 1 0 0 0 5 2 L 5 5.6933594 C 3.2138662 6.5594405 2 8.153847 2 10 L 6 10 A 2 2 0 0 0 8 12 A 2 2 0 0 0 10 10 L 14 10 C 14 8.153847 12.786134 6.5594405 11 5.6933594 L 11 2 A 1 1 0 0 0 10 1 L 6 1 z M 4.9023438 10.634766 L 3.1699219 11.634766 L 4.1699219 13.365234 L 5.9023438 12.365234 L 4.9023438 10.634766 z M 11.097656 10.634766 L 10.097656 12.365234 L 11.830078 13.365234 L 12.830078 11.634766 L 11.097656 10.634766 z M 7 13 L 7 15 L 9 15 L 9 13 L 7 13 z "
+ transform="translate(0,1036.3622)"
+ id="path4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sprite.svg b/editor/icons/source/icon_sprite.svg
new file mode 100644
index 0000000000..488bbf934d
--- /dev/null
+++ b/editor/icons/source/icon_sprite.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_sprite.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.7581185"
+ inkscape:cy="10.410499"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5b7f4;fill-opacity:0.98823529;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 4 6 A 1 1 0 0 1 5 7 A 1 1 0 0 1 4 8 A 1 1 0 0 1 3 7 A 1 1 0 0 1 4 6 z M 12 6 A 1 1 0 0 1 13 7 A 1 1 0 0 1 12 8 A 1 1 0 0 1 11 7 A 1 1 0 0 1 12 6 z M 5 9 L 11 9 A 3 3 0 0 1 9.5 11.597656 A 3 3 0 0 1 6.5 11.597656 A 3 3 0 0 1 5 9 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sprite_3d.svg b/editor/icons/source/icon_sprite_3d.svg
new file mode 100644
index 0000000000..4ea81f7ea2
--- /dev/null
+++ b/editor/icons/source/icon_sprite_3d.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite_3d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_sprite_3d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="7.7581185"
+ inkscape:cy="10.410499"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 4 6 A 1 1 0 0 1 5 7 A 1 1 0 0 1 4 8 A 1 1 0 0 1 3 7 A 1 1 0 0 1 4 6 z M 12 6 A 1 1 0 0 1 13 7 A 1 1 0 0 1 12 8 A 1 1 0 0 1 11 7 A 1 1 0 0 1 12 6 z M 5 9 L 11 9 A 3 3 0 0 1 9.5 11.597656 A 3 3 0 0 1 6.5 11.597656 A 3 3 0 0 1 5 9 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_sprite_frames.svg b/editor/icons/source/icon_sprite_frames.svg
new file mode 100644
index 0000000000..dc445da773
--- /dev/null
+++ b/editor/icons/source/icon_sprite_frames.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_sprite_frames.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254835"
+ inkscape:cx="10.147205"
+ inkscape:cy="8.653875"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ y="1046.3622"
+ x="10"
+ height="2.0000086"
+ width="2"
+ id="rect4230"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4232"
+ width="2"
+ height="2.0000086"
+ x="13"
+ y="1046.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4234"
+ width="2"
+ height="2.0000086"
+ x="10"
+ y="1049.3622" />
+ <rect
+ y="1049.3622"
+ x="13"
+ height="2.0000086"
+ width="2"
+ id="rect4236"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 6 1 A 5 5 0 0 0 1 6 A 5 5 0 0 0 6 11 A 5 5 0 0 0 11 6 A 5 5 0 0 0 6 1 z M 3 5 A 1 1 0 0 1 4 6 A 1 1 0 0 1 3 7 A 1 1 0 0 1 2 6 A 1 1 0 0 1 3 5 z M 9 5 A 1 1 0 0 1 10 6 A 1 1 0 0 1 9 7 A 1 1 0 0 1 8 6 A 1 1 0 0 1 9 5 z M 7.9960938 7.4921875 A 0.50005 0.50005 0 0 1 8.3535156 8.3535156 C 7.7356645 8.9714156 6.8611111 9.25 6 9.25 C 5.1388889 9.25 4.2643355 8.9714156 3.6464844 8.3535156 A 0.50005 0.50005 0 0 1 3.9941406 7.4960938 A 0.50005 0.50005 0 0 1 4.3535156 7.6464844 C 4.7356645 8.0286844 5.3611111 8.25 6 8.25 C 6.6388889 8.25 7.2643355 8.0286844 7.6464844 7.6464844 A 0.50005 0.50005 0 0 1 7.9960938 7.4921875 z "
+ transform="translate(0,1036.3622)"
+ id="path4238" />
+ <rect
+ y="1043.3622"
+ x="13"
+ height="2.0000086"
+ width="2"
+ id="rect4246"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1049.3622"
+ x="7"
+ height="2.0000086"
+ width="2"
+ id="rect4248"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_static_body.svg b/editor/icons/source/icon_static_body.svg
new file mode 100644
index 0000000000..fcaa2b7d3e
--- /dev/null
+++ b/editor/icons/source/icon_static_body.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_static_body.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="10.872202"
+ inkscape:cy="6.7990901"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 1 A 2 2 0 0 0 1.5859375 1.5859375 A 2 2 0 0 0 1 3 L 1 13 A 2 2 0 0 0 1.5859375 14.414062 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 3 A 2 2 0 0 0 13 1 L 3 1 z M 3 2 L 13 2 A 1.0000174 1.0000174 0 0 1 14 3 L 14 13 A 1.0000174 1.0000174 0 0 1 13 14 L 3 14 A 1.0000174 1.0000174 0 0 1 2 13 L 2 3 A 1.0000174 1.0000174 0 0 1 3 2 z M 3 3 L 3 5 L 5 5 L 5 3 L 3 3 z M 11 3 L 11 5 L 13 5 L 13 3 L 11 3 z M 3 11 L 3 13 L 5 13 L 5 11 L 3 11 z M 11 11 L 11 13 L 13 13 L 13 11 L 11 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_static_body_2d.svg b/editor/icons/source/icon_static_body_2d.svg
new file mode 100644
index 0000000000..0ed3ef7cf0
--- /dev/null
+++ b/editor/icons/source/icon_static_body_2d.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_static_body_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-1.0099286"
+ inkscape:cy="7.4019621"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5b7f6;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 1 A 2 2 0 0 0 1.5859375 1.5859375 A 2 2 0 0 0 1 3 L 1 13 A 2 2 0 0 0 1.5859375 14.414062 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 3 A 2 2 0 0 0 13 1 L 3 1 z M 3 2 L 13 2 A 1.0000174 1.0000174 0 0 1 14 3 L 14 13 A 1.0000174 1.0000174 0 0 1 13 14 L 3 14 A 1.0000174 1.0000174 0 0 1 2 13 L 2 3 A 1.0000174 1.0000174 0 0 1 3 2 z M 3 3 L 3 5 L 5 5 L 5 3 L 3 3 z M 11 3 L 11 5 L 13 5 L 13 3 L 11 3 z M 3 11 L 3 13 L 5 13 L 5 11 L 3 11 z M 11 11 L 11 13 L 13 13 L 13 11 L 11 11 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_stream_player.svg b/editor/icons/source/icon_stream_player.svg
new file mode 100644
index 0000000000..618646bbed
--- /dev/null
+++ b/editor/icons/source/icon_stream_player.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_stream_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627416"
+ inkscape:cx="3.1209493"
+ inkscape:cy="9.3365973"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 5,2 C 4.4477153,2 4,2.4477153 4,3 l 0,1 0,7 -2,0 c -0.5522847,0 -1,0.447715 -1,1 l 0,2 c 0,0.552285 0.4477153,1 1,1 l 2,0 1,0 c 0.5522847,0 1,-0.447715 1,-1 l 0,-3 0,-7 6,0 0,5 -2,0 C 9.4477153,9 9,9.4477153 9,10 l 0,2 c 0,0.552285 0.4477153,1 1,1 l 3,0 c 0.552285,0 1,-0.447715 1,-1 L 14,9 14,3 C 14,2.4477153 13.552285,2 13,2 L 6,2 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccsssscssccccsssssscsscs" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_string.svg b/editor/icons/source/icon_string.svg
new file mode 100644
index 0000000000..f32e82256f
--- /dev/null
+++ b/editor/icons/source/icon_string.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_string.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="4.1642221"
+ inkscape:cy="8.5720882"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 5 1 L 5 3 L 7 3 L 7 13 L 5 13 L 5 15 L 7 15 A 1 1 0 0 0 8 14 A 1 1 0 0 0 9 15 L 11 15 L 11 13 L 9 13 L 9 3 L 11 3 L 11 1 L 9 1 A 1 1 0 0 0 8 2 A 1 1 0 0 0 7 1 L 5 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_style_box_empty.svg b/editor/icons/source/icon_style_box_empty.svg
new file mode 100644
index 0000000000..c881fe1c10
--- /dev/null
+++ b/editor/icons/source/icon_style_box_empty.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_style_box_empty.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4313">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 6.3750001,1025.8622 c -0.931942,2e-4 -1.6874069,0.6716 -1.6875,1.5 l 0,1.5 3.375,0 0,-3 -1.6875,0 z m 5.0624999,0 0,3 3.375,0 0,-3 -3.375,0 z m 6.75,0 0,3 3.375,0 0,-3 -3.375,0 z m 6.75,0 0,3 3.375,0 0,-1.5 c -9.3e-5,-0.8284 -0.755558,-1.4998 -1.6875,-1.5 l -1.6875,0 z m -20.2499999,6 0,3 3.375,0 0,-3 -3.375,0 z m 20.2499999,0 0,0.3486 c 0.532973,0.2675 0.975667,0.657 1.282105,1.128 0.537834,0.828 1.294284,1.6769 2.092895,2.5722 l 0,-4.0488 -3.375,0 z m -1.6875,3 c -1.948558,3 -5.0625,5.0147 -5.0625,7.5 0,2.4854 2.266559,4.5 5.0625,4.5 2.795941,0 5.0625,-2.0146 5.0625,-4.5 0,-2.4853 -3.113942,-4.5 -5.0625,-7.5 z m -18.5624999,3 0,3 3.375,0 0,-3 -3.375,0 z m 0,6 0,1.5 c 9.31e-5,0.8284 0.755558,1.4998 1.6875,1.5 l 1.6875,0 0,-3 -3.375,0 z m 6.7499999,0 0,3 3.375,0 0,-3 -3.375,0 z"
+ id="path4315"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.442024"
+ inkscape:cy="8.6470776"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4313)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777778,353.45399)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_style_box_flat.svg b/editor/icons/source/icon_style_box_flat.svg
new file mode 100644
index 0000000000..9071014ff3
--- /dev/null
+++ b/editor/icons/source/icon_style_box_flat.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_style_box_flat.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4313">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 6.3750001,1025.8622 c -0.931942,2e-4 -1.6874069,0.6716 -1.6875,1.5 l 0,1.5 3.375,0 0,-3 -1.6875,0 z m 5.0624999,0 0,3 3.375,0 0,-3 -3.375,0 z m 6.75,0 0,3 3.375,0 0,-3 -3.375,0 z m 6.75,0 0,3 3.375,0 0,-1.5 c -9.3e-5,-0.8284 -0.755558,-1.4998 -1.6875,-1.5 l -1.6875,0 z m -20.2499999,6 0,3 3.375,0 0,-3 -3.375,0 z m 20.2499999,0 0,0.3486 c 0.532973,0.2675 0.975667,0.657 1.282105,1.128 0.537834,0.828 1.294284,1.6769 2.092895,2.5722 l 0,-4.0488 -3.375,0 z m -1.6875,3 c -1.948558,3 -5.0625,5.0147 -5.0625,7.5 0,2.4854 2.266559,4.5 5.0625,4.5 2.795941,0 5.0625,-2.0146 5.0625,-4.5 0,-2.4853 -3.113942,-4.5 -5.0625,-7.5 z m -18.5624999,3 0,3 3.375,0 0,-3 -3.375,0 z m 0,6 0,1.5 c 9.31e-5,0.8284 0.755558,1.4998 1.6875,1.5 l 1.6875,0 0,-3 -3.375,0 z m 6.7499999,0 0,3 3.375,0 0,-3 -3.375,0 z"
+ id="path4315"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4391">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 6.3750001,1025.8622 c -0.931942,2e-4 -1.6874069,0.6716 -1.6875,1.5 l 0,18 c 9.31e-5,0.8284 0.755558,1.4998 1.6875,1.5 l 10.1876219,0 c -1.081633,-1.2612 -1.750122,-2.8111 -1.750122,-4.5 0,-2.3563 1.351562,-4.0453 2.494995,-5.376 1.143433,-1.3305 2.270438,-2.4714 3.019043,-3.624 0.571813,-0.8788 1.604865,-1.4416 2.745483,-1.4941 1.267652,-0.06 2.465974,0.5173 3.101441,1.4941 0.549842,0.8466 1.32435,1.7113 2.139038,2.625 l 0,-8.625 c -9.3e-5,-0.8284 -0.755558,-1.4998 -1.6875,-1.5 l -20.2499999,0 z m 16.8749999,9 c -1.948558,3 -5.0625,5.0147 -5.0625,7.5 0,2.4854 2.266559,4.5 5.0625,4.5 2.795941,0 5.0625,-2.0146 5.0625,-4.5 0,-2.4853 -3.113942,-4.5 -5.0625,-7.5 z"
+ id="path4393"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="11.34212"
+ inkscape:cy="7.7545325"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4391)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777778,353.45399)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_style_box_texture.svg b/editor/icons/source/icon_style_box_texture.svg
new file mode 100644
index 0000000000..30b1f1af68
--- /dev/null
+++ b/editor/icons/source/icon_style_box_texture.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_style_box_texture.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4189">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 6.3750001,1025.8622 a 1.6876688,1.5001498 0 0 0 -1.6875,1.5 l 0,18 a 1.6876688,1.5001498 0 0 0 1.6875,1.5 l 10.1217039,0 c -0.747392,-0.8796 -1.304338,-1.8888 -1.562256,-3 l -6.8719479,0 0,-15 16.8749999,0 0,3.3486 a 3.4281247,3.0472216 0 0 1 1.282105,1.1279 c 0.537834,0.828 1.294284,1.677 2.092895,2.5723 l 0,-8.5488 a 1.6876688,1.5001498 0 0 0 -1.6875,-1.5 l -20.2499999,0 z m 11.8124999,4.5 0,1.5 -1.6875,0 0,1.5 -3.375,0 0,1.5 -1.6875,0 0,1.5 -1.6874999,0 0,1.5 3.3749999,0 3.375,0 0.02637,0 c 0.246127,-0.317 0.496441,-0.6239 0.738282,-0.9053 1.145331,-1.3327 2.270672,-2.4711 3.015746,-3.6182 a 3.4281247,3.0472216 0 0 1 1.282105,-1.1279 l 0,-0.3486 -1.6875,0 0,-1.5 -1.6875,0 z m 5.0625,4.5 c -1.948558,3 -5.0625,5.0146 -5.0625,7.5 0,2.4853 2.266559,4.5 5.0625,4.5 2.795941,0 5.0625,-2.0147 5.0625,-4.5 0,-2.4854 -3.113942,-4.5 -5.0625,-7.5 z"
+ id="path4191"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="9.8110364"
+ inkscape:cy="10.993538"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4189)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777778,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tab_container.svg b/editor/icons/source/icon_tab_container.svg
new file mode 100644
index 0000000000..6c197a86f6
--- /dev/null
+++ b/editor/icons/source/icon_tab_container.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tab_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="3.8596634"
+ inkscape:cy="10.446251"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.8954305 1 1 1.8954305 1 3 L 1 13 C 1 14.104569 1.8954305 15 3 15 L 13 15 C 14.104569 15 15 14.104569 15 13 L 15 3 C 15 1.8954305 14.104569 1 13 1 L 3 1 z M 3 3 L 8 3 L 8 5 L 8 7 L 13 7 L 13 13 L 3 13 L 3 3 z M 10 3 L 13 3 L 13 5 L 10 5 L 10 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tabs.svg b/editor/icons/source/icon_tabs.svg
new file mode 100644
index 0000000000..79ed1e5910
--- /dev/null
+++ b/editor/icons/source/icon_tabs.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tabs.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="11.687421"
+ inkscape:cy="9.3335226"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="1"
+ height="9.0000172"
+ x="1"
+ y="1040.3622" />
+ <rect
+ y="-8"
+ x="1039.3622"
+ height="6"
+ width="1"
+ id="rect4159"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ y="1040.3622"
+ x="7"
+ height="3.0000174"
+ width="1"
+ id="rect4161"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4163"
+ sodipodi:type="arc"
+ sodipodi:cx="2"
+ sodipodi:cy="1040.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="1.5707963"
+ sodipodi:end="0"
+ d="m 2,1041.3622 a 1,1 0 0 1 -0.9238795,-0.6173 1,1 0 0 1 0.2167727,-1.0898 1,1 0 0 1 1.0897902,-0.2168 A 1,1 0 0 1 3,1040.3622 l -1,0 z" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4167"
+ width="1"
+ height="9.0000172"
+ x="14"
+ y="1040.3622" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4169"
+ width="1"
+ height="6"
+ x="1039.3622"
+ y="-14" />
+ <path
+ transform="scale(-1,1)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4171"
+ sodipodi:type="arc"
+ sodipodi:cx="-14"
+ sodipodi:cy="1040.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="1.5707963"
+ sodipodi:end="0"
+ d="m -14,1041.3622 a 1,1 0 0 1 -0.92388,-0.6173 1,1 0 0 1 0.216773,-1.0898 1,1 0 0 1 1.08979,-0.2168 1,1 0 0 1 0.617317,0.9239 l -1,0 z" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4173"
+ width="1"
+ height="13"
+ x="1042.3622"
+ y="-15" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_test_cube.svg b/editor/icons/source/icon_test_cube.svg
new file mode 100644
index 0000000000..c42c0bb674
--- /dev/null
+++ b/editor/icons/source/icon_test_cube.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_test_cube.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.5411615"
+ inkscape:cy="7.1105382"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-7"
+ inkscape:label="Layer 1"
+ transform="translate(0,1.1802001e-5)"
+ style="stroke:#fc9c9c;stroke-opacity:0.99607843">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 7.9628906 1.0019531 A 1.0001 1.0001 0 0 0 7.5527344 1.1054688 L 1.5527344 4.1054688 A 1.0001 1.0001 0 0 0 1 5 L 1 11 A 1.0001 1.0001 0 0 0 1.5527344 11.894531 L 7.5527344 14.894531 A 1.0001 1.0001 0 0 0 8.4472656 14.894531 L 14.447266 11.894531 A 1.0001 1.0001 0 0 0 15 11 L 15 5 A 1.0001 1.0001 0 0 0 14.447266 4.1054688 L 8.4472656 1.1054688 A 1.0001 1.0001 0 0 0 7.9628906 1.0019531 z M 8 3.1191406 L 11.763672 5 L 8 6.8828125 L 4.2363281 5 L 8 3.1191406 z M 3 6.6191406 L 7 8.6191406 L 7 12.382812 L 3 10.382812 L 3 6.6191406 z M 13 6.6191406 L 13 10.382812 L 9 12.382812 L 9 8.6191406 L 13 6.6191406 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_text_edit.svg b/editor/icons/source/icon_text_edit.svg
new file mode 100644
index 0000000000..4d08e9e3b2
--- /dev/null
+++ b/editor/icons/source/icon_text_edit.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_text_edit.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="5.6173015"
+ inkscape:cy="11.506395"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 1 C 1.8954305 1 1 1.8954 1 3 L 1 13 C 1 14.1046 1.8954305 15 3 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 3 C 15 1.8954 14.104569 1 13 1 L 3 1 z M 3 3 L 13 3 L 13 13 L 3 13 L 3 3 z M 4 4 L 4 8 L 5 8 L 5 4 L 4 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4173" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_texture.svg b/editor/icons/source/icon_texture.svg
new file mode 100644
index 0000000000..39e88e592b
--- /dev/null
+++ b/editor/icons/source/icon_texture.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_image_texture.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.9365814"
+ inkscape:cy="6.4466253"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 2 1 A 1 1 0 0 0 1 2 L 1 14 A 1 1 0 0 0 2 15 L 14 15 A 1 1 0 0 0 15 14 L 15 2 A 1 1 0 0 0 14 1 L 2 1 z M 3 3 L 13 3 L 13 11 L 3 11 L 3 3 z "
+ transform="translate(0,1036.3622)"
+ id="rect4156" />
+ <rect
+ y="1043.3622"
+ x="6"
+ height="1"
+ width="2"
+ id="rect4197"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4199"
+ width="2"
+ height="2.0000174"
+ x="6"
+ y="1044.3622" />
+ <rect
+ y="1045.3622"
+ x="4"
+ height="1"
+ width="2"
+ id="rect4201"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4203"
+ width="2"
+ height="2.0000174"
+ x="8"
+ y="1044.3622" />
+ <rect
+ y="1044.3622"
+ x="10"
+ height="2.0000174"
+ width="2"
+ id="rect4205"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4207"
+ width="3"
+ height="2.0000174"
+ x="8"
+ y="1042.3622" />
+ <rect
+ y="1041.3622"
+ x="9"
+ height="1"
+ width="1"
+ id="rect4217"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4219"
+ width="1"
+ height="1"
+ x="5"
+ y="1044.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_texture_button.svg b/editor/icons/source/icon_texture_button.svg
new file mode 100644
index 0000000000..ef447af082
--- /dev/null
+++ b/editor/icons/source/icon_texture_button.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_texture_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="15.33841"
+ inkscape:cy="14.971735"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 3 L 1 11 L 15 11 L 15 3 L 14 3 L 2 3 L 1 3 z M 9 5 L 10 5 L 10 6 L 11 6 L 11 8 L 12 8 L 12 10 L 10 10 L 8 10 L 6 10 L 4 10 L 4 9 L 5 9 L 5 8 L 6 8 L 6 7 L 8 7 L 8 6 L 9 6 L 9 5 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ <rect
+ transform="scale(1,-1)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="14"
+ height="2.0000522"
+ x="1"
+ y="-1049.3622" />
+ <rect
+ y="-1049.3622"
+ x="1"
+ height="2.0000522"
+ width="14"
+ id="rect4142"
+ style="opacity:1;fill:#000000;fill-opacity:0.07843138;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_texture_progress.svg b/editor/icons/source/icon_texture_progress.svg
new file mode 100644
index 0000000000..493dd7fd63
--- /dev/null
+++ b/editor/icons/source/icon_texture_progress.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_texture_progress.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.953439"
+ inkscape:cy="10.793984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,3 C 1.8954305,3 1,3.8954305 1,5 l 0,6 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,5 C 15,3.8954305 14.104569,3 13,3 Z m 0,2 10,0 0,6 -10,0 z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4222"
+ width="1"
+ height="2"
+ x="4"
+ y="1042.3622" />
+ <rect
+ y="1043.3622"
+ x="6"
+ height="3.0000174"
+ width="1"
+ id="rect4224"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4226"
+ width="1"
+ height="4.0000172"
+ x="8"
+ y="1042.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_texture_rect.svg b/editor/icons/source/icon_texture_rect.svg
new file mode 100644
index 0000000000..88d9b4081f
--- /dev/null
+++ b/editor/icons/source/icon_texture_rect.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_texture_rect.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="14.395168"
+ inkscape:cy="9.9171316"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="1"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1050.3622"
+ x="1"
+ height="0.9999826"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4158"
+ width="14"
+ height="0.9999826"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="14"
+ height="14"
+ width="1"
+ id="rect4160"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4197"
+ d="m 9,1042.3622 0,1 -1,0 0,1 -2,0 0,1 -1,0 0,1 -1,0 0,1 2,0 2,0 2,0 2,0 0,-2 -1,0 0,-2 -1,0 0,-1 -1,0 z"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_theme.svg b/editor/icons/source/icon_theme.svg
new file mode 100644
index 0000000000..2cacb9755a
--- /dev/null
+++ b/editor/icons/source/icon_theme.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_theme.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4370">
+ <g
+ id="g4372"
+ inkscape:label="Layer 1"
+ transform="matrix(1.6875,0,0,1.4999998,2.9999999,-530.18094)">
+ <path
+ id="path4374"
+ transform="translate(0,1036.3622)"
+ d="M 7,1 6.4355469,3.2578125 A 5.0000172,5.0000172 0 0 0 5.7460938,3.5371094 L 3.7578125,2.34375 2.34375,3.7578125 3.5390625,5.7519531 A 5.0000172,5.0000172 0 0 0 3.2539062,6.4375 L 1,7 1,9 3.2578125,9.5644531 A 5.0000172,5.0000172 0 0 0 3.5371094,10.251953 L 2.34375,12.242188 3.7578125,13.65625 5.7519531,12.460938 A 5.0000172,5.0000172 0 0 0 6.4375,12.746094 L 7,15 9,15 9.5644531,12.742188 a 5.0000172,5.0000172 0 0 0 0.6874999,-0.279297 l 1.990235,1.193359 1.414062,-1.414062 -1.195312,-1.994141 A 5.0000172,5.0000172 0 0 0 12.746094,9.5625 L 15,9 15,7 12.742188,6.4355469 a 5.0000172,5.0000172 0 0 0 -0.279297,-0.6875 L 13.65625,3.7578125 12.242188,2.34375 10.248047,3.5390625 A 5.0000172,5.0000172 0 0 0 9.5625,3.2539062 L 9,1 7,1 Z M 8,6 A 2.0000174,2.0000174 0 0 1 10,8 2.0000174,2.0000174 0 0 1 8,10 2.0000174,2.0000174 0 0 1 6,8 2.0000174,2.0000174 0 0 1 8,6 Z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="10.857726"
+ inkscape:cy="9.3127855"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="g4181"
+ mask="none"
+ clip-path="url(#clipPath4370)"
+ transform="matrix(0.59259259,0,0,0.66666674,-1.7777777,353.454)">
+ <rect
+ y="1025.8622"
+ x="3"
+ height="3.0000043"
+ width="27"
+ id="rect4159"
+ style="fill:#ff7070;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ffeb70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4161-3"
+ width="27"
+ height="3.0000041"
+ x="3"
+ y="1028.8622" />
+ <rect
+ style="fill:#9dff70;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4163-6"
+ width="27"
+ height="2.9999995"
+ x="3"
+ y="1031.8622" />
+ <rect
+ y="1034.8622"
+ x="3"
+ height="3.0000031"
+ width="27"
+ id="rect4165-1"
+ style="fill:#70ffb9;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="1037.8622"
+ x="3"
+ height="3.0000029"
+ width="27"
+ id="rect4167"
+ style="fill:#70deff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#ff70ac;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4169"
+ width="27"
+ height="2.9999976"
+ x="3"
+ y="1043.8622" />
+ <rect
+ style="fill:#9f70ff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4146"
+ width="27"
+ height="3.0000029"
+ x="3"
+ y="1040.8622" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tile_map.svg b/editor/icons/source/icon_tile_map.svg
new file mode 100644
index 0000000000..28f75a97e5
--- /dev/null
+++ b/editor/icons/source/icon_tile_map.svg
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_tile_map.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="5.8997097"
+ inkscape:cy="7.6139286"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4160"
+ width="2"
+ height="2"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="4"
+ height="2"
+ width="2"
+ id="rect4162"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4164"
+ width="2"
+ height="2"
+ x="4"
+ y="1040.3622" />
+ <rect
+ y="1040.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4166"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1037.3622"
+ x="7"
+ height="2"
+ width="2"
+ id="rect4168"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4170"
+ width="2"
+ height="2"
+ x="10"
+ y="1037.3622" />
+ <rect
+ y="1040.3622"
+ x="10"
+ height="2"
+ width="2"
+ id="rect4172"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4174"
+ width="2"
+ height="2"
+ x="7"
+ y="1040.3622" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4176"
+ width="2"
+ height="2"
+ x="1"
+ y="1043.3622" />
+ <rect
+ y="1043.3622"
+ x="4"
+ height="2"
+ width="2"
+ id="rect4178"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4180"
+ width="2"
+ height="2"
+ x="4"
+ y="1046.3622" />
+ <rect
+ y="1046.3622"
+ x="1"
+ height="2"
+ width="2"
+ id="rect4182"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1037.3622"
+ x="13"
+ height="2"
+ width="2"
+ id="rect4184"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4186"
+ width="2"
+ height="2"
+ x="13"
+ y="1040.3622" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4188"
+ width="2"
+ height="2"
+ x="7"
+ y="1043.3622" />
+ <rect
+ y="1043.3622"
+ x="10"
+ height="2"
+ width="2"
+ id="rect4190"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4192"
+ width="2"
+ height="2"
+ x="10"
+ y="1046.3622" />
+ <rect
+ y="1046.3622"
+ x="7"
+ height="2"
+ width="2"
+ id="rect4194"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4196"
+ width="2"
+ height="2"
+ x="13"
+ y="1043.3622" />
+ <rect
+ y="1046.3622"
+ x="13"
+ height="2"
+ width="2"
+ id="rect4198"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1049.3622"
+ x="4"
+ height="2"
+ width="2"
+ id="rect4200"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4202"
+ width="2"
+ height="2"
+ x="1"
+ y="1049.3622" />
+ <rect
+ y="1049.3622"
+ x="10"
+ height="2"
+ width="2"
+ id="rect4204"
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4206"
+ width="2"
+ height="2"
+ x="7"
+ y="1049.3622" />
+ <rect
+ style="opacity:1;fill:#a5b7f7;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4208"
+ width="2"
+ height="2"
+ x="13"
+ y="1049.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tile_set.svg b/editor/icons/source/icon_tile_set.svg
new file mode 100644
index 0000000000..e697f03888
--- /dev/null
+++ b/editor/icons/source/icon_tile_set.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_dependency_changed_hl.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_tile_set.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="30.700696"
+ inkscape:cx="7.5612844"
+ inkscape:cy="6.4018109"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 1 1 L 1 3 L 3 3 L 3 1 L 1 1 z M 4 1 L 4 3 L 6 3 L 6 1 L 4 1 z M 7 1 L 7 3 L 9 3 L 9 1 L 7 1 z M 10 1 L 10 3 L 12 3 L 12 1 L 10 1 z M 13 1 L 13 3 L 15 3 L 15 1 L 13 1 z M 1 4 L 1 6 L 3 6 L 3 4 L 1 4 z M 4 4 L 4 6 L 6 6 L 6 4 L 4 4 z M 7 4 L 7 6 L 9 6 L 9 4 L 7 4 z M 10 4 L 10 6 L 12 6 L 12 4 L 10 4 z M 13 4 L 13 6 L 15 6 L 15 4 L 13 4 z M 1 7 L 1 9 L 3 9 L 3 7 L 1 7 z M 4 7 L 4 9 L 6 9 L 6 7 L 4 7 z M 9 8 L 9 9 L 9 14 L 9 15 L 14 15 C 14.552285 15 15 14.552285 15 14 L 15 9 C 15 8.4477153 14.552285 8 14 8 L 14 12 L 13 11 L 12 12 L 12 8 L 9 8 z M 1 10 L 1 12 L 3 12 L 3 10 L 1 10 z M 4 10 L 4 12 L 6 12 L 6 10 L 4 10 z M 1 13 L 1 15 L 3 15 L 3 13 L 1 13 z M 4 13 L 4 15 L 6 15 L 6 13 L 4 13 z "
+ transform="translate(0,1036.3622)"
+ id="rect4161" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_timer.svg b/editor/icons/source/icon_timer.svg
new file mode 100644
index 0000000000..0615ab865a
--- /dev/null
+++ b/editor/icons/source/icon_timer.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_timer.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.6045193"
+ inkscape:cy="8.1915618"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4175"
+ width="1"
+ height="1"
+ x="20"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 A 7.0000172 7.0000172 0 0 0 1 8 A 7.0000172 7.0000172 0 0 0 8 15 A 7.0000172 7.0000172 0 0 0 15 8 A 7.0000172 7.0000172 0 0 0 8 1 z M 8 3 A 5.0000172 5.0000172 0 0 1 13 8 A 5.0000172 5.0000172 0 0 1 8 13 A 5.0000172 5.0000172 0 0 1 3 8 A 5.0000172 5.0000172 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4156" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4161"
+ width="2"
+ height="3.9999826"
+ x="7"
+ y="1041.3622" />
+ <rect
+ y="1043.3622"
+ x="7"
+ height="1.9999826"
+ width="4"
+ id="rect4163"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_button.svg b/editor/icons/source/icon_tool_button.svg
new file mode 100644
index 0000000000..1c5176c8c9
--- /dev/null
+++ b/editor/icons/source/icon_tool_button.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.173168"
+ inkscape:cy="9.7479984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 3 L 1 11 L 15 11 L 15 3 L 1 3 z M 11 4 A 3 3 0 0 1 13.826172 6 L 11 6 A 1 1 0 0 0 10 7 A 1 1 0 0 0 11 8 L 13.824219 8 A 3 3 0 0 1 11 10 A 3 3 0 0 1 8.1757812 8 L 3 8 A 1 1 0 0 1 2 7 A 1 1 0 0 1 3 6 L 8.1738281 6 A 3 3 0 0 1 11 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4139" />
+ <rect
+ transform="scale(1,-1)"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="14"
+ height="2.0000522"
+ x="1"
+ y="-1049.3622" />
+ <rect
+ y="-1049.3622"
+ x="1"
+ height="2.0000522"
+ width="14"
+ id="rect4142"
+ style="opacity:1;fill:#000000;fill-opacity:0.07843138;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_move.svg b/editor/icons/source/icon_tool_move.svg
new file mode 100644
index 0000000000..243b680dfe
--- /dev/null
+++ b/editor/icons/source/icon_tool_move.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_move.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_move.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.7373622"
+ inkscape:cy="9.2915869"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8 1 L 6.5 2.5 L 5 4 L 7 4 L 7 7 L 4 7 L 4 5 L 2.5 6.5 L 1 8 L 2.5 9.5 L 4 11 L 4 9 L 7 9 L 7 12 L 5 12 L 6.5 13.5 L 8 15 L 9.5 13.5 L 11 12 L 9 12 L 9 9 L 12 9 L 12 11 L 13.5 9.5 L 15 8 L 13.5 6.5 L 12 5 L 12 7 L 9 7 L 9 4 L 11 4 L 9.5 2.5 L 8 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_pan.svg b/editor/icons/source/icon_tool_pan.svg
new file mode 100644
index 0000000000..a93fc3d29d
--- /dev/null
+++ b/editor/icons/source/icon_tool_pan.svg
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_pan.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_pan.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="13.577719"
+ inkscape:cy="10.651205"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="false"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-others="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.63636994,0,0,0.63636994,11.81847,382.85245)"
+ inkscape:label="Layer 1"
+ id="g4515"
+ style="stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 6 8 L 6 15 L 12 15 L 12 13 L 14 13 L 14 8 L 6 8 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ <rect
+ y="1039.3622"
+ x="6"
+ height="7.9999657"
+ width="2"
+ id="rect4181"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4183"
+ width="2"
+ height="7.9999657"
+ x="9"
+ y="1038.3622" />
+ <rect
+ y="1040.3622"
+ x="12"
+ height="7.9999657"
+ width="2"
+ id="rect4185"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4187"
+ cx="7"
+ cy="1039.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1038.3622"
+ cx="10"
+ id="circle4189"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4191"
+ cx="13"
+ cy="1040.3622"
+ r="1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4193"
+ cx="12"
+ cy="1049.3622"
+ r="2" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3.5251027,1045.5875 c -0.520152,-0.3803 -1.1942798,-0.4556 -1.6498687,0 -0.4556596,0.4556 -0.4556352,1.1943 -2.36e-5,1.6499 L 6,1051.3622 l 1.6498923,-2.7593 z"
+ id="rect4208"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="1.4083061"
+ inkscape:transform-center-y="-3.0582"
+ sodipodi:nodetypes="sssccs" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_rotate.svg b/editor/icons/source/icon_tool_rotate.svg
new file mode 100644
index 0000000000..817aee3995
--- /dev/null
+++ b/editor/icons/source/icon_tool_rotate.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_rotate.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.9785059"
+ inkscape:cy="10.426966"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 9 2 A 6.0000172 6.0000172 0 0 0 3 8 L 5 8 A 4 4 0 0 1 9 4 A 4 4 0 0 1 13 8 A 4 4 0 0 1 9 12 L 9 14 A 6.0000172 6.0000172 0 0 0 15 8 A 6.0000172 6.0000172 0 0 0 9 2 z "
+ transform="translate(0,1036.3622)"
+ id="path4138" />
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4142"
+ sodipodi:sides="3"
+ sodipodi:cx="3"
+ sodipodi:cy="1046.3622"
+ sodipodi:r1="2.236068"
+ sodipodi:r2="1.118034"
+ sodipodi:arg1="1.0471976"
+ sodipodi:arg2="2.0943951"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 4.1180339,1048.2987 -1.6770509,-0.9683 -1.67705101,-0.9682 1.67705101,-0.9683 1.6770511,-0.9682 -1e-7,1.9365 z"
+ inkscape:transform-center-x="0.00013164169"
+ transform="matrix(0,-1.1925797,1.5491989,0,-1617.0232,1049.2732)"
+ inkscape:transform-center-y="0.66664316" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_scale.svg b/editor/icons/source/icon_tool_scale.svg
new file mode 100644
index 0000000000..515bef3bb7
--- /dev/null
+++ b/editor/icons/source/icon_tool_scale.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_scale.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_scale.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.7380314"
+ inkscape:cy="11.043755"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 14.019532,1038.3427 -2.828125,0.707 -2.8281258,0.707 1.4140624,1.4141 -4.9492186,4.9492 -1.4140625,-1.4141 -0.7070313,2.8282 L 2,1050.3622 l 2.828125,-0.707 2.828125,-0.7071 -1.4140625,-1.414 4.9492195,-4.9492 1.414062,1.414 0.707031,-2.8281 0.707032,-2.8281 z"
+ id="rect4135"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tool_select.svg b/editor/icons/source/icon_tool_select.svg
new file mode 100644
index 0000000000..2da6a3e6ba
--- /dev/null
+++ b/editor/icons/source/icon_tool_select.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_select.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tool_select.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.6219069"
+ inkscape:cy="11.371689"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1-6"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-6"
+ inkscape:label="Layer 1"
+ transform="translate(-26.000893,-9.8683103)">
+ <g
+ style="stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="g4515"
+ inkscape:label="Layer 1"
+ transform="matrix(0.63636994,0,0,0.63636994,11.81847,382.85245)" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="rect4163"
+ d="m 40.000893,1053.167 -12,-4.9365 4.936497,12 1.420656,-4.2301 2.8254,2.8252 1.412701,-1.4127 -2.8254,-2.8252 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tools.svg b/editor/icons/source/icon_tools.svg
new file mode 100644
index 0000000000..f2b8cd9343
--- /dev/null
+++ b/editor/icons/source/icon_tools.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_g_d_script.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_g_d_script.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.7306265"
+ inkscape:cy="9.0071681"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 7 1 L 6.4355469 3.2578125 A 5.0000172 5.0000172 0 0 0 5.7460938 3.5371094 L 3.7578125 2.34375 L 2.34375 3.7578125 L 3.5390625 5.7519531 A 5.0000172 5.0000172 0 0 0 3.2539062 6.4375 L 1 7 L 1 9 L 3.2578125 9.5644531 A 5.0000172 5.0000172 0 0 0 3.5371094 10.251953 L 2.34375 12.242188 L 3.7578125 13.65625 L 5.7519531 12.460938 A 5.0000172 5.0000172 0 0 0 6.4375 12.746094 L 7 15 L 9 15 L 9.5644531 12.742188 A 5.0000172 5.0000172 0 0 0 10.251953 12.462891 L 12.242188 13.65625 L 13.65625 12.242188 L 12.460938 10.248047 A 5.0000172 5.0000172 0 0 0 12.746094 9.5625 L 15 9 L 15 7 L 12.742188 6.4355469 A 5.0000172 5.0000172 0 0 0 12.462891 5.7480469 L 13.65625 3.7578125 L 12.242188 2.34375 L 10.248047 3.5390625 A 5.0000172 5.0000172 0 0 0 9.5625 3.2539062 L 9 1 L 7 1 z M 8 6 A 2.0000174 2.0000174 0 0 1 10 8 A 2.0000174 2.0000174 0 0 1 8 10 A 2.0000174 2.0000174 0 0 1 6 8 A 2.0000174 2.0000174 0 0 1 8 6 z "
+ transform="translate(0,1036.3622)"
+ id="path4176" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_touch_screen_button.svg b/editor/icons/source/icon_touch_screen_button.svg
new file mode 100644
index 0000000000..70abc964aa
--- /dev/null
+++ b/editor/icons/source/icon_touch_screen_button.svg
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_touch_screen_button.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="8.4904718"
+ inkscape:cy="7.5523354"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.63636994,0,0,0.63636994,10.81847,386.85247)"
+ inkscape:label="Layer 1"
+ id="g4515"
+ style="fill:#a5b7f8;fill-opacity:0.98823529;stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 6.0000004,1040.3624 0,7 0,0.033 -2.4746094,-1.8086 c -0.520152,-0.3803 -1.1948017,-0.4556 -1.6503906,0 -0.4556596,0.4556 -0.4556116,1.1948 0,1.6504 l 4.125,4.125 5.9999996,0 c 1.104569,0 2,-0.8954 2,-2 l 0,-5 -5.9999996,0 0,-4 -2,0 z"
+ id="rect4179"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccscssccccc" />
+ <circle
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4187"
+ cx="7"
+ cy="1040.3622"
+ r="1" />
+ <rect
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4226"
+ width="2"
+ height="1"
+ x="3"
+ y="1040.3622" />
+ <rect
+ y="1037.3622"
+ x="3"
+ height="1"
+ width="8"
+ id="rect4228"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ y="1040.3622"
+ x="9"
+ height="1"
+ width="2"
+ id="rect4230"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4232"
+ width="1"
+ height="2.0000174"
+ x="2"
+ y="1038.3622" />
+ <rect
+ y="1038.3622"
+ x="11"
+ height="2.0000174"
+ width="1"
+ id="rect4234"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4236"
+ sodipodi:type="arc"
+ sodipodi:cx="3"
+ sodipodi:cy="1038.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="0"
+ d="m 2,1038.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z" />
+ <path
+ d="m -12,1038.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z"
+ sodipodi:end="0"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="1038.3622"
+ sodipodi:cx="-11"
+ sodipodi:type="arc"
+ id="path4238"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,1)" />
+ <path
+ transform="scale(-1,-1)"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4240"
+ sodipodi:type="arc"
+ sodipodi:cx="-11"
+ sodipodi:cy="-1040.3622"
+ sodipodi:rx="1"
+ sodipodi:ry="1"
+ sodipodi:start="3.1415927"
+ sodipodi:end="0"
+ d="m -12,-1040.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z" />
+ <path
+ d="m -4,-1040.3622 a 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 l -1,0 z"
+ sodipodi:end="0"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="-1040.3622"
+ sodipodi:cx="-3"
+ sodipodi:type="arc"
+ id="path4242"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_track_add_key.svg b/editor/icons/source/icon_track_add_key.svg
new file mode 100644
index 0000000000..f550f922bb
--- /dev/null
+++ b/editor/icons/source/icon_track_add_key.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_track_add_key.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_track_add_key.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.389243"
+ inkscape:cy="3.816961"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 0 L 3 3 L 0 3 L 0 5 L 3 5 L 3 8 L 5 8 L 5 5 L 8 5 L 8 3 L 5 3 L 5 0 L 3 0 z "
+ transform="translate(0,1044.3622)"
+ id="rect4137" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_track_add_key_hl.svg b/editor/icons/source/icon_track_add_key_hl.svg
new file mode 100644
index 0000000000..1b45cf8c4a
--- /dev/null
+++ b/editor/icons/source/icon_track_add_key_hl.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_track_add_key_hl.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_track_add_key_hl.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="-4.0417082"
+ inkscape:cy="5.5439904"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:#84ffb1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 3 0 L 3 3 L 0 3 L 0 5 L 3 5 L 3 8 L 5 8 L 5 5 L 8 5 L 8 3 L 5 3 L 5 0 L 3 0 z "
+ id="rect4137"
+ transform="translate(0,1044.3622)" />
+ <path
+ transform="translate(0,1044.3622)"
+ id="path4143"
+ d="M 3 0 L 3 3 L 0 3 L 0 5 L 3 5 L 3 8 L 5 8 L 5 5 L 8 5 L 8 3 L 5 3 L 5 0 L 3 0 z "
+ style="fill:#ffffff;fill-opacity:0.42424244;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_track_continuous.svg b/editor/icons/source/icon_track_continuous.svg
new file mode 100644
index 0000000000..78b9dd3f4b
--- /dev/null
+++ b/editor/icons/source/icon_track_continuous.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_track_continuous.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.8686169"
+ inkscape:cy="5.8136992"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 2,1050.3622 c 6,0 6,-4 12,-4"
+ id="path4156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_track_discrete.svg b/editor/icons/source/icon_track_discrete.svg
new file mode 100644
index 0000000000..381782cf6f
--- /dev/null
+++ b/editor/icons/source/icon_track_discrete.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_track_discrete.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="7.8686169"
+ inkscape:cy="5.8136992"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4230"
+ cx="2"
+ cy="1050.3622"
+ r="1" />
+ <circle
+ r="1"
+ cy="1048.3622"
+ cx="8"
+ id="circle4232"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4234"
+ cx="14"
+ cy="1046.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_track_trigger.svg b/editor/icons/source/icon_track_trigger.svg
new file mode 100644
index 0000000000..9c13791f70
--- /dev/null
+++ b/editor/icons/source/icon_track_trigger.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="8"
+ viewBox="0 0 16 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_track_trigger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_track_trigger.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="0.93634514"
+ inkscape:cy="3.5256605"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <circle
+ r="1"
+ cy="1048.3622"
+ cx="11"
+ id="circle4232"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4234"
+ cx="14"
+ cy="1046.3622"
+ r="1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4169"
+ width="6"
+ height="2"
+ x="1"
+ y="1045.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4171"
+ width="2"
+ height="3.9999826"
+ x="3"
+ y="1047.3622" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4173"
+ cx="8"
+ cy="1050.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_translation.svg b/editor/icons/source/icon_translation.svg
new file mode 100644
index 0000000000..389b8a40de
--- /dev/null
+++ b/editor/icons/source/icon_translation.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_translation.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.1812988"
+ inkscape:cy="6.7732008"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 2 1 L 2 15 L 12 15 A 1.9999826 1.9999826 0 0 0 14 13 L 14 3 A 1.9999826 1.9999826 0 0 0 12 1 L 12 6 L 12 8 L 10 6 L 8 8 L 8 6 L 8 1 L 2 1 z "
+ transform="translate(0,1036.3622)"
+ id="rect4159" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_transpose.svg b/editor/icons/source/icon_transpose.svg
new file mode 100644
index 0000000000..ceccfecfa3
--- /dev/null
+++ b/editor/icons/source/icon_transpose.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_scale.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_transpose.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="11.628028"
+ inkscape:cy="13.482329"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4154"
+ width="2"
+ height="14"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="1"
+ height="2.0000174"
+ width="14"
+ id="rect4156"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1049.3622"
+ x="1"
+ height="1.9999652"
+ width="7"
+ id="rect4158"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1037.3622"
+ x="6"
+ height="14"
+ width="2"
+ id="rect4160"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="14"
+ height="2"
+ x="1"
+ y="1042.3622" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4164"
+ width="7.0000172"
+ height="1.9999828"
+ x="1037.3622"
+ y="-14.999983"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <path
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 15,1051.3622 -5,0 5,-5 z"
+ id="path4168"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4170"
+ width="5"
+ height="3"
+ x="8"
+ y="1039.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tree.svg b/editor/icons/source/icon_tree.svg
new file mode 100644
index 0000000000..b31fd38097
--- /dev/null
+++ b/editor/icons/source/icon_tree.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_tree.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.885344"
+ inkscape:cy="6.8775392"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4175"
+ width="1"
+ height="1"
+ x="20"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 1 A 2 2 0 0 0 1.5859375 1.5859375 A 2 2 0 0 0 1 3 L 1 13 A 2 2 0 0 0 1.5859375 14.414062 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 3 A 2 2 0 0 0 13 1 L 3 1 z M 3 2 L 13 2 A 1.0000174 1.0000174 0 0 1 14 3 L 14 13 A 1.0000174 1.0000174 0 0 1 13 14 L 3 14 A 1.0000174 1.0000174 0 0 1 2 13 L 2 3 A 1.0000174 1.0000174 0 0 1 3 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4173"
+ width="1"
+ height="5.0000172"
+ x="4"
+ y="1040.3622" />
+ <rect
+ y="1041.3622"
+ x="4"
+ height="1.0000174"
+ width="8"
+ id="rect4176"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4178"
+ width="7"
+ height="1.0000174"
+ x="5"
+ y="1044.3622" />
+ <rect
+ y="1045.3622"
+ x="7"
+ height="3.0000174"
+ width="1"
+ id="rect4180"
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4191"
+ width="5"
+ height="1"
+ x="7"
+ y="1047.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_tween.svg b/editor/icons/source/icon_tween.svg
new file mode 100644
index 0000000000..5cb5cad227
--- /dev/null
+++ b/editor/icons/source/icon_tween.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tween.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_tween.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.0670176"
+ inkscape:cy="10.041334"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 9,1050.3622 -7,0 0,-7"
+ id="path4138"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path4140"
+ d="m 7,1038.3622 7,0 0,7"
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4142"
+ d="m 6.0000002,1041.3622 4.9999998,0 0,5 z"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4144"
+ d="m 2,1050.3622 7,-7"
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_unbone.svg b/editor/icons/source/icon_unbone.svg
new file mode 100644
index 0000000000..7e4109f2ec
--- /dev/null
+++ b/editor/icons/source/icon_unbone.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_bone.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_unbone.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="6.4412926"
+ inkscape:cy="9.085446"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 10.478516 1 A 2.4664114 2.4663006 0 0 0 8.6972656 1.7207031 A 2.4664114 2.4663006 0 0 0 8.3828125 4.8242188 L 7.3105469 5.8964844 L 10.101562 8.6875 L 11.177734 7.6132812 A 2.4664198 2.4663006 0 0 0 14.277344 7.3027344 A 2.4664198 2.4663006 0 0 0 14.277344 3.8144531 A 2.4664198 2.4663006 0 0 0 12.880859 3.1171875 A 2.4664114 2.4663006 0 0 0 12.185547 1.7207031 A 2.4664114 2.4663006 0 0 0 10.478516 1 z M 5.8964844 7.3105469 L 4.8242188 8.3847656 A 2.4664114 2.4663006 0 0 0 1.7226562 8.6972656 A 2.4664114 2.4663006 0 0 0 1.7226562 12.185547 A 2.4664114 2.4663006 0 0 0 3.1191406 12.880859 A 2.4664198 2.4663006 0 0 0 3.8144531 14.277344 A 2.4664198 2.4663006 0 0 0 7.3027344 14.277344 A 2.4664198 2.4663006 0 0 0 7.6171875 11.173828 L 8.6875 10.101562 L 5.8964844 7.3105469 z "
+ transform="translate(0,1036.3622)"
+ id="path4139" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_ungroup.svg b/editor/icons/source/icon_ungroup.svg
new file mode 100644
index 0000000000..f0b33465cd
--- /dev/null
+++ b/editor/icons/source/icon_ungroup.svg
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_ungroup.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="2.9046561"
+ inkscape:cy="8.8085261"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.39215686;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 7,1037.3622 0,2 0,4 -4,0 c 0,0 -0.446,0 -1,0 -0.554,0 -1,0 -1,0 l 0,2 0,4 c 0,0 0.446,0 1,0 0.554,0 1,0 1,0 l 0,-4 4,0 0,4 -4,0 c -2.34e-5,0 0,0.446 0,1 0,0.554 -2.34e-5,1 0,1 l 4,0 c 0,0 0.446,0 1,0 0.554,0 1,0 1,0 l 0,-2 0,-4 4,0 c 0,0 0.446,0 1,0 0.554,0 1,0 1,0 l 0,-2 0,-4 c 0,0 -0.446,0 -1,0 -0.554,0 -1,0 -1,0 l 0,4 -4,0 0,-4 4,0 c 2.3e-5,0 0,-0.446 0,-1 0,-0.554 2.3e-5,-1 0,-1 l -4,0 c 0,0 -0.446,0 -1,0 -0.554,0 -1,0 -1,0 z"
+ id="rect4697" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4679"
+ width="2"
+ height="1.9999826"
+ x="1"
+ y="1049.3622"
+ rx="2.5000134"
+ ry="4.2248896e-05" />
+ <rect
+ ry="4.224963e-05"
+ rx="2.5000134"
+ y="1043.3622"
+ x="1"
+ height="2.0000174"
+ width="2"
+ id="rect4681"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4693"
+ width="2"
+ height="2.0000174"
+ x="13"
+ y="1037.3622"
+ rx="2.5000134"
+ ry="4.224963e-05" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4726"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1049.3622"
+ rx="2.5000134"
+ ry="4.224963e-05" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="2"
+ height="2.0000174"
+ x="7"
+ y="1037.3622"
+ rx="2.5000134"
+ ry="4.224963e-05" />
+ <rect
+ ry="4.224963e-05"
+ rx="2.5000134"
+ y="1043.3622"
+ x="7"
+ height="2.0000174"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ ry="4.224963e-05"
+ rx="2.5000134"
+ y="1043.3622"
+ x="13"
+ height="2.0000174"
+ width="2"
+ id="rect4161"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_unlock.svg b/editor/icons/source/icon_unlock.svg
new file mode 100644
index 0000000000..b821d486ed
--- /dev/null
+++ b/editor/icons/source/icon_unlock.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_unlock.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_unlock.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.9526998"
+ inkscape:cy="6.9680614"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="false"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-others="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ transform="matrix(0.63636994,0,0,0.63636994,11.81847,382.85245)"
+ inkscape:label="Layer 1"
+ id="g4515"
+ style="stroke:#ffffff;stroke-width:6.28565216;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 8 L 2 15 L 14 15 L 14 8 L 2 8 z M 7 10 L 9 10 L 9 13 L 7 13 L 7 10 z "
+ id="rect4139"
+ transform="translate(0,1036.3622)" />
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8,1 C 7.1226197,1.001545 6.2610925,1.233935 5.5019531,1.6738281 l 1,1.7324219 C 6.9570181,3.1417636 7.4736593,3.0016575 8,3 c 1.6568542,0 3,1.3431458 3,3 l 2,0 C 13,3.2385763 10.761424,1 8,1 Z"
+ transform="translate(0,1036.3622)"
+ id="path4141"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ y="1042.3622"
+ x="11"
+ height="2"
+ width="2"
+ id="rect4147"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_uv.svg b/editor/icons/source/icon_uv.svg
new file mode 100644
index 0000000000..698a57fc0a
--- /dev/null
+++ b/editor/icons/source/icon_uv.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_tool_rotate.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_uv.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="-4.4331479"
+ inkscape:cy="7.1529248"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 5 L 1 9 A 3 2.9999914 0 0 0 2.5 11.597656 A 3 2.9999914 0 0 0 5.5 11.597656 A 3 2.9999914 0 0 0 7 9 L 7 5 L 5 5 L 5 9 A 1 1 0 0 1 4 10 A 1 1 0 0 1 3 9 L 3 5 L 1 5 z M 9 5 L 11 12 L 12 12 L 13 12 L 14 12 L 16 5 L 14 5 L 12.5 10.25 L 11 5 L 9 5 z "
+ transform="translate(0,1036.3622)"
+ id="rect4155" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_box_container.svg b/editor/icons/source/icon_v_box_container.svg
new file mode 100644
index 0000000000..9773b253fb
--- /dev/null
+++ b/editor/icons/source/icon_v_box_container.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_box_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.6758349"
+ inkscape:cy="9.0861534"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 15,1039.3622 c 0,-1.1046 -0.89543,-2 -2,-2 l -10,0 c -1.104569,0 -2,0.8954 -2,2 l 0,10 c 0,1.1046 0.895431,2 2,2 l 10,0 c 1.10457,0 2,-0.8954 2,-2 l 0,-10 z m -2,0 0,2 -10,0 0,-2 10,0 z m 0,4 0,2 -10,0 0,-2 10,0 z m 0,4 0,2 -10,0 0,-2 10,0 z"
+ id="rect4140"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_button_array.svg b/editor/icons/source/icon_v_button_array.svg
new file mode 100644
index 0000000000..aded4b401b
--- /dev/null
+++ b/editor/icons/source/icon_v_button_array.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_button.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_button_array.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.9547041"
+ inkscape:cy="8.9802416"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="14"
+ height="6.0000172"
+ x="1"
+ y="1037.3622" />
+ <rect
+ y="1042.3622"
+ x="1"
+ height="0.99996543"
+ width="14"
+ id="rect4161"
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 9 L 1 15 L 3 13 L 5 15 L 7 13 L 9 15 L 11 13 L 13 15 L 15 13 L 15 9 L 1 9 z "
+ transform="translate(0,1036.3622)"
+ id="rect4157" />
+ <path
+ style="opacity:1;fill:#98dc9f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1 14 L 1 15 L 2 14 L 1 14 z M 4 14 L 5 15 L 6 14 L 4 14 z M 8 14 L 9 15 L 10 14 L 8 14 z M 12 14 L 13 15 L 14 14 L 12 14 z "
+ transform="translate(0,1036.3622)"
+ id="rect4159" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_scroll_bar.svg b/editor/icons/source/icon_v_scroll_bar.svg
new file mode 100644
index 0000000000..659dc39b0b
--- /dev/null
+++ b/editor/icons/source/icon_v_scroll_bar.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_scroll_bar.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.543346"
+ inkscape:cy="9.3134214"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 13,1039.3622 c 0,-1.1046 -0.89543,-2 -2,-2 l -6,0 c -1.104569,0 -2,0.8954 -2,2 l 0,10 c 0,1.1046 0.895431,2 2,2 l 6,0 c 1.10457,0 2,-0.8954 2,-2 z m -2,0 0,10 -6,0 0,-10 z"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4181"
+ width="4"
+ height="4"
+ x="1042.3622"
+ y="-8"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4187"
+ width="4"
+ height="4"
+ x="1040.3622"
+ y="-10"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_separator.svg b/editor/icons/source/icon_v_separator.svg
new file mode 100644
index 0000000000..7e5ce39ba0
--- /dev/null
+++ b/editor/icons/source/icon_v_separator.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_separator.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="10.534143"
+ inkscape:cy="10.281549"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="m 2,1047.3622 3,0 0,-6 -3,0 0,6 z m 5,4 2,0 0,-14 -2,0 0,14 z m 4,-4 3,0 0,-6 -3,0 0,6 z"
+ id="rect4156"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_slider.svg b/editor/icons/source/icon_v_slider.svg
new file mode 100644
index 0000000000..74b59cfce5
--- /dev/null
+++ b/editor/icons/source/icon_v_slider.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_slider.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="9.3533577"
+ inkscape:cy="8.3875011"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 9,1038.3622 a 1,1 0 0 0 -1,-1 1,1 0 0 0 -1,1 l 0,3.1738 a 3,3 0 0 1 1,-0.1738 3,3 0 0 1 1,0.1758 l 0,-3.1758 z m 0,8.8262 a 3,3 0 0 1 -1,0.1738 3,3 0 0 1 -1,-0.1758 l 0,3.1758 a 1,1 0 0 0 1,1 1,1 0 0 0 1,-1 l 0,-3.1738 z"
+ id="rect4157"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4167"
+ cx="8"
+ cy="1044.3622"
+ r="2" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_v_split_container.svg b/editor/icons/source/icon_v_split_container.svg
new file mode 100644
index 0000000000..4e7704eb4e
--- /dev/null
+++ b/editor/icons/source/icon_v_split_container.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_v_split_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="6.8095409"
+ inkscape:cy="10.783047"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z m 0,2 10,0 0,10 -10,0 z"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssccccc"
+ transform="translate(0,1036.3622)" />
+ <rect
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4155"
+ width="2"
+ height="10"
+ x="1043.3622"
+ y="-13"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1045.3622 -4,0 2,2 z"
+ id="path4173"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 10,1043.3622 -2,-2 -2,2 z"
+ id="path4171"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vector.svg b/editor/icons/source/icon_vector.svg
new file mode 100644
index 0000000000..3260aa77ac
--- /dev/null
+++ b/editor/icons/source/icon_vector.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vector.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="4.3605855"
+ inkscape:cy="6.1062603"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1047.3622 -4,4"
+ id="path4161"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 7,1040.3622 0,7 7,0"
+ id="path4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vector2.svg b/editor/icons/source/icon_vector2.svg
new file mode 100644
index 0000000000..b7b157db01
--- /dev/null
+++ b/editor/icons/source/icon_vector2.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="12"
+ viewBox="0 0 16 12"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot-design/assets/icons/svg/icon_graph_scalar_uniform.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vector_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.3478451"
+ inkscape:cy="7.2601098"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ showguides="false"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1040.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#b8ea68;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 4,1041.3622 0,9 9,0"
+ id="path4163"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vehicle_body.svg b/editor/icons/source/icon_vehicle_body.svg
new file mode 100644
index 0000000000..a168b98a99
--- /dev/null
+++ b/editor/icons/source/icon_vehicle_body.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vehicle_body.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="63.999997"
+ inkscape:cx="8.7499158"
+ inkscape:cy="7.6997367"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 5 3 A 1 1 0 0 0 4 4 L 3 7 L 1 7 L 1 11 L 2.0507812 11 C 2.2824511 9.8589301 3.2905526 9 4.5 9 C 5.7094474 9 6.717549 9.8589301 6.9492188 11 L 9.0507812 11 C 9.2824511 9.8589301 10.290553 9 11.5 9 C 12.709447 9 13.717549 9.8589301 13.949219 11 L 15 11 L 15 7 L 11 7 L 11 3 L 5 3 z M 6 4 L 10 4 L 10 7 L 6 7 L 6 4 z "
+ transform="translate(0,1036.3622)"
+ id="rect4167" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="path4154"
+ cx="4.5"
+ cy="1047.8622"
+ r="1.5" />
+ <circle
+ r="1.5"
+ cy="1047.8622"
+ cx="11.5"
+ id="circle4165"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vehicle_wheel.svg b/editor/icons/source/icon_vehicle_wheel.svg
new file mode 100644
index 0000000000..dff80c4d00
--- /dev/null
+++ b/editor/icons/source/icon_vehicle_wheel.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vehicle_wheel.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.9995914"
+ inkscape:cy="9.3390829"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 3 A 5 5 0 0 1 13 8 A 5 5 0 0 1 8 13 A 5 5 0 0 1 3 8 A 5 5 0 0 1 8 3 z "
+ transform="translate(0,1036.3622)"
+ id="path4212" />
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 4 A 4 4 0 0 0 4 8 A 4 4 0 0 0 8 12 A 4 4 0 0 0 12 8 A 4 4 0 0 0 8 4 z M 8 5 A 1 1 0 0 1 9 6 A 1 1 0 0 1 8 7 A 1 1 0 0 1 7 6 A 1 1 0 0 1 8 5 z M 6 7 A 1 1 0 0 1 7 8 A 1 1 0 0 1 6 9 A 1 1 0 0 1 5 8 A 1 1 0 0 1 6 7 z M 10 7 A 1 1 0 0 1 11 8 A 1 1 0 0 1 10 9 A 1 1 0 0 1 9 8 A 1 1 0 0 1 10 7 z M 8 9 A 1 1 0 0 1 9 10 A 1 1 0 0 1 8 11 A 1 1 0 0 1 7 10 A 1 1 0 0 1 8 9 z "
+ id="circle4229"
+ transform="translate(0,1036.3622)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_video_player.svg b/editor/icons/source/icon_video_player.svg
new file mode 100644
index 0000000000..bfb499518b
--- /dev/null
+++ b/editor/icons/source/icon_video_player.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_video_player.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="4.9323208"
+ inkscape:cy="11.020342"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4175"
+ width="1"
+ height="1"
+ x="20"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 1 A 2 2 0 0 0 1.5859375 1.5859375 A 2 2 0 0 0 1 3 L 1 13 A 2 2 0 0 0 1.5859375 14.414062 A 2 2 0 0 0 3 15 L 13 15 A 2 2 0 0 0 15 13 L 15 3 A 2 2 0 0 0 13 1 L 3 1 z M 3 2 L 13 2 A 1.0000174 1.0000174 0 0 1 14 3 L 14 13 A 1.0000174 1.0000174 0 0 1 13 14 L 3 14 A 1.0000174 1.0000174 0 0 1 2 13 L 2 3 A 1.0000174 1.0000174 0 0 1 3 2 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ <path
+ style="fill:#a5efac;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6,1047.3622 0,-6 5,3 z"
+ id="path4180"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_viewport.svg b/editor/icons/source/icon_viewport.svg
new file mode 100644
index 0000000000..631260ab33
--- /dev/null
+++ b/editor/icons/source/icon_viewport.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_viewport.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="14.11111"
+ inkscape:cy="8.6614747"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3,2 C 2.4695977,2.0000801 1.9609485,2.2108464 1.5859375,2.5859375 1.2108464,2.9609485 1.0000801,3.4695977 1,4 l 0,8 c 8.03e-5,0.530402 0.2108465,1.039051 0.5859375,1.414062 C 1.9609484,13.789153 2.4695976,13.99992 3,14 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,4 C 15,2.8954305 14.104569,2 13,2 Z m 0,1 10,0 c 0.552281,9.6e-6 0.99999,0.4477192 1,1 l 0,8 c -10e-6,0.552281 -0.447719,0.99999 -1,1 L 3,13 C 2.4477192,12.99999 2.0000096,12.552281 2,12 L 2,4 c 9.6e-6,-0.5522808 0.4477192,-0.9999904 1,-1 z"
+ transform="translate(0,1036.3622)"
+ id="rect4179"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsssscccccccccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_viewport_container.svg b/editor/icons/source/icon_viewport_container.svg
new file mode 100644
index 0000000000..300b8390c4
--- /dev/null
+++ b/editor/icons/source/icon_viewport_container.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_viewport_container.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="13.216634"
+ inkscape:cy="7.7987238"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3,1 C 1.8954305,1 1,1.8954305 1,3 l 0,10 c 0,1.104569 0.8954305,2 2,2 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,3 C 15,1.8954305 14.104569,1 13,1 Z M 3,3 13,3 13,13 3,13 Z M 6,4 C 5.469598,4.0001 4.9609495,4.2108375 4.5859375,4.5859375 4.2108465,4.9609375 4.00008,5.4696 4,6 l 0,4 c 8e-5,0.5304 0.2108475,1.039063 0.5859375,1.414062 C 4.9609485,11.789162 5.469598,11.9999 6,12 l 4,0 c 1.104569,0 2,-0.8954 2,-2 L 12,6 C 12,4.8954 11.104569,4 10,4 Z m 0,1 4,0 c 0.552281,0 0.99999,0.4477 1,1 l 0,4 c -10e-6,0.5523 -0.447719,1 -1,1 L 6,11 C 5.447719,11 5.00001,10.5523 5,10 L 5,6 C 5.00001,5.4477 5.447719,5 6,5 Z"
+ transform="translate(0,1036.3622)"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccsssscssccssccs" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_viewport_sprite.svg b/editor/icons/source/icon_viewport_sprite.svg
new file mode 100644
index 0000000000..ab1ac198ce
--- /dev/null
+++ b/editor/icons/source/icon_viewport_sprite.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_viewport_sprite.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="6.9421446"
+ inkscape:cy="7.9109534"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4175"
+ width="1"
+ height="1"
+ x="20"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="29"
+ height="1"
+ width="1"
+ id="rect4177"
+ style="opacity:1;fill:#fefeff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3,2 C 2.4695977,2.0000801 1.9609485,2.2108464 1.5859375,2.5859375 1.2108464,2.9609485 1.0000801,3.4695977 1,4 l 0,8 c 8.03e-5,0.530402 0.2108465,1.039051 0.5859375,1.414062 C 1.9609484,13.789153 2.4695976,13.99992 3,14 l 10,0 c 1.104569,0 2,-0.895431 2,-2 L 15,4 C 15,2.8954305 14.104569,2 13,2 Z m 0,1 10,0 c 0.552281,9.6e-6 0.99999,0.4477192 1,1 l 0,8 c -10e-6,0.552281 -0.447719,0.99999 -1,1 L 3,13 C 2.4477192,12.99999 2.0000096,12.552281 2,12 L 2,4 c 9.6e-6,-0.5522808 0.4477192,-0.9999904 1,-1 z"
+ transform="translate(0,1036.3622)"
+ id="rect4179"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsssscccccccccc" />
+ <rect
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4213"
+ width="2"
+ height="1.9999826"
+ x="4"
+ y="1042.3622" />
+ <rect
+ y="1042.3622"
+ x="10"
+ height="1.9999826"
+ width="2"
+ id="rect4215"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="1045.3622"
+ x="4"
+ height="1.0000174"
+ width="8"
+ id="rect4217"
+ style="opacity:1;fill:#a5b7f8;fill-opacity:0.98823529;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_viewport_texture.svg b/editor/icons/source/icon_viewport_texture.svg
new file mode 100644
index 0000000000..4cf6532059
--- /dev/null
+++ b/editor/icons/source/icon_viewport_texture.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_sprite.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_viewport_texture.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="18.523635"
+ inkscape:cy="6.064799"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-intersection-paths="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 3 2 C 2.4695977 2.0000801 1.9609485 2.2108464 1.5859375 2.5859375 C 1.2108464 2.9609485 1.0000801 3.4695977 1 4 L 1 12 C 1.0000803 12.530402 1.2108465 13.039051 1.5859375 13.414062 C 1.9609484 13.789154 2.4695976 13.99992 3 14 L 13 14 C 14.104569 14 15 13.104569 15 12 L 15 4 C 15 2.8954305 14.104569 2 13 2 L 3 2 z M 3 3 L 13 3 C 13.552281 3.0000096 13.99999 3.4477192 14 4 L 14 12 C 13.99999 12.552281 13.552281 12.99999 13 13 L 3 13 C 2.4477192 12.99999 2.0000096 12.552281 2 12 L 2 4 C 2.0000096 3.4477192 2.4477192 3.0000096 3 3 z M 9 6 L 9 7 L 8 7 L 8 8 L 6 8 L 6 9 L 5 9 L 5 10 L 4 10 L 4 11 L 6 11 L 8 11 L 10 11 L 12 11 L 12 9 L 11 9 L 11 8 L 11 7 L 10 7 L 10 6 L 9 6 z "
+ transform="translate(0,1036.3622)"
+ id="rect4179" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visibility_enabler.svg b/editor/icons/source/icon_visibility_enabler.svg
new file mode 100644
index 0000000000..7c3bc54c99
--- /dev/null
+++ b/editor/icons/source/icon_visibility_enabler.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visibility_enabler.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="7.6618615"
+ inkscape:cy="10.09281"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-0"
+ inkscape:label="Layer 1"
+ transform="translate(-1.5201563e-4,0)"
+ style="fill:#fc9c9c;fill-opacity:0.99607843">
+ <path
+ id="path4165"
+ transform="translate(0,1036.3622)"
+ d="M 8,2 C 5.4432667,2 2.2093331,3.9476781 1.0449219,7.7050781 a 1.0001,1.0001 0 0 0 -0.00586,0.5703125 C 2.1634651,12.210791 5.5,14 8,14 c 2.5,0 5.836534,-1.789209 6.960938,-5.7246094 a 1.0001,1.0001 0 0 0 0,-0.5527344 C 13.86059,3.9350563 10.554367,2 8,2 Z M 8,4 A 4,4 0 0 1 12,8 4,4 0 0 1 8,12 4,4 0 0 1 4,8 4,4 0 0 1 8,4 Z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4192"
+ cx="8"
+ cy="1044.3622"
+ r="2" />
+ </g>
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 1 1 L 1 4 L 2 4 L 2 2 L 4 2 L 4 1 L 1 1 z M 12 1 L 12 2 L 14 2 L 14 4 L 15 4 L 15 1 L 12 1 z M 1 12 L 1 15 L 4 15 L 4 14 L 2 14 L 2 12 L 1 12 z M 14 12 L 14 14 L 12 14 L 12 15 L 15 15 L 15 12 L 14 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4176" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visibility_enabler_2d.svg b/editor/icons/source/icon_visibility_enabler_2d.svg
new file mode 100644
index 0000000000..1e7d1a751f
--- /dev/null
+++ b/editor/icons/source/icon_visibility_enabler_2d.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visibility_enabler_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="3.8611624"
+ inkscape:cy="11.15347"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-0"
+ inkscape:label="Layer 1"
+ transform="translate(-1.5201563e-4,0)"
+ style="fill:#a5b7f9;fill-opacity:0.98823529">
+ <path
+ id="path4165"
+ transform="translate(0,1036.3622)"
+ d="M 8,2 C 5.4432667,2 2.2093331,3.9476781 1.0449219,7.7050781 a 1.0001,1.0001 0 0 0 -0.00586,0.5703125 C 2.1634651,12.210791 5.5,14 8,14 c 2.5,0 5.836534,-1.789209 6.960938,-5.7246094 a 1.0001,1.0001 0 0 0 0,-0.5527344 C 13.86059,3.9350563 10.554367,2 8,2 Z M 8,4 A 4,4 0 0 1 12,8 4,4 0 0 1 8,12 4,4 0 0 1 4,8 4,4 0 0 1 8,4 Z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <circle
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4192"
+ cx="8"
+ cy="1044.3622"
+ r="2" />
+ </g>
+ <path
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 1 1 L 1 4 L 2 4 L 2 2 L 4 2 L 4 1 L 1 1 z M 12 1 L 12 2 L 14 2 L 14 4 L 15 4 L 15 1 L 12 1 z M 1 12 L 1 15 L 4 15 L 4 14 L 2 14 L 2 12 L 1 12 z M 14 12 L 14 14 L 12 14 L 12 15 L 15 15 L 15 12 L 14 12 z "
+ transform="translate(0,1036.3622)"
+ id="rect4176" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visibility_notifier.svg b/editor/icons/source/icon_visibility_notifier.svg
new file mode 100644
index 0000000000..b307a6162d
--- /dev/null
+++ b/editor/icons/source/icon_visibility_notifier.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visibility_notifier.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="0.5167491"
+ inkscape:cy="12.138813"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 8 3 C 5.4432667 3 2.2093331 4.9476781 1.0449219 8.7050781 A 1.0001 1.0001 0 0 0 1.0390625 9.2753906 C 2.1634657 13.210791 5.5 15 8 15 C 9.4906676 15 11.271733 14.347929 12.710938 13 L 12 13 L 10 13 L 10 12.458984 A 4 4 0 0 1 8 13 A 4 4 0 0 1 4 9 A 4 4 0 0 1 8 5 A 4 4 0 0 1 10 5.5410156 L 10 3.359375 C 9.3168765 3.1210335 8.635589 3 8 3 z M 8 7 A 2 2 0 0 0 6 9 A 2 2 0 0 0 8 11 A 2 2 0 0 0 10 9 A 2 2 0 0 0 8 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4165" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4157"
+ width="2"
+ height="6"
+ x="12"
+ y="1037.3622" />
+ <rect
+ y="-1047.3622"
+ x="12"
+ height="2.0000174"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visibility_notifier_2d.svg b/editor/icons/source/icon_visibility_notifier_2d.svg
new file mode 100644
index 0000000000..dc2482f9e1
--- /dev/null
+++ b/editor/icons/source/icon_visibility_notifier_2d.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visibility_notifier_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="0.5167491"
+ inkscape:cy="12.138813"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-intersection-paths="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a5b7fa;fill-opacity:0.98823529;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 8 3 C 5.4432667 3 2.2093331 4.9476781 1.0449219 8.7050781 A 1.0001 1.0001 0 0 0 1.0390625 9.2753906 C 2.1634657 13.210791 5.5 15 8 15 C 9.4906676 15 11.271733 14.347929 12.710938 13 L 12 13 L 10 13 L 10 12.458984 A 4 4 0 0 1 8 13 A 4 4 0 0 1 4 9 A 4 4 0 0 1 8 5 A 4 4 0 0 1 10 5.5410156 L 10 3.359375 C 9.3168765 3.1210335 8.635589 3 8 3 z M 8 7 A 2 2 0 0 0 6 9 A 2 2 0 0 0 8 11 A 2 2 0 0 0 10 9 A 2 2 0 0 0 8 7 z "
+ transform="translate(0,1036.3622)"
+ id="path4165" />
+ <rect
+ style="opacity:1;fill:#a5b7fa;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4157"
+ width="2"
+ height="6"
+ x="12"
+ y="1037.3622" />
+ <rect
+ y="-1047.3622"
+ x="12"
+ height="2.0000174"
+ width="2"
+ id="rect4159"
+ style="opacity:1;fill:#a5b7fa;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visible.svg b/editor/icons/source/icon_visible.svg
new file mode 100644
index 0000000000..0185e1f3a9
--- /dev/null
+++ b/editor/icons/source/icon_visible.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_history.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visible.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="13.144261"
+ inkscape:cy="10.090962"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 8 2 C 5.4432667 2 2.2093331 3.9476781 1.0449219 7.7050781 A 1.0001 1.0001 0 0 0 1.0390625 8.2753906 C 2.1634651 12.210791 5.5 14 8 14 C 10.5 14 13.836534 12.210791 14.960938 8.2753906 A 1.0001 1.0001 0 0 0 14.960938 7.7226562 C 13.86059 3.9350563 10.554367 2 8 2 z M 8 4 A 4 4 0 0 1 12 8 A 4 4 0 0 1 8 12 A 4 4 0 0 1 4 8 A 4 4 0 0 1 8 4 z "
+ transform="translate(0,1036.3622)"
+ id="path4165" />
+ <circle
+ r="2"
+ cy="1044.3622"
+ cx="8"
+ id="circle4192"
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visual_script.svg b/editor/icons/source/icon_visual_script.svg
new file mode 100644
index 0000000000..be4b47ca54
--- /dev/null
+++ b/editor/icons/source/icon_visual_script.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_canvas_item_shader_graph.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_visual_script.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="2.7930637"
+ inkscape:cy="10.792256"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 A 2 2 0 0 0 1 3 A 2 2 0 0 0 2 4.7304688 L 2 11.271484 A 2 2 0 0 0 1 13 A 2 2 0 0 0 3 15 A 2 2 0 0 0 5 13 A 2 2 0 0 0 4 11.269531 L 4 5.4140625 L 6.2929688 7.7070312 L 7.7070312 6.2929688 L 5.4140625 4 L 11.271484 4 A 2 2 0 0 0 13 5 A 2 2 0 0 0 15 3 A 2 2 0 0 0 13 1 A 2 2 0 0 0 11.269531 2 L 4.7285156 2 A 2 2 0 0 0 3 1 z "
+ transform="translate(0,1036.3622)"
+ id="path4198" />
+ <ellipse
+ r="2"
+ style="opacity:1;fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse4152"
+ cx="3"
+ cy="1039.3622" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e0e0e0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ d="m 11,1050.3622 3,-3 -3,-3"
+ id="path3378"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_visual_shader_port.svg b/editor/icons/source/icon_visual_shader_port.svg
new file mode 100644
index 0000000000..9e80e0e9e9
--- /dev/null
+++ b/editor/icons/source/icon_visual_shader_port.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="10"
+ height="10"
+ viewBox="0 0 10 10"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collapse.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_visual_shader_port.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="-0.97644929"
+ inkscape:cy="7.6043186"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1042.3622)">
+ <path
+ style="fill:#f3f3f3;fill-rule:evenodd;stroke:#e4e4e4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ d="m 2,1051.3622 0,-8 6,4 z"
+ id="path4135"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vu_empty.svg b/editor/icons/source/icon_vu_empty.svg
new file mode 100644
index 0000000000..c4c7a4e625
--- /dev/null
+++ b/editor/icons/source/icon_vu_empty.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="4"
+ viewBox="0 0 128 4"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_vu_empty.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vu_empty.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4211">
+ <stop
+ style="stop-color:#84ffb1;stop-opacity:1"
+ offset="0"
+ id="stop4213" />
+ <stop
+ id="stop4221"
+ offset="0.5"
+ style="stop-color:#e1dc7a;stop-opacity:1" />
+ <stop
+ style="stop-color:#ff8484;stop-opacity:1"
+ offset="1"
+ id="stop4215" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4211"
+ id="linearGradient4219"
+ x1="0"
+ y1="2"
+ x2="128"
+ y2="2"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="67.735572"
+ inkscape:cy="8.9854683"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1048.3622)">
+ <path
+ style="opacity:1;fill:url(#linearGradient4219);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 A 2 2 0 0 0 0 2 A 2 2 0 0 0 2 4 L 77 4 L 80 4 L 82 4 L 85 4 L 100 4 L 100 0 L 85 0 L 82 0 L 80 0 L 77 0 L 2 0 z M 102 0 L 102 4 L 126 4 A 2 2 0 0 0 128 2 A 2 2 0 0 0 126 0 L 102 0 z "
+ transform="translate(0,1048.3622)"
+ id="rect4204" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:0.23529412;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 A 2 2 0 0 0 0 2 A 2 2 0 0 0 2 4 L 77 4 L 80 4 L 82 4 L 85 4 L 100 4 L 100 0 L 85 0 L 82 0 L 80 0 L 77 0 L 2 0 z M 102 0 L 102 4 L 126 4 A 2 2 0 0 0 128 2 A 2 2 0 0 0 126 0 L 102 0 z "
+ transform="translate(0,1048.3622)"
+ id="path4242" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_vu_full.svg b/editor/icons/source/icon_vu_full.svg
new file mode 100644
index 0000000000..7084ddf204
--- /dev/null
+++ b/editor/icons/source/icon_vu_full.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="4"
+ viewBox="0 0 128 4"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_vu_empty.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_vu_full.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4211">
+ <stop
+ style="stop-color:#84ffb1;stop-opacity:1"
+ offset="0"
+ id="stop4213" />
+ <stop
+ id="stop4221"
+ offset="0.5"
+ style="stop-color:#e1dc7a;stop-opacity:1" />
+ <stop
+ style="stop-color:#ff8484;stop-opacity:1"
+ offset="1"
+ id="stop4215" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4211"
+ id="linearGradient4219"
+ x1="0"
+ y1="2"
+ x2="128"
+ y2="2"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="67.735572"
+ inkscape:cy="8.9854683"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="false"
+ inkscape:snap-smooth-nodes="false"
+ inkscape:snap-midpoints="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1048.3622)">
+ <path
+ style="opacity:1;fill:url(#linearGradient4219);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 2 0 A 2 2 0 0 0 0 2 A 2 2 0 0 0 2 4 L 77 4 L 80 4 L 82 4 L 85 4 L 100 4 L 100 0 L 85 0 L 82 0 L 80 0 L 77 0 L 2 0 z M 102 0 L 102 4 L 126 4 A 2 2 0 0 0 128 2 A 2 2 0 0 0 126 0 L 102 0 z "
+ transform="translate(0,1048.3622)"
+ id="rect4204" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_warning.svg b/editor/icons/source/icon_warning.svg
new file mode 100644
index 0000000000..4d39141a58
--- /dev/null
+++ b/editor/icons/source/icon_warning.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="8"
+ viewBox="0 0 8 8"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_warning.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254832"
+ inkscape:cx="2.2320862"
+ inkscape:cy="6.41947"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1044.3622)">
+ <rect
+ style="opacity:1;fill:#ffd684;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4142"
+ width="8"
+ height="8"
+ x="0"
+ y="1044.3622"
+ ry="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_window_dialog.svg b/editor/icons/source/icon_window_dialog.svg
new file mode 100644
index 0000000000..433ae48a55
--- /dev/null
+++ b/editor/icons/source/icon_window_dialog.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_confirmation_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_window_dialog.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="2.2494901"
+ inkscape:cy="5.6766918"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#a5efac;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 3 1 C 1.89543 1 1 1.8954 1 3 L 1 4 L 15 4 L 15 3 C 15 1.8954 14.104569 1 13 1 L 3 1 z M 12 2 L 13 2 L 13 3 L 12 3 L 12 2 z M 1 5 L 1 13 C 1 14.1046 1.89543 15 3 15 L 13 15 C 14.104569 15 15 14.1046 15 13 L 15 5 L 1 5 z "
+ transform="translate(0,1036.3622)"
+ id="rect4140" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_world.svg b/editor/icons/source/icon_world.svg
new file mode 100644
index 0000000000..b2be396217
--- /dev/null
+++ b/editor/icons/source/icon_world.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_world.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="45.254834"
+ inkscape:cx="10.207753"
+ inkscape:cy="6.6325397"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4219"
+ cx="5.9999828"
+ cy="1046.3622"
+ r="4.9999828" />
+ <circle
+ style="opacity:1;fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4221"
+ cx="12"
+ cy="1039.3622"
+ r="1" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_world_2d.svg b/editor/icons/source/icon_world_2d.svg
new file mode 100644
index 0000000000..cb4427808a
--- /dev/null
+++ b/editor/icons/source/icon_world_2d.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_world_2d.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="17.648364"
+ inkscape:cy="4.8796811"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="false"
+ inkscape:snap-intersection-paths="false"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 2,1037.3613 a 1.0001,1.0001 0 0 0 -1,1 l 0,10 a 1.0001,1.0001 0 0 0 1,1 c 2.3666667,0 3.9746094,0.4629 5.7246094,0.9629 1.75,0.5 3.6420576,1.0371 6.2753906,1.0371 a 1.0001,1.0001 0 0 0 1,-1 l 0,-10 a 1.0001,1.0001 0 0 0 -1,-1 c -2.366667,0 -3.974609,-0.4609 -5.7246094,-0.9609 -1.75,-0.5 -3.6420573,-1.0391 -6.2753906,-1.0391 z m 1,2.0957 c 1.798426,0.1158 3.2574477,0.448 4.7246094,0.8672 1.4977347,0.4279 3.1940466,0.8188 5.2753906,0.9414 l 0,8.002 c -1.79849,-0.1158 -3.2574125,-0.448 -4.7246094,-0.8672 C 6.7776425,1047.9725 5.0813715,1047.5796 3,1047.457 l 0,-8 z"
+ id="path4157"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_world_environment.svg b/editor/icons/source/icon_world_environment.svg
new file mode 100644
index 0000000000..912e348c81
--- /dev/null
+++ b/editor/icons/source/icon_world_environment.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/icon_node_2d.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_world_environment.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="31.999999"
+ inkscape:cx="2.4346197"
+ inkscape:cy="8.8876091"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-smooth-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ d="M 8 1 A 7 7 0 0 0 1 8 A 7 7 0 0 0 8 15 A 7 7 0 0 0 15 8 A 7 7 0 0 0 8 1 z M 8 2 A 6 6 0 0 1 14 8 A 6 6 0 0 1 8 14 A 6 6 0 0 1 2 8 A 6 6 0 0 1 8 2 z "
+ transform="translate(0,1036.3622)"
+ id="path4158" />
+ <rect
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843"
+ id="rect4163"
+ width="12"
+ height="1"
+ x="2"
+ y="1041.3622" />
+ <rect
+ y="1046.3622"
+ x="2"
+ height="1"
+ width="12"
+ id="rect4165"
+ style="opacity:1;fill:#fc9c9c;fill-opacity:0.99607843;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.99607843" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
+ d="m 8,1038.3622 c 0,0 -3.5,2 -3.5,6 0,4 3.5,6 3.5,6"
+ id="path4167"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czc" />
+ <path
+ sodipodi:nodetypes="czc"
+ inkscape:connector-curvature="0"
+ id="path4169"
+ d="m 8,1038.3622 c 0,0 3.5,2 3.5,6 0,4 -3.5,6 -3.5,6"
+ style="fill:none;fill-rule:evenodd;stroke:#fc9c9c;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_y_sort.svg b/editor/icons/source/icon_y_sort.svg
new file mode 100644
index 0000000000..65990097c6
--- /dev/null
+++ b/editor/icons/source/icon_y_sort.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_center_container.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_y_sort.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="4.9766986"
+ inkscape:cy="10.397342"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4157"
+ width="6"
+ height="2"
+ x="9"
+ y="1038.3622" />
+ <path
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3,1048.3622 -2,0 3,3 3,-3 -2,0 0,-8 2,0 -3,-3 -3,3 2,0 z"
+ id="rect4140"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <rect
+ y="1043.3622"
+ x="9"
+ height="2"
+ width="4"
+ id="rect4160"
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#a5b7f9;fill-opacity:0.98823529;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="2"
+ height="2"
+ x="9"
+ y="1048.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_zoom.svg b/editor/icons/source/icon_zoom.svg
new file mode 100644
index 0000000000..811036b370
--- /dev/null
+++ b/editor/icons/source/icon_zoom.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_zoom.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_zoom.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.7772222"
+ inkscape:cy="11.922647"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <path
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 6,1037.3622 a 5,5 0 0 0 -5,5 5,5 0 0 0 5,5 5,5 0 0 0 5,-5 5,5 0 0 0 -5,-5 z m 0,2 a 3,3 0 0 1 3,3 3,3 0 0 1 -3,3 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3 z"
+ id="path4135"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:1;fill:#e0e0e0;fill-opacity:0.99607843;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4140"
+ width="2"
+ height="7.0000172"
+ x="-733.81873"
+ y="745.30402"
+ inkscape:transform-center-y="5.3032921"
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+ inkscape:transform-center-x="-5.3033134" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_zoom_less.svg b/editor/icons/source/icon_zoom_less.svg
new file mode 100644
index 0000000000..970b1954bb
--- /dev/null
+++ b/editor/icons/source/icon_zoom_less.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_zoom_less.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.000001"
+ inkscape:cx="3.0997291"
+ inkscape:cy="9.8345523"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4137"
+ width="14"
+ height="1.9999478"
+ x="1"
+ y="1043.3622" />
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_zoom_more.svg b/editor/icons/source/icon_zoom_more.svg
new file mode 100644
index 0000000000..87acdfb021
--- /dev/null
+++ b/editor/icons/source/icon_zoom_more.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_zoom.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:docname="icon_zoom_more.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="3.7772222"
+ inkscape:cy="13.690414"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1018"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <g
+ id="layer1-6"
+ inkscape:label="Capa 1"
+ transform="translate(-201.5751,205.0256)">
+ <g
+ inkscape:label="Layer 1"
+ id="layer1-0-4"
+ transform="matrix(48.459085,0,0,53.967813,-126.63031,-55835.691)">
+ <g
+ transform="translate(0.51853114,-0.01988754)"
+ id="g4182-8">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:0.99607843"
+ id="rect4167"
+ width="0.042994563"
+ height="0.26204652"
+ x="6.3978949"
+ y="1050.0524"
+ rx="0"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0"
+ y="1050.165"
+ x="6.2806396"
+ height="0.040943757"
+ width="0.28011176"
+ id="rect4169-6"
+ style="fill:#e0e0e0;fill-opacity:0.99607843" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/editor/icons/source/icon_zoom_reset.svg b/editor/icons/source/icon_zoom_reset.svg
new file mode 100644
index 0000000000..a82f93dfea
--- /dev/null
+++ b/editor/icons/source/icon_zoom_reset.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_add_track.png"
+ inkscape:export-xdpi="45"
+ inkscape:export-ydpi="45"
+ sodipodi:docname="icon_zoom_reset.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.000001"
+ inkscape:cx="-8.8962151"
+ inkscape:cy="11.998138"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-object-midpoints="true"
+ inkscape:snap-center="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3336" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1036.3622)">
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4137"
+ width="2"
+ height="14.000017"
+ x="3"
+ y="1037.3622" />
+ <rect
+ y="1037.3622"
+ x="12"
+ height="14.000017"
+ width="2"
+ id="rect4156"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4160"
+ width="2"
+ height="1.9999995"
+ x="7"
+ y="1046.3622" />
+ <rect
+ y="1040.3622"
+ x="7"
+ height="1.9999995"
+ width="2"
+ id="rect4162"
+ style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1,1040.3622 2,-3 2,0 0,3 z"
+ id="path4164"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4166"
+ d="m 10,1040.3622 2,-3 2,0 0,3 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/editor/icons/xpmfix.sh b/editor/icons/xpmfix.sh
new file mode 100755
index 0000000000..a24dede3c9
--- /dev/null
+++ b/editor/icons/xpmfix.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+sed -i 's/static char/static const char/g' *.xpm
diff --git a/editor/import/SCsub b/editor/import/SCsub
new file mode 100644
index 0000000000..f1fa50148f
--- /dev/null
+++ b/editor/import/SCsub
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import('env')
+Export('env')
+env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
new file mode 100644
index 0000000000..7098e8812b
--- /dev/null
+++ b/editor/import/editor_import_collada.cpp
@@ -0,0 +1,2508 @@
+/*************************************************************************/
+/* editor_import_collada.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_import_collada.h"
+
+
+#include "scene/3d/spatial.h"
+#include "scene/3d/skeleton.h"
+#include "scene/3d/path.h"
+#include "scene/3d/camera.h"
+#include "scene/3d/light.h"
+#include "scene/animation/animation_player.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/resources/animation.h"
+#include "scene/resources/packed_scene.h"
+#include "os/os.h"
+#include "editor/collada/collada.h"
+#include "editor/editor_node.h"
+#include <iostream>
+
+
+struct ColladaImport {
+
+ Collada collada;
+ Spatial *scene;
+
+ Vector<Ref<Animation> > animations;
+
+ struct NodeMap {
+ //String path;
+ Spatial *node;
+ int bone;
+ List<int> anim_tracks;
+
+ NodeMap() { node=NULL; bone=-1; }
+ };
+
+ bool found_ambient;
+ Color ambient;
+ bool found_directional;
+ bool force_make_tangents;
+ bool apply_mesh_xform_to_vertices;
+ bool use_mesh_builtin_materials;
+ float bake_fps;
+
+
+
+ Map<String,NodeMap> node_map; //map from collada node to engine node
+ Map<String,String> node_name_map; //map from collada node to engine node
+ Map<String, Ref<Mesh> > mesh_cache;
+ Map<String, Ref<Curve3D> > curve_cache;
+ Map<String, Ref<Material> > material_cache;
+ Map<Collada::Node*,Skeleton*> skeleton_map;
+
+ Map< Skeleton*, Map< String, int> > skeleton_bone_map;
+
+ Set<String> valid_animated_nodes;
+ Vector<int> valid_animated_properties;
+ Map<String,bool> bones_with_animation;
+
+ Error _populate_skeleton(Skeleton *p_skeleton,Collada::Node *p_node, int &r_bone, int p_parent);
+ Error _create_scene_skeletons(Collada::Node *p_node);
+ Error _create_scene(Collada::Node *p_node, Spatial *p_parent);
+ Error _create_resources(Collada::Node *p_node);
+ Error _create_material(const String& p_material);
+ Error _create_mesh_surfaces(bool p_optimize, Ref<Mesh>& p_mesh, const Map<String,Collada::NodeGeometry::Material>& p_material_map, const Collada::MeshData &meshdata, const Transform& p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_data, const Collada::MorphControllerData *p_morph_data, Vector<Ref<Mesh> > p_morph_meshes=Vector<Ref<Mesh> >(), bool p_for_morph=false, bool p_use_mesh_material=false);
+ Error load(const String& p_path, int p_flags, bool p_force_make_tangents=false);
+ void _fix_param_animation_tracks();
+ void create_animation(int p_clip,bool p_make_tracks_in_all_bones, bool p_import_value_tracks);
+ void create_animations(bool p_make_tracks_in_all_bones, bool p_import_value_tracks);
+
+ Set<String> tracks_in_clips;
+ Vector<String> missing_textures;
+
+ void _pre_process_lights(Collada::Node *p_node);
+
+ ColladaImport() {
+
+ found_ambient=false;
+ found_directional=false;
+ force_make_tangents=false;
+ apply_mesh_xform_to_vertices=true;
+ bake_fps=15;
+
+ }
+};
+
+
+Error ColladaImport::_populate_skeleton(Skeleton *p_skeleton,Collada::Node *p_node, int &r_bone, int p_parent) {
+
+
+ if (p_node->type!=Collada::Node::TYPE_JOINT)
+ return OK;
+
+ Collada::NodeJoint *joint = static_cast<Collada::NodeJoint*>(p_node);
+
+ print_line("populating joint "+joint->name);
+ p_skeleton->add_bone(p_node->name);
+ if (p_parent>=0)
+ p_skeleton->set_bone_parent(r_bone,p_parent);
+
+ NodeMap nm;
+ nm.node=p_skeleton;
+ nm.bone = r_bone;
+ node_map[p_node->id]=nm;
+ node_name_map[p_node->name]=p_node->id;
+
+ skeleton_bone_map[p_skeleton][joint->sid]=r_bone;
+
+ if (collada.state.bone_rest_map.has(joint->sid)) {
+
+ p_skeleton->set_bone_rest(r_bone,collada.fix_transform(collada.state.bone_rest_map[joint->sid]));
+ //should map this bone to something for animation?
+ } else {
+ print_line("no rest: "+joint->sid);
+ WARN_PRINT("Joint has no rest..");
+ }
+
+
+ int id = r_bone++;
+ for(int i=0;i<p_node->children.size();i++) {
+
+ Error err = _populate_skeleton(p_skeleton,p_node->children[i],r_bone,id);
+ if (err)
+ return err;
+ }
+
+ return OK;
+}
+
+
+void ColladaImport::_pre_process_lights(Collada::Node *p_node) {
+
+
+ if (p_node->type==Collada::Node::TYPE_LIGHT) {
+
+
+ Collada::NodeLight *light=static_cast<Collada::NodeLight*>(p_node);
+ if (collada.state.light_data_map.has(light->light)) {
+
+ Collada::LightData &ld = collada.state.light_data_map[light->light];
+ if (ld.mode==Collada::LightData::MODE_AMBIENT) {
+ found_ambient=true;
+ ambient=ld.color;
+ }
+ if (ld.mode==Collada::LightData::MODE_DIRECTIONAL) {
+ found_directional=true;
+ }
+ }
+
+ }
+
+
+ for(int i=0;i<p_node->children.size();i++)
+ _pre_process_lights(p_node->children[i]);
+}
+
+Error ColladaImport::_create_scene_skeletons(Collada::Node *p_node) {
+
+
+ if (p_node->type==Collada::Node::TYPE_SKELETON) {
+
+ Skeleton *sk = memnew( Skeleton );
+ int bone = 0;
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ _populate_skeleton(sk,p_node->children[i],bone,-1);
+ }
+ sk->localize_rests(); //after creating skeleton, rests must be localized...!
+ skeleton_map[p_node]=sk;
+ }
+
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ Error err = _create_scene_skeletons(p_node->children[i]);
+ if (err)
+ return err;
+ }
+ return OK;
+
+}
+
+
+Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
+
+ Spatial * node=NULL;
+
+ switch(p_node->type) {
+
+ case Collada::Node::TYPE_NODE: {
+
+ node = memnew( Spatial );
+ } break;
+ case Collada::Node::TYPE_JOINT: {
+
+ return OK; // do nothing
+ } break;
+ case Collada::Node::TYPE_LIGHT: {
+
+ //node = memnew( Light)
+ Collada::NodeLight *light = static_cast<Collada::NodeLight*>(p_node);
+ if (collada.state.light_data_map.has(light->light)) {
+
+ Collada::LightData &ld = collada.state.light_data_map[light->light];
+
+ if (ld.mode==Collada::LightData::MODE_AMBIENT) {
+
+ if (found_directional)
+ return OK; //do nothing not needed
+
+ if (!bool(GLOBAL_DEF("collada/use_ambient",false)))
+ return OK;
+ //well, it's an ambient light..
+ Light *l = memnew( DirectionalLight );
+ //l->set_color(Light::COLOR_AMBIENT,ld.color);
+ //l->set_color(Light::COLOR_DIFFUSE,Color(0,0,0));
+ //l->set_color(Light::COLOR_SPECULAR,Color(0,0,0));
+ node = l;
+
+ } else if (ld.mode==Collada::LightData::MODE_DIRECTIONAL) {
+
+ //well, it's an ambient light..
+ Light *l = memnew( DirectionalLight );
+ /*
+ if (found_ambient) //use it here
+ l->set_color(Light::COLOR_AMBIENT,ambient);
+
+ l->set_color(Light::COLOR_DIFFUSE,ld.color);
+ l->set_color(Light::COLOR_SPECULAR,Color(1,1,1));
+ */
+ node = l;
+ } else {
+
+ Light *l;
+
+ if (ld.mode==Collada::LightData::MODE_OMNI)
+ l=memnew( OmniLight );
+ else {
+ l=memnew( SpotLight );
+ //l->set_parameter(Light::PARAM_SPOT_ANGLE,ld.spot_angle);
+ //l->set_parameter(Light::PARAM_SPOT_ATTENUATION,ld.spot_exp);
+ }
+
+ //
+ //l->set_color(Light::COLOR_DIFFUSE,ld.color);
+ //l->set_color(Light::COLOR_SPECULAR,Color(1,1,1));
+ //l->approximate_opengl_attenuation(ld.constant_att,ld.linear_att,ld.quad_att);
+ node=l;
+ }
+
+ } else {
+
+ node = memnew( Spatial );
+ }
+ } break;
+ case Collada::Node::TYPE_CAMERA: {
+
+ Collada::NodeCamera *cam = static_cast<Collada::NodeCamera*>(p_node);
+ Camera *camera = memnew( Camera );
+
+ if (collada.state.camera_data_map.has(cam->camera)) {
+
+ const Collada::CameraData &cd = collada.state.camera_data_map[cam->camera];
+
+ switch(cd.mode) {
+
+ case Collada::CameraData::MODE_ORTHOGONAL: {
+
+ if (cd.orthogonal.y_mag) {
+
+ camera->set_keep_aspect_mode(Camera::KEEP_HEIGHT);
+ camera->set_orthogonal(cd.orthogonal.y_mag*2.0 ,cd.z_near,cd.z_far);
+
+ } else if (!cd.orthogonal.y_mag && cd.orthogonal.x_mag) {
+
+
+ camera->set_keep_aspect_mode(Camera::KEEP_WIDTH);
+ camera->set_orthogonal(cd.orthogonal.x_mag*2.0,cd.z_near,cd.z_far);
+ }
+
+ } break;
+ case Collada::CameraData::MODE_PERSPECTIVE: {
+
+ if (cd.perspective.y_fov) {
+
+ camera->set_perspective(cd.perspective.y_fov,cd.z_near,cd.z_far);
+
+ } else if (!cd.perspective.y_fov && cd.perspective.x_fov) {
+
+ camera->set_perspective(cd.perspective.x_fov / cd.aspect,cd.z_near,cd.z_far);
+ }
+
+ } break;
+ }
+
+ }
+
+ node=camera;
+
+ } break;
+ case Collada::Node::TYPE_GEOMETRY: {
+
+ Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry*>(p_node);
+
+ if (collada.state.curve_data_map.has(ng->source)) {
+
+ node = memnew( Path );
+ } else {
+ //mesh since nothing else
+ node = memnew( MeshInstance );
+ node->cast_to<MeshInstance>()->set_flag(GeometryInstance::FLAG_USE_BAKED_LIGHT,true);
+ }
+ } break;
+ case Collada::Node::TYPE_SKELETON: {
+
+ ERR_FAIL_COND_V(!skeleton_map.has(p_node),ERR_CANT_CREATE);
+ Skeleton *sk = skeleton_map[p_node];
+ node=sk;
+ } break;
+
+ }
+
+ if (p_node->name!="")
+ node->set_name(p_node->name);
+ NodeMap nm;
+ nm.node=node;
+ node_map[p_node->id]=nm;
+ node_name_map[p_node->name]=p_node->id;
+ Transform xf = p_node->default_transform;
+
+ xf = collada.fix_transform( xf ) * p_node->post_transform;
+ node->set_transform(xf);
+ p_parent->add_child(node);
+ node->set_owner(scene);
+
+ if (p_node->empty_draw_type!="") {
+ node->set_meta("empty_draw_type", Variant(p_node->empty_draw_type));
+ }
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ Error err = _create_scene(p_node->children[i],node);
+ if (err)
+ return err;
+ }
+ return OK;
+}
+
+
+Error ColladaImport::_create_material(const String& p_target) {
+
+ ERR_FAIL_COND_V(material_cache.has(p_target),ERR_ALREADY_EXISTS);
+ ERR_FAIL_COND_V(!collada.state.material_map.has(p_target),ERR_INVALID_PARAMETER);
+ Collada::Material &src_mat=collada.state.material_map[p_target];
+ ERR_FAIL_COND_V(!collada.state.effect_map.has(src_mat.instance_effect),ERR_INVALID_PARAMETER);
+ Collada::Effect &effect=collada.state.effect_map[src_mat.instance_effect];
+
+ Ref<FixedSpatialMaterial> material= memnew( FixedSpatialMaterial );
+
+ if (src_mat.name!="")
+ material->set_name(src_mat.name);
+ else if (effect.name!="")
+ material->set_name(effect.name);
+
+ // DIFFUSE
+
+ if (effect.diffuse.texture!="") {
+
+ String texfile = effect.get_texture_path(effect.diffuse.texture,collada);
+ if (texfile!="") {
+
+ Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
+ if (texture.is_valid()) {
+
+ material->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,texture);
+ material->set_albedo(Color(1,1,1,1));
+ //material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,Color(1,1,1,1));
+ } else {
+ missing_textures.push_back(texfile.get_file());
+ }
+ }
+ } else {
+ //material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,effect.diffuse.color);
+ }
+
+ // SPECULAR
+
+ if (effect.specular.texture!="") {
+
+ String texfile = effect.get_texture_path(effect.specular.texture,collada);
+ if (texfile!="") {
+
+ Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
+ if (texture.is_valid()) {
+ material->set_texture(FixedSpatialMaterial::TEXTURE_SPECULAR,texture);
+ material->set_specular(Color(1,1,1,1));
+
+ //material->set_texture(FixedSpatialMaterial::PARAM_SPECULAR,texture);
+ //material->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR,Color(1,1,1,1));
+ } else {
+ missing_textures.push_back(texfile.get_file());
+ }
+
+ }
+ } else {
+ material->set_metalness(effect.specular.color.get_v());
+ }
+
+
+ // EMISSION
+
+ if (effect.emission.texture!="") {
+
+ String texfile = effect.get_texture_path(effect.emission.texture,collada);
+ if (texfile!="") {
+
+ Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
+ if (texture.is_valid()) {
+
+ material->set_feature(FixedSpatialMaterial::FEATURE_EMISSION,true);
+ material->set_texture(FixedSpatialMaterial::TEXTURE_EMISSION,texture);
+ material->set_emission(Color(1,1,1,1));
+
+ //material->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,Color(1,1,1,1));
+ }else {
+ missing_textures.push_back(texfile.get_file());
+ }
+
+ }
+ } else {
+ if (effect.emission.color!=Color()) {
+ material->set_feature(FixedSpatialMaterial::FEATURE_EMISSION,true);
+ material->set_emission(effect.emission.color);
+ }
+ }
+
+ // NORMAL
+
+ if (effect.bump.texture!="") {
+
+ String texfile = effect.get_texture_path(effect.bump.texture,collada);
+ if (texfile!="") {
+
+ Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
+ if (texture.is_valid()) {
+ material->set_feature(FixedSpatialMaterial::FEATURE_NORMAL_MAPPING,true);
+ material->set_texture(FixedSpatialMaterial::TEXTURE_NORMAL,texture);
+ //material->set_emission(Color(1,1,1,1));
+
+ //material->set_texture(FixedSpatialMaterial::PARAM_NORMAL,texture);
+ }else {
+ //missing_textures.push_back(texfile.get_file());
+ }
+
+ }
+ }
+
+
+ float roughness = Math::sqrt(1.0-((Math::log(effect.shininess)/Math::log(2.0))/8.0)); //not very right..
+ material->set_roughness(roughness);
+
+ if (effect.double_sided) {
+ material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ }
+ material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,effect.unshaded);
+
+
+
+ material_cache[p_target]=material;
+ return OK;
+}
+
+
+static void _generate_normals(const PoolVector<int>& p_indices,const PoolVector<Vector3>& p_vertices,PoolVector<Vector3>&r_normals) {
+
+
+ r_normals.resize(p_vertices.size());
+ PoolVector<Vector3>::Write narrayw = r_normals.write();
+
+ int iacount=p_indices.size()/3;
+ PoolVector<int>::Read index_arrayr = p_indices.read();
+ PoolVector<Vector3>::Read vertex_arrayr = p_vertices.read();
+
+ for(int idx=0;idx<iacount;idx++) {
+
+ Vector3 v[3]={
+ vertex_arrayr[index_arrayr[idx*3+0]],
+ vertex_arrayr[index_arrayr[idx*3+1]],
+ vertex_arrayr[index_arrayr[idx*3+2]]
+ };
+
+ Vector3 normal = Plane(v[0],v[1],v[2]).normal;
+
+ narrayw[index_arrayr[idx*3+0]]+=normal;
+ narrayw[index_arrayr[idx*3+1]]+=normal;
+ narrayw[index_arrayr[idx*3+2]]+=normal;
+ }
+
+ int vlen=p_vertices.size();
+
+ for(int idx=0;idx<vlen;idx++) {
+ narrayw[idx].normalize();
+ }
+
+}
+
+
+static void _generate_tangents_and_binormals(const PoolVector<int>& p_indices,const PoolVector<Vector3>& p_vertices,const PoolVector<Vector3>& p_uvs,const PoolVector<Vector3>& p_normals,PoolVector<real_t>&r_tangents) {
+
+ int vlen=p_vertices.size();
+
+ Vector<Vector3> tangents;
+ tangents.resize(vlen);
+ Vector<Vector3> binormals;
+ binormals.resize(vlen);
+
+
+ int iacount=p_indices.size()/3;
+
+ PoolVector<int>::Read index_arrayr = p_indices.read();
+ PoolVector<Vector3>::Read vertex_arrayr = p_vertices.read();
+ PoolVector<Vector3>::Read narrayr = p_normals.read();
+ PoolVector<Vector3>::Read uvarrayr = p_uvs.read();
+
+
+ for(int idx=0;idx<iacount;idx++) {
+
+
+ Vector3 v1 = vertex_arrayr[ index_arrayr[idx*3+0] ];
+ Vector3 v2 = vertex_arrayr[ index_arrayr[idx*3+1] ];
+ Vector3 v3 = vertex_arrayr[ index_arrayr[idx*3+2] ];
+
+ Vector3 w1 = uvarrayr[ index_arrayr[idx*3+0] ];
+ Vector3 w2 = uvarrayr[ index_arrayr[idx*3+1] ];
+ Vector3 w3 = uvarrayr[ index_arrayr[idx*3+2] ];
+
+ real_t x1 = v2.x - v1.x;
+ real_t x2 = v3.x - v1.x;
+ real_t y1 = v2.y - v1.y;
+ real_t y2 = v3.y - v1.y;
+ real_t z1 = v2.z - v1.z;
+ real_t z2 = v3.z - v1.z;
+
+ real_t s1 = w2.x - w1.x;
+ real_t s2 = w3.x - w1.x;
+ real_t t1 = w2.y - w1.y;
+ real_t t2 = w3.y - w1.y;
+
+ real_t r = (s1 * t2 - s2 * t1);
+
+ Vector3 tangent;
+ Vector3 binormal;
+
+ if (r==0) {
+
+ binormal=Vector3();
+ tangent=Vector3();
+ } else {
+ tangent = Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
+ (t2 * z1 - t1 * z2) * r).normalized();
+ binormal = Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,
+ (s1 * z2 - s2 * z1) * r).normalized();
+ }
+
+ tangents[ index_arrayr[idx*3+0] ]+=tangent;
+ binormals[ index_arrayr[idx*3+0] ]+=binormal;
+ tangents[ index_arrayr[idx*3+1] ]+=tangent;
+ binormals[ index_arrayr[idx*3+1] ]+=binormal;
+ tangents[ index_arrayr[idx*3+2] ]+=tangent;
+ binormals[ index_arrayr[idx*3+2] ]+=binormal;
+
+ //print_line(itos(idx)+" tangent: "+tangent);
+ //print_line(itos(idx)+" binormal: "+binormal);
+ }
+
+ r_tangents.resize(vlen*4);
+ PoolVector<real_t>::Write tarrayw = r_tangents.write();
+
+ for(int idx=0;idx<vlen;idx++) {
+ Vector3 tangent = tangents[idx];
+ Vector3 bingen = narrayr[idx].cross(tangent);
+ float dir;
+ if (bingen.dot(binormals[idx]) < 0 )
+ dir=-1.0;
+ else
+ dir=+1.0;
+
+ tarrayw[idx*4+0]=tangent.x;
+ tarrayw[idx*4+1]=tangent.y;
+ tarrayw[idx*4+2]=tangent.z;
+ tarrayw[idx*4+3]=dir;
+ }
+}
+
+Error ColladaImport::_create_mesh_surfaces(bool p_optimize,Ref<Mesh>& p_mesh,const Map<String,Collada::NodeGeometry::Material>& p_material_map,const Collada::MeshData &meshdata,const Transform& p_local_xform,const Vector<int> &bone_remap, const Collada::SkinControllerData *skin_controller, const Collada::MorphControllerData *p_morph_data,Vector<Ref<Mesh> > p_morph_meshes,bool p_for_morph,bool p_use_mesh_material) {
+
+
+ bool local_xform_mirror=p_local_xform.basis.determinant() < 0;
+
+ if (p_morph_data) {
+
+ //add morphie target
+ ERR_FAIL_COND_V( !p_morph_data->targets.has("MORPH_TARGET"), ERR_INVALID_DATA );
+ String mt = p_morph_data->targets["MORPH_TARGET"];
+ ERR_FAIL_COND_V( !p_morph_data->sources.has(mt), ERR_INVALID_DATA);
+ int morph_targets = p_morph_data->sources[mt].sarray.size();
+ for(int i=0;i<morph_targets;i++) {
+
+ String target = p_morph_data->sources[mt].sarray[i];
+ ERR_FAIL_COND_V( !collada.state.mesh_data_map.has(target), ERR_INVALID_DATA );
+ String name = collada.state.mesh_data_map[target].name;
+
+ p_mesh->add_blend_shape(name);
+ }
+ if (p_morph_data->mode=="RELATIVE")
+ p_mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_RELATIVE);
+ else if (p_morph_data->mode=="NORMALIZED")
+ p_mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_NORMALIZED);
+ }
+
+
+ int surface=0;
+ for(int p_i = 0; p_i < meshdata.primitives.size(); p_i ++ ) {
+
+
+
+ const Collada::MeshData::Primitives& p = meshdata.primitives[p_i];
+
+ /* VERTEX SOURCE */
+ ERR_FAIL_COND_V(!p.sources.has("VERTEX"),ERR_INVALID_DATA);
+
+ String vertex_src_id = p.sources["VERTEX"].source;
+ int vertex_ofs=p.sources["VERTEX"].offset;
+
+ ERR_FAIL_COND_V(!meshdata.vertices.has(vertex_src_id),ERR_INVALID_DATA);
+
+ ERR_FAIL_COND_V(!meshdata.vertices[vertex_src_id].sources.has("POSITION"),ERR_INVALID_DATA);
+ String position_src_id = meshdata.vertices[vertex_src_id].sources["POSITION"];
+
+ ERR_FAIL_COND_V(!meshdata.sources.has(position_src_id),ERR_INVALID_DATA);
+
+ const Collada::MeshData::Source *vertex_src=&meshdata.sources[position_src_id];
+
+ /* NORMAL SOURCE */
+
+ const Collada::MeshData::Source *normal_src=NULL;
+ int normal_ofs=0;
+
+ if (p.sources.has("NORMAL")) {
+
+ String normal_source_id = p.sources["NORMAL"].source;
+ normal_ofs = p.sources["NORMAL"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(normal_source_id),ERR_INVALID_DATA);
+ normal_src=&meshdata.sources[normal_source_id];
+ }
+
+ const Collada::MeshData::Source *binormal_src=NULL;
+ int binormal_ofs=0;
+
+ if (p.sources.has("TEXBINORMAL")) {
+
+ String binormal_source_id = p.sources["TEXBINORMAL"].source;
+ binormal_ofs = p.sources["TEXBINORMAL"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(binormal_source_id),ERR_INVALID_DATA);
+ binormal_src=&meshdata.sources[binormal_source_id];
+ }
+
+ const Collada::MeshData::Source *tangent_src=NULL;
+ int tangent_ofs=0;
+
+ if (p.sources.has("TEXTANGENT")) {
+
+ String tangent_source_id = p.sources["TEXTANGENT"].source;
+ tangent_ofs = p.sources["TEXTANGENT"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(tangent_source_id),ERR_INVALID_DATA);
+ tangent_src=&meshdata.sources[tangent_source_id];
+ }
+
+
+ const Collada::MeshData::Source *uv_src=NULL;
+ int uv_ofs=0;
+
+ if (p.sources.has("TEXCOORD0")) {
+
+ String uv_source_id = p.sources["TEXCOORD0"].source;
+ uv_ofs = p.sources["TEXCOORD0"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(uv_source_id),ERR_INVALID_DATA);
+ uv_src=&meshdata.sources[uv_source_id];
+ }
+
+ const Collada::MeshData::Source *uv2_src=NULL;
+ int uv2_ofs=0;
+
+ if (p.sources.has("TEXCOORD1")) {
+
+ String uv2_source_id = p.sources["TEXCOORD1"].source;
+ uv2_ofs = p.sources["TEXCOORD1"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(uv2_source_id),ERR_INVALID_DATA);
+ uv2_src=&meshdata.sources[uv2_source_id];
+ }
+
+
+ const Collada::MeshData::Source *color_src=NULL;
+ int color_ofs=0;
+
+ if (p.sources.has("COLOR")) {
+
+ String color_source_id = p.sources["COLOR"].source;
+ color_ofs = p.sources["COLOR"].offset;
+ ERR_FAIL_COND_V( !meshdata.sources.has(color_source_id), ERR_INVALID_DATA );
+ color_src=&meshdata.sources[color_source_id];
+ }
+
+ //find largest source..
+
+ /************************/
+ /* ADD WEIGHTS IF EXIST */
+ /************************/
+
+ Map<int,Vector<Collada::Vertex::Weight> > pre_weights;
+
+ bool has_weights=false;
+
+ if (skin_controller) {
+
+ const Collada::SkinControllerData::Source *weight_src=NULL;
+ int weight_ofs=0;
+
+ if (skin_controller->weights.sources.has("WEIGHT")) {
+
+ String weight_id = skin_controller->weights.sources["WEIGHT"].source;
+ weight_ofs = skin_controller->weights.sources["WEIGHT"].offset;
+ if (skin_controller->sources.has(weight_id)) {
+
+ weight_src = &skin_controller->sources[weight_id];
+
+ }
+ }
+
+ int joint_ofs=0;
+
+ if (skin_controller->weights.sources.has("JOINT")) {
+
+ joint_ofs = skin_controller->weights.sources["JOINT"].offset;
+ }
+
+ //should be OK, given this was pre-checked.
+
+ int index_ofs=0;
+ int wstride = skin_controller->weights.sources.size();
+ for(int w_i=0;w_i<skin_controller->weights.sets.size();w_i++) {
+
+ int amount = skin_controller->weights.sets[w_i];
+
+ Vector<Collada::Vertex::Weight> weights;
+
+ for (int a_i=0;a_i<amount;a_i++) {
+
+ Collada::Vertex::Weight w;
+
+ int read_from = index_ofs+a_i*wstride;
+ ERR_FAIL_INDEX_V(read_from+wstride-1,skin_controller->weights.indices.size(),ERR_INVALID_DATA);
+ int weight_index = skin_controller->weights.indices[read_from+weight_ofs];
+ ERR_FAIL_INDEX_V(weight_index,weight_src->array.size(),ERR_INVALID_DATA);
+
+ w.weight = weight_src->array[weight_index];
+
+ int bone_index = skin_controller->weights.indices[read_from+joint_ofs];
+ if (bone_index==-1)
+ continue; //ignore this weight (refers to bind shape)
+ ERR_FAIL_INDEX_V(bone_index,bone_remap.size(),ERR_INVALID_DATA);
+
+ w.bone_idx=bone_remap[bone_index];
+
+
+ weights.push_back(w);
+ }
+
+ /* FIX WEIGHTS */
+
+
+
+ weights.sort();
+
+ if (weights.size()>4) {
+ //cap to 4 and make weights add up 1
+ weights.resize(4);
+
+ }
+
+ //make sure weights allways add up to 1
+ float total=0;
+ for(int i=0;i<weights.size();i++)
+ total+=weights[i].weight;
+ if (total)
+ for(int i=0;i<weights.size();i++)
+ weights[i].weight/=total;
+
+ if (weights.size()==0 || total==0) { //if nothing, add a weight to bone 0
+ //no weights assigned
+ Collada::Vertex::Weight w;
+ w.bone_idx=0;
+ w.weight=1.0;
+ weights.clear();
+ weights.push_back(w);
+
+ }
+
+ pre_weights[w_i]=weights;
+
+ /*
+ for(Set<int>::Element *E=vertex_map[w_i].front();E;E=E->next()) {
+
+ int dst = E->get();
+ ERR_EXPLAIN("invalid vertex index in array");
+ ERR_FAIL_INDEX_V(dst,vertex_array.size(),ERR_INVALID_DATA);
+ vertex_array[dst].weights=weights;
+
+ }*/
+
+
+
+
+ index_ofs+=wstride*amount;
+
+ }
+
+ //vertices need to be localized
+ has_weights=true;
+
+ }
+
+ Set<Collada::Vertex> vertex_set; //vertex set will be the vertices
+ List<int> indices_list; //indices will be the indices
+ //Map<int,Set<int> > vertex_map; //map vertices (for setting skinning/morph)
+
+ /**************************/
+ /* CREATE PRIMITIVE ARRAY */
+ /**************************/
+
+ // The way collada uses indices is more optimal, and friendlier with 3D modelling sofware,
+ // because it can index everything, not only vertices (similar to how the WII works).
+ // This is, however, more incompatible with standard video cards, so arrays must be converted.
+ // Must convert to GL/DX format.
+
+ int _prim_ofs=0;
+ int vertidx=0;
+ for(int p_i=0;p_i<p.count;p_i++) {
+
+
+ int amount;
+ if (p.polygons.size()) {
+
+ ERR_FAIL_INDEX_V(p_i,p.polygons.size(),ERR_INVALID_DATA);
+ amount=p.polygons[p_i];
+ } else {
+ amount=3; //triangles;
+ }
+
+ //COLLADA_PRINT("amount: "+itos(amount));
+
+ int prev2[2]={0,0};
+
+ for(int j=0;j<amount;j++) {
+
+ int src=_prim_ofs;
+ //_prim_ofs+=p.sources.size()
+
+ ERR_FAIL_INDEX_V(src,p.indices.size(),ERR_INVALID_DATA);
+
+ Collada::Vertex vertex;
+ if (!p_optimize)
+ vertex.uid=vertidx++;
+
+
+
+ int vertex_index=p.indices[src+vertex_ofs]; //used for index field (later used by controllers)
+ int vertex_pos = (vertex_src->stride?vertex_src->stride:3) * vertex_index;
+ ERR_FAIL_INDEX_V(vertex_pos,vertex_src->array.size(),ERR_INVALID_DATA);
+ vertex.vertex=Vector3(vertex_src->array[vertex_pos+0],vertex_src->array[vertex_pos+1],vertex_src->array[vertex_pos+2]);
+
+ if (pre_weights.has(vertex_index)) {
+ vertex.weights=pre_weights[vertex_index];
+ }
+
+ if (normal_src) {
+
+
+
+ int normal_pos = (normal_src->stride?normal_src->stride:3) * p.indices[src+normal_ofs];
+ ERR_FAIL_INDEX_V(normal_pos,normal_src->array.size(),ERR_INVALID_DATA);
+ vertex.normal=Vector3(normal_src->array[normal_pos+0],normal_src->array[normal_pos+1],normal_src->array[normal_pos+2]);
+ vertex.normal=vertex.normal.snapped(0.001);
+
+
+ if (tangent_src && binormal_src) {
+
+ int binormal_pos = (binormal_src->stride?binormal_src->stride:3) * p.indices[src+binormal_ofs];
+ ERR_FAIL_INDEX_V(binormal_pos,binormal_src->array.size(),ERR_INVALID_DATA);
+ Vector3 binormal =Vector3(binormal_src->array[binormal_pos+0],binormal_src->array[binormal_pos+1],binormal_src->array[binormal_pos+2]);
+
+ int tangent_pos = (tangent_src->stride?tangent_src->stride:3) * p.indices[src+tangent_ofs];
+ ERR_FAIL_INDEX_V(tangent_pos,tangent_src->array.size(),ERR_INVALID_DATA);
+ Vector3 tangent =Vector3(tangent_src->array[tangent_pos+0],tangent_src->array[tangent_pos+1],tangent_src->array[tangent_pos+2]);
+
+ vertex.tangent.normal=tangent;
+ vertex.tangent.d= vertex.normal.cross(tangent).dot(binormal) > 0 ? 1 : -1;
+ }
+
+ }
+
+
+ if (uv_src) {
+
+ int uv_pos = (uv_src->stride?uv_src->stride:2) * p.indices[src+uv_ofs];
+ ERR_FAIL_INDEX_V(uv_pos,uv_src->array.size(),ERR_INVALID_DATA);
+ vertex.uv=Vector3(uv_src->array[uv_pos+0],1.0-uv_src->array[uv_pos+1],0);
+ }
+
+ if (uv2_src) {
+
+ int uv2_pos = (uv2_src->stride?uv2_src->stride:2) * p.indices[src+uv2_ofs];
+ ERR_FAIL_INDEX_V(uv2_pos,uv2_src->array.size(),ERR_INVALID_DATA);
+ vertex.uv2=Vector3(uv2_src->array[uv2_pos+0],1.0-uv2_src->array[uv2_pos+1],0);
+ }
+
+ if (color_src) {
+
+ int color_pos = (color_src->stride?color_src->stride:3) * p.indices[src+color_ofs]; // colors are RGB in collada..
+ ERR_FAIL_INDEX_V(color_pos,color_src->array.size(),ERR_INVALID_DATA);
+ vertex.color=Color(color_src->array[color_pos+0],color_src->array[color_pos+1],color_src->array[color_pos+2],(color_src->stride>3)?color_src->array[color_pos+3]:1.0);
+
+ }
+
+#ifndef NO_UP_AXIS_SWAP
+ if (collada.state.up_axis==Vector3::AXIS_Z) {
+
+ SWAP( vertex.vertex.z, vertex.vertex.y );
+ vertex.vertex.z = -vertex.vertex.z;
+ SWAP( vertex.normal.z, vertex.normal.y );
+ vertex.normal.z = -vertex.normal.z;
+ SWAP( vertex.tangent.normal.z, vertex.tangent.normal.y );
+ vertex.tangent.normal.z = -vertex.tangent.normal.z;
+
+ }
+
+#endif
+
+ vertex.fix_unit_scale(collada);
+ int index=0;
+ //COLLADA_PRINT("vertex: "+vertex.vertex);
+
+ if (vertex_set.has(vertex)) {
+
+ index=vertex_set.find(vertex)->get().idx;
+ } else {
+
+ index=vertex_set.size();
+ vertex.idx=index;
+ vertex_set.insert(vertex);
+ }
+
+ /* if (!vertex_map.has(vertex_index))
+ vertex_map[vertex_index]=Set<int>();
+ vertex_map[vertex_index].insert(index); //should be outside..*/
+ //build triangles if needed
+ if (j==0)
+ prev2[0]=index;
+
+ if (j>=2) {
+ //insert indices in reverse order (collada uses CCW as frontface)
+ if (local_xform_mirror) {
+
+ indices_list.push_back(prev2[0]);
+ indices_list.push_back(prev2[1]);
+ indices_list.push_back(index);
+
+ } else {
+ indices_list.push_back(prev2[0]);
+ indices_list.push_back(index);
+ indices_list.push_back(prev2[1]);
+ }
+ }
+
+ prev2[1]=index;
+ _prim_ofs+=p.vertex_size;
+ }
+
+ }
+
+
+
+ Vector<Collada::Vertex> vertex_array; //there we go, vertex array
+
+ vertex_array.resize(vertex_set.size());
+ for(Set<Collada::Vertex>::Element *F=vertex_set.front();F;F=F->next()) {
+
+ vertex_array[F->get().idx]=F->get();
+ }
+
+
+ if (has_weights) {
+
+ //if skeleton, localize
+ Transform local_xform = p_local_xform;
+ for(int i=0;i<vertex_array.size();i++) {
+
+ vertex_array[i].vertex=local_xform.xform(vertex_array[i].vertex);
+ vertex_array[i].normal=local_xform.basis.xform(vertex_array[i].normal).normalized();
+ vertex_array[i].tangent.normal=local_xform.basis.xform(vertex_array[i].tangent.normal).normalized();
+ if (local_xform_mirror) {
+ //i shouldn't do this? wtf?
+ //vertex_array[i].normal*=-1.0;
+ //vertex_array[i].tangent.normal*=-1.0;
+ }
+ }
+ }
+
+
+ PoolVector<int> index_array;
+ index_array.resize(indices_list.size());
+ PoolVector<int>::Write index_arrayw = index_array.write();
+
+ int iidx=0;
+ for(List<int>::Element *F=indices_list.front();F;F=F->next()) {
+
+ index_arrayw[iidx++]=F->get();
+ }
+
+ index_arrayw=PoolVector<int>::Write();
+
+
+ /*****************/
+ /* MAKE SURFACES */
+ /*****************/
+
+
+ {
+
+ Ref<FixedSpatialMaterial> material;
+
+ //find material
+ Mesh::PrimitiveType primitive=Mesh::PRIMITIVE_TRIANGLES;
+
+ {
+
+ if (p_material_map.has(p.material)) {
+ String target=p_material_map[p.material].target;
+
+ if (!material_cache.has(target)) {
+ Error err = _create_material(target);
+ if (!err)
+ material=material_cache[target];
+ } else
+ material=material_cache[target];
+
+ } else if (p.material!=""){
+ print_line("Warning, unreferenced material in geometry instance: "+p.material);
+ }
+ }
+
+
+
+ PoolVector<Vector3> final_vertex_array;
+ PoolVector<Vector3> final_normal_array;
+ PoolVector<float> final_tangent_array;
+ PoolVector<Color> final_color_array;
+ PoolVector<Vector3> final_uv_array;
+ PoolVector<Vector3> final_uv2_array;
+ PoolVector<int> final_bone_array;
+ PoolVector<float> final_weight_array;
+
+ uint32_t final_format=0;
+
+ //create format
+ final_format=Mesh::ARRAY_FORMAT_VERTEX|Mesh::ARRAY_FORMAT_INDEX;
+
+ if (normal_src) {
+ final_format|=Mesh::ARRAY_FORMAT_NORMAL;
+ if (uv_src && binormal_src && tangent_src) {
+ final_format|=Mesh::ARRAY_FORMAT_TANGENT;
+ }
+
+ }
+
+
+
+ if (color_src)
+ final_format|=Mesh::ARRAY_FORMAT_COLOR;
+ if (uv_src)
+ final_format|=Mesh::ARRAY_FORMAT_TEX_UV;
+ if (uv2_src)
+ final_format|=Mesh::ARRAY_FORMAT_TEX_UV2;
+
+ if (has_weights) {
+ final_format|=Mesh::ARRAY_FORMAT_WEIGHTS;
+ final_format|=Mesh::ARRAY_FORMAT_BONES;
+ }
+
+
+ //set arrays
+
+ int vlen = vertex_array.size();
+ { //vertices
+
+ PoolVector<Vector3> varray;
+ varray.resize(vertex_array.size());
+
+ PoolVector<Vector3>::Write varrayw = varray.write();
+
+ for(int k=0;k<vlen;k++)
+ varrayw[k]=vertex_array[k].vertex;
+
+ varrayw = PoolVector<Vector3>::Write();
+ final_vertex_array=varray;
+
+ }
+
+
+ if (uv_src) { //compute uv first, may be needed for computing tangent/bionrmal
+ PoolVector<Vector3> uvarray;
+ uvarray.resize(vertex_array.size());
+ PoolVector<Vector3>::Write uvarrayw = uvarray.write();
+
+ for(int k=0;k<vlen;k++) {
+ uvarrayw[k]=vertex_array[k].uv;
+ }
+
+ uvarrayw = PoolVector<Vector3>::Write();
+ final_uv_array=uvarray;
+
+ }
+
+ if (uv2_src) { //compute uv first, may be needed for computing tangent/bionrmal
+ PoolVector<Vector3> uv2array;
+ uv2array.resize(vertex_array.size());
+ PoolVector<Vector3>::Write uv2arrayw = uv2array.write();
+
+ for(int k=0;k<vlen;k++) {
+ uv2arrayw[k]=vertex_array[k].uv2;
+ }
+
+ uv2arrayw = PoolVector<Vector3>::Write();
+ final_uv2_array=uv2array;
+
+ }
+
+ if (normal_src) {
+ PoolVector<Vector3> narray;
+ narray.resize(vertex_array.size());
+ PoolVector<Vector3>::Write narrayw = narray.write();
+
+ for(int k=0;k<vlen;k++) {
+ narrayw[k]=vertex_array[k].normal;
+ }
+
+ narrayw = PoolVector<Vector3>::Write();
+ final_normal_array=narray;
+
+ /*
+ PoolVector<Vector3> altnaray;
+ _generate_normals(index_array,final_vertex_array,altnaray);
+
+ for(int i=0;i<altnaray.size();i++)
+ print_line(rtos(altnaray[i].dot(final_normal_array[i])));
+ */
+
+ } else if (primitive==Mesh::PRIMITIVE_TRIANGLES) {
+ //generate normals (even if unused later)
+
+ _generate_normals(index_array,final_vertex_array,final_normal_array);
+ if (OS::get_singleton()->is_stdout_verbose())
+ print_line("Collada: Triangle mesh lacks normals, so normals were generated.");
+ final_format|=Mesh::ARRAY_FORMAT_NORMAL;
+
+ }
+
+ if (final_normal_array.size() && uv_src && binormal_src && tangent_src && !force_make_tangents) {
+
+ PoolVector<real_t> tarray;
+ tarray.resize(vertex_array.size()*4);
+ PoolVector<real_t>::Write tarrayw = tarray.write();
+
+
+ for(int k=0;k<vlen;k++) {
+ tarrayw[k*4+0]=vertex_array[k].tangent.normal.x;
+ tarrayw[k*4+1]=vertex_array[k].tangent.normal.y;
+ tarrayw[k*4+2]=vertex_array[k].tangent.normal.z;
+ tarrayw[k*4+3]=vertex_array[k].tangent.d;
+
+ }
+
+ tarrayw = PoolVector<real_t>::Write();
+
+ final_tangent_array=tarray;
+ } else if (final_normal_array.size() && primitive==Mesh::PRIMITIVE_TRIANGLES && final_uv_array.size() && (force_make_tangents || (material.is_valid()))){
+ //if this uses triangles, there are uvs and the material is using a normalmap, generate tangents and binormals, because they WILL be needed
+ //generate binormals/tangents
+ _generate_tangents_and_binormals(index_array,final_vertex_array,final_uv_array,final_normal_array,final_tangent_array);
+ final_format|=Mesh::ARRAY_FORMAT_TANGENT;
+ if (OS::get_singleton()->is_stdout_verbose())
+ print_line("Collada: Triangle mesh lacks tangents (And normalmap was used), so tangents were generated.");
+
+ }
+
+
+ if (color_src) {
+ PoolVector<Color> colorarray;
+ colorarray.resize(vertex_array.size());
+ PoolVector<Color>::Write colorarrayw = colorarray.write();
+
+ for(int k=0;k<vlen;k++) {
+ colorarrayw[k]=vertex_array[k].color;
+ }
+
+ colorarrayw = PoolVector<Color>::Write();
+
+ final_color_array=colorarray;
+ }
+
+ if (has_weights) {
+ PoolVector<float> weightarray;
+ PoolVector<int> bonearray;
+
+ weightarray.resize(vertex_array.size()*4);
+ PoolVector<float>::Write weightarrayw = weightarray.write();
+ bonearray.resize(vertex_array.size()*4);
+ PoolVector<int>::Write bonearrayw = bonearray.write();
+
+ for(int k=0;k<vlen;k++) {
+ float sum=0;
+
+ for(int l=0;l<VS::ARRAY_WEIGHTS_SIZE;l++) {
+ if (l<vertex_array[k].weights.size()) {
+ weightarrayw[k*VS::ARRAY_WEIGHTS_SIZE+l]=vertex_array[k].weights[l].weight;
+ sum+=weightarrayw[k*VS::ARRAY_WEIGHTS_SIZE+l];
+ bonearrayw[k*VS::ARRAY_WEIGHTS_SIZE+l]=int(vertex_array[k].weights[l].bone_idx);
+ //COLLADA_PRINT(itos(k)+": "+rtos(bonearrayw[k*VS::ARRAY_WEIGHTS_SIZE+l])+":"+rtos(weightarray[k*VS::ARRAY_WEIGHTS_SIZE+l]));
+ } else {
+
+ weightarrayw[k*VS::ARRAY_WEIGHTS_SIZE+l]=0;
+ bonearrayw[k*VS::ARRAY_WEIGHTS_SIZE+l]=0;
+
+ }
+
+
+ }
+ /*
+ if (sum<0.8)
+ COLLADA_PRINT("ERROR SUMMING INDEX "+itos(k)+" had weights: "+itos(vertex_array[k].weights.size()));
+ */
+
+ }
+
+ weightarrayw = PoolVector<float>::Write();
+ bonearrayw = PoolVector<int>::Write();
+
+ final_weight_array = weightarray;
+ final_bone_array = bonearray;
+ }
+
+
+
+ ////////////////////////////
+ // FINALLY CREATE SUFRACE //
+ ////////////////////////////
+
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+
+ d[Mesh::ARRAY_INDEX]=index_array;
+ d[Mesh::ARRAY_VERTEX]=final_vertex_array;
+
+ if (final_normal_array.size())
+ d[Mesh::ARRAY_NORMAL]=final_normal_array;
+ if (final_tangent_array.size())
+ d[Mesh::ARRAY_TANGENT]=final_tangent_array;
+ if (final_uv_array.size())
+ d[Mesh::ARRAY_TEX_UV]=final_uv_array;
+ if (final_uv2_array.size())
+ d[Mesh::ARRAY_TEX_UV2]=final_uv2_array;
+ if (final_color_array.size())
+ d[Mesh::ARRAY_COLOR]=final_color_array;
+ if (final_weight_array.size())
+ d[Mesh::ARRAY_WEIGHTS]=final_weight_array;
+ if (final_bone_array.size())
+ d[Mesh::ARRAY_BONES]=final_bone_array;
+
+
+ Array mr;
+
+ ////////////////////////////
+ // THEN THE MORPH TARGETS //
+ ////////////////////////////
+#if 0
+ if (p_morph_data) {
+
+ //add morphie target
+ ERR_FAIL_COND_V( !p_morph_data->targets.has("MORPH_TARGET"), ERR_INVALID_DATA );
+ String mt = p_morph_data->targets["MORPH_TARGET"];
+ ERR_FAIL_COND_V( !p_morph_data->sources.has(mt), ERR_INVALID_DATA);
+ int morph_targets = p_morph_data->sources[mt].sarray.size();
+ mr.resize(morph_targets);
+
+ for(int j=0;j<morph_targets;j++) {
+
+ Array mrt;
+ mrt.resize(VS::ARRAY_MAX);
+
+ String target = p_morph_data->sources[mt].sarray[j];
+ ERR_FAIL_COND_V( !collada.state.mesh_data_map.has(target), ERR_INVALID_DATA );
+ String name = collada.state.mesh_data_map[target].name;
+ Collada::MeshData &md = collada.state.mesh_data_map[target];
+
+ // collada in itself supports morphing everything. However, the spec is unclear and no examples or exporters that
+ // morph anything but "POSITIONS" seem to exit. Because of this, normals and binormals/tangents have to be regenerated here,
+ // which may result in inaccurate (but most of the time good enough) results.
+
+ PoolVector<Vector3> vertices;
+ vertices.resize(vlen);
+
+ ERR_FAIL_COND_V( md.vertices.size() != 1, ERR_INVALID_DATA);
+ String vertex_src_id=md.vertices.front()->key();
+ ERR_FAIL_COND_V(!md.vertices[vertex_src_id].sources.has("POSITION"),ERR_INVALID_DATA);
+ String position_src_id = md.vertices[vertex_src_id].sources["POSITION"];
+
+ ERR_FAIL_COND_V(!md.sources.has(position_src_id),ERR_INVALID_DATA);
+
+ const Collada::MeshData::Source *m=&md.sources[position_src_id];
+
+ ERR_FAIL_COND_V( m->array.size() != vertex_src->array.size(), ERR_INVALID_DATA);
+ int stride=m->stride;
+ if (stride==0)
+ stride=3;
+
+
+ //read vertices from morph target
+ PoolVector<Vector3>::Write vertw = vertices.write();
+
+ for(int m_i=0;m_i<m->array.size()/stride;m_i++) {
+
+ int pos = m_i*stride;
+ Vector3 vtx( m->array[pos+0], m->array[pos+1], m->array[pos+2] );
+
+#ifndef NO_UP_AXIS_SWAP
+ if (collada.state.up_axis==Vector3::AXIS_Z) {
+
+ SWAP( vtx.z, vtx.y );
+ vtx.z = -vtx.z;
+
+ }
+#endif
+
+ Collada::Vertex vertex;
+ vertex.vertex=vtx;
+ vertex.fix_unit_scale(collada);
+ vtx=vertex.vertex;
+
+ vtx = p_local_xform.xform(vtx);
+
+
+ if (vertex_map.has(m_i)) { //vertex may no longer be here, don't bother converting
+
+
+ for (Set<int> ::Element *E=vertex_map[m_i].front() ; E; E=E->next() ) {
+
+ vertw[E->get()]=vtx;
+ }
+ }
+ }
+
+
+ //vertices are in place, now generate everything else
+ vertw = PoolVector<Vector3>::Write();
+ PoolVector<Vector3> normals;
+ PoolVector<float> tangents;
+ print_line("vertex source id: "+vertex_src_id);
+ if(md.vertices[vertex_src_id].sources.has("NORMAL")){
+ //has normals
+ normals.resize(vlen);
+ //std::cout << "has normals" << std::endl;
+ String normal_src_id = md.vertices[vertex_src_id].sources["NORMAL"];
+ //std::cout << "normals source: "<< normal_src_id.utf8().get_data() <<std::endl;
+ ERR_FAIL_COND_V(!md.sources.has(normal_src_id),ERR_INVALID_DATA);
+
+ const Collada::MeshData::Source *m=&md.sources[normal_src_id];
+
+ ERR_FAIL_COND_V( m->array.size() != vertex_src->array.size(), ERR_INVALID_DATA);
+ int stride=m->stride;
+ if (stride==0)
+ stride=3;
+
+
+ //read normals from morph target
+ PoolVector<Vector3>::Write vertw = normals.write();
+
+ for(int m_i=0;m_i<m->array.size()/stride;m_i++) {
+
+ int pos = m_i*stride;
+ Vector3 vtx( m->array[pos+0], m->array[pos+1], m->array[pos+2] );
+
+ #ifndef NO_UP_AXIS_SWAP
+ if (collada.state.up_axis==Vector3::AXIS_Z) {
+
+ SWAP( vtx.z, vtx.y );
+ vtx.z = -vtx.z;
+
+ }
+ #endif
+
+ Collada::Vertex vertex;
+ vertex.vertex=vtx;
+ vertex.fix_unit_scale(collada);
+ vtx=vertex.vertex;
+
+ vtx = p_local_xform.xform(vtx);
+
+
+ if (vertex_map.has(m_i)) { //vertex may no longer be here, don't bother converting
+
+
+ for (Set<int> ::Element *E=vertex_map[m_i].front() ; E; E=E->next() ) {
+
+ vertw[E->get()]=vtx;
+ }
+ }
+ }
+
+ print_line("using built-in normals");
+ }else{
+ print_line("generating normals");
+ _generate_normals(index_array,vertices,normals);//no normals
+ }
+ if (final_tangent_array.size() && final_uv_array.size()) {
+
+ _generate_tangents_and_binormals(index_array,vertices,final_uv_array,normals,tangents);
+
+ }
+
+ mrt[Mesh::ARRAY_VERTEX]=vertices;
+
+ mrt[Mesh::ARRAY_NORMAL]=normals;
+ if (tangents.size())
+ mrt[Mesh::ARRAY_TANGENT]=tangents;
+ if (final_uv_array.size())
+ mrt[Mesh::ARRAY_TEX_UV]=final_uv_array;
+ if (final_uv2_array.size())
+ mrt[Mesh::ARRAY_TEX_UV2]=final_uv2_array;
+ if (final_color_array.size())
+ mrt[Mesh::ARRAY_COLOR]=final_color_array;
+
+ mr[j]=mrt;
+
+ }
+
+ }
+
+#endif
+ for(int mi=0;mi<p_morph_meshes.size();mi++) {
+
+ //print_line("want surface "+itos(mi)+" has "+itos(p_morph_meshes[mi]->get_surface_count()));
+ Array a = p_morph_meshes[mi]->surface_get_arrays(surface);
+ //add valid weight and bone arrays if they exist, TODO check if they are unique to shape (generally not)
+
+ if (final_weight_array.size())
+ a[Mesh::ARRAY_WEIGHTS]=final_weight_array;
+ if (final_bone_array.size())
+ a[Mesh::ARRAY_BONES]=final_bone_array;
+
+ a[Mesh::ARRAY_INDEX]=Variant();
+ //a.resize(Mesh::ARRAY_MAX); //no need for index
+ mr.push_back(a);
+ }
+
+
+ p_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES,d,mr,p_for_morph?0:Mesh::ARRAY_COMPRESS_DEFAULT);
+
+ if (material.is_valid()) {
+ if (p_use_mesh_material) {
+ p_mesh->surface_set_material(surface, material);
+ }
+ p_mesh->surface_set_name(surface, material->get_name());
+ }
+ }
+
+ /*****************/
+ /* FIND MATERIAL */
+ /*****************/
+
+ surface++;
+ }
+
+
+ return OK;
+
+}
+
+
+Error ColladaImport::_create_resources(Collada::Node *p_node) {
+
+
+ if (p_node->type==Collada::Node::TYPE_GEOMETRY && node_map.has(p_node->id)) {
+
+
+ Spatial * node=node_map[p_node->id].node;
+ Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry*>(p_node);
+
+
+ if (node->cast_to<Path>()) {
+
+ Path *path = node->cast_to<Path>();
+
+ String curve = ng->source;
+
+ if (curve_cache.has(ng->source)) {
+
+ path->set_curve(curve_cache[ng->source]);
+ } else {
+
+ Ref<Curve3D> c = memnew( Curve3D );
+
+ const Collada::CurveData &cd = collada.state.curve_data_map[ng->source];
+
+ ERR_FAIL_COND_V( !cd.control_vertices.has("POSITION") , ERR_INVALID_DATA);
+ ERR_FAIL_COND_V( !cd.control_vertices.has("IN_TANGENT") , ERR_INVALID_DATA);
+ ERR_FAIL_COND_V( !cd.control_vertices.has("OUT_TANGENT") , ERR_INVALID_DATA);
+ ERR_FAIL_COND_V( !cd.control_vertices.has("INTERPOLATION") , ERR_INVALID_DATA);
+
+
+ ERR_FAIL_COND_V( !cd.sources.has(cd.control_vertices["POSITION"] ) , ERR_INVALID_DATA);
+ const Collada::CurveData::Source &vertices = cd.sources[ cd.control_vertices["POSITION"] ];
+ ERR_FAIL_COND_V( vertices.stride!=3, ERR_INVALID_DATA );
+
+ ERR_FAIL_COND_V( !cd.sources.has(cd.control_vertices["IN_TANGENT"] ) , ERR_INVALID_DATA);
+ const Collada::CurveData::Source &in_tangents = cd.sources[ cd.control_vertices["IN_TANGENT"] ];
+ ERR_FAIL_COND_V( in_tangents.stride!=3 , ERR_INVALID_DATA);
+
+ ERR_FAIL_COND_V( !cd.sources.has(cd.control_vertices["OUT_TANGENT"] ), ERR_INVALID_DATA );
+ const Collada::CurveData::Source &out_tangents = cd.sources[ cd.control_vertices["OUT_TANGENT"] ];
+ ERR_FAIL_COND_V( out_tangents.stride!=3, ERR_INVALID_DATA );
+
+ ERR_FAIL_COND_V( !cd.sources.has(cd.control_vertices["INTERPOLATION"] ), ERR_INVALID_DATA );
+ const Collada::CurveData::Source &interps = cd.sources[ cd.control_vertices["INTERPOLATION"] ];
+ ERR_FAIL_COND_V( interps.stride!=1, ERR_INVALID_DATA );
+
+ const Collada::CurveData::Source *tilts=NULL;
+ if (cd.control_vertices.has("TILT") && cd.sources.has(cd.control_vertices["TILT"]))
+ tilts=&cd.sources[ cd.control_vertices["TILT"] ];
+
+
+ if (tilts) {
+ print_line("FOUND TILTS!!!");
+ }
+ int pc = vertices.array.size()/3;
+ for(int i=0;i<pc;i++) {
+
+ Vector3 pos( vertices.array[i*3+0], vertices.array[i*3+1], vertices.array[i*3+2] );
+ Vector3 in( in_tangents.array[i*3+0], in_tangents.array[i*3+1], in_tangents.array[i*3+2] );
+ Vector3 out( out_tangents.array[i*3+0], out_tangents.array[i*3+1], out_tangents.array[i*3+2] );
+
+#ifndef NO_UP_AXIS_SWAP
+ if (collada.state.up_axis==Vector3::AXIS_Z) {
+
+ SWAP(pos.y,pos.z);
+ pos.z=-pos.z;
+ SWAP(in.y,in.z);
+ in.z=-in.z;
+ SWAP(out.y,out.z);
+ out.z=-out.z;
+ }
+#endif
+ pos*=collada.state.unit_scale;
+ in*=collada.state.unit_scale;
+ out*=collada.state.unit_scale;
+
+ c->add_point(pos,in-pos,out-pos);
+ if (tilts)
+ c->set_point_tilt(i,tilts->array[i]);
+
+ }
+
+ curve_cache[ng->source]=c;
+ path->set_curve(c);
+
+ }
+
+
+ }
+
+
+ if (node->cast_to<MeshInstance>()) {
+
+
+ Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry*>(p_node);
+
+ MeshInstance *mi = node->cast_to<MeshInstance>();
+
+
+ ERR_FAIL_COND_V(!mi,ERR_BUG);
+
+
+ Collada::SkinControllerData *skin=NULL;
+ Collada::MorphControllerData *morph=NULL;
+ String meshid;
+ Transform apply_xform;
+ Vector<int> bone_remap;
+ Vector<Ref<Mesh> > morphs;
+
+ print_line("mesh: "+String(mi->get_name()));
+
+ if (ng->controller) {
+
+ print_line("has controller");
+
+ String ngsource = ng->source;
+
+ if (collada.state.skin_controller_data_map.has(ngsource)) {
+
+
+ ERR_FAIL_COND_V(!collada.state.skin_controller_data_map.has(ngsource),ERR_INVALID_DATA);
+ skin=&collada.state.skin_controller_data_map[ngsource];
+
+ Vector<String> skeletons = ng->skeletons;
+
+ ERR_FAIL_COND_V( skeletons.empty(), ERR_INVALID_DATA );
+
+ String skname = skeletons[0];
+ if (!node_map.has(skname)) {
+ print_line("no node for skeleton "+skname);
+ }
+ ERR_FAIL_COND_V( !node_map.has(skname), ERR_INVALID_DATA );
+ NodeMap nmsk = node_map[skname];
+ Skeleton *sk = nmsk.node->cast_to<Skeleton>();
+ ERR_FAIL_COND_V( !sk, ERR_INVALID_DATA );
+ ERR_FAIL_COND_V( !skeleton_bone_map.has(sk), ERR_INVALID_DATA );
+ Map<String, int> &bone_remap_map=skeleton_bone_map[sk];
+
+
+ meshid=skin->base;
+
+ if (collada.state.morph_controller_data_map.has(meshid)) {
+ //it's a morph!!
+ morph = &collada.state.morph_controller_data_map[meshid];
+ ngsource=meshid;
+ meshid=morph->mesh;
+ } else {
+ ngsource="";
+ }
+
+ if (apply_mesh_xform_to_vertices) {
+ apply_xform=collada.fix_transform(p_node->default_transform);
+ node->set_transform(Transform());
+ } else {
+ apply_xform=Transform();
+ }
+
+ Collada::SkinControllerData::Source *joint_src=NULL;
+
+ ERR_FAIL_COND_V(!skin->weights.sources.has("JOINT"),ERR_INVALID_DATA);
+
+ String joint_id = skin->weights.sources["JOINT"].source;
+ ERR_FAIL_COND_V(!skin->sources.has(joint_id),ERR_INVALID_DATA);
+
+ joint_src = &skin->sources[joint_id];
+
+ bone_remap.resize(joint_src->sarray.size());
+
+ for(int i=0;i<bone_remap.size();i++) {
+
+ String str = joint_src->sarray[i];
+ if (!bone_remap_map.has(str)) {
+ print_line("bone not found for remap: "+str);
+ print_line("in skeleton: "+skname);
+ }
+ ERR_FAIL_COND_V( !bone_remap_map.has(str), ERR_INVALID_DATA );
+ bone_remap[i]=bone_remap_map[str];
+ }
+ }
+
+ if (collada.state.morph_controller_data_map.has(ngsource)) {
+ print_line("is morph "+ngsource);
+ //it's a morph!!
+ morph = &collada.state.morph_controller_data_map[ngsource];
+ meshid=morph->mesh;
+ printf("KKmorph: %p\n",morph);
+ print_line("morph mshid: "+meshid);
+
+ Vector<String> targets;
+
+ morph->targets.has("MORPH_TARGET");
+ String target = morph->targets["MORPH_TARGET"];
+ bool valid=false;
+ if (morph->sources.has(target)) {
+ valid=true;
+ Vector<String> names = morph->sources[target].sarray;
+ for(int i=0;i<names.size();i++) {
+
+ String meshid=names[i];
+ if (collada.state.mesh_data_map.has(meshid)) {
+ Ref<Mesh> mesh=Ref<Mesh>(memnew( Mesh ));
+ const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid];
+ Error err = _create_mesh_surfaces(false,mesh,ng->material_map,meshdata,apply_xform,bone_remap,skin,NULL,Vector<Ref<Mesh> >(),true);
+ ERR_FAIL_COND_V(err,err);
+
+ morphs.push_back(mesh);
+ } else {
+ valid=false;
+ }
+ }
+ }
+
+ if (!valid)
+ morphs.clear();
+
+ ngsource="";
+ }
+
+ if (ngsource!=""){
+ ERR_EXPLAIN("Controller Instance Source '"+ngsource+"' is neither skin or morph!");
+ ERR_FAIL_V( ERR_INVALID_DATA );
+ }
+
+
+
+ } else {
+ meshid=ng->source;
+ }
+
+ Ref<Mesh> mesh;
+ if (mesh_cache.has(meshid)) {
+ mesh=mesh_cache[meshid];
+ } else {
+ if (collada.state.mesh_data_map.has(meshid)) {
+ //bleh, must ignore invalid
+
+ ERR_FAIL_COND_V(!collada.state.mesh_data_map.has(meshid),ERR_INVALID_DATA);
+ mesh=Ref<Mesh>(memnew( Mesh ));
+ const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid];
+ mesh->set_name( meshdata.name );
+ Error err = _create_mesh_surfaces(morphs.size()==0,mesh,ng->material_map,meshdata,apply_xform,bone_remap,skin,morph,morphs,false,use_mesh_builtin_materials);
+ ERR_FAIL_COND_V(err,err);
+
+ mesh_cache[meshid]=mesh;
+ } else {
+
+ print_line("Warning, will not import geometry: "+meshid);
+ }
+ }
+
+ if (!mesh.is_null()) {
+
+ mi->set_mesh(mesh);
+ if (!use_mesh_builtin_materials) {
+ const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid];
+
+ for(int i=0;i<meshdata.primitives.size();i++) {
+
+ String matname=meshdata.primitives[i].material;
+
+ if (ng->material_map.has(matname)) {
+ String target=ng->material_map[matname].target;
+
+ Ref<Material> material;
+ if (!material_cache.has(target)) {
+ Error err = _create_material(target);
+ if (!err)
+ material=material_cache[target];
+ } else
+ material=material_cache[target];
+
+ mi->set_surface_material(i,material);
+ } else if (matname!=""){
+ print_line("Warning, unreferenced material in geometry instance: "+matname);
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ for(int i=0;i<p_node->children.size();i++) {
+
+ Error err = _create_resources(p_node->children[i]);
+ if (err)
+ return err;
+ }
+ return OK;
+}
+
+
+Error ColladaImport::load(const String& p_path,int p_flags,bool p_force_make_tangents) {
+
+ Error err = collada.load(p_path,p_flags);
+ ERR_FAIL_COND_V(err,err);
+
+ force_make_tangents=p_force_make_tangents;
+ ERR_FAIL_COND_V( !collada.state.visual_scene_map.has( collada.state.root_visual_scene ), ERR_INVALID_DATA );
+ Collada::VisualScene &vs = collada.state.visual_scene_map[ collada.state.root_visual_scene ];
+
+ scene = memnew( Spatial ); // root
+
+ //determine what's going on with the lights
+ for(int i=0;i<vs.root_nodes.size();i++) {
+
+ _pre_process_lights(vs.root_nodes[i]);
+
+ }
+ //import scene
+
+ for(int i=0;i<vs.root_nodes.size();i++) {
+
+ Error err = _create_scene_skeletons(vs.root_nodes[i]);
+ if (err!=OK) {
+ memdelete(scene);
+ ERR_FAIL_COND_V(err,err);
+ }
+ }
+
+ for(int i=0;i<vs.root_nodes.size();i++) {
+
+ Error err = _create_scene(vs.root_nodes[i],scene);
+ if (err!=OK) {
+ memdelete(scene);
+ ERR_FAIL_COND_V(err,err);
+ }
+
+ Error err2 = _create_resources(vs.root_nodes[i]);
+ if (err2!=OK) {
+ memdelete(scene);
+ ERR_FAIL_COND_V(err2,err2);
+ }
+ }
+
+ //optatively, set unit scale in the root
+ scene->set_transform(collada.get_root_transform());
+
+
+ return OK;
+
+}
+
+void ColladaImport::_fix_param_animation_tracks() {
+
+ for (Map<String,Collada::Node*>::Element *E=collada.state.scene_map.front();E;E=E->next()) {
+
+ Collada::Node *n = E->get();
+ switch(n->type) {
+
+ case Collada::Node::TYPE_NODE: {
+ // ? do nothing
+ } break;
+ case Collada::Node::TYPE_JOINT: {
+
+ } break;
+ case Collada::Node::TYPE_SKELETON: {
+
+ } break;
+ case Collada::Node::TYPE_LIGHT: {
+
+ } break;
+ case Collada::Node::TYPE_CAMERA: {
+
+ } break;
+ case Collada::Node::TYPE_GEOMETRY: {
+
+ Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry*>(n);
+ // test source(s)
+ String source = ng->source;
+
+ while (source!="") {
+
+ if (collada.state.skin_controller_data_map.has(source)) {
+
+ const Collada::SkinControllerData& skin = collada.state.skin_controller_data_map[source];
+
+ //nothing to animate here i think
+
+ source=skin.base;
+ } else if (collada.state.morph_controller_data_map.has(source)) {
+
+
+ const Collada::MorphControllerData& morph = collada.state.morph_controller_data_map[source];
+
+ if (morph.targets.has("MORPH_WEIGHT") && morph.targets.has("MORPH_TARGET")) {
+
+
+ String weights = morph.targets["MORPH_WEIGHT"];
+ String targets = morph.targets["MORPH_TARGET"];
+ //fails here
+
+ if (morph.sources.has(targets) && morph.sources.has(weights)) {
+ const Collada::MorphControllerData::Source &weight_src=morph.sources[weights];
+ const Collada::MorphControllerData::Source &target_src=morph.sources[targets];
+
+
+ ERR_FAIL_COND(weight_src.array.size() != target_src.sarray.size());
+
+ for(int i=0;i<weight_src.array.size();i++) {
+
+ String track_name = weights+"("+itos(i)+")";
+ String mesh_name = target_src.sarray[i];
+ if (collada.state.mesh_name_map.has(mesh_name) && collada.state.referenced_tracks.has(track_name)) {
+
+
+ const Vector<int>&rt = collada.state.referenced_tracks[track_name];
+
+ for(int rti=0;rti<rt.size();rti++) {
+ Collada::AnimationTrack *at = &collada.state.animation_tracks[rt[rti]];
+
+ at->target=E->key();
+ at->param="morph/"+collada.state.mesh_name_map[mesh_name];
+ at->property=true;
+ //at->param
+ }
+ }
+ }
+ }
+ }
+ source=morph.mesh;
+ } else {
+
+ source=""; // for now nothing else supported
+ }
+ }
+
+ } break;
+
+ }
+ }
+
+}
+
+void ColladaImport::create_animations(bool p_make_tracks_in_all_bones, bool p_import_value_tracks) {
+
+
+ _fix_param_animation_tracks();
+ for(int i=0;i<collada.state.animation_clips.size();i++) {
+
+ for(int j=0;j<collada.state.animation_clips[i].tracks.size();j++)
+ tracks_in_clips.insert(collada.state.animation_clips[i].tracks[j]);
+ }
+
+
+
+ for(int i=0;i<collada.state.animation_tracks.size();i++) {
+
+ Collada::AnimationTrack &at = collada.state.animation_tracks[i];
+ //print_line("CHANNEL: "+at.target+" PARAM: "+at.param);
+
+ String node;
+
+ if (!node_map.has(at.target)) {
+
+ if (node_name_map.has(at.target)) {
+
+ node=node_name_map[at.target];
+ } else {
+ print_line("Coudlnt find node: "+at.target);
+ continue;
+ }
+ } else {
+ node=at.target;
+ }
+
+
+ if (at.property) {
+
+ valid_animated_properties.push_back(i);
+
+ } else {
+
+ node_map[node].anim_tracks.push_back(i);
+ valid_animated_nodes.insert(node);
+ }
+
+ }
+
+ create_animation(-1,p_make_tracks_in_all_bones, p_import_value_tracks);
+ //print_line("clipcount: "+itos(collada.state.animation_clips.size()));
+ for(int i=0;i<collada.state.animation_clips.size();i++)
+ create_animation(i, p_make_tracks_in_all_bones, p_import_value_tracks);
+
+}
+
+void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones, bool p_import_value_tracks) {
+
+ Ref<Animation> animation = Ref<Animation>( memnew( Animation ));
+
+
+ if (p_clip==-1) {
+
+ //print_line("default");
+ animation->set_name("default");
+ } else {
+ //print_line("clip name: "+collada.state.animation_clips[p_clip].name);
+ animation->set_name(collada.state.animation_clips[p_clip].name);
+ }
+
+ for(Map<String,NodeMap>::Element *E=node_map.front();E;E=E->next()) {
+
+ if (E->get().bone<0)
+ continue;
+ bones_with_animation[E->key()]=false;
+ }
+ //store and validate tracks
+
+ if (p_clip==-1) {
+ //main anim
+ }
+
+ Set<int> track_filter;
+
+
+ if (p_clip==-1) {
+
+ for(int i=0;i<collada.state.animation_clips.size();i++) {
+
+ int tc = collada.state.animation_clips[i].tracks.size();
+ for(int j=0;j<tc;j++) {
+
+ String n = collada.state.animation_clips[i].tracks[j];
+ if (collada.state.by_id_tracks.has(n)) {
+
+ const Vector<int>&ti = collada.state.by_id_tracks[n];
+ for(int k=0;k<ti.size();k++) {
+ track_filter.insert(ti[k]);
+ }
+ }
+ }
+ }
+ } else {
+
+ int tc = collada.state.animation_clips[p_clip].tracks.size();
+ for(int j=0;j<tc;j++) {
+
+ String n = collada.state.animation_clips[p_clip].tracks[j];
+ if (collada.state.by_id_tracks.has(n)) {
+
+ const Vector<int>&ti = collada.state.by_id_tracks[n];
+ for(int k=0;k<ti.size();k++) {
+ track_filter.insert(ti[k]);
+ }
+ }
+ }
+
+ }
+
+ //animation->set_loop(true);
+ //create animation tracks
+
+ Vector<float> base_snapshots;
+
+ float f=0;
+ float snapshot_interval = 1.0/bake_fps; //should be customizable somewhere...
+
+ float anim_length=collada.state.animation_length;
+ if (p_clip>=0 && collada.state.animation_clips[p_clip].end)
+ anim_length=collada.state.animation_clips[p_clip].end;
+
+ while(f<anim_length) {
+
+ base_snapshots.push_back(f);
+
+ f+=snapshot_interval;
+
+ if (f>=anim_length) {
+ base_snapshots.push_back(anim_length);
+
+ }
+ }
+
+ //print_line("anim len: "+rtos(anim_length));
+ animation->set_length(anim_length);
+
+ bool tracks_found=false;
+
+
+
+ for(Set<String>::Element* E=valid_animated_nodes.front();E;E=E->next()) {
+
+ // take snapshots
+
+
+ if (!collada.state.scene_map.has(E->get())) {
+
+ continue;
+ }
+
+ NodeMap &nm = node_map[E->get()];
+ String path = scene->get_path_to(nm.node);
+
+ if (nm.bone>=0) {
+ Skeleton *sk = static_cast<Skeleton*>(nm.node);
+ String name = sk->get_bone_name(nm.bone);
+ path=path+":"+name;
+ }
+
+ bool found_anim=false;
+
+
+ Collada::Node *cn = collada.state.scene_map[E->get()];
+ if (cn->ignore_anim) {
+
+ continue;
+ }
+
+
+
+ animation->add_track(Animation::TYPE_TRANSFORM);
+ int track = animation->get_track_count() -1;
+ animation->track_set_path( track , path );
+ animation->track_set_imported( track , true ); //helps merging later
+
+ Vector<float> snapshots = base_snapshots;
+
+ if (nm.anim_tracks.size()==1) {
+ //use snapshot keys from anim track instead, because this was most likely exported baked
+ Collada::AnimationTrack &at = collada.state.animation_tracks[nm.anim_tracks.front()->get()];
+ snapshots.clear();
+ for(int i=0;i<at.keys.size();i++)
+ snapshots.push_back(at.keys[i].time);
+
+
+ }
+
+
+ for(int i=0;i<snapshots.size();i++) {
+
+
+ for(List<int>::Element *ET=nm.anim_tracks.front();ET;ET=ET->next()) {
+ //apply tracks
+
+
+ if (p_clip==-1) {
+
+ if (track_filter.has(ET->get())) {
+
+ continue;
+ }
+ } else {
+
+ if (!track_filter.has(ET->get()))
+ continue;
+
+ }
+
+ found_anim=true;
+
+ Collada::AnimationTrack &at = collada.state.animation_tracks[ET->get()];
+
+ int xform_idx=-1;
+ for(int j=0;j<cn->xform_list.size();j++) {
+
+
+ if (cn->xform_list[j].id==at.param) {
+
+ xform_idx=j;
+ break;
+ }
+ }
+
+ if (xform_idx==-1) {
+ print_line("couldnt find matching node "+at.target+" xform for track "+at.param);
+ continue;
+ }
+
+ ERR_CONTINUE(xform_idx==-1);
+
+ Vector<float> data = at.get_value_at_time(snapshots[i]);
+ ERR_CONTINUE(data.empty());
+
+
+ Collada::Node::XForm &xf = cn->xform_list[xform_idx];
+
+ if (at.component=="ANGLE") {
+ ERR_CONTINUE(data.size()!=1);
+ ERR_CONTINUE(xf.op!=Collada::Node::XForm::OP_ROTATE);
+ ERR_CONTINUE(xf.data.size()<4);
+ xf.data[3]=data[0];
+ } else if (at.component=="X" || at.component=="Y" || at.component=="Z") {
+ int cn=at.component[0]-'X';
+ ERR_CONTINUE(cn>=xf.data.size());
+ ERR_CONTINUE(data.size()>1);
+ xf.data[cn]=data[0];
+ } else if (data.size()==xf.data.size()) {
+
+ xf.data=data;
+ } else {
+
+
+ if ( data.size()!=xf.data.size() ) {
+ print_line("component "+at.component+" datasize "+itos(data.size())+" xfdatasize "+itos(xf.data.size()));
+ }
+
+ ERR_CONTINUE( data.size()!=xf.data.size() );
+ }
+ }
+
+ Transform xform = cn->compute_transform(collada);
+ xform = collada.fix_transform(xform) * cn->post_transform;
+
+
+ if (nm.bone>=0) {
+ //make bone transform relative to rest (in case of skeleton)
+ Skeleton *sk = nm.node->cast_to<Skeleton>();
+ if (sk) {
+
+ xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform;
+ } else {
+
+ ERR_PRINT("INVALID SKELETON!!!!");
+ }
+ }
+
+ Quat q = xform.basis;
+ q.normalize();
+ Vector3 s = xform.basis.get_scale();
+ Vector3 l = xform.origin;
+
+ animation->transform_track_insert_key(track,snapshots[i],l,q,s);
+
+ }
+
+
+
+ if (nm.bone>=0) {
+ if (found_anim)
+ bones_with_animation[E->get()]=true;
+ }
+
+ if (found_anim)
+ tracks_found=true;
+ else {
+ animation->remove_track( track );
+ }
+
+ }
+
+ if (p_make_tracks_in_all_bones) {
+
+ //some bones may lack animation, but since we don't store pose as a property, we must add keyframes!
+ for(Map<String,bool>::Element *E=bones_with_animation.front();E;E=E->next()) {
+
+ if (E->get())
+ continue;
+
+ //print_line("BONE LACKS ANIM: "+E->key());
+
+ NodeMap &nm = node_map[E->key()];
+ String path = scene->get_path_to(nm.node);
+ ERR_CONTINUE( nm.bone <0 );
+ Skeleton *sk = static_cast<Skeleton*>(nm.node);
+ String name = sk->get_bone_name(nm.bone);
+ path=path+":"+name;
+
+ Collada::Node *cn = collada.state.scene_map[E->key()];
+ if (cn->ignore_anim) {
+ print_line("warning, ignoring animation on node: "+path);
+ continue;
+ }
+
+ animation->add_track(Animation::TYPE_TRANSFORM);
+ int track = animation->get_track_count() -1;
+ animation->track_set_path( track , path );
+ animation->track_set_imported( track , true ); //helps merging later
+
+
+ Transform xform = cn->compute_transform(collada);
+ xform = collada.fix_transform(xform) * cn->post_transform;
+
+ xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform;
+
+ Quat q = xform.basis;
+ q.normalize();
+ Vector3 s = xform.basis.get_scale();
+ Vector3 l = xform.origin;
+
+ animation->transform_track_insert_key(track,0,l,q,s);
+
+ tracks_found=true;
+ }
+ }
+
+
+
+ if (p_import_value_tracks) {
+ for (int i = 0; i < valid_animated_properties.size(); i++) {
+
+
+ int ti = valid_animated_properties[i];
+
+ if (p_clip == -1) {
+
+ if (track_filter.has(ti))
+ continue;
+ }
+ else {
+
+ if (!track_filter.has(ti))
+ continue;
+
+ }
+
+
+ Collada::AnimationTrack &at = collada.state.animation_tracks[ti];
+
+ // take snapshots
+ if (!collada.state.scene_map.has(at.target))
+ continue;
+
+ NodeMap &nm = node_map[at.target];
+ String path = scene->get_path_to(nm.node);
+
+ animation->add_track(Animation::TYPE_VALUE);
+ int track = animation->get_track_count() - 1;
+
+ path = path + ":" + at.param;
+ animation->track_set_path(track, path);
+ animation->track_set_imported(track, true); //helps merging later
+
+
+ for (int i = 0; i < at.keys.size(); i++) {
+
+ float time = at.keys[i].time;
+ Variant value;
+ Vector<float> data = at.keys[i].data;
+ if (data.size() == 1) {
+ //push a float
+ value = data[0];
+
+ }
+ else if (data.size() == 16) {
+ //matrix
+ print_line("value keys for matrices not supported");
+ }
+ else {
+
+ print_line("don't know what to do with this amount of value keys: " + itos(data.size()));
+ }
+
+ animation->track_insert_key(track, time, value);
+ }
+
+
+ tracks_found = true;
+
+ }
+ }
+
+
+
+ if (tracks_found) {
+
+ animations.push_back(animation);
+ }
+
+
+
+}
+
+
+/*********************************************************************************/
+/*************************************** SCENE ***********************************/
+/*********************************************************************************/
+
+
+#define DEBUG_ANIMATION
+
+
+uint32_t EditorSceneImporterCollada::get_import_flags() const {
+
+ return IMPORT_SCENE|IMPORT_ANIMATION;
+
+}
+void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) const {
+
+
+ r_extensions->push_back("dae");
+}
+Node* EditorSceneImporterCollada::import_scene(const String& p_path, uint32_t p_flags,int p_bake_fps, List<String> *r_missing_deps, Error* r_err) {
+
+ ColladaImport state;
+ uint32_t flags=Collada::IMPORT_FLAG_SCENE;
+ if (p_flags&IMPORT_ANIMATION)
+ flags|=Collada::IMPORT_FLAG_ANIMATION;
+
+ state.use_mesh_builtin_materials=!(p_flags&IMPORT_MATERIALS_IN_INSTANCES);
+ state.bake_fps=p_bake_fps;
+
+ Error err = state.load(p_path,flags,p_flags&EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS);
+
+ ERR_FAIL_COND_V(err!=OK,NULL);
+
+ if (state.missing_textures.size()) {
+
+ /*
+ for(int i=0;i<state.missing_textures.size();i++) {
+ EditorNode::add_io_error("Texture Not Found: "+state.missing_textures[i]);
+ }
+ */
+
+
+ if (r_missing_deps) {
+
+ for(int i=0;i<state.missing_textures.size();i++) {
+ //EditorNode::add_io_error("Texture Not Found: "+state.missing_textures[i]);
+ r_missing_deps->push_back(state.missing_textures[i]);
+ }
+
+ }
+ }
+
+ if (p_flags&IMPORT_ANIMATION) {
+
+ state.create_animations(p_flags&IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS,p_flags&EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS);
+ AnimationPlayer *ap = memnew( AnimationPlayer );
+ for(int i=0;i<state.animations.size();i++) {
+ String name;
+ if (state.animations[i]->get_name()=="")
+ name="default";
+ else
+ name=state.animations[i]->get_name();
+
+ if (p_flags&IMPORT_ANIMATION_DETECT_LOOP) {
+
+ if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) {
+ state.animations[i]->set_loop(true);
+ }
+ }
+
+ ap->add_animation(name,state.animations[i]);
+ }
+ state.scene->add_child(ap);
+ ap->set_owner(state.scene);
+
+ }
+
+ return state.scene;
+
+}
+
+Ref<Animation> EditorSceneImporterCollada::import_animation(const String& p_path,uint32_t p_flags) {
+
+
+ ColladaImport state;
+
+
+ state.use_mesh_builtin_materials=false;
+
+ Error err = state.load(p_path,Collada::IMPORT_FLAG_ANIMATION,p_flags&EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS);
+ ERR_FAIL_COND_V(err!=OK,RES());
+
+
+ state.create_animations(p_flags&EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS,p_flags&EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS);
+ if (state.scene)
+ memdelete(state.scene);
+
+ if (state.animations.size()==0)
+ return Ref<Animation>();
+ Ref<Animation> anim=state.animations[0];
+ anim=state.animations[0];
+ print_line("Anim Load OK");
+ String base = p_path.get_basename().to_lower();
+ if (p_flags&IMPORT_ANIMATION_DETECT_LOOP) {
+
+ if (base.begins_with("loop") || base.ends_with("loop") || base.begins_with("cycle") || base.ends_with("cycle")) {
+ anim->set_loop(true);
+ }
+ }
+
+
+ return anim;
+}
+
+
+EditorSceneImporterCollada::EditorSceneImporterCollada() {
+
+
+}
+
diff --git a/editor/import/editor_import_collada.h b/editor/import/editor_import_collada.h
new file mode 100644
index 0000000000..5c7624bd33
--- /dev/null
+++ b/editor/import/editor_import_collada.h
@@ -0,0 +1,51 @@
+/*************************************************************************/
+/* editor_import_collada.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_IMPORT_COLLADA_H
+#define EDITOR_IMPORT_COLLADA_H
+
+#include "editor/import/resource_importer_scene.h"
+
+
+
+class EditorSceneImporterCollada : public EditorSceneImporter {
+
+ GDCLASS(EditorSceneImporterCollada,EditorSceneImporter );
+public:
+
+ virtual uint32_t get_import_flags() const;
+ virtual void get_extensions(List<String> *r_extensions) const;
+ virtual Node* import_scene(const String& p_path,uint32_t p_flags,int p_bake_fps,List<String> *r_missing_deps=NULL,Error* r_err=NULL);
+ virtual Ref<Animation> import_animation(const String& p_path,uint32_t p_flags);
+
+ EditorSceneImporterCollada();
+};
+
+
+#endif
+
diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp
new file mode 100644
index 0000000000..f14c10fb99
--- /dev/null
+++ b/editor/import/resource_importer_csv_translation.cpp
@@ -0,0 +1,126 @@
+
+#include "resource_importer_csv_translation.h"
+#include "os/file_access.h"
+#include "translation.h"
+#include "io/resource_saver.h"
+#include "compressed_translation.h"
+
+String ResourceImporterCSVTranslation::get_importer_name() const {
+
+ return "csv_translation";
+}
+
+String ResourceImporterCSVTranslation::get_visible_name() const{
+
+ return "CSV Translation";
+}
+void ResourceImporterCSVTranslation::get_recognized_extensions(List<String> *p_extensions) const{
+
+ p_extensions->push_back("csv");
+}
+
+String ResourceImporterCSVTranslation::get_save_extension() const {
+ return ""; //does not save a single resoure
+}
+
+String ResourceImporterCSVTranslation::get_resource_type() const{
+
+ return "StreamCSVTranslation";
+}
+
+bool ResourceImporterCSVTranslation::get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const {
+
+ return true;
+}
+
+int ResourceImporterCSVTranslation::get_preset_count() const {
+ return 0;
+}
+String ResourceImporterCSVTranslation::get_preset_name(int p_idx) const {
+
+ return "";
+}
+
+
+void ResourceImporterCSVTranslation::get_import_options(List<ImportOption> *r_options,int p_preset) const {
+
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"compress"),true));
+
+}
+
+
+
+Error ResourceImporterCSVTranslation::import(const String& p_source_file, const String& p_save_path, const Map<StringName,Variant>& p_options, List<String>* r_platform_variants, List<String> *r_gen_files) {
+
+
+ bool compress = p_options["compress"];
+ FileAccessRef f = FileAccess::open(p_source_file,FileAccess::READ);
+
+ ERR_FAIL_COND_V( !f, ERR_INVALID_PARAMETER );
+
+ Vector<String> line = f->get_csv_line();
+ if (line.size()<=1) {
+ return ERR_PARSE_ERROR;
+ }
+
+ Vector<String> locales;
+ Vector<Ref<Translation> > translations;
+
+ for(int i=1;i<line.size();i++) {
+
+ String locale = line[i];
+ if (!TranslationServer::is_locale_valid(locale)) {
+ return ERR_PARSE_ERROR;
+ }
+
+ locales.push_back(locale);
+ Ref<Translation> translation;
+ translation.instance();
+ translation->set_locale(locale);
+ translations.push_back(translation);
+ }
+
+ line = f->get_csv_line();
+
+ while(line.size()==locales.size()+1) {
+
+ String key = line[0];
+ if (key!="") {
+
+ for(int i=1;i<line.size();i++) {
+ translations[i-1]->add_message(key,line[i]);
+ }
+ }
+
+ line = f->get_csv_line();
+ }
+
+
+ for(int i=0;i<translations.size();i++) {
+ Ref<Translation> xlt = translations[i];
+
+ if (compress) {
+ Ref<PHashTranslation> cxl = memnew( PHashTranslation );
+ cxl->generate( xlt );
+ xlt=cxl;
+ }
+
+ String save_path = p_source_file.get_basename()+"."+translations[i]->get_locale()+".xl";
+
+ ResourceSaver::save(save_path,xlt);
+ if (r_gen_files) {
+ r_gen_files->push_back(save_path);
+ }
+ }
+
+
+
+ return OK;
+
+}
+
+ResourceImporterCSVTranslation::ResourceImporterCSVTranslation()
+{
+
+}
diff --git a/editor/import/resource_importer_csv_translation.h b/editor/import/resource_importer_csv_translation.h
new file mode 100644
index 0000000000..d08218e7d9
--- /dev/null
+++ b/editor/import/resource_importer_csv_translation.h
@@ -0,0 +1,27 @@
+#ifndef RESOURCEIMPORTERCSVTRANSLATION_H
+#define RESOURCEIMPORTERCSVTRANSLATION_H
+
+#include "io/resource_import.h"
+
+
+class ResourceImporterCSVTranslation : public ResourceImporter {
+ GDCLASS(ResourceImporterCSVTranslation,ResourceImporter)
+public:
+ virtual String get_importer_name() const;
+ virtual String get_visible_name() const;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual String get_save_extension() const;
+ virtual String get_resource_type() const;
+
+ virtual int get_preset_count() const;
+ virtual String get_preset_name(int p_idx) const;
+
+ virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
+ virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
+
+ virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
+
+ ResourceImporterCSVTranslation();
+};
+
+#endif // RESOURCEIMPORTERCSVTRANSLATION_H
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
new file mode 100644
index 0000000000..aacb5fbb2d
--- /dev/null
+++ b/editor/import/resource_importer_obj.cpp
@@ -0,0 +1,231 @@
+#include "resource_importer_obj.h"
+
+#include "io/resource_saver.h"
+#include "scene/resources/mesh.h"
+#include "scene/resources/surface_tool.h"
+#include "scene/resources/surface_tool.h"
+#include "os/file_access.h"
+
+String ResourceImporterOBJ::get_importer_name() const {
+
+ return "obj_mesh";
+}
+
+String ResourceImporterOBJ::get_visible_name() const{
+
+ return "OBJ As Mesh";
+}
+void ResourceImporterOBJ::get_recognized_extensions(List<String> *p_extensions) const{
+
+ p_extensions->push_back("obj");
+}
+String ResourceImporterOBJ::get_save_extension() const {
+ return "msh";
+}
+
+String ResourceImporterOBJ::get_resource_type() const{
+
+ return "Mesh";
+}
+
+bool ResourceImporterOBJ::get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const {
+
+ return true;
+}
+
+int ResourceImporterOBJ::get_preset_count() const {
+ return 0;
+}
+String ResourceImporterOBJ::get_preset_name(int p_idx) const {
+
+ return String();
+}
+
+
+void ResourceImporterOBJ::get_import_options(List<ImportOption> *r_options,int p_preset) const {
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"generate/tangents"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"generate/normals"),true));
+ //not for nowp
+ //r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"import/materials")));
+ //r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"import/textures")));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/flip_faces"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/smooth_shading"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/weld_vertices"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"force/weld_tolerance",PROPERTY_HINT_RANGE,"0.00001,16,0.00001"),0.0001));
+ //r_options->push_back(PropertyInfo(Variant::INT,"compress/bitrate",PROPERTY_HINT_ENUM,"64,96,128,192"));
+
+}
+
+
+
+Error ResourceImporterOBJ::import(const String& p_source_file, const String& p_save_path, const Map<StringName,Variant>& p_options, List<String>* r_platform_variants, List<String> *r_gen_files) {
+
+ FileAccessRef f = FileAccess::open(p_source_file,FileAccess::READ);
+ ERR_FAIL_COND_V(!f,ERR_CANT_OPEN);
+
+ Ref<Mesh> mesh = Ref<Mesh>( memnew( Mesh ) );
+ Map<String,Ref<Material> > name_map;
+
+
+
+ bool generate_normals=p_options["generate/normals"];
+ bool generate_tangents=p_options["generate/tangents"];
+ bool flip_faces=p_options["force/flip_faces"];
+ bool force_smooth=p_options["force/smooth_shading"];
+ bool weld_vertices=p_options["force/weld_vertices"];
+ float weld_tolerance=p_options["force/weld_tolerance"];
+ Vector<Vector3> vertices;
+ Vector<Vector3> normals;
+ Vector<Vector2> uvs;
+ String name;
+
+ Ref<SurfaceTool> surf_tool = memnew( SurfaceTool) ;
+ surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
+ if (force_smooth)
+ surf_tool->add_smooth_group(true);
+ int has_index_data=false;
+
+ while(true) {
+
+
+ String l = f->get_line().strip_edges();
+
+ if (l.begins_with("v ")) {
+ //vertex
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+ Vector3 vtx;
+ vtx.x=v[1].to_float();
+ vtx.y=v[2].to_float();
+ vtx.z=v[3].to_float();
+ vertices.push_back(vtx);
+ } else if (l.begins_with("vt ")) {
+ //uv
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<3,ERR_INVALID_DATA);
+ Vector2 uv;
+ uv.x=v[1].to_float();
+ uv.y=1.0-v[2].to_float();
+ uvs.push_back(uv);
+
+ } else if (l.begins_with("vn ")) {
+ //normal
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+ Vector3 nrm;
+ nrm.x=v[1].to_float();
+ nrm.y=v[2].to_float();
+ nrm.z=v[3].to_float();
+ normals.push_back(nrm);
+ } else if (l.begins_with("f ")) {
+ //vertex
+
+ has_index_data=true;
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+
+ //not very fast, could be sped up
+
+
+ Vector<String> face[3];
+ face[0] = v[1].split("/");
+ face[1] = v[2].split("/");
+ ERR_FAIL_COND_V(face[0].size()==0,ERR_PARSE_ERROR);
+ ERR_FAIL_COND_V(face[0].size()!=face[1].size(),ERR_PARSE_ERROR);
+ for(int i=2;i<v.size()-1;i++) {
+
+ face[2] = v[i+1].split("/");
+ ERR_FAIL_COND_V(face[0].size()!=face[2].size(),ERR_PARSE_ERROR);
+ for(int j=0;j<3;j++) {
+
+ int idx=j;
+
+ if (!flip_faces && idx<2) {
+ idx=1^idx;
+ }
+
+
+ if (face[idx].size()==3) {
+ int norm = face[idx][2].to_int()-1;
+ ERR_FAIL_INDEX_V(norm,normals.size(),ERR_PARSE_ERROR);
+ surf_tool->add_normal(normals[norm]);
+ }
+
+ if (face[idx].size()>=2 && face[idx][1]!=String()) {
+
+ int uv = face[idx][1].to_int()-1;
+ ERR_FAIL_INDEX_V(uv,uvs.size(),ERR_PARSE_ERROR);
+ surf_tool->add_uv(uvs[uv]);
+ }
+
+ int vtx = face[idx][0].to_int()-1;
+ ERR_FAIL_INDEX_V(vtx,vertices.size(),ERR_PARSE_ERROR);
+
+ Vector3 vertex = vertices[vtx];
+ if (weld_vertices)
+ vertex=vertex.snapped(weld_tolerance);
+ surf_tool->add_vertex(vertex);
+ }
+
+ face[1]=face[2];
+ }
+ } else if (l.begins_with("s ") && !force_smooth) { //smoothing
+ String what = l.substr(2,l.length()).strip_edges();
+ if (what=="off")
+ surf_tool->add_smooth_group(false);
+ else
+ surf_tool->add_smooth_group(true);
+
+ } else if (l.begins_with("o ") || f->eof_reached()) { //new surface or done
+
+ if (has_index_data) {
+ //new object/surface
+ if (generate_normals || force_smooth)
+ surf_tool->generate_normals();
+ if (uvs.size() && (normals.size() || generate_normals) && generate_tangents)
+ surf_tool->generate_tangents();
+
+ surf_tool->index();
+ mesh = surf_tool->commit(mesh);
+ if (name=="")
+ name=vformat(TTR("Surface %d"),mesh->get_surface_count()-1);
+ mesh->surface_set_name(mesh->get_surface_count()-1,name);
+ name="";
+ surf_tool->clear();
+ surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
+ if (force_smooth)
+ surf_tool->add_smooth_group(true);
+
+ has_index_data=false;
+
+ if (f->eof_reached())
+ break;
+ }
+
+ if (l.begins_with("o ")) //name
+ name=l.substr(2,l.length()).strip_edges();
+ }
+ }
+
+/*
+ TODO, check existing materials and merge?
+ //re-apply materials if exist
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ String n = mesh->surface_get_name(i);
+ if (name_map.has(n))
+ mesh->surface_set_material(i,name_map[n]);
+ }
+*/
+
+ Error err = ResourceSaver::save(p_save_path+".msh",mesh);
+
+ return err;
+
+}
+
+ResourceImporterOBJ::ResourceImporterOBJ()
+{
+
+}
diff --git a/editor/import/resource_importer_obj.h b/editor/import/resource_importer_obj.h
new file mode 100644
index 0000000000..d2a3c4fddd
--- /dev/null
+++ b/editor/import/resource_importer_obj.h
@@ -0,0 +1,28 @@
+#ifndef RESOURCEIMPORTEROBJ_H
+#define RESOURCEIMPORTEROBJ_H
+
+
+#include "io/resource_import.h"
+
+class ResourceImporterOBJ : public ResourceImporter {
+ GDCLASS(ResourceImporterOBJ,ResourceImporter)
+public:
+ virtual String get_importer_name() const;
+ virtual String get_visible_name() const;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual String get_save_extension() const;
+ virtual String get_resource_type() const;
+
+ virtual int get_preset_count() const;
+ virtual String get_preset_name(int p_idx) const;
+
+ virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
+ virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
+
+ virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
+
+ ResourceImporterOBJ();
+};
+
+
+#endif // RESOURCEIMPORTEROBJ_H
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
new file mode 100644
index 0000000000..cdaf40798b
--- /dev/null
+++ b/editor/import/resource_importer_scene.cpp
@@ -0,0 +1,1328 @@
+#include "resource_importer_scene.h"
+
+#include "scene/resources/packed_scene.h"
+#include "io/resource_saver.h"
+#include "editor/editor_node.h"
+
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/navigation.h"
+#include "scene/3d/room_instance.h"
+#include "scene/3d/body_shape.h"
+#include "scene/3d/physics_body.h"
+#include "scene/3d/portal.h"
+#include "scene/3d/vehicle_body.h"
+#include "scene/resources/sphere_shape.h"
+#include "scene/resources/box_shape.h"
+#include "scene/resources/ray_shape.h"
+#include "scene/resources/plane_shape.h"
+
+
+void EditorScenePostImport::_bind_methods() {
+
+ BIND_VMETHOD( MethodInfo("post_import",PropertyInfo(Variant::OBJECT,"scene")) );
+
+}
+
+Node *EditorScenePostImport::post_import(Node* p_scene) {
+
+ if (get_script_instance())
+ return get_script_instance()->call("post_import",p_scene);
+
+ return p_scene;
+}
+
+EditorScenePostImport::EditorScenePostImport() {
+
+
+}
+
+
+String ResourceImporterScene::get_importer_name() const {
+
+ return "scene";
+}
+
+String ResourceImporterScene::get_visible_name() const{
+
+ return "Scene";
+}
+
+void ResourceImporterScene::get_recognized_extensions(List<String> *p_extensions) const{
+
+ for (Set< Ref<EditorSceneImporter> >::Element *E=importers.front();E;E=E->next()) {
+ E->get()->get_extensions(p_extensions);
+ }
+}
+
+String ResourceImporterScene::get_save_extension() const {
+ return "scn";
+}
+
+String ResourceImporterScene::get_resource_type() const{
+
+ return "PackedScene";
+}
+
+bool ResourceImporterScene::get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const {
+
+ if (p_option.begins_with("animation/")) {
+ if (p_option!="animation/import" && !bool(p_options["animation/import"]))
+ return false;
+
+ if (p_option.begins_with("animation/optimizer/") && p_option!="animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"]))
+ return false;
+
+ if (p_option.begins_with("animation/clip_")) {
+ int max_clip = p_options["animation/clips/amount"];
+ int clip = p_option.get_slice("/",1).get_slice("_",1).to_int()-1;
+ if (clip>=max_clip)
+ return false;
+ }
+ }
+
+ return true;
+
+}
+
+int ResourceImporterScene::get_preset_count() const {
+ return 0;
+}
+String ResourceImporterScene::get_preset_name(int p_idx) const {
+
+ return "";
+}
+
+
+static bool _teststr(const String& p_what,const String& p_str) {
+
+ if (p_what.findn("$"+p_str)!=-1) //blender and other stuff
+ return true;
+ if (p_what.to_lower().ends_with("-"+p_str)) //collada only supports "_" and "-" besides letters
+ return true;
+ if (p_what.to_lower().ends_with("_"+p_str)) //collada only supports "_" and "-" besides letters
+ return true;
+ return false;
+}
+
+static String _fixstr(const String& p_what,const String& p_str) {
+
+ if (p_what.findn("$"+p_str)!=-1) //blender and other stuff
+ return p_what.replace("$"+p_str,"");
+ if (p_what.to_lower().ends_with("-"+p_str)) //collada only supports "_" and "-" besides letters
+ return p_what.substr(0,p_what.length()-(p_str.length()+1));
+ if (p_what.to_lower().ends_with("_"+p_str)) //collada only supports "_" and "-" besides letters
+ return p_what.substr(0,p_what.length()-(p_str.length()+1));
+ return p_what;
+}
+
+
+Node* ResourceImporterScene::_fix_node(Node *p_node,Node *p_root,Map<Ref<Mesh>,Ref<Shape> > &collision_map) {
+
+ // children first..
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+
+ Node *r = _fix_node(p_node->get_child(i),p_root,collision_map);
+ if (!r) {
+ print_line("was erased..");
+ i--; //was erased
+ }
+ }
+
+ String name = p_node->get_name();
+
+ bool isroot = p_node==p_root;
+
+
+ if (!isroot && _teststr(name,"noimp")) {
+
+ memdelete(p_node);
+ return NULL;
+ }
+
+
+ if (p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ bool bb=false;
+
+ if ((_teststr(name,"bb"))) {
+ bb=true;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"bb"))) {
+ bb=true;
+
+ }
+
+ if (bb) {
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD,true);
+ if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ //fm->set_flag(Material::FLAG_UNSHADED,true);
+ //fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ //fm->set_depth_draw_mode(Material::DEPTH_DRAW_NEVER);
+ //fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> m = mi->get_mesh();
+
+ if (m.is_valid()) {
+
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> mat = m->surface_get_material(i);
+ if (!mat.is_valid())
+ continue;
+
+ if (_teststr(mat->get_name(),"alpha")) {
+
+ mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT,true);
+ mat->set_name(_fixstr(mat->get_name(),"alpha"));
+ }
+ if (_teststr(mat->get_name(),"vcol")) {
+
+ mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
+ mat->set_name(_fixstr(mat->get_name(),"vcol"));
+ }
+
+ }
+ }
+ }
+
+ if (p_node->cast_to<AnimationPlayer>()) {
+ //remove animations referencing non-importable nodes
+ AnimationPlayer *ap = p_node->cast_to<AnimationPlayer>();
+
+ List<StringName> anims;
+ ap->get_animation_list(&anims);
+ for(List<StringName>::Element *E=anims.front();E;E=E->next()) {
+
+ Ref<Animation> anim=ap->get_animation(E->get());
+ ERR_CONTINUE(anim.is_null());
+ for(int i=0;i<anim->get_track_count();i++) {
+ NodePath path = anim->track_get_path(i);
+
+ for(int j=0;j<path.get_name_count();j++) {
+ String node = path.get_name(j);
+ if (_teststr(node,"noimp")) {
+ anim->remove_track(i);
+ i--;
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+
+ if (p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str;
+
+ if ((_teststr(name,"imp"))) {
+ str=name;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"imp"))) {
+ str=mi->get_mesh()->get_name();
+
+ }
+
+
+ if (p_node->get_parent() && p_node->get_parent()->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ MeshInstance *mip = p_node->get_parent()->cast_to<MeshInstance>();
+ String d=str.substr(str.find("imp")+3,str.length());
+ if (d!="") {
+ if ((d[0]<'0' || d[0]>'9'))
+ d=d.substr(1,d.length());
+ if (d.length() && d[0]>='0' && d[0]<='9') {
+ float dist = d.to_double();
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD,true);
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD_FIX_Y,true);
+ //mi->set_draw_range_begin(dist);
+ //mi->set_draw_range_end(100000);
+
+ //mip->set_draw_range_begin(0);
+ //mip->set_draw_range_end(dist);
+
+ if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ //fm->set_flag(Material::FLAG_UNSHADED,true);
+ //fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ //fm->set_depth_draw_mode(Material::DEPTH_DRAW_NEVER);
+ //fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+#if 0
+ if (p_flags&SCENE_FLAG_CREATE_LODS && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str;
+
+ if ((_teststr(name,"lod"))) {
+ str=name;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"lod"))) {
+ str=mi->get_mesh()->get_name();
+
+ }
+
+
+ if (p_node->get_parent() && p_node->get_parent()->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ MeshInstance *mip = p_node->get_parent()->cast_to<MeshInstance>();
+ String d=str.substr(str.find("lod")+3,str.length());
+ if (d!="") {
+ if ((d[0]<'0' || d[0]>'9'))
+ d=d.substr(1,d.length());
+ if (d.length() && d[0]>='0' && d[0]<='9') {
+ float dist = d.to_double();
+ /// mi->set_draw_range_begin(dist);
+ // mi->set_draw_range_end(100000);
+
+ // mip->set_draw_range_begin(0);
+ // mip->set_draw_range_end(dist);
+
+ /*if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ fm->set_flag(Material::FLAG_UNSHADED,true);
+ fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ fm->set_hint(Material::HINT_NO_DEPTH_DRAW,true);
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }*/
+ }
+ }
+ }
+ }
+
+
+ if (p_flags&SCENE_FLAG_DETECT_LIGHTMAP_LAYER && _teststr(name,"lm") && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str=name;
+ int layer = str.substr(str.find("lm")+3,str.length()).to_int();
+ //mi->set_baked_light_texture_id(layer);
+ }
+#endif
+ if (_teststr(name,"colonly")) {
+
+ if (isroot)
+ return p_node;
+
+ if (p_node->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ Node * col = mi->create_trimesh_collision_node();
+ ERR_FAIL_COND_V(!col,NULL);
+
+ col->set_name(_fixstr(name,"colonly"));
+ col->cast_to<Spatial>()->set_transform(mi->get_transform());
+ p_node->replace_by(col);
+ memdelete(p_node);
+ p_node=col;
+
+ StaticBody *sb = col->cast_to<StaticBody>();
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_shape(sb->get_shape(0));
+ colshape->set_name("shape");
+ sb->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+ } else if (p_node->has_meta("empty_draw_type")) {
+ String empty_draw_type = String(p_node->get_meta("empty_draw_type"));
+ print_line(empty_draw_type);
+ StaticBody *sb = memnew( StaticBody);
+ sb->set_name(_fixstr(name,"colonly"));
+ sb->cast_to<Spatial>()->set_transform(p_node->cast_to<Spatial>()->get_transform());
+ p_node->replace_by(sb);
+ memdelete(p_node);
+ CollisionShape *colshape = memnew( CollisionShape);
+ if (empty_draw_type == "CUBE") {
+ BoxShape *boxShape = memnew( BoxShape);
+ boxShape->set_extents(Vector3(1, 1, 1));
+ colshape->set_shape(boxShape);
+ colshape->set_name("BoxShape");
+ } else if (empty_draw_type == "SINGLE_ARROW") {
+ RayShape *rayShape = memnew( RayShape);
+ rayShape->set_length(1);
+ colshape->set_shape(rayShape);
+ colshape->set_name("RayShape");
+ sb->cast_to<Spatial>()->rotate_x(Math_PI / 2);
+ } else if (empty_draw_type == "IMAGE") {
+ PlaneShape *planeShape = memnew( PlaneShape);
+ colshape->set_shape(planeShape);
+ colshape->set_name("PlaneShape");
+ } else {
+ SphereShape *sphereShape = memnew( SphereShape);
+ sphereShape->set_radius(1);
+ colshape->set_shape(sphereShape);
+ colshape->set_name("SphereShape");
+ }
+ sb->add_child(colshape);
+ colshape->set_owner(sb->get_owner());
+ }
+
+ } else if (_teststr(name,"rigid") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ // get mesh instance and bounding box
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ Rect3 aabb = mi->get_aabb();
+
+ // create a new rigid body collision node
+ RigidBody * rigid_body = memnew( RigidBody );
+ Node * col = rigid_body;
+ ERR_FAIL_COND_V(!col,NULL);
+
+ // remove node name postfix
+ col->set_name(_fixstr(name,"rigid"));
+ // get mesh instance xform matrix to the rigid body collision node
+ col->cast_to<Spatial>()->set_transform(mi->get_transform());
+ // save original node by duplicating it into a new instance and correcting the name
+ Node * mesh = p_node->duplicate();
+ mesh->set_name(_fixstr(name,"rigid"));
+ // reset the xform matrix of the duplicated node so it can inherit parent node xform
+ mesh->cast_to<Spatial>()->set_transform(Transform(Basis()));
+ // reparent the new mesh node to the rigid body collision node
+ p_node->add_child(mesh);
+ mesh->set_owner(p_node->get_owner());
+ // replace the original node with the rigid body collision node
+ p_node->replace_by(col);
+ memdelete(p_node);
+ p_node=col;
+
+ // create an alias for the rigid body collision node
+ RigidBody *rb = col->cast_to<RigidBody>();
+ // create a new Box collision shape and set the right extents
+ Ref<BoxShape> shape = memnew( BoxShape );
+ shape->set_extents(aabb.get_size() * 0.5);
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_name("shape");
+ colshape->set_shape(shape);
+ // reparent the new collision shape to the rigid body collision node
+ rb->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+
+ } else if (_teststr(name,"col") && p_node->cast_to<MeshInstance>()) {
+
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ mi->set_name(_fixstr(name,"col"));
+ Node *col= mi->create_trimesh_collision_node();
+ ERR_FAIL_COND_V(!col,NULL);
+
+ col->set_name("col");
+ p_node->add_child(col);
+
+ StaticBody *sb=col->cast_to<StaticBody>();
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_shape(sb->get_shape(0));
+ colshape->set_name("shape");
+ col->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+ sb->set_owner(p_node->get_owner());
+
+ } else if (_teststr(name,"navmesh") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> mesh=mi->get_mesh();
+ ERR_FAIL_COND_V(mesh.is_null(),NULL);
+ NavigationMeshInstance *nmi = memnew( NavigationMeshInstance );
+
+
+ nmi->set_name(_fixstr(name,"navmesh"));
+ Ref<NavigationMesh> nmesh = memnew( NavigationMesh);
+ nmesh->create_from_mesh(mesh);
+ nmi->set_navigation_mesh(nmesh);
+ nmi->cast_to<Spatial>()->set_transform(mi->get_transform());
+ p_node->replace_by(nmi);
+ memdelete(p_node);
+ p_node=nmi;
+ } else if (_teststr(name,"vehicle")) {
+
+ if (isroot)
+ return p_node;
+
+ Node *owner = p_node->get_owner();
+ Spatial *s = p_node->cast_to<Spatial>();
+ VehicleBody *bv = memnew( VehicleBody );
+ String n = _fixstr(p_node->get_name(),"vehicle");
+ bv->set_name(n);
+ p_node->replace_by(bv);
+ p_node->set_name(n);
+ bv->add_child(p_node);
+ bv->set_owner(owner);
+ p_node->set_owner(owner);
+ bv->set_transform(s->get_transform());
+ s->set_transform(Transform());
+
+ p_node=bv;
+
+
+ } else if (_teststr(name,"wheel")) {
+
+ if (isroot)
+ return p_node;
+
+ Node *owner = p_node->get_owner();
+ Spatial *s = p_node->cast_to<Spatial>();
+ VehicleWheel *bv = memnew( VehicleWheel );
+ String n = _fixstr(p_node->get_name(),"wheel");
+ bv->set_name(n);
+ p_node->replace_by(bv);
+ p_node->set_name(n);
+ bv->add_child(p_node);
+ bv->set_owner(owner);
+ p_node->set_owner(owner);
+ bv->set_transform(s->get_transform());
+ s->set_transform(Transform());
+
+ p_node=bv;
+
+ } else if (_teststr(name,"room") && p_node->cast_to<MeshInstance>()) {
+
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ PoolVector<Face3> faces = mi->get_faces(VisualInstance::FACES_SOLID);
+
+
+ BSP_Tree bsptree(faces);
+
+ Ref<RoomBounds> area = memnew( RoomBounds );
+ //area->set_bounds(faces);
+ //area->set_geometry_hint(faces);
+
+
+ Room * room = memnew( Room );
+ room->set_name(_fixstr(name,"room"));
+ room->set_transform(mi->get_transform());
+ room->set_room(area);
+
+ p_node->replace_by(room);
+ memdelete(p_node);
+ p_node=room;
+
+ } else if (_teststr(name,"room")) {
+
+ if (isroot)
+ return p_node;
+
+ Spatial *dummy = p_node->cast_to<Spatial>();
+ ERR_FAIL_COND_V(!dummy,NULL);
+
+ Room * room = memnew( Room );
+ room->set_name(_fixstr(name,"room"));
+ room->set_transform(dummy->get_transform());
+
+ p_node->replace_by(room);
+ memdelete(p_node);
+ p_node=room;
+
+ //room->compute_room_from_subtree();
+
+ } else if (_teststr(name,"portal") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ PoolVector<Face3> faces = mi->get_faces(VisualInstance::FACES_SOLID);
+
+ ERR_FAIL_COND_V(faces.size()==0,NULL);
+ //step 1 compute the plane
+ Set<Vector3> points;
+ Plane plane;
+
+ Vector3 center;
+
+ for(int i=0;i<faces.size();i++) {
+
+ Face3 f = faces.get(i);
+ Plane p = f.get_plane();
+ plane.normal+=p.normal;
+ plane.d+=p.d;
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 v = f.vertex[i].snapped(0.01);
+ if (!points.has(v)) {
+ points.insert(v);
+ center+=v;
+ }
+ }
+ }
+
+ plane.normal.normalize();
+ plane.d/=faces.size();
+ center/=points.size();
+
+ //step 2, create points
+
+ Transform t;
+ t.basis.from_z(plane.normal);
+ t.basis.transpose();
+ t.origin=center;
+
+ Vector<Point2> portal_points;
+
+ for(Set<Vector3>::Element *E=points.front();E;E=E->next()) {
+
+ Vector3 local = t.xform_inv(E->get());
+ portal_points.push_back(Point2(local.x,local.y));
+ }
+ // step 3 bubbly sort points
+
+ int swaps=0;
+
+ do {
+ swaps=0;
+
+ for(int i=0;i<portal_points.size()-1;i++) {
+
+ float a = portal_points[i].angle();
+ float b = portal_points[i+1].angle();
+
+ if (a>b) {
+ SWAP( portal_points[i], portal_points[i+1] );
+ swaps++;
+ }
+
+ }
+
+ } while(swaps);
+
+
+ Portal *portal = memnew( Portal );
+
+ portal->set_shape(portal_points);
+ portal->set_transform( mi->get_transform() * t);
+
+ p_node->replace_by(portal);
+ memdelete(p_node);
+ p_node=portal;
+
+ } else if (p_node->cast_to<MeshInstance>()) {
+
+ //last attempt, maybe collision insde the mesh data
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> mesh = mi->get_mesh();
+ if (!mesh.is_null()) {
+
+ if (_teststr(mesh->get_name(),"col")) {
+
+ mesh->set_name( _fixstr(mesh->get_name(),"col") );
+ Ref<Shape> shape;
+
+ if (collision_map.has(mesh)) {
+ shape = collision_map[mesh];
+
+ } else {
+
+ shape = mesh->create_trimesh_shape();
+ if (!shape.is_null())
+ collision_map[mesh]=shape;
+
+
+ }
+
+ if (!shape.is_null()) {
+#if 0
+ StaticBody* static_body = memnew( StaticBody );
+ ERR_FAIL_COND_V(!static_body,NULL);
+ static_body->set_name( String(mesh->get_name()) + "_col" );
+ shape->set_name(static_body->get_name());
+ static_body->add_shape(shape);
+
+ mi->add_child(static_body);
+ if (mi->get_owner())
+ static_body->set_owner( mi->get_owner() );
+#endif
+ }
+
+ }
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = mesh->surface_get_material(i);
+ if (fm.is_valid()) {
+ String name = fm->get_name();
+ /* if (_teststr(name,"alpha")) {
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ name=_fixstr(name,"alpha");
+ }
+
+ if (_teststr(name,"vcol")) {
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY,true);
+ name=_fixstr(name,"vcol");
+ }*/
+ fm->set_name(name);
+ }
+ }
+
+ }
+
+ }
+
+
+ return p_node;
+}
+
+
+void ResourceImporterScene::_create_clips(Node *scene, const Array& p_clips,bool p_bake_all) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+ if (!anim->has_animation("default"))
+ return;
+
+
+ Ref<Animation> default_anim = anim->get_animation("default");
+
+ for(int i=0;i<p_clips.size();i+=4) {
+
+ String name = p_clips[i];
+ float from=p_clips[i+1];
+ float to=p_clips[i+2];
+ bool loop=p_clips[i+3];
+ if (from>=to)
+ continue;
+
+ Ref<Animation> new_anim = memnew( Animation );
+
+ for(int j=0;j<default_anim->get_track_count();j++) {
+
+
+ List<float> keys;
+ int kc = default_anim->track_get_key_count(j);
+ int dtrack=-1;
+ for(int k=0;k<kc;k++) {
+
+ float kt = default_anim->track_get_key_time(j,k);
+ if (kt>=from && kt<to) {
+
+ //found a key within range, so create track
+ if (dtrack==-1) {
+ new_anim->add_track(default_anim->track_get_type(j));
+ dtrack = new_anim->get_track_count()-1;
+ new_anim->track_set_path(dtrack,default_anim->track_get_path(j));
+
+ if (kt>(from+0.01) && k>0) {
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,from,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,0,p,q,s);
+ }
+ }
+
+ }
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_get_key(j,k,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,kt-from,p,q,s);
+ }
+
+ }
+
+ if (dtrack!=-1 && kt>=to) {
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,to,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,to-from,p,q,s);
+ }
+ }
+
+ }
+
+ if (dtrack==-1 && p_bake_all) {
+ new_anim->add_track(default_anim->track_get_type(j));
+ dtrack = new_anim->get_track_count()-1;
+ new_anim->track_set_path(dtrack,default_anim->track_get_path(j));
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+
+
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,from,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,0,p,q,s);
+ default_anim->transform_track_interpolate(j,to,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,to-from,p,q,s);
+ }
+
+ }
+ }
+
+
+ new_anim->set_loop(loop);
+ new_anim->set_length(to-from);
+ anim->add_animation(name,new_anim);
+ }
+
+ anim->remove_animation("default"); //remove default (no longer needed)
+}
+
+void ResourceImporterScene::_filter_anim_tracks(Ref<Animation> anim,Set<String> &keep) {
+
+ Ref<Animation> a = anim;
+ ERR_FAIL_COND(!a.is_valid());
+
+ print_line("From Anim "+anim->get_name()+":");
+
+ for(int j=0;j<a->get_track_count();j++) {
+
+ String path = a->track_get_path(j);
+
+ if (!keep.has(path)) {
+
+ print_line("Remove: "+path);
+ a->remove_track(j);
+ j--;
+ }
+
+ }
+}
+
+
+void ResourceImporterScene::_filter_tracks(Node *scene, const String& p_text) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+ Vector<String> strings = p_text.split("\n");
+ for(int i=0;i<strings.size();i++) {
+
+ strings[i]=strings[i].strip_edges();
+ }
+
+ List<StringName> anim_names;
+ anim->get_animation_list(&anim_names);
+ for(List<StringName>::Element *E=anim_names.front();E;E=E->next()) {
+
+ String name = E->get();
+ bool valid_for_this=false;
+ bool valid=false;
+
+ Set<String> keep;
+ Set<String> keep_local;
+
+
+ for(int i=0;i<strings.size();i++) {
+
+
+ if (strings[i].begins_with("@")) {
+
+ valid_for_this=false;
+ for(Set<String>::Element *F=keep_local.front();F;F=F->next()) {
+ keep.insert(F->get());
+ }
+ keep_local.clear();
+
+ Vector<String> filters=strings[i].substr(1,strings[i].length()).split(",");
+ for(int j=0;j<filters.size();j++) {
+
+ String fname = filters[j].strip_edges();
+ if (fname=="")
+ continue;
+ int fc = fname[0];
+ bool plus;
+ if (fc=='+')
+ plus=true;
+ else if (fc=='-')
+ plus=false;
+ else
+ continue;
+
+ String filter=fname.substr(1,fname.length()).strip_edges();
+
+ if (!name.matchn(filter))
+ continue;
+ valid_for_this=plus;
+ }
+
+ if (valid_for_this)
+ valid=true;
+
+ } else if (valid_for_this) {
+
+ Ref<Animation> a = anim->get_animation(name);
+ if (!a.is_valid())
+ continue;
+
+ for(int j=0;j<a->get_track_count();j++) {
+
+ String path = a->track_get_path(j);
+
+ String tname = strings[i];
+ if (tname=="")
+ continue;
+ int fc = tname[0];
+ bool plus;
+ if (fc=='+')
+ plus=true;
+ else if (fc=='-')
+ plus=false;
+ else
+ continue;
+
+ String filter=tname.substr(1,tname.length()).strip_edges();
+
+ if (!path.matchn(filter))
+ continue;
+
+ if (plus)
+ keep_local.insert(path);
+ else if (!keep.has(path)) {
+ keep_local.erase(path);
+ }
+ }
+
+ }
+
+ }
+
+ if (valid) {
+ for(Set<String>::Element *F=keep_local.front();F;F=F->next()) {
+ keep.insert(F->get());
+ }
+ _filter_anim_tracks(anim->get_animation(name),keep);
+ } else {
+
+ }
+
+ }
+
+
+
+}
+
+void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_error,float p_max_ang_error,float p_max_angle) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+
+ List<StringName> anim_names;
+ anim->get_animation_list(&anim_names);
+ for(List<StringName>::Element *E=anim_names.front();E;E=E->next()) {
+
+ Ref<Animation> a = anim->get_animation(E->get());
+ a->optimize(p_max_lin_error,p_max_ang_error,Math::deg2rad(p_max_angle));
+ }
+}
+
+
+static String _make_extname(const String& p_str) {
+
+ String ext_name=p_str.replace(".","_");
+ ext_name=ext_name.replace(":","_");
+ ext_name=ext_name.replace("\"","_");
+ ext_name=ext_name.replace("<","_");
+ ext_name=ext_name.replace(">","_");
+ ext_name=ext_name.replace("/","_");
+ ext_name=ext_name.replace("|","_");
+ ext_name=ext_name.replace("\\","_");
+ ext_name=ext_name.replace("?","_");
+ ext_name=ext_name.replace("*","_");
+
+ return ext_name;
+}
+
+void ResourceImporterScene::_make_external_resources(Node* p_node,const String& p_base_path, bool p_make_materials, bool p_make_meshes, Map<Ref<Material>,Ref<Material> >& p_materials, Map<Ref<Mesh>,Ref<Mesh> >& p_meshes) {
+
+ List<PropertyInfo> pi;
+
+ p_node->get_property_list(&pi);
+
+ for (List<PropertyInfo>::Element *E=pi.front();E;E=E->next()) {
+
+ if (E->get().type==Variant::OBJECT) {
+
+ Ref<Material> mat = p_node->get(E->get().name);
+ if (p_make_materials && mat.is_valid() && mat->get_name()!="") {
+
+
+ if (!p_materials.has(mat)) {
+
+ String ext_name = p_base_path+"."+_make_extname(mat->get_name())+".mtl";
+ if (FileAccess::exists(ext_name)) {
+ //if exists, use it
+ Ref<Material> existing = ResourceLoader::load(ext_name);
+ p_materials[mat]=existing;
+ } else {
+
+ ResourceSaver::save(ext_name,mat,ResourceSaver::FLAG_CHANGE_PATH);
+ p_materials[mat]=mat;
+ }
+ }
+
+ if (p_materials[mat]!=mat) {
+
+ p_node->set(E->get().name,p_materials[mat]);
+ }
+ } else {
+
+ Ref<Mesh> mesh = p_node->get(E->get().name);
+
+ if (mesh.is_valid()) {
+
+ bool mesh_just_added=false;
+
+ if (p_make_meshes) {
+
+ if (!p_meshes.has(mesh)) {
+
+ String ext_name = p_base_path+"."+_make_extname(mesh->get_name())+".msh";
+ if (FileAccess::exists(ext_name)) {
+ //if exists, use it
+ Ref<Mesh> existing = ResourceLoader::load(ext_name);
+ p_meshes[mesh]=existing;
+ } else {
+
+ ResourceSaver::save(ext_name,mesh,ResourceSaver::FLAG_CHANGE_PATH);
+ p_meshes[mesh]=mesh;
+ mesh_just_added=true;
+ }
+
+
+ }
+ }
+
+
+ if (p_make_materials){
+
+ if (mesh_just_added || !p_meshes.has(mesh)) {
+
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+ mat=mesh->surface_get_material(i);
+ if (!mat.is_valid() || mat->get_name()=="")
+ continue;
+
+ if (!p_materials.has(mat)) {
+
+ String ext_name = p_base_path+"."+_make_extname(mat->get_name())+".mtl";
+ if (FileAccess::exists(ext_name)) {
+ //if exists, use it
+ Ref<Material> existing = ResourceLoader::load(ext_name);
+ p_materials[mat]=existing;
+ } else {
+
+ ResourceSaver::save(ext_name,mat,ResourceSaver::FLAG_CHANGE_PATH);
+ p_materials[mat]=mat;
+ }
+ }
+
+ if (p_materials[mat]!=mat) {
+
+ mesh->surface_set_material(i,p_materials[mat]);
+ }
+
+ }
+
+ if(!p_make_meshes) {
+ p_meshes[mesh]=Ref<Mesh>(); //save it anyway, so it won't be checked again
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ _make_external_resources(p_node->get_child(i),p_base_path,p_make_materials,p_make_meshes,p_materials,p_meshes);
+ }
+}
+
+
+void ResourceImporterScene::get_import_options(List<ImportOption> *r_options,int p_preset) const {
+
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING,"nodes/root_type",PROPERTY_HINT_TYPE_STRING,"Node"),"Spatial"));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING,"nodes/root_name"),"Scene Root"));
+
+ List<String> script_extentions;
+ ResourceLoader::get_recognized_extensions_for_type("Script",&script_extentions);
+
+ String script_ext_hint;
+
+ for(List<String>::Element *E=script_extentions.front();E;E=E->next()) {
+ if (script_ext_hint!="")
+ script_ext_hint+=",";
+ script_ext_hint+="*."+E->get();
+ }
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING,"nodes/custom_script",PROPERTY_HINT_FILE,script_ext_hint),""));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"materials/location",PROPERTY_HINT_ENUM,"Node,Mesh"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"materials/storage",PROPERTY_HINT_ENUM,"Bult-In,Files"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"geometry/compress"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"geometry/ensure_tangents"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"geometry/storage",PROPERTY_HINT_ENUM,"Built-In,Files"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"animation/import",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"animation/fps",PROPERTY_HINT_RANGE,"1,120,1"),15));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING,"animation/filter_script",PROPERTY_HINT_MULTILINE_TEXT),""));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"animation/optimizer/enabled",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"animation/optimizer/max_linear_error"),0.05));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"animation/optimizer/max_angular_error"),0.01));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"animation/optimizer/max_angle"),22));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"animation/optimizer/remove_unused_tracks"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"animation/clips/amount",PROPERTY_HINT_RANGE,"0,256,1",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED),0));
+ for(int i=0;i<256;i++) {
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING,"animation/clip_"+itos(i+1)+"/name"),""));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"animation/clip_"+itos(i+1)+"/start_frame"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"animation/clip_"+itos(i+1)+"/end_frame"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"animation/clip_"+itos(i+1)+"/loops"),false));
+ }
+}
+
+Error ResourceImporterScene::import(const String& p_source_file, const String& p_save_path, const Map<StringName,Variant>& p_options, List<String>* r_platform_variants, List<String> *r_gen_files) {
+
+ String src_path=p_source_file;
+
+ Ref<EditorSceneImporter> importer;
+ String ext=src_path.get_extension().to_lower();
+
+
+ EditorProgress progress("import",TTR("Import Scene"),104);
+ progress.step(TTR("Importing Scene.."),0);
+
+ for(Set< Ref<EditorSceneImporter> >::Element *E=importers.front();E;E=E->next()) {
+
+ List<String> extensions;
+ E->get()->get_extensions(&extensions);
+
+ for(List<String>::Element *F=extensions.front();F;F=F->next()) {
+
+ if (F->get().to_lower()==ext) {
+
+ importer = E->get();
+ break;
+ }
+ }
+
+ if (importer.is_valid())
+ break;
+ }
+
+ ERR_FAIL_COND_V(!importer.is_valid(),ERR_FILE_UNRECOGNIZED);
+
+ float fps=p_options["animation/fps"];
+
+
+
+ int import_flags=EditorSceneImporter::IMPORT_ANIMATION_DETECT_LOOP;
+ if (!bool(p_options["animation/optimizer/remove_unused_tracks"]))
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS;
+
+ if (bool(p_options["animation/import"]))
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION;
+
+ if (bool(p_options["geometry/ensure_tangents"]))
+ import_flags|=EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS;
+
+ if (int(p_options["materials/location"])==0)
+ import_flags|=EditorSceneImporter::IMPORT_MATERIALS_IN_INSTANCES;
+
+
+ Error err=OK;
+ List<String> missing_deps; // for now, not much will be done with this
+ Node *scene = importer->import_scene(src_path,import_flags,fps,&missing_deps,&err);
+ if (!scene || err!=OK) {
+ return err;
+ }
+
+ String root_type = p_options["nodes/root_type"];
+
+ if (scene->get_class()!=root_type) {
+ Object *base = ClassDB::instance(root_type);
+ Node *base_node = NULL;
+ if (base)
+ base_node=base->cast_to<Node>();
+
+ if (base_node) {
+
+ scene->replace_by(base_node);
+ memdelete(scene);
+ scene=base_node;
+ }
+ }
+
+ scene->set_name(p_options["nodes/root_name"]);
+
+
+ err=OK;
+
+ String animation_filter = String(p_options["animation/filter_script"]).strip_edges();
+
+ bool use_optimizer = p_options["animation/optimizer/enabled"];
+ float anim_optimizer_linerr=p_options["animation/optimizer/max_linear_error"];
+ float anim_optimizer_angerr=p_options["animation/optimizer/max_angular_error"];
+ float anim_optimizer_maxang=p_options["animation/optimizer/max_angle"];
+
+ Map<Ref<Mesh>,Ref<Shape> > collision_map;
+
+ scene=_fix_node(scene,scene,collision_map);
+
+ if (use_optimizer) {
+ _optimize_animations(scene,anim_optimizer_linerr,anim_optimizer_angerr,anim_optimizer_maxang);
+ }
+
+ Array animation_clips;
+ {
+
+
+ int clip_count = p_options["animation/clips/amount"];
+
+ for(int i=0;i<clip_count;i++) {
+ String name = p_options["animation/clip_"+itos(i+1)+"/name"];
+ int from_frame = p_options["animation/clip_"+itos(i+1)+"/start_frame"];
+ int end_frame = p_options["animation/clip_"+itos(i+1)+"/end_frame"];
+ bool loop = p_options["animation/clip_"+itos(i+1)+"/loops"];
+
+ animation_clips.push_back(name);
+ animation_clips.push_back(from_frame/fps);
+ animation_clips.push_back(end_frame/fps);
+ animation_clips.push_back(loop);
+ }
+
+ }
+ if (animation_clips.size()) {
+ _create_clips(scene,animation_clips,!bool(p_options["animation/optimizer/remove_unused_tracks"]));
+ }
+
+ if (animation_filter!="") {
+ _filter_tracks(scene,animation_filter);
+ }
+
+
+ bool external_materials = p_options["materials/storage"];
+ bool external_meshes = p_options["geometry/storage"];
+
+ if (external_materials || external_meshes) {
+ Map<Ref<Material>, Ref<Material> > mat_map;
+ Map<Ref<Mesh>, Ref<Mesh> > mesh_map;
+ _make_external_resources(scene,p_source_file.get_basename(),external_materials,external_meshes,mat_map,mesh_map);
+ }
+
+ progress.step(TTR("Running Custom Script.."),2);
+
+ String post_import_script_path = p_options["nodes/custom_script"];
+ Ref<EditorScenePostImport> post_import_script;
+
+ if (post_import_script_path!="") {
+ post_import_script_path = post_import_script_path; // FIXME: is there a good reason for this?
+ Ref<Script> scr = ResourceLoader::load(post_import_script_path);
+ if (!scr.is_valid()) {
+ EditorNode::add_io_error(TTR("Couldn't load post-import script:")+" "+post_import_script_path);
+ } else {
+
+ post_import_script = Ref<EditorScenePostImport>( memnew( EditorScenePostImport ) );
+ post_import_script->set_script(scr.get_ref_ptr());
+ if (!post_import_script->get_script_instance()) {
+ EditorNode::add_io_error(TTR("Invalid/broken script for post-import (check console):")+" "+post_import_script_path);
+ post_import_script.unref();
+ return ERR_CANT_CREATE;
+ }
+ }
+ }
+
+
+ if (post_import_script.is_valid()) {
+ scene = post_import_script->post_import(scene);
+ if (!scene) {
+ EditorNode::add_io_error(TTR("Error running post-import script:")+" "+post_import_script_path);
+ return err;
+ }
+
+
+ }
+
+ progress.step(TTR("Saving.."),104);
+
+ Ref<PackedScene> packer = memnew( PackedScene );
+ packer->pack(scene);
+ print_line("SAVING TO: "+p_save_path+".scn");
+ err = ResourceSaver::save(p_save_path+".scn",packer); //do not take over, let the changed files reload themselves
+
+ memdelete(scene);
+
+ EditorNode::get_singleton()->reload_scene(p_source_file);
+
+ return OK;
+}
+
+ResourceImporterScene *ResourceImporterScene::singleton=NULL;
+
+ResourceImporterScene::ResourceImporterScene()
+{
+ singleton=this;
+}
diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h
new file mode 100644
index 0000000000..cfa44b160a
--- /dev/null
+++ b/editor/import/resource_importer_scene.h
@@ -0,0 +1,93 @@
+#ifndef RESOURCEIMPORTERSCENE_H
+#define RESOURCEIMPORTERSCENE_H
+
+#include "io/resource_import.h"
+#include "scene/resources/animation.h"
+#include "scene/resources/shape.h"
+
+class Material;
+
+class EditorSceneImporter : public Reference {
+
+ GDCLASS(EditorSceneImporter,Reference );
+public:
+
+ enum ImportFlags {
+ IMPORT_SCENE=1,
+ IMPORT_ANIMATION=2,
+ IMPORT_ANIMATION_DETECT_LOOP=4,
+ IMPORT_ANIMATION_OPTIMIZE=8,
+ IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS=16,
+ IMPORT_ANIMATION_KEEP_VALUE_TRACKS=32,
+ IMPORT_GENERATE_TANGENT_ARRAYS=256,
+ IMPORT_FAIL_ON_MISSING_DEPENDENCIES=512,
+ IMPORT_MATERIALS_IN_INSTANCES=1024
+
+ };
+
+ virtual uint32_t get_import_flags() const=0;
+ virtual void get_extensions(List<String> *r_extensions) const=0;
+ virtual Node* import_scene(const String& p_path,uint32_t p_flags,int p_bake_fps,List<String> *r_missing_deps,Error* r_err=NULL)=0;
+ virtual Ref<Animation> import_animation(const String& p_path,uint32_t p_flags)=0;
+
+
+
+ EditorSceneImporter() {}
+};
+
+class EditorScenePostImport : public Reference {
+
+ GDCLASS(EditorScenePostImport,Reference );
+protected:
+
+ static void _bind_methods();
+public:
+
+ virtual Node* post_import(Node* p_scene);
+ EditorScenePostImport();
+};
+
+
+class ResourceImporterScene : public ResourceImporter {
+ GDCLASS(ResourceImporterScene,ResourceImporter)
+
+ Set< Ref<EditorSceneImporter> > importers;
+
+ static ResourceImporterScene *singleton;
+public:
+
+ static ResourceImporterScene *get_singleton() { return singleton; }
+
+ const Set< Ref<EditorSceneImporter> >& get_importers() const { return importers; }
+
+ void add_importer(Ref<EditorSceneImporter> p_importer) { importers.insert(p_importer); }
+
+ virtual String get_importer_name() const;
+ virtual String get_visible_name() const;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual String get_save_extension() const;
+ virtual String get_resource_type() const;
+
+
+ virtual int get_preset_count() const;
+ virtual String get_preset_name(int p_idx) const;
+
+ virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
+ virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
+
+ void _make_external_resources(Node* p_node,const String& p_base_path, bool p_make_materials, bool p_make_meshes, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<Mesh>, Ref<Mesh> > &p_meshes);
+
+ Node* _fix_node(Node *p_node,Node *p_root,Map<Ref<Mesh>,Ref<Shape> > &collision_map);
+
+ void _create_clips(Node *scene, const Array& p_clips,bool p_bake_all);
+ void _filter_anim_tracks(Ref<Animation> anim,Set<String> &keep);
+ void _filter_tracks(Node *scene, const String& p_text);
+ void _optimize_animations(Node *scene, float p_max_lin_error,float p_max_ang_error,float p_max_angle);
+
+ virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
+
+ ResourceImporterScene();
+};
+
+
+#endif // RESOURCEIMPORTERSCENE_H
diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp
new file mode 100644
index 0000000000..43c7ff79c6
--- /dev/null
+++ b/editor/import/resource_importer_texture.cpp
@@ -0,0 +1,393 @@
+#include "resource_importer_texture.h"
+#include "io/image_loader.h"
+#include "scene/resources/texture.h"
+#include "editor/editor_file_system.h"
+#include "io/config_file.h"
+
+
+void ResourceImporterTexture::_texture_reimport_srgb(const Ref<StreamTexture>& p_tex) {
+
+ singleton->mutex->lock();
+ StringName path = p_tex->get_path();
+
+ if (!singleton->make_flags.has(path)) {
+ singleton->make_flags[path]=0;
+ }
+
+ singleton->make_flags[path]|=MAKE_SRGB_FLAG;
+
+ print_line("requesting srgb for "+String(path));
+
+ singleton->mutex->unlock();
+
+}
+
+
+
+void ResourceImporterTexture::_texture_reimport_3d(const Ref<StreamTexture>& p_tex) {
+
+
+ singleton->mutex->lock();
+ StringName path = p_tex->get_path();
+
+ if (!singleton->make_flags.has(path)) {
+ singleton->make_flags[path]=0;
+ }
+
+ singleton->make_flags[path]|=MAKE_3D_FLAG;
+
+ print_line("requesting 3d for "+String(path));
+
+ singleton->mutex->unlock();
+
+
+}
+
+void ResourceImporterTexture::update_imports() {
+
+ if (EditorFileSystem::get_singleton()->is_scanning() || EditorFileSystem::get_singleton()->is_importing()) {
+ return; // do nothing for noe
+ }
+ mutex->lock();
+
+ if (make_flags.empty()) {
+ mutex->unlock();
+ return;
+ }
+
+ Vector<String> to_reimport;
+ for (Map<StringName,int>::Element *E=make_flags.front();E;E=E->next()) {
+
+ print_line("checking for reimport "+String(E->key()));
+
+
+ Ref<ConfigFile> cf;
+ cf.instance();
+ String src_path = String(E->key())+".import";
+
+ Error err = cf->load(src_path);
+ ERR_CONTINUE(err!=OK);
+
+ bool changed=false;
+ if (E->get()&MAKE_SRGB_FLAG && int(cf->get_value("params","flags/srgb"))==2) {
+ cf->set_value("params","flags/srgb",1);
+ changed=true;
+ }
+
+ if (E->get()&MAKE_3D_FLAG && bool(cf->get_value("params","detect_3d"))) {
+ cf->set_value("params","detect_3d",false);
+ cf->set_value("params","compress/mode",2);
+ cf->set_value("params","flags/repeat",true);
+ cf->set_value("params","flags/filter",true);
+ cf->set_value("params","flags/mipmaps",true);
+ changed=true;
+ }
+
+ if (changed) {
+ cf->save(src_path);
+ to_reimport.push_back(E->key());
+ }
+
+ }
+
+ make_flags.clear();
+
+ mutex->unlock();
+
+ if (to_reimport.size()) {
+ EditorFileSystem::get_singleton()->reimport_files(to_reimport);
+ }
+
+}
+
+
+
+String ResourceImporterTexture::get_importer_name() const {
+
+ return "texture";
+}
+
+String ResourceImporterTexture::get_visible_name() const{
+
+ return "Texture";
+}
+void ResourceImporterTexture::get_recognized_extensions(List<String> *p_extensions) const{
+
+ ImageLoader::get_recognized_extensions(p_extensions);
+}
+String ResourceImporterTexture::get_save_extension() const {
+ return "stex";
+}
+
+String ResourceImporterTexture::get_resource_type() const{
+
+ return "StreamTexture";
+}
+
+bool ResourceImporterTexture::get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const {
+
+ if (p_option=="compress/lossy_quality" && int(p_options["compress/mode"])!=COMPRESS_LOSSY)
+ return false;
+
+ return true;
+}
+
+int ResourceImporterTexture::get_preset_count() const {
+ return 4;
+}
+String ResourceImporterTexture::get_preset_name(int p_idx) const {
+
+ static const char* preset_names[]={
+ "2D, Detect 3D",
+ "2D",
+ "2D Pixel",
+ "3D"
+ };
+
+ return preset_names[p_idx];
+}
+
+
+void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options,int p_preset) const {
+
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"compress/mode",PROPERTY_HINT_ENUM,"Lossless,Lossy,Video RAM,Uncompressed",PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED),p_preset==PRESET_3D?2:0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"compress/lossy_quality",PROPERTY_HINT_RANGE,"0,1,0.01"),0.7));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"flags/repeat",PROPERTY_HINT_ENUM,"Disabled,Enabled,Mirrored"),p_preset==PRESET_3D?1:0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/filter"),p_preset==PRESET_2D_PIXEL?false:true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/mipmaps"),p_preset==PRESET_3D?true:false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/anisotropic"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"flags/srgb",PROPERTY_HINT_ENUM,"Disable,Enable,Detect"),2));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/fix_alpha_border"),p_preset!=PRESET_3D?true:false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/premult_alpha"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"stream"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"size_limit",PROPERTY_HINT_RANGE,"0,4096,1"),0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"detect_3d"),p_preset==PRESET_DETECT));
+
+}
+
+
+void ResourceImporterTexture::_save_stex(const Image& p_image, const String& p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb) {
+
+
+ FileAccess *f = FileAccess::open(p_to_path,FileAccess::WRITE);
+ f->store_8('G');
+ f->store_8('D');
+ f->store_8('S');
+ f->store_8('T'); //godot streamable texture
+
+ f->store_32(p_image.get_width());
+ f->store_32(p_image.get_height());
+ f->store_32(p_texture_flags);
+
+ uint32_t format=0;
+
+ if (p_streamable)
+ format|=StreamTexture::FORMAT_BIT_STREAM;
+ if (p_mipmaps || p_compress_mode==COMPRESS_VIDEO_RAM) //VRAM always uses mipmaps
+ format|=StreamTexture::FORMAT_BIT_HAS_MIPMAPS; //mipmaps bit
+ if (p_detect_3d)
+ format|=StreamTexture::FORMAT_BIT_DETECT_3D;
+ if (p_detect_srgb)
+ format|=StreamTexture::FORMAT_BIT_DETECT_SRGB;
+
+
+ switch (p_compress_mode) {
+ case COMPRESS_LOSSLESS: {
+
+ Image image = p_image;
+ if (p_mipmaps) {
+ image.generate_mipmaps();
+ } else {
+ image.clear_mipmaps();
+ }
+
+ int mmc = image.get_mipmap_count() + 1;
+
+ format|=StreamTexture::FORMAT_BIT_LOSSLESS;
+ f->store_32(format);
+ f->store_32(mmc);
+
+ for(int i=0;i<mmc;i++) {
+
+ if (i>0) {
+ image.shrink_x2();
+ }
+
+ PoolVector<uint8_t> data = Image::lossless_packer(image);
+ int data_len = data.size();
+ f->store_32(data_len);
+
+ PoolVector<uint8_t>::Read r= data.read();
+ f->store_buffer(r.ptr(),data_len);
+
+ }
+
+
+ } break;
+ case COMPRESS_LOSSY: {
+ Image image = p_image;
+ if (p_mipmaps) {
+ image.generate_mipmaps();
+ } else {
+ image.clear_mipmaps();
+ }
+
+ int mmc = image.get_mipmap_count() + 1;
+
+ format|=StreamTexture::FORMAT_BIT_LOSSY;
+ f->store_32(format);
+ f->store_32(mmc);
+
+ for(int i=0;i<mmc;i++) {
+
+ if (i>0) {
+ image.shrink_x2();
+ }
+
+ PoolVector<uint8_t> data = Image::lossy_packer(image,p_lossy_quality);
+ int data_len = data.size();
+ f->store_32(data_len);
+
+ PoolVector<uint8_t>::Read r = data.read();
+ f->store_buffer(r.ptr(),data_len);
+
+ }
+ } break;
+ case COMPRESS_VIDEO_RAM: {
+
+ Image image = p_image;
+ image.generate_mipmaps();
+ image.compress(p_vram_compression);
+
+ format |= image.get_format();
+
+ f->store_32(format);
+
+ PoolVector<uint8_t> data=image.get_data();
+ int dl = data.size();
+ PoolVector<uint8_t>::Read r = data.read();
+ f->store_buffer(r.ptr(),dl);
+
+ } break;
+ case COMPRESS_UNCOMPRESSED: {
+
+ Image image = p_image;
+ if (p_mipmaps) {
+ image.generate_mipmaps();
+ } else {
+ image.clear_mipmaps();
+ }
+
+ format |= image.get_format();
+ f->store_32(format);
+
+ PoolVector<uint8_t> data=image.get_data();
+ int dl = data.size();
+ PoolVector<uint8_t>::Read r = data.read();
+
+ f->store_buffer(r.ptr(),dl);
+
+ } break;
+ }
+
+ memdelete(f);
+}
+
+Error ResourceImporterTexture::import(const String& p_source_file, const String& p_save_path, const Map<StringName,Variant>& p_options, List<String>* r_platform_variants, List<String> *r_gen_files) {
+
+ int compress_mode = p_options["compress/mode"];
+ float lossy= p_options["compress/lossy_quality"];
+ int repeat= p_options["flags/repeat"];
+ bool filter= p_options["flags/filter"];
+ bool mipmaps= p_options["flags/mipmaps"];
+ bool anisotropic= p_options["flags/anisotropic"];
+ int srgb= p_options["flags/srgb"];
+ bool fix_alpha_border= p_options["process/fix_alpha_border"];
+ bool premult_alpha= p_options["process/premult_alpha"];
+ bool stream = p_options["stream"];
+ int size_limit = p_options["size_limit"];
+
+
+ Image image;
+ Error err = ImageLoader::load_image(p_source_file,&image);
+ if (err!=OK)
+ return err;
+
+
+ int tex_flags=0;
+ if (repeat>0)
+ tex_flags|=Texture::FLAG_REPEAT;
+ if (repeat==2)
+ tex_flags|=Texture::FLAG_MIRRORED_REPEAT;
+ if (filter)
+ tex_flags|=Texture::FLAG_FILTER;
+ if (mipmaps || compress_mode==COMPRESS_VIDEO_RAM)
+ tex_flags|=Texture::FLAG_MIPMAPS;
+ if (anisotropic)
+ tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
+ if (srgb==1)
+ tex_flags|=Texture::FLAG_CONVERT_TO_LINEAR;
+
+ if (size_limit >0 && (image.get_width()>size_limit || image.get_height()>size_limit )) {
+ //limit size
+ if (image.get_width() >= image.get_height()) {
+ int new_width = size_limit;
+ int new_height = image.get_height() * new_width / image.get_width();
+
+ image.resize(new_width,new_height,Image::INTERPOLATE_CUBIC);
+ } else {
+
+ int new_height = size_limit;
+ int new_width = image.get_width() * new_height / image.get_height();
+
+ image.resize(new_width,new_height,Image::INTERPOLATE_CUBIC);
+ }
+ }
+
+ if (fix_alpha_border) {
+ image.fix_alpha_edges();
+ }
+
+ if (premult_alpha) {
+ image.premultiply_alpha();
+ }
+
+ bool detect_3d = p_options["detect_3d"];
+ bool detect_srgb = srgb==2;
+
+ if (compress_mode==COMPRESS_VIDEO_RAM) {
+ //must import in all formats
+ //Android, GLES 2.x
+ _save_stex(image,p_save_path+".etc.stex",compress_mode,lossy,Image::COMPRESS_ETC,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
+ r_platform_variants->push_back("etc");
+ //_save_stex(image,p_save_path+".etc2.stex",compress_mode,lossy,Image::COMPRESS_ETC2,mipmaps,tex_flags,stream);
+ //r_platform_variants->push_back("etc2");
+ _save_stex(image,p_save_path+".s3tc.stex",compress_mode,lossy,Image::COMPRESS_S3TC,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
+ r_platform_variants->push_back("s3tc");
+
+ } else {
+ //import normally
+ _save_stex(image,p_save_path+".stex",compress_mode,lossy,Image::COMPRESS_16BIT /*this is ignored */,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
+ }
+
+ return OK;
+}
+
+ResourceImporterTexture *ResourceImporterTexture::singleton=NULL;
+
+ResourceImporterTexture::ResourceImporterTexture()
+{
+
+ singleton=this;
+ StreamTexture::request_3d_callback=_texture_reimport_3d;
+ StreamTexture::request_srgb_callback=_texture_reimport_srgb;
+ mutex = Mutex::create();
+}
+
+ResourceImporterTexture::~ResourceImporterTexture()
+{
+
+ memdelete(mutex);
+}
+
diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h
new file mode 100644
index 0000000000..4c795e132c
--- /dev/null
+++ b/editor/import/resource_importer_texture.h
@@ -0,0 +1,70 @@
+#ifndef RESOURCEIMPORTTEXTURE_H
+#define RESOURCEIMPORTTEXTURE_H
+
+#include "io/resource_import.h"
+class StreamTexture;
+
+class ResourceImporterTexture : public ResourceImporter {
+ GDCLASS(ResourceImporterTexture,ResourceImporter)
+
+
+
+protected:
+
+ enum {
+ MAKE_3D_FLAG=1,
+ MAKE_SRGB_FLAG=2
+ };
+
+ Mutex *mutex;
+ Map<StringName,int> make_flags;
+
+ static void _texture_reimport_srgb(const Ref<StreamTexture>& p_tex);
+ static void _texture_reimport_3d(const Ref<StreamTexture>& p_tex);
+
+
+
+
+ static ResourceImporterTexture *singleton;
+public:
+
+ static ResourceImporterTexture *get_singleton() { return singleton; }
+ virtual String get_importer_name() const;
+ virtual String get_visible_name() const;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual String get_save_extension() const;
+ virtual String get_resource_type() const;
+
+
+ enum Preset {
+ PRESET_DETECT,
+ PRESET_2D,
+ PRESET_2D_PIXEL,
+ PRESET_3D,
+ };
+
+ enum CompressMode {
+ COMPRESS_LOSSLESS,
+ COMPRESS_LOSSY,
+ COMPRESS_VIDEO_RAM,
+ COMPRESS_UNCOMPRESSED
+ };
+
+ virtual int get_preset_count() const;
+ virtual String get_preset_name(int p_idx) const;
+
+ virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
+ virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
+
+ void _save_stex(const Image& p_image, const String& p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable,bool p_detect_3d,bool p_detect_srgb);
+
+ virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
+
+
+ void update_imports();
+
+ ResourceImporterTexture();
+ ~ResourceImporterTexture();
+};
+
+#endif // RESOURCEIMPORTTEXTURE_H
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
new file mode 100644
index 0000000000..ee53b740ca
--- /dev/null
+++ b/editor/import/resource_importer_wav.cpp
@@ -0,0 +1,619 @@
+#include "resource_importer_wav.h"
+
+#include "scene/resources/audio_stream_sample.h"
+#include "os/file_access.h"
+#include "io/marshalls.h"
+#include "io/resource_saver.h"
+
+String ResourceImporterWAV::get_importer_name() const {
+
+ return "wav";
+}
+
+String ResourceImporterWAV::get_visible_name() const{
+
+ return "Microsoft WAV";
+}
+void ResourceImporterWAV::get_recognized_extensions(List<String> *p_extensions) const{
+
+ p_extensions->push_back("wav");
+}
+String ResourceImporterWAV::get_save_extension() const {
+ return "smp";
+}
+
+String ResourceImporterWAV::get_resource_type() const{
+
+ return "AudioStreamSample";
+}
+
+bool ResourceImporterWAV::get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const {
+
+ return true;
+}
+
+int ResourceImporterWAV::get_preset_count() const {
+ return 0;
+}
+String ResourceImporterWAV::get_preset_name(int p_idx) const {
+
+ return String();
+}
+
+
+void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options,int p_preset) const {
+
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/8_bit"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/mono"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"force/max_rate"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL,"force/max_rate_hz",PROPERTY_HINT_EXP_RANGE,"11025,192000,1"),44100));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"edit/trim"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"edit/normalize"),true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"edit/loop"),false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"compress/mode",PROPERTY_HINT_ENUM,"Disabled,RAM (Ima-ADPCM)"),0));
+
+}
+
+
+Error ResourceImporterWAV::import(const String& p_source_file, const String& p_save_path, const Map<StringName,Variant>& p_options, List<String>* r_platform_variants, List<String> *r_gen_files) {
+
+ /* STEP 1, READ WAVE FILE */
+
+ Error err;
+ FileAccess *file=FileAccess::open(p_source_file, FileAccess::READ,&err);
+
+ ERR_FAIL_COND_V( err!=OK, ERR_CANT_OPEN );
+
+ /* CHECK RIFF */
+ char riff[5];
+ riff[4]=0;
+ file->get_buffer((uint8_t*)&riff,4); //RIFF
+
+ if (riff[0]!='R' || riff[1]!='I' || riff[2]!='F' || riff[3]!='F') {
+
+ file->close();
+ memdelete(file);
+ ERR_FAIL_V( ERR_FILE_UNRECOGNIZED );
+ }
+
+
+ /* GET FILESIZE */
+ uint32_t filesize=file->get_32();
+
+ /* CHECK WAVE */
+
+ char wave[4];
+
+ file->get_buffer((uint8_t*)&wave,4); //RIFF
+
+ if (wave[0]!='W' || wave[1]!='A' || wave[2]!='V' || wave[3]!='E') {
+
+
+ file->close();
+ memdelete(file);
+ ERR_EXPLAIN("Not a WAV file (no WAVE RIFF Header)")
+ ERR_FAIL_V( ERR_FILE_UNRECOGNIZED );
+ }
+
+ int format_bits=0;
+ int format_channels=0;
+
+ AudioStreamSample::LoopMode loop=AudioStreamSample::LOOP_DISABLED;
+ bool format_found=false;
+ bool data_found=false;
+ int format_freq=0;
+ int loop_begin=0;
+ int loop_end=0;
+ int frames;
+
+ Vector<float> data;
+
+ while (!file->eof_reached()) {
+
+
+ /* chunk */
+ char chunkID[4];
+ file->get_buffer((uint8_t*)&chunkID,4); //RIFF
+
+ /* chunk size */
+ uint32_t chunksize=file->get_32();
+ uint32_t file_pos=file->get_pos(); //save file pos, so we can skip to next chunk safely
+
+ if (file->eof_reached()) {
+
+ //ERR_PRINT("EOF REACH");
+ break;
+ }
+
+ if (chunkID[0]=='f' && chunkID[1]=='m' && chunkID[2]=='t' && chunkID[3]==' ' && !format_found) {
+ /* IS FORMAT CHUNK */
+
+ uint16_t compression_code=file->get_16();
+
+
+ if (compression_code!=1) {
+ ERR_PRINT("Format not supported for WAVE file (not PCM). Save WAVE files as uncompressed PCM instead.");
+ break;
+ }
+
+ format_channels=file->get_16();
+ if (format_channels!=1 && format_channels !=2) {
+
+ ERR_PRINT("Format not supported for WAVE file (not stereo or mono)");
+ break;
+
+ }
+
+ format_freq=file->get_32(); //sampling rate
+
+ file->get_32(); // average bits/second (unused)
+ file->get_16(); // block align (unused)
+ format_bits=file->get_16(); // bits per sample
+
+ if (format_bits%8) {
+
+ ERR_PRINT("Strange number of bits in sample (not 8,16,24,32)");
+ break;
+ }
+
+ /* Dont need anything else, continue */
+ format_found=true;
+ }
+
+
+ if (chunkID[0]=='d' && chunkID[1]=='a' && chunkID[2]=='t' && chunkID[3]=='a' && !data_found) {
+ /* IS FORMAT CHUNK */
+ data_found=true;
+
+ if (!format_found) {
+ ERR_PRINT("'data' chunk before 'format' chunk found.");
+ break;
+
+ }
+
+ frames=chunksize;
+
+ frames/=format_channels;
+ frames/=(format_bits>>3);
+
+ /*print_line("chunksize: "+itos(chunksize));
+ print_line("channels: "+itos(format_channels));
+ print_line("bits: "+itos(format_bits));
+*/
+
+ int len=frames;
+ if (format_channels==2)
+ len*=2;
+ if (format_bits>8)
+ len*=2;
+
+
+ data.resize(frames*format_channels);
+
+ for (int i=0;i<frames;i++) {
+
+
+ for (int c=0;c<format_channels;c++) {
+
+
+ if (format_bits==8) {
+ // 8 bit samples are UNSIGNED
+
+ uint8_t s = file->get_8();
+ s-=128;
+ int8_t *sp=(int8_t*)&s;
+
+ data[i*format_channels+c]=float(*sp)/128.0;
+
+ } else {
+ //16+ bits samples are SIGNED
+ // if sample is > 16 bits, just read extra bytes
+
+ uint32_t s=0;
+ for (int b=0;b<(format_bits>>3);b++) {
+
+ s|=((uint32_t)file->get_8())<<(b*8);
+ }
+ s<<=(32-format_bits);
+ int32_t ss=s;
+
+
+ data[i*format_channels+c]=(ss>>16)/32768.0;
+ }
+ }
+
+ }
+
+
+
+ if (file->eof_reached()) {
+ file->close();
+ memdelete(file);
+ ERR_EXPLAIN("Premature end of file.");
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+ }
+
+ if (chunkID[0]=='s' && chunkID[1]=='m' && chunkID[2]=='p' && chunkID[3]=='l') {
+ //loop point info!
+
+ for(int i=0;i<10;i++)
+ file->get_32(); // i wish to know why should i do this... no doc!
+
+ loop=file->get_32()?AudioStreamSample::LOOP_PING_PONG:AudioStreamSample::LOOP_FORWARD;
+ loop_begin=file->get_32();
+ loop_end=file->get_32();
+
+ }
+ file->seek( file_pos+chunksize );
+ }
+
+ file->close();
+ memdelete(file);
+
+ // STEP 2, APPLY CONVERSIONS
+
+
+ bool is16=format_bits!=8;
+ int rate=format_freq;
+
+ print_line("Input Sample: ");
+ print_line("\tframes: "+itos(frames));
+ print_line("\tformat_channels: "+itos(format_channels));
+ print_line("\t16bits: "+itos(is16));
+ print_line("\trate: "+itos(rate));
+ print_line("\tloop: "+itos(loop));
+ print_line("\tloop begin: "+itos(loop_begin));
+ print_line("\tloop end: "+itos(loop_end));
+
+
+ //apply frequency limit
+
+ bool limit_rate = p_options["force/max_rate"];
+ int limit_rate_hz = p_options["force/max_rate_hz"];
+ if (limit_rate && rate > limit_rate_hz) {
+ //resampleeee!!!
+ int new_data_frames = frames * limit_rate_hz / rate;
+ Vector<float> new_data;
+ new_data.resize( new_data_frames * format_channels );
+ for(int c=0;c<format_channels;c++) {
+
+ for(int i=0;i<new_data_frames;i++) {
+
+ //simple cubic interpolation should be enough.
+ float pos = float(i) * frames / new_data_frames;
+ float mu = pos-Math::floor(pos);
+ int ipos = int(Math::floor(pos));
+
+ float y0=data[MAX(0,ipos-1)*format_channels+c];
+ float y1=data[ipos*format_channels+c];
+ float y2=data[MIN(frames-1,ipos+1)*format_channels+c];
+ float y3=data[MIN(frames-1,ipos+2)*format_channels+c];
+
+ float mu2 = mu*mu;
+ float a0 = y3 - y2 - y0 + y1;
+ float a1 = y0 - y1 - a0;
+ float a2 = y2 - y0;
+ float a3 = y1;
+
+ float res=(a0*mu*mu2+a1*mu2+a2*mu+a3);
+
+ new_data[i*format_channels+c]=res;
+ }
+ }
+
+ if (loop) {
+
+ loop_begin=loop_begin*new_data_frames/frames;
+ loop_end=loop_end*new_data_frames/frames;
+ }
+ data=new_data;
+ rate=limit_rate_hz;
+ frames=new_data_frames;
+ }
+
+
+ bool normalize = p_options["edit/normalize"];
+
+ if (normalize) {
+
+ float max=0;
+ for(int i=0;i<data.size();i++) {
+
+ float amp = Math::abs(data[i]);
+ if (amp>max)
+ max=amp;
+ }
+
+ if (max>0) {
+
+ float mult=1.0/max;
+ for(int i=0;i<data.size();i++) {
+
+ data[i]*=mult;
+ }
+
+ }
+ }
+
+ bool trim = p_options["edit/trim"];
+
+ if (trim && !loop) {
+
+ int first=0;
+ int last=(frames*format_channels)-1;
+ bool found=false;
+ float limit = Math::db2linear((float)-30);
+ for(int i=0;i<data.size();i++) {
+ float amp = Math::abs(data[i]);
+
+ if (!found && amp > limit) {
+ first=i;
+ found=true;
+ }
+
+ if (found && amp > limit) {
+ last=i;
+ }
+ }
+
+ first/=format_channels;
+ last/=format_channels;
+
+ if (first<last) {
+
+ Vector<float> new_data;
+ new_data.resize((last-first+1)*format_channels);
+ for(int i=first*format_channels;i<=last*format_channels;i++) {
+ new_data[i-first*format_channels]=data[i];
+ }
+
+ data=new_data;
+ frames=data.size()/format_channels;
+ }
+
+ }
+
+ bool make_loop = p_options["edit/loop"];
+
+ if (make_loop && !loop) {
+
+ loop=AudioStreamSample::LOOP_FORWARD;
+ loop_begin=0;
+ loop_end=frames;
+ }
+
+ int compression = p_options["compress/mode"];
+ bool force_mono = p_options["force/mono"];
+
+
+ if (force_mono && format_channels==2) {
+
+ Vector<float> new_data;
+ new_data.resize(data.size()/2);
+ for(int i=0;i<frames;i++) {
+ new_data[i]=(data[i*2+0]+data[i*2+1])/2.0;
+ }
+
+ data=new_data;
+ format_channels=1;
+ }
+
+ bool force_8_bit = p_options["force/8_bit"];
+ if (force_8_bit) {
+
+ is16=false;
+ }
+
+
+ PoolVector<uint8_t> dst_data;
+ AudioStreamSample::Format dst_format;
+
+ if ( compression == 1) {
+
+ dst_format=AudioStreamSample::FORMAT_IMA_ADPCM;
+ if (format_channels==1) {
+ _compress_ima_adpcm(data,dst_data);
+ } else {
+
+ //byte interleave
+ Vector<float> left;
+ Vector<float> right;
+
+ int tframes = data.size()/2;
+ left.resize(tframes);
+ right.resize(tframes);
+
+ for(int i=0;i<tframes;i++) {
+ left[i]=data[i*2+0];
+ right[i]=data[i*2+1];
+ }
+
+ PoolVector<uint8_t> bleft;
+ PoolVector<uint8_t> bright;
+
+ _compress_ima_adpcm(left,bleft);
+ _compress_ima_adpcm(right,bright);
+
+ int dl = bleft.size();
+ dst_data.resize( dl *2 );
+
+ PoolVector<uint8_t>::Write w=dst_data.write();
+ PoolVector<uint8_t>::Read rl=bleft.read();
+ PoolVector<uint8_t>::Read rr=bright.read();
+
+ for(int i=0;i<dl;i++) {
+ w[i*2+0]=rl[i];
+ w[i*2+1]=rr[i];
+ }
+ }
+
+ //print_line("compressing ima-adpcm, resulting buffersize is "+itos(dst_data.size())+" from "+itos(data.size()));
+
+ } else {
+
+ dst_format=is16?AudioStreamSample::FORMAT_16_BITS:AudioStreamSample::FORMAT_8_BITS;
+ dst_data.resize( data.size() * (is16?2:1));
+ {
+ PoolVector<uint8_t>::Write w = dst_data.write();
+
+ int ds=data.size();
+ for(int i=0;i<ds;i++) {
+
+ if (is16) {
+ int16_t v = CLAMP(data[i]*32768,-32768,32767);
+ encode_uint16(v,&w[i*2]);
+ } else {
+ int8_t v = CLAMP(data[i]*128,-128,127);
+ w[i]=v;
+ }
+ }
+ }
+ }
+
+
+ Ref<AudioStreamSample> sample;
+ sample.instance();
+ sample->set_data(dst_data);
+ sample->set_format(dst_format);
+ sample->set_mix_rate(rate);
+ sample->set_loop_mode(loop);
+ sample->set_loop_begin(loop_begin);
+ sample->set_loop_end(loop_end);
+ sample->set_stereo(format_channels==2);
+
+ ResourceSaver::save(p_save_path+".smp",sample);
+
+
+ return OK;
+
+}
+
+void ResourceImporterWAV::_compress_ima_adpcm(const Vector<float>& p_data,PoolVector<uint8_t>& dst_data) {
+
+
+ /*p_sample_data->data = (void*)malloc(len);
+ xm_s8 *dataptr=(xm_s8*)p_sample_data->data;*/
+
+ static const int16_t _ima_adpcm_step_table[89] = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+ };
+
+ static const int8_t _ima_adpcm_index_table[16] = {
+ -1, -1, -1, -1, 2, 4, 6, 8,
+ -1, -1, -1, -1, 2, 4, 6, 8
+ };
+
+
+ int datalen = p_data.size();
+ int datamax=datalen;
+ if (datalen&1)
+ datalen++;
+
+ dst_data.resize(datalen/2+4);
+ PoolVector<uint8_t>::Write w = dst_data.write();
+
+
+ int i,step_idx=0,prev=0;
+ uint8_t *out = w.ptr();
+ //int16_t xm_prev=0;
+ const float *in=p_data.ptr();
+
+
+ /* initial value is zero */
+ *(out++) =0;
+ *(out++) =0;
+ /* Table index initial value */
+ *(out++) =0;
+ /* unused */
+ *(out++) =0;
+
+ for (i=0;i<datalen;i++) {
+ int step,diff,vpdiff,mask;
+ uint8_t nibble;
+ int16_t xm_sample;
+
+ if (i>=datamax)
+ xm_sample=0;
+ else {
+
+
+ xm_sample=CLAMP(in[i]*32767.0,-32768,32767);
+ /*
+ if (xm_sample==32767 || xm_sample==-32768)
+ printf("clippy!\n",xm_sample);
+ */
+ }
+
+ //xm_sample=xm_sample+xm_prev;
+ //xm_prev=xm_sample;
+
+ diff = (int)xm_sample - prev ;
+
+ nibble=0 ;
+ step = _ima_adpcm_step_table[ step_idx ];
+ vpdiff = step >> 3 ;
+ if (diff < 0) {
+ nibble=8;
+ diff=-diff ;
+ }
+ mask = 4 ;
+ while (mask) {
+
+ if (diff >= step) {
+
+ nibble |= mask;
+ diff -= step;
+ vpdiff += step;
+ }
+
+ step >>= 1 ;
+ mask >>= 1 ;
+ };
+
+ if (nibble&8)
+ prev-=vpdiff ;
+ else
+ prev+=vpdiff ;
+
+ if (prev > 32767) {
+ //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip up %i\n",i,xm_sample,prev,diff,vpdiff,prev);
+ prev=32767;
+ } else if (prev < -32768) {
+ //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip down %i\n",i,xm_sample,prev,diff,vpdiff,prev);
+ prev = -32768 ;
+ }
+
+ step_idx += _ima_adpcm_index_table[nibble];
+ if (step_idx< 0)
+ step_idx= 0 ;
+ else if (step_idx> 88)
+ step_idx= 88 ;
+
+
+ if (i&1) {
+ *out|=nibble<<4;
+ out++;
+ } else {
+ *out=nibble;
+ }
+ /*dataptr[i]=prev>>8;*/
+ }
+
+
+
+
+}
+
+ResourceImporterWAV::ResourceImporterWAV()
+{
+
+}
diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h
new file mode 100644
index 0000000000..9f1bd57da7
--- /dev/null
+++ b/editor/import/resource_importer_wav.h
@@ -0,0 +1,30 @@
+#ifndef RESOURCEIMPORTWAV_H
+#define RESOURCEIMPORTWAV_H
+
+
+#include "io/resource_import.h"
+
+class ResourceImporterWAV : public ResourceImporter {
+ GDCLASS(ResourceImporterWAV,ResourceImporter)
+public:
+ virtual String get_importer_name() const;
+ virtual String get_visible_name() const;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual String get_save_extension() const;
+ virtual String get_resource_type() const;
+
+
+ virtual int get_preset_count() const;
+ virtual String get_preset_name(int p_idx) const;
+
+ virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
+ virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
+
+ void _compress_ima_adpcm(const Vector<float>& p_data,PoolVector<uint8_t>& dst_data);
+
+ virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
+
+ ResourceImporterWAV();
+};
+
+#endif // RESOURCEIMPORTWAV_H
diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp
new file mode 100644
index 0000000000..bf61ca4df0
--- /dev/null
+++ b/editor/import_dock.cpp
@@ -0,0 +1,331 @@
+#include "import_dock.h"
+
+class ImportDockParameters : public Object {
+ GDCLASS(ImportDockParameters,Object)
+public:
+ Map<StringName,Variant> values;
+ List<PropertyInfo> properties;
+ Ref<ResourceImporter> importer;
+ Vector<String> paths;
+
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ if (values.has(p_name)) {
+ values[p_name]=p_value;
+ return true;
+ }
+
+ return false;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ if (values.has(p_name)) {
+ r_ret=values[p_name];
+ return true;
+ }
+
+ return false;
+
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ for (const List<PropertyInfo>::Element *E=properties.front();E;E=E->next()) {
+ if (!importer->get_option_visibility(E->get().name,values))
+ continue;
+ p_list->push_back(E->get());
+ }
+ }
+
+ void update() {
+ _change_notify();
+ }
+};
+
+void ImportDock::set_edit_path(const String& p_path) {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(p_path+".import");
+ if (err!=OK) {
+ clear();
+ return;
+ }
+
+
+ params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(config->get_value("remap","importer"));
+ if (params->importer.is_null()) {
+ clear();
+ return;
+ }
+
+ List<ResourceImporter::ImportOption> options;
+ params->importer->get_import_options(&options);
+
+ params->properties.clear();
+ params->values.clear();
+
+ for (List<ResourceImporter::ImportOption>::Element *E=options.front();E;E=E->next()) {
+
+ params->properties.push_back(E->get().option);
+ if (config->has_section_key("params",E->get().option.name)) {
+ params->values[E->get().option.name]=config->get_value("params",E->get().option.name);
+ } else {
+ params->values[E->get().option.name]=E->get().default_value;
+ }
+ }
+
+ params->update();
+
+ List<Ref<ResourceImporter> > importers;
+ ResourceFormatImporter::get_singleton()->get_importers_for_extension(p_path.get_extension(),&importers);
+ List<Pair<String,String> > importer_names;
+
+ for (List<Ref<ResourceImporter> > ::Element *E=importers.front();E;E=E->next()) {
+ importer_names.push_back(Pair<String,String>(E->get()->get_visible_name(),E->get()->get_importer_name()));
+ }
+
+ importer_names.sort_custom<PairSort<String,String> >();
+
+ import_as->clear();
+
+ for (List<Pair<String,String> >::Element *E=importer_names.front();E;E=E->next()) {
+ import_as->add_item(E->get().first);
+ import_as->set_item_metadata(import_as->get_item_count()-1,E->get().second);
+ if (E->get().second==params->importer->get_importer_name()) {
+ import_as->select(import_as->get_item_count()-1);
+ }
+ }
+
+ preset->get_popup()->clear();
+
+ if (params->importer->get_preset_count()==0) {
+ preset->get_popup()->add_item(TTR("Default"));
+ } else {
+ for (int i=0;i<params->importer->get_preset_count();i++) {
+ preset->get_popup()->add_item(params->importer->get_preset_name(i));
+ }
+ }
+
+ params->paths.clear();
+ params->paths.push_back(p_path);
+ import->set_disabled(false);
+ import_as->set_disabled(false);
+
+ imported->set_text(p_path.get_file());
+}
+
+void ImportDock::set_edit_multiple_paths(const Vector<String>& p_paths) {
+
+ clear();
+
+ //use the value that is repeated the mot
+ Map<String,Dictionary> value_frequency;
+
+ for(int i=0;i<p_paths.size();i++) {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(p_paths[i]+".import");
+ ERR_CONTINUE(err!=OK);
+
+ if (i==0) {
+ params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(config->get_value("remap","importer"));
+ if (params->importer.is_null()) {
+ clear();
+ return;
+ }
+ }
+
+ List<String> keys;
+ config->get_section_keys("params",&keys);
+
+
+ for (List<String>::Element *E=keys.front();E;E=E->next()) {
+
+ if (!value_frequency.has(E->get())) {
+ value_frequency[E->get()]=Dictionary();
+ }
+
+ Variant value = config->get_value("params",E->get());
+
+ if (value_frequency[E->get()].has(value)) {
+ value_frequency[E->get()][value]=int(value_frequency[E->get()][value])+1;
+ } else {
+ value_frequency[E->get()][value]=1;
+ }
+ }
+
+ }
+
+ ERR_FAIL_COND(params->importer.is_null());
+
+ List<ResourceImporter::ImportOption> options;
+ params->importer->get_import_options(&options);
+
+ params->properties.clear();
+ params->values.clear();
+
+ for (List<ResourceImporter::ImportOption>::Element *E=options.front();E;E=E->next()) {
+
+ params->properties.push_back(E->get().option);
+
+ if (value_frequency.has(E->get().option.name)) {
+
+ Dictionary d = value_frequency[E->get().option.name];
+ int freq=0;
+ List<Variant> v;
+ d.get_key_list(&v);
+ Variant value;
+ for (List<Variant>::Element *F=v.front();F;F=F->next()) {
+ int f = d[F->get()];
+ if (f>freq) {
+ value=F->get();
+ }
+ }
+
+ params->values[E->get().option.name]=value;
+ } else {
+ params->values[E->get().option.name]=E->get().default_value;
+ }
+ }
+
+ params->update();
+
+ List<Ref<ResourceImporter> > importers;
+ ResourceFormatImporter::get_singleton()->get_importers_for_extension(p_paths[0].get_extension(),&importers);
+ List<Pair<String,String> > importer_names;
+
+ for (List<Ref<ResourceImporter> > ::Element *E=importers.front();E;E=E->next()) {
+ importer_names.push_back(Pair<String,String>(E->get()->get_visible_name(),E->get()->get_importer_name()));
+ }
+
+ importer_names.sort_custom<PairSort<String,String> >();
+
+ import_as->clear();
+
+ for (List<Pair<String,String> >::Element *E=importer_names.front();E;E=E->next()) {
+ import_as->add_item(E->get().first);
+ import_as->set_item_metadata(import_as->get_item_count()-1,E->get().second);
+ if (E->get().second==params->importer->get_importer_name()) {
+ import_as->select(import_as->get_item_count()-1);
+ }
+ }
+
+ preset->get_popup()->clear();
+
+ if (params->importer->get_preset_count()==0) {
+ preset->get_popup()->add_item(TTR("Default"));
+ } else {
+ for (int i=0;i<params->importer->get_preset_count();i++) {
+ preset->get_popup()->add_item(params->importer->get_preset_name(i));
+ }
+ }
+
+ params->paths=p_paths;
+ import->set_disabled(false);
+ import_as->set_disabled(false);
+
+ imported->set_text(itos(p_paths.size())+TTR(" Files"));
+}
+
+void ImportDock::_preset_selected(int p_idx) {
+
+ print_line("preset selected? "+p_idx);
+ List<ResourceImporter::ImportOption> options;
+
+ params->importer->get_import_options(&options,p_idx);
+
+ for (List<ResourceImporter::ImportOption>::Element *E=options.front();E;E=E->next()) {
+
+ params->values[E->get().option.name]=E->get().default_value;
+ }
+
+ params->update();
+
+}
+
+
+void ImportDock::clear() {
+
+ imported->set_text("");
+ import->set_disabled(true);
+ import_as->clear();
+ import_as->set_disabled(true);
+ params->values.clear();
+ params->properties.clear();
+ params->update();
+ preset->get_popup()->clear();
+
+}
+
+void ImportDock::_reimport() {
+
+ for(int i=0;i<params->paths.size();i++) {
+
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(params->paths[i]+".import");
+ ERR_CONTINUE(err!=OK);
+
+ config->erase_section("params");
+
+ for (List<PropertyInfo>::Element *E=params->properties.front();E;E=E->next()) {
+ config->set_value("params",E->get().name,params->values[E->get().name]);
+ }
+
+ config->save(params->paths[i]+".import");
+ }
+
+ EditorFileSystem::get_singleton()->reimport_files(params->paths);
+ EditorFileSystem::get_singleton()->emit_signal("filesystem_changed"); //it changed, so force emitting the signal
+
+}
+
+void ImportDock::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_reimport"),&ImportDock::_reimport);
+ ClassDB::bind_method(D_METHOD("_preset_selected"),&ImportDock::_preset_selected);
+}
+
+ImportDock::ImportDock() {
+
+
+ imported = memnew( LineEdit );
+ imported->set_editable(false);
+ add_child(imported);
+ HBoxContainer *hb = memnew(HBoxContainer);
+ add_margin_child(TTR("Import As:"),hb);
+ import_as = memnew( OptionButton );
+ hb->add_child(import_as);
+ import_as->set_h_size_flags(SIZE_EXPAND_FILL);
+ preset = memnew( MenuButton );
+ preset->set_text(TTR("Preset.."));
+ preset->get_popup()->connect("index_pressed",this,"_preset_selected");
+ hb->add_child(preset);
+
+ import_opts = memnew( PropertyEditor );
+ add_child(import_opts);
+ import_opts->set_v_size_flags(SIZE_EXPAND_FILL);
+ import_opts->hide_top_label();
+ import_opts->set_hide_script(true);
+
+ hb = memnew( HBoxContainer );
+ add_child(hb);
+ import = memnew( Button );
+ import->set_text(TTR("Reimport"));
+ import->connect("pressed",this,"_reimport");
+ hb->add_spacer();
+ hb->add_child(import);
+ hb->add_spacer();
+
+ params = memnew( ImportDockParameters );
+ import_opts->edit(params);
+
+}
+
+ImportDock::~ImportDock() {
+
+ memdelete(params);
+}
diff --git a/editor/import_dock.h b/editor/import_dock.h
new file mode 100644
index 0000000000..bddf5480b8
--- /dev/null
+++ b/editor/import_dock.h
@@ -0,0 +1,42 @@
+#ifndef IMPORTDOCK_H
+#define IMPORTDOCK_H
+
+#include "io/resource_import.h"
+#include "editor_file_system.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/popup_menu.h"
+#include "property_editor.h"
+
+class ImportDockParameters;
+class ImportDock : public VBoxContainer {
+ GDCLASS(ImportDock,VBoxContainer)
+
+ LineEdit *imported;
+ OptionButton *import_as;
+ MenuButton *preset;
+ PropertyEditor *import_opts;
+
+ List<PropertyInfo> properties;
+ Map<StringName,Variant> property_values;
+
+ Button *import;
+
+ ImportDockParameters *params;
+
+ void _preset_selected(int p_idx);
+
+ void _reimport();
+protected:
+ static void _bind_methods();
+public:
+
+ void set_edit_path(const String& p_path);
+ void set_edit_multiple_paths(const Vector<String>& p_paths);
+ void clear();
+
+ ImportDock();
+ ~ImportDock();
+};
+
+#endif // IMPORTDOCK_H
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
new file mode 100644
index 0000000000..253f9bcc01
--- /dev/null
+++ b/editor/inspector_dock.cpp
@@ -0,0 +1,50 @@
+/*************************************************************************/
+/* inspector_dock.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "inspector_dock.h"
+
+#if 0
+void InspectorDock::_go_next() {
+
+
+}
+
+void InspectorDock::_go_prev() {
+
+
+}
+
+void InspectorDock::_bind_methods() {
+
+}
+
+InspectorDock::InspectorDock() {
+
+
+}
+#endif
diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h
new file mode 100644
index 0000000000..be6ed5fa87
--- /dev/null
+++ b/editor/inspector_dock.h
@@ -0,0 +1,63 @@
+/*************************************************************************/
+/* inspector_dock.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef INSPECTOR_DOCK_H
+#define INSPECTOR_DOCK_H
+
+#include "scene/gui/box_container.h"
+#include "property_editor.h"
+
+
+//this is for now bundled in EditorNode, will be moved away here eventually
+
+#if 0
+class InspectorDock : public VBoxContainer
+{
+ GDCLASS(InspectorDock,VBoxContainer);
+
+ PropertyEditor *property_editor;
+
+ EditorHistory editor_history;
+
+ void _go_next();
+ void _go_prev();
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ EditorHistory &get_editor_history();
+
+ PropertyEditor *get_property_editor();
+
+ InspectorDock();
+};
+
+#endif
+#endif // INSPECTOR_DOCK_H
diff --git a/editor/io_plugins/SCsub b/editor/io_plugins/SCsub
new file mode 100644
index 0000000000..f1fa50148f
--- /dev/null
+++ b/editor/io_plugins/SCsub
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import('env')
+Export('env')
+env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/io_plugins/editor_atlas.cpp b/editor/io_plugins/editor_atlas.cpp
new file mode 100644
index 0000000000..c5f1ee73cf
--- /dev/null
+++ b/editor/io_plugins/editor_atlas.cpp
@@ -0,0 +1,160 @@
+/*************************************************************************/
+/* editor_atlas.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_atlas.h"
+
+#include "print_string.h"
+
+struct _EditorAtlasWorkRect {
+
+ Size2i s;
+ Point2i p;
+ int idx;
+ _FORCE_INLINE_ bool operator<(const _EditorAtlasWorkRect& p_r) const { return s.width > p_r.s.width; };
+};
+
+struct _EditorAtlasWorkRectResult {
+
+ Vector<_EditorAtlasWorkRect> result;
+ int max_w;
+ int max_h;
+};
+
+void EditorAtlas::fit(const Vector<Size2i>& p_rects,Vector<Point2i>& r_result, Size2i& r_size) {
+
+ //super simple, almost brute force scanline stacking fitter
+ //it's pretty basic for now, but it tries to make sure that the aspect ratio of the
+ //resulting atlas is somehow square. This is necesary because video cards have limits
+ //on texture size (usually 2048 or 4096), so the more square a texture, the more chances
+ //it will work in every hardware.
+ // for example, it will prioritize a 1024x1024 atlas (works everywhere) instead of a
+ // 256x8192 atlas (won't work anywhere).
+
+ ERR_FAIL_COND(p_rects.size()==0);
+
+ Vector<_EditorAtlasWorkRect> wrects;
+ wrects.resize(p_rects.size());
+ for(int i=0;i<p_rects.size();i++) {
+ wrects[i].s=p_rects[i];
+ wrects[i].idx=i;
+ }
+ wrects.sort();
+ int widest = wrects[0].s.width;
+
+ Vector<_EditorAtlasWorkRectResult> results;
+
+ for(int i=0;i<=12;i++) {
+
+ int w = 1<<i;
+ int max_h=0;
+ int max_w=0;
+ if ( w < widest )
+ continue;
+
+ Vector<int> hmax;
+ hmax.resize(w);
+ for(int j=0;j<w;j++)
+ hmax[j]=0;
+
+ //place them
+ int ofs=0;
+
+ for(int j=0;j<wrects.size();j++) {
+
+
+ if (ofs+wrects[j].s.width > w) {
+
+ ofs=0;
+ }
+
+ int from_y=0;
+ for(int k=0;k<wrects[j].s.width;k++) {
+
+ if (hmax[ofs+k] > from_y)
+ from_y=hmax[ofs+k];
+ }
+
+ wrects[j].p.x=ofs;
+ wrects[j].p.y=from_y;
+
+
+
+ int end_h = from_y+wrects[j].s.height;
+ int end_w = ofs+wrects[j].s.width;
+
+ for(int k=0;k<wrects[j].s.width;k++) {
+
+ hmax[ofs+k]=end_h;
+ }
+
+ if (end_h > max_h)
+ max_h=end_h;
+
+ if (end_w > max_w)
+ max_w=end_w;
+
+ ofs+=wrects[j].s.width;
+
+ }
+
+ _EditorAtlasWorkRectResult result;
+ result.result=wrects;
+ result.max_h=max_h;
+ result.max_w=max_w;
+ results.push_back(result);
+
+ }
+
+ //find the result with the best aspect ratio
+
+ int best=-1;
+ float best_aspect=1e20;
+
+ for(int i=0;i<results.size();i++) {
+
+ float h = results[i].max_h;
+ float w = results[i].max_w;
+ float aspect = h>w ? h/w : w/h;
+ if (aspect < best_aspect) {
+ best=i;
+ best_aspect=aspect;
+ }
+ }
+
+ r_result.resize(p_rects.size());
+
+ for(int i=0;i<p_rects.size();i++) {
+
+ r_result[ results[best].result[i].idx ]=results[best].result[i].p;
+ }
+
+ r_size=Size2(results[best].max_w,results[best].max_h );
+
+}
+
+
diff --git a/editor/io_plugins/editor_atlas.h b/editor/io_plugins/editor_atlas.h
new file mode 100644
index 0000000000..e0cf76576e
--- /dev/null
+++ b/editor/io_plugins/editor_atlas.h
@@ -0,0 +1,43 @@
+/*************************************************************************/
+/* editor_atlas.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_ATLAS_H
+#define EDITOR_ATLAS_H
+
+#include "math_2d.h"
+#include "vector.h"
+
+class EditorAtlas {
+public:
+
+ static void fit(const Vector<Size2i>& p_rects,Vector<Point2i>& r_result, Size2i& r_size);
+
+
+};
+
+#endif // EDITOR_ATLAS_H
diff --git a/editor/io_plugins/editor_bitmask_import_plugin.cpp b/editor/io_plugins/editor_bitmask_import_plugin.cpp
new file mode 100644
index 0000000000..7282cbe4e7
--- /dev/null
+++ b/editor/io_plugins/editor_bitmask_import_plugin.cpp
@@ -0,0 +1,387 @@
+/*************************************************************************/
+/* editor_bitmask_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_bitmask_import_plugin.h"
+#if 0
+#include "io/image_loader.h"
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_dir_dialog.h"
+#include "editor/editor_node.h"
+#include "editor/property_editor.h"
+#include "io/resource_saver.h"
+#include "os/file_access.h"
+#include "io/marshalls.h"
+#include "editor/editor_settings.h"
+
+class _EditorBitMaskImportOptions : public Object {
+
+ GDCLASS(_EditorBitMaskImportOptions, Object);
+public:
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ return false;
+ }
+
+ bool _get(const StringName& p_name, Variant &r_ret) const{
+
+ return false;
+ }
+
+ void _get_property_list(List<PropertyInfo> *p_list) const{
+
+ }
+
+ static void _bind_methods() {
+
+ ADD_SIGNAL(MethodInfo("changed"));
+ }
+
+
+ _EditorBitMaskImportOptions() {
+
+ }
+
+};
+
+class EditorBitMaskImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorBitMaskImportDialog, ConfirmationDialog);
+
+ EditorBitMaskImportPlugin *plugin;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ EditorFileDialog *file_select;
+ EditorDirDialog *save_select;
+ ConfirmationDialog *error_dialog;
+ PropertyEditor *option_editor;
+
+public:
+
+ void _choose_files(const Vector<String>& p_path) {
+
+ String files;
+ for (int i = 0; i<p_path.size(); i++) {
+
+ if (i>0)
+ files += ",";
+ files += p_path[i];
+ }
+
+ import_path->set_text(files);
+
+ }
+ void _choose_save_dir(const String& p_path) {
+
+ save_path->set_text(p_path);
+ }
+
+ void _browse() {
+
+ file_select->popup_centered_ratio();
+ }
+
+ void _browse_target() {
+
+ save_select->popup_centered_ratio();
+
+ }
+
+
+ void popup_import(const String& p_path) {
+
+ popup_centered(Size2(400, 100)*EDSCALE);
+ if (p_path != "") {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+ ERR_FAIL_COND(!rimd.is_valid());
+
+ save_path->set_text(p_path.get_base_dir());
+
+ String src = "";
+ for (int i = 0; i<rimd->get_source_count(); i++) {
+ if (i>0)
+ src += ",";
+ src += EditorImportPlugin::expand_source_path(rimd->get_source_path(i));
+ }
+ import_path->set_text(src);
+ }
+ }
+
+
+ void _import() {
+
+ Vector<String> bitmasks = import_path->get_text().split(",");
+
+ if (bitmasks.size() == 0) {
+ error_dialog->set_text(TTR("No bit masks to import!"));
+ error_dialog->popup_centered(Size2(200, 100)*EDSCALE);
+ }
+
+ if (save_path->get_text().strip_edges() == "") {
+ error_dialog->set_text(TTR("Target path is empty."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!save_path->get_text().begins_with("res://")) {
+ error_dialog->set_text(TTR("Target path must be a complete resource path."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!DirAccess::exists(save_path->get_text())) {
+ error_dialog->set_text(TTR("Target path must exist."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ for (int i = 0; i<bitmasks.size(); i++) {
+
+ Ref<ResourceImportMetadata> imd = memnew(ResourceImportMetadata);
+
+ imd->add_source(EditorImportPlugin::validate_source_path(bitmasks[i]));
+
+ String dst = save_path->get_text();
+ if (dst == "") {
+ error_dialog->set_text(TTR("Save path is empty!"));
+ error_dialog->popup_centered(Size2(200, 100)*EDSCALE);
+ }
+
+ dst = dst.plus_file(bitmasks[i].get_file().get_basename() + ".pbm");
+
+ plugin->import(dst, imd);
+ }
+
+ hide();
+
+ }
+
+
+ void _notification(int p_what) {
+
+ }
+
+ static void _bind_methods() {
+
+
+ ClassDB::bind_method("_choose_files", &EditorBitMaskImportDialog::_choose_files);
+ ClassDB::bind_method("_choose_save_dir", &EditorBitMaskImportDialog::_choose_save_dir);
+ ClassDB::bind_method("_import", &EditorBitMaskImportDialog::_import);
+ ClassDB::bind_method("_browse", &EditorBitMaskImportDialog::_browse);
+ ClassDB::bind_method("_browse_target", &EditorBitMaskImportDialog::_browse_target);
+ //ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) );
+ }
+
+ EditorBitMaskImportDialog(EditorBitMaskImportPlugin *p_plugin) {
+
+ plugin = p_plugin;
+
+
+ set_title(TTR("Import BitMasks"));
+
+ VBoxContainer *vbc = memnew(VBoxContainer);
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+
+ HBoxContainer *hbc = memnew(HBoxContainer);
+ vbc->add_margin_child(TTR("Source Texture(s):"), hbc);
+
+ import_path = memnew(LineEdit);
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+
+ Button * import_choose = memnew(Button);
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this, "_browse");
+
+ hbc = memnew(HBoxContainer);
+ vbc->add_margin_child(TTR("Target Path:"), hbc);
+
+ save_path = memnew(LineEdit);
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew(Button);
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this, "_browse_target");
+
+ file_select = memnew(EditorFileDialog);
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ add_child(file_select);
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ file_select->connect("files_selected", this, "_choose_files");
+
+ List<String> extensions;
+ ImageLoader::get_recognized_extensions(&extensions);
+ file_select->clear_filters();
+ for (int i = 0; i<extensions.size(); i++) {
+
+ file_select->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
+ }
+
+ save_select = memnew(EditorDirDialog);
+ add_child(save_select);
+
+ //save_select->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ save_select->connect("dir_selected", this, "_choose_save_dir");
+
+ get_ok()->connect("pressed", this, "_import");
+ get_ok()->set_text(TTR("Import"));
+
+
+ error_dialog = memnew(ConfirmationDialog);
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ //error_dialog->get_cancel()->hide();
+
+ set_hide_on_ok(false);
+ }
+
+ ~EditorBitMaskImportDialog() {
+ }
+
+};
+
+
+String EditorBitMaskImportPlugin::get_name() const {
+
+ return "bitmask";
+}
+String EditorBitMaskImportPlugin::get_visible_name() const{
+
+ return TTR("Bit Mask");
+}
+void EditorBitMaskImportPlugin::import_dialog(const String& p_from){
+
+ dialog->popup_import(p_from);
+}
+Error EditorBitMaskImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from){
+
+ ERR_FAIL_COND_V(p_from->get_source_count() != 1, ERR_INVALID_PARAMETER);
+
+ Ref<ResourceImportMetadata> from = p_from;
+
+ String src_path = EditorImportPlugin::expand_source_path(from->get_source_path(0));
+ Ref<ImageTexture> it = ResourceLoader::load(src_path);
+ ERR_FAIL_COND_V(it.is_null(), ERR_CANT_OPEN);
+
+ Ref<BitMap> target = memnew(BitMap);
+ target->create_from_image_alpha(it.ptr()->get_data());
+
+ from->set_source_md5(0, FileAccess::get_md5(src_path));
+ from->set_editor(get_name());
+ target->set_import_metadata(from);
+
+
+ Error err = ResourceSaver::save(p_path, target);
+
+ return err;
+
+}
+
+
+EditorBitMaskImportPlugin* EditorBitMaskImportPlugin::singleton = NULL;
+
+
+void EditorBitMaskImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+ Vector<String> files;
+
+ List<String> valid_extensions;
+ ImageLoader::get_recognized_extensions(&valid_extensions);
+ for(int i=0;i<p_drop.size();i++) {
+
+ String extension=p_drop[i].get_extension().to_lower();
+
+ for (List<String>::Element *E=valid_extensions.front();E;E=E->next()) {
+
+ if (E->get()==extension) {
+ files.push_back(p_drop[i]);
+ break;
+ }
+ }
+ }
+
+ if (files.size()) {
+ import_dialog();
+ dialog->_choose_files(files);
+ dialog->_choose_save_dir(p_dest_path);
+ }
+}
+
+void EditorBitMaskImportPlugin::reimport_multiple_files(const Vector<String>& p_list) {
+
+ if (p_list.size() == 0)
+ return;
+
+ Vector<String> sources;
+ for (int i = 0; i<p_list.size(); i++) {
+ int idx;
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(p_list[i], &idx);
+ if (efsd) {
+ for (int j = 0; j<efsd->get_source_count(idx); j++) {
+ String file = expand_source_path(efsd->get_source_file(idx, j));
+ if (sources.find(file) == -1) {
+ sources.push_back(file);
+ }
+
+ }
+ }
+ }
+
+ if (sources.size()) {
+
+ dialog->popup_import(p_list[0]);
+ dialog->_choose_files(sources);
+ dialog->_choose_save_dir(p_list[0].get_base_dir());
+ }
+}
+
+bool EditorBitMaskImportPlugin::can_reimport_multiple_files() const {
+
+ return true;
+}
+
+EditorBitMaskImportPlugin::EditorBitMaskImportPlugin(EditorNode* p_editor) {
+
+ singleton = this;
+ dialog = memnew(EditorBitMaskImportDialog(this));
+ p_editor->get_gui_base()->add_child(dialog);
+}
+
+EditorBitMaskExportPlugin::EditorBitMaskExportPlugin() {
+
+}
+#endif
diff --git a/editor/io_plugins/editor_bitmask_import_plugin.h b/editor/io_plugins/editor_bitmask_import_plugin.h
new file mode 100644
index 0000000000..d1618d7843
--- /dev/null
+++ b/editor/io_plugins/editor_bitmask_import_plugin.h
@@ -0,0 +1,70 @@
+/*************************************************************************/
+/* editor_bitmask_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_BITMASK_IMPORT_PLUGIN_H
+#define EDITOR_BITMASK_IMPORT_PLUGIN_H
+#if 0
+#include "editor/editor_import_export.h"
+#include "scene/resources/font.h"
+
+class EditorNode;
+class EditorBitMaskImportDialog;
+
+class EditorBitMaskImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorBitMaskImportPlugin, EditorImportPlugin);
+
+ EditorBitMaskImportDialog *dialog;
+public:
+
+ static EditorBitMaskImportPlugin *singleton;
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from = "");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path);
+ virtual void reimport_multiple_files(const Vector<String>& p_list);
+ virtual bool can_reimport_multiple_files() const;
+
+
+ EditorBitMaskImportPlugin(EditorNode* p_editor);
+};
+
+class EditorBitMaskExportPlugin : public EditorExportPlugin {
+
+ GDCLASS(EditorBitMaskExportPlugin, EditorExportPlugin);
+
+
+public:
+
+ EditorBitMaskExportPlugin();
+};
+
+#endif
+#endif // EDITOR_SAMPLE_IMPORT_PLUGIN_H
diff --git a/editor/io_plugins/editor_export_scene.cpp b/editor/io_plugins/editor_export_scene.cpp
new file mode 100644
index 0000000000..a593b870f9
--- /dev/null
+++ b/editor/io_plugins/editor_export_scene.cpp
@@ -0,0 +1,142 @@
+/*************************************************************************/
+/* editor_export_scene.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_export_scene.h"
+#if 0
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+#include "scene/resources/packed_scene.h"
+#include "global_config.h"
+
+Vector<uint8_t> EditorSceneExportPlugin::custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform) {
+
+ if (!EditorImportExport::get_singleton()->get_convert_text_scenes()) {
+ return Vector<uint8_t>();
+ }
+
+
+ String extension = p_path.get_extension();
+
+ //step 1 check if scene
+
+ if (extension=="xml" || extension=="xres") {
+
+ String type = ResourceLoader::get_resource_type(p_path);
+
+ if (type!="PackedScene")
+ return Vector<uint8_t>();
+
+ } else if (extension!="tscn" && extension!="xscn") {
+ return Vector<uint8_t>();
+ }
+
+ //step 2 check if cached
+
+ uint64_t sd=0;
+ String smd5;
+ String gp = GlobalConfig::get_singleton()->globalize_path(p_path);
+ String md5=gp.md5_text();
+ String tmp_path = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp/");
+
+ bool valid=false;
+ {
+ //if existing, make sure it's valid
+ FileAccessRef f = FileAccess::open(tmp_path+"scnexp-"+md5+".txt",FileAccess::READ);
+ if (f) {
+
+ uint64_t d = f->get_line().strip_edges().to_int64();
+ sd = FileAccess::get_modified_time(p_path);
+
+ if (d==sd) {
+ valid=true;
+ } else {
+ String cmd5 = f->get_line().strip_edges();
+ smd5 = FileAccess::get_md5(p_path);
+ if (cmd5==smd5) {
+ valid=true;
+ }
+ }
+
+
+ }
+ }
+
+ if (!valid) {
+ //cache failed, convert
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+
+ String copy = p_path+".convert."+extension;
+
+ // a copy will allow loading the internal resources without conflicting with opened scenes
+ da->copy(p_path,copy);
+
+ //@todo for tscn use something more efficient
+
+ Ref<PackedScene> copyres = ResourceLoader::load(copy,"PackedScene");
+
+ da->remove(copy);
+
+ memdelete(da);
+
+ ERR_FAIL_COND_V(!copyres.is_valid(),Vector<uint8_t>());
+
+ Error err = ResourceSaver::save(tmp_path+"scnexp-"+md5+".scn",copyres);
+
+ copyres=Ref<PackedScene>();
+
+ ERR_FAIL_COND_V(err!=OK,Vector<uint8_t>());
+
+ FileAccessRef f = FileAccess::open(tmp_path+"scnexp-"+md5+".txt",FileAccess::WRITE);
+
+ if (sd==0)
+ sd = FileAccess::get_modified_time(p_path);
+ if (smd5==String())
+ smd5 = FileAccess::get_md5(p_path);
+
+ f->store_line(String::num(sd));
+ f->store_line(smd5);
+ f->store_line(gp); //source path for reference
+ }
+
+
+ Vector<uint8_t> ret = FileAccess::get_file_as_array(tmp_path+"scnexp-"+md5+".scn");
+
+ p_path+=".converted.scn";
+
+ return ret;
+
+}
+
+
+EditorSceneExportPlugin::EditorSceneExportPlugin()
+{
+}
+#endif
diff --git a/editor/io_plugins/editor_export_scene.h b/editor/io_plugins/editor_export_scene.h
new file mode 100644
index 0000000000..ac425fbedd
--- /dev/null
+++ b/editor/io_plugins/editor_export_scene.h
@@ -0,0 +1,44 @@
+/*************************************************************************/
+/* editor_export_scene.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_EXPORT_SCENE_H
+#define EDITOR_EXPORT_SCENE_H
+
+#include "editor/editor_export.h"
+
+#if 0
+class EditorSceneExportPlugin : public EditorExportPlugin {
+ GDCLASS( EditorSceneExportPlugin, EditorExportPlugin );
+public:
+
+ virtual Vector<uint8_t> custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform);
+
+ EditorSceneExportPlugin();
+};
+#endif
+#endif // EDITOR_EXPORT_SCENE_H
diff --git a/editor/io_plugins/editor_font_import_plugin.cpp b/editor/io_plugins/editor_font_import_plugin.cpp
new file mode 100644
index 0000000000..c792ad717a
--- /dev/null
+++ b/editor/io_plugins/editor_font_import_plugin.cpp
@@ -0,0 +1,1704 @@
+/*************************************************************************/
+/* editor_font_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_font_import_plugin.h"
+#if 0
+#include "scene/gui/dialogs.h"
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_node.h"
+#include "os/file_access.h"
+#include "editor_atlas.h"
+#include "io/image_loader.h"
+#include "io/resource_saver.h"
+
+#ifdef FREETYPE_ENABLED
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#endif
+
+
+class _EditorFontImportOptions : public Object {
+
+ GDCLASS(_EditorFontImportOptions,Object);
+public:
+
+ enum FontMode {
+
+ FONT_BITMAP,
+ FONT_DISTANCE_FIELD
+ };
+
+ enum ColorType {
+ COLOR_WHITE,
+ COLOR_CUSTOM,
+ COLOR_GRADIENT_RANGE,
+ COLOR_GRADIENT_IMAGE
+ };
+
+
+ int char_extra_spacing;
+ int top_extra_spacing;
+ int bottom_extra_spacing;
+ int space_extra_spacing;
+
+ enum CharacterSet {
+
+ CHARSET_ASCII,
+ CHARSET_LATIN,
+ CHARSET_UNICODE,
+ CHARSET_CUSTOM,
+ CHARSET_CUSTOM_LATIN
+ };
+
+
+ FontMode font_mode;
+
+ CharacterSet character_set;
+ String custom_file;
+
+ bool shadow;
+ Vector2 shadow_offset;
+ int shadow_radius;
+ Color shadow_color;
+ float shadow_transition;
+
+ bool shadow2;
+ Vector2 shadow2_offset;
+ int shadow2_radius;
+ Color shadow2_color;
+ float shadow2_transition;
+
+ ColorType color_type;
+ Color color;
+ Color gradient_begin;
+ Color gradient_end;
+ bool color_use_monochrome;
+ String gradient_image;
+
+ bool enable_filter;
+ bool round_advance;
+ bool premultiply_alpha;
+
+
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+ if (n=="mode/mode") {
+ font_mode=FontMode(int(p_value));
+ _change_notify();
+ } else if (n=="extra_space/char")
+ char_extra_spacing=p_value;
+ else if (n=="extra_space/space")
+ space_extra_spacing=p_value;
+ else if (n=="extra_space/top")
+ top_extra_spacing=p_value;
+ else if (n=="extra_space/bottom")
+ bottom_extra_spacing=p_value;
+
+ else if (n=="character_set/mode") {
+ character_set=CharacterSet(int(p_value));
+ _change_notify();
+ } else if (n=="character_set/custom")
+ custom_file=p_value;
+
+ else if (n=="shadow/enabled") {
+ shadow=p_value;
+ _change_notify();
+ }else if (n=="shadow/radius")
+ shadow_radius=p_value;
+ else if (n=="shadow/offset")
+ shadow_offset=p_value;
+ else if (n=="shadow/color")
+ shadow_color=p_value;
+ else if (n=="shadow/transition")
+ shadow_transition=p_value;
+
+ else if (n=="shadow2/enabled") {
+ shadow2=p_value;
+ _change_notify();
+ }else if (n=="shadow2/radius")
+ shadow2_radius=p_value;
+ else if (n=="shadow2/offset")
+ shadow2_offset=p_value;
+ else if (n=="shadow2/color")
+ shadow2_color=p_value;
+ else if (n=="shadow2/transition")
+ shadow2_transition=p_value;
+
+ else if (n=="color/mode") {
+ color_type=ColorType(int(p_value));
+ _change_notify();
+ }else if (n=="color/color")
+ color=p_value;
+ else if (n=="color/begin")
+ gradient_begin=p_value;
+ else if (n=="color/end")
+ gradient_end=p_value;
+ else if (n=="color/image")
+ gradient_image=p_value;
+ else if (n=="color/monochrome")
+ color_use_monochrome=p_value;
+ else if (n=="advanced/round_advance")
+ round_advance=p_value;
+ else if (n=="advanced/enable_filter")
+ enable_filter=p_value;
+ else if (n=="advanced/premultiply_alpha")
+ premultiply_alpha=p_value;
+ else
+ return false;
+
+ emit_signal("changed");
+
+
+ return true;
+
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const{
+
+ String n = p_name;
+ if (n=="mode/mode")
+ r_ret=font_mode;
+ else if (n=="extra_space/char")
+ r_ret=char_extra_spacing;
+ else if (n=="extra_space/space")
+ r_ret=space_extra_spacing;
+ else if (n=="extra_space/top")
+ r_ret=top_extra_spacing;
+ else if (n=="extra_space/bottom")
+ r_ret=bottom_extra_spacing;
+
+ else if (n=="character_set/mode")
+ r_ret=character_set;
+ else if (n=="character_set/custom")
+ r_ret=custom_file;
+
+ else if (n=="shadow/enabled")
+ r_ret=shadow;
+ else if (n=="shadow/radius")
+ r_ret=shadow_radius;
+ else if (n=="shadow/offset")
+ r_ret=shadow_offset;
+ else if (n=="shadow/color")
+ r_ret=shadow_color;
+ else if (n=="shadow/transition")
+ r_ret=shadow_transition;
+
+ else if (n=="shadow2/enabled")
+ r_ret=shadow2;
+ else if (n=="shadow2/radius")
+ r_ret=shadow2_radius;
+ else if (n=="shadow2/offset")
+ r_ret=shadow2_offset;
+ else if (n=="shadow2/color")
+ r_ret=shadow2_color;
+ else if (n=="shadow2/transition")
+ r_ret=shadow2_transition;
+
+
+ else if (n=="color/mode")
+ r_ret=color_type;
+ else if (n=="color/color")
+ r_ret=color;
+ else if (n=="color/begin")
+ r_ret=gradient_begin;
+ else if (n=="color/end")
+ r_ret=gradient_end;
+ else if (n=="color/image")
+ r_ret=gradient_image;
+ else if (n=="color/monochrome")
+ r_ret=color_use_monochrome;
+ else if (n=="advanced/round_advance")
+ r_ret=round_advance;
+ else if (n=="advanced/enable_filter")
+ r_ret=enable_filter;
+ else if (n=="advanced/premultiply_alpha")
+ r_ret=premultiply_alpha;
+ else
+ return false;
+
+ return true;
+
+ }
+
+ void _get_property_list( List<PropertyInfo> *p_list) const{
+
+
+ p_list->push_back(PropertyInfo(Variant::INT,"mode/mode",PROPERTY_HINT_ENUM,"Bitmap,Distance Field"));
+
+ p_list->push_back(PropertyInfo(Variant::INT,"extra_space/char",PROPERTY_HINT_RANGE,"-64,64,1"));
+ p_list->push_back(PropertyInfo(Variant::INT,"extra_space/space",PROPERTY_HINT_RANGE,"-64,64,1"));
+ p_list->push_back(PropertyInfo(Variant::INT,"extra_space/top",PROPERTY_HINT_RANGE,"-64,64,1"));
+ p_list->push_back(PropertyInfo(Variant::INT,"extra_space/bottom",PROPERTY_HINT_RANGE,"-64,64,1"));
+ p_list->push_back(PropertyInfo(Variant::INT,"character_set/mode",PROPERTY_HINT_ENUM,"Ascii,Latin,Unicode,Custom,Custom&Latin"));
+
+ if (character_set>=CHARSET_CUSTOM)
+ p_list->push_back(PropertyInfo(Variant::STRING,"character_set/custom",PROPERTY_HINT_GLOBAL_FILE));
+
+ int usage = PROPERTY_USAGE_DEFAULT;
+
+ if (font_mode==FONT_DISTANCE_FIELD) {
+ usage = PROPERTY_USAGE_NOEDITOR;
+ }
+
+ {
+
+ p_list->push_back(PropertyInfo(Variant::BOOL,"shadow/enabled",PROPERTY_HINT_NONE,"",usage));
+ if (shadow) {
+ p_list->push_back(PropertyInfo(Variant::INT,"shadow/radius",PROPERTY_HINT_RANGE,"-64,64,1",usage));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2,"shadow/offset",PROPERTY_HINT_NONE,"",usage));
+ p_list->push_back(PropertyInfo(Variant::COLOR,"shadow/color",PROPERTY_HINT_NONE,"",usage));
+ p_list->push_back(PropertyInfo(Variant::REAL,"shadow/transition",PROPERTY_HINT_EXP_EASING,"",usage));
+ }
+
+ p_list->push_back(PropertyInfo(Variant::BOOL,"shadow2/enabled",PROPERTY_HINT_NONE,"",usage));
+ if (shadow2) {
+ p_list->push_back(PropertyInfo(Variant::INT,"shadow2/radius",PROPERTY_HINT_RANGE,"-64,64,1",usage));
+ p_list->push_back(PropertyInfo(Variant::VECTOR2,"shadow2/offset",PROPERTY_HINT_NONE,"",usage));
+ p_list->push_back(PropertyInfo(Variant::COLOR,"shadow2/color",PROPERTY_HINT_NONE,"",usage));
+ p_list->push_back(PropertyInfo(Variant::REAL,"shadow2/transition",PROPERTY_HINT_EXP_EASING,"",usage));
+ }
+
+ p_list->push_back(PropertyInfo(Variant::INT,"color/mode",PROPERTY_HINT_ENUM,"White,Color,Gradient,Gradient Image",usage));
+ if (color_type==COLOR_CUSTOM) {
+ p_list->push_back(PropertyInfo(Variant::COLOR,"color/color",PROPERTY_HINT_NONE,"",usage));
+
+ }
+ if (color_type==COLOR_GRADIENT_RANGE) {
+ p_list->push_back(PropertyInfo(Variant::COLOR,"color/begin",PROPERTY_HINT_NONE,"",usage));
+ p_list->push_back(PropertyInfo(Variant::COLOR,"color/end",PROPERTY_HINT_NONE,"",usage));
+ }
+ if (color_type==COLOR_GRADIENT_IMAGE) {
+ p_list->push_back(PropertyInfo(Variant::STRING,"color/image",PROPERTY_HINT_GLOBAL_FILE,"",usage));
+ }
+ p_list->push_back(PropertyInfo(Variant::BOOL,"color/monochrome",PROPERTY_HINT_NONE,"",usage));
+ }
+
+ p_list->push_back(PropertyInfo(Variant::BOOL,"advanced/round_advance"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"advanced/enable_filter"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"advanced/premultiply_alpha"));
+
+ }
+
+
+ static void _bind_methods() {
+
+
+ ADD_SIGNAL( MethodInfo("changed"));
+ }
+
+
+ void reset() {
+
+ char_extra_spacing=0;
+ top_extra_spacing=0;
+ bottom_extra_spacing=0;
+ space_extra_spacing=0;
+
+ character_set=CHARSET_LATIN;
+
+ shadow=false;
+ shadow_radius=2;
+ shadow_color=Color(0,0,0,0.3);
+ shadow_transition=1.0;
+
+ shadow2=false;
+ shadow2_radius=2;
+ shadow2_color=Color(0,0,0,0.3);
+ shadow2_transition=1.0;
+
+ color_type=COLOR_WHITE;
+ color=Color(1,1,1,1);
+ gradient_begin=Color(1,1,1,1);
+ gradient_end=Color(0.5,0.5,0.5,1);
+ color_use_monochrome=false;
+
+ font_mode=FONT_BITMAP;
+ round_advance=true;
+ enable_filter=true;
+ premultiply_alpha=false;
+
+ }
+
+ _EditorFontImportOptions() {
+
+ font_mode=FONT_BITMAP;
+
+ char_extra_spacing=0;
+ top_extra_spacing=0;
+ bottom_extra_spacing=0;
+ space_extra_spacing=0;
+
+ character_set=CHARSET_LATIN;
+
+ shadow=false;
+ shadow_radius=2;
+ shadow_color=Color(0,0,0,0.3);
+ shadow_transition=1.0;
+
+ shadow2=false;
+ shadow2_radius=2;
+ shadow2_color=Color(0,0,0,0.3);
+ shadow2_transition=1.0;
+
+ color_type=COLOR_WHITE;
+ color=Color(1,1,1,1);
+ gradient_begin=Color(1,1,1,1);
+ gradient_end=Color(0.5,0.5,0.5,1);
+ color_use_monochrome=false;
+
+ round_advance=true;
+ enable_filter=true;
+ premultiply_alpha=false;
+ }
+
+
+};
+
+
+class EditorFontImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorFontImportDialog, ConfirmationDialog);
+
+
+ EditorLineEditFileChooser *source;
+ EditorLineEditFileChooser *dest;
+ SpinBox *font_size;
+ LineEdit *test_string;
+ ColorPickerButton *test_color;
+ Label *test_label;
+ PropertyEditor *prop_edit;
+ Timer *timer;
+ ConfirmationDialog *error_dialog;
+
+
+ Ref<ResourceImportMetadata> get_rimd() {
+
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ List<PropertyInfo> pl;
+ options->_get_property_list(&pl);
+ for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) {
+
+ Variant v;
+ String opt=E->get().name;
+ options->_get(opt,v);
+ if (opt=="color/image" || opt=="character_set/custom") {
+ v = EditorImportPlugin::validate_source_path(v);
+ }
+ imd->set_option(opt,v);
+ }
+
+ String src_path = EditorImportPlugin::validate_source_path(source->get_line_edit()->get_text());
+ //print_line("pre src path "+source->get_line_edit()->get_text());
+ //print_line("src path "+src_path);
+ imd->add_source(src_path);
+ imd->set_option("font/size",font_size->get_value());
+
+ return imd;
+
+ }
+
+ void _src_changed(String) {
+ _prop_changed();
+ }
+
+ void _update_text2(String) {
+ _update_text();
+ }
+ void _update_text3(Color) {
+ _update_text();
+ }
+
+ void _update_text() {
+
+ test_label->set_text("");
+ test_label->set_text(test_string->get_text());
+ test_label->add_color_override("font_color",test_color->get_pick_color());
+ }
+
+ void _update() {
+
+ Ref<ResourceImportMetadata> imd = get_rimd();
+ Ref<BitmapFont> font = plugin->generate_font(imd);
+ test_label->add_font_override("font",font);
+ _update_text();
+ }
+
+ void _font_size_changed(double) {
+
+ _prop_changed();
+ }
+
+ void _prop_changed() {
+
+ timer->start();
+ }
+
+ void _import_inc(String p_font) {
+
+ Ref<BitmapFont> font = ResourceLoader::load(p_font);
+ if (!font.is_valid())
+ return;
+ Ref<ImageTexture> tex = font->get_texture(0);
+ if (tex.is_null())
+ return;
+ FileAccessRef f=FileAccess::open(p_font.get_basename()+".inc",FileAccess::WRITE);
+ Vector<CharType> ck = font->get_char_keys();
+
+ f->store_line("static const int _builtin_font_height="+itos(font->get_height())+";");
+ f->store_line("static const int _builtin_font_ascent="+itos(font->get_ascent())+";");
+ f->store_line("static const int _builtin_font_charcount="+itos(ck.size())+";");
+ f->store_line("static const int _builtin_font_charrects["+itos(ck.size())+"][8]={");
+ f->store_line("/* charidx , ofs_x, ofs_y, size_x, size_y, valign, halign, advance */");
+
+ for(int i=0;i<ck.size();i++) {
+ CharType k=ck[i];
+ BitmapFont::Character c=font->get_character(k);
+ f->store_line("{"+itos(k)+","+rtos(c.rect.pos.x)+","+rtos(c.rect.pos.y)+","+rtos(c.rect.size.x)+","+rtos(c.rect.size.y)+","+rtos(c.v_align)+","+rtos(c.h_align)+","+rtos(c.advance)+"},");
+ }
+ f->store_line("};");
+
+ Vector<BitmapFont::KerningPairKey> kp=font->get_kerning_pair_keys();
+ f->store_line("static const int _builtin_font_kerning_pair_count="+itos(kp.size())+";");
+ f->store_line("static const int _builtin_font_kerning_pairs["+itos(kp.size())+"][3]={");
+ for(int i=0;i<kp.size();i++) {
+
+ int d = font->get_kerning_pair(kp[i].A,kp[i].B);
+ f->store_line("{"+itos(kp[i].A)+","+itos(kp[i].B)+","+itos(d)+"},");
+ }
+
+ f->store_line("};");
+ Image img = tex->get_data();
+
+ f->store_line("static const int _builtin_font_img_width="+itos(img.get_width())+";");
+ f->store_line("static const int _builtin_font_img_height="+itos(img.get_height())+";");
+
+ String fname = p_font.get_basename()+".sv.png";
+ ResourceSaver::save(fname,tex);
+ Vector<uint8_t> data=FileAccess::get_file_as_array(fname);
+
+
+ f->store_line("static const int _builtin_font_img_data_size="+itos(data.size())+";");
+ f->store_line("static const unsigned char _builtin_font_img_data["+itos(data.size())+"]={");
+
+
+
+ for(int i=0;i<data.size();i++) {
+
+ f->store_line(itos(data[i])+",");
+
+ }
+ f->store_line("};");
+
+ }
+
+ void _import() {
+
+ if (source->get_line_edit()->get_text()=="") {
+ error_dialog->set_text(TTR("No source font file!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ if (dest->get_line_edit()->get_text()=="") {
+ error_dialog->set_text(TTR("No target font resource!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ if (dest->get_line_edit()->get_text().get_file()==".fnt") {
+ dest->get_line_edit()->set_text(dest->get_line_edit()->get_text().get_base_dir() + "/" + source->get_line_edit()->get_text().get_file().get_basename() + ".fnt" );
+ }
+
+ if (dest->get_line_edit()->get_text().get_extension() == dest->get_line_edit()->get_text()) {
+ dest->get_line_edit()->set_text(dest->get_line_edit()->get_text() + ".fnt");
+ }
+
+ if (dest->get_line_edit()->get_text().get_extension().to_lower() != "fnt") {
+ error_dialog->set_text(TTR("Invalid file extension.\nPlease use .fnt."));
+ error_dialog->popup_centered(Size2(200,100));
+ return;
+ }
+
+ Ref<ResourceImportMetadata> rimd = get_rimd();
+
+ if (rimd.is_null()) {
+ error_dialog->set_text(TTR("Can't load/process source font."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ Error err = plugin->import(dest->get_line_edit()->get_text(),rimd);
+
+ if (err!=OK) {
+ error_dialog->set_text(TTR("Couldn't save font."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ _import_inc(dest->get_line_edit()->get_text());
+
+ hide();
+ }
+
+ EditorFontImportPlugin *plugin;
+ _EditorFontImportOptions *options;
+
+ static void _bind_methods() {
+
+ ClassDB::bind_method("_update",&EditorFontImportDialog::_update);
+ ClassDB::bind_method("_update_text",&EditorFontImportDialog::_update_text);
+ ClassDB::bind_method("_update_text2",&EditorFontImportDialog::_update_text2);
+ ClassDB::bind_method("_update_text3",&EditorFontImportDialog::_update_text3);
+ ClassDB::bind_method("_prop_changed",&EditorFontImportDialog::_prop_changed);
+ ClassDB::bind_method("_src_changed",&EditorFontImportDialog::_src_changed);
+ ClassDB::bind_method("_font_size_changed",&EditorFontImportDialog::_font_size_changed);
+ ClassDB::bind_method("_import",&EditorFontImportDialog::_import);
+
+ }
+
+public:
+
+ void _notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ prop_edit->edit(options);
+ _update_text();
+ }
+ }
+
+ void popup_import(const String& p_path) {
+
+ popup_centered(Size2(600,500)*EDSCALE);
+
+ if (p_path!="") {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+ ERR_FAIL_COND(!rimd.is_valid());
+
+ dest->get_line_edit()->set_text(p_path);
+ List<String> opts;
+ rimd->get_options(&opts);
+ options->reset();
+ for(List<String>::Element *E=opts.front();E;E=E->next()) {
+
+ options->_set(E->get(),rimd->get_option(E->get()));
+ }
+
+ String src = "";
+ for(int i=0;i<rimd->get_source_count();i++) {
+ if (i>0)
+ src+=",";
+ src+=EditorImportPlugin::expand_source_path(rimd->get_source_path(i));
+ }
+ source->get_line_edit()->set_text(src);
+
+ font_size->set_value(rimd->get_option("font/size"));
+ }
+ }
+
+
+ void set_source_and_dest(const String& p_font,const String& p_dest) {
+ source->get_line_edit()->set_text(p_font);
+ dest->get_line_edit()->set_text(p_dest);
+ _prop_changed();
+ }
+
+ EditorFontImportDialog(EditorFontImportPlugin *p_plugin) {
+ plugin=p_plugin;
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+ HBoxContainer *hbc = memnew( HBoxContainer);
+ vbc->add_child(hbc);
+ VBoxContainer *vbl = memnew( VBoxContainer );
+ hbc->add_child(vbl);
+ hbc->set_v_size_flags(SIZE_EXPAND_FILL);
+ vbl->set_h_size_flags(SIZE_EXPAND_FILL);
+ VBoxContainer *vbr = memnew( VBoxContainer );
+ hbc->add_child(vbr);
+ vbr->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ source = memnew( EditorLineEditFileChooser );
+ source->get_file_dialog()->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ source->get_file_dialog()->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ source->get_file_dialog()->add_filter("*.ttf;TrueType");
+ source->get_file_dialog()->add_filter("*.otf;OpenType");
+ source->get_file_dialog()->add_filter("*.fnt;BMFont");
+ source->get_line_edit()->connect("text_entered",this,"_src_changed");
+
+ vbl->add_margin_child(TTR("Source Font:"),source);
+ font_size = memnew( SpinBox );
+ vbl->add_margin_child(TTR("Source Font Size:"),font_size);
+ font_size->set_min(3);
+ font_size->set_max(256);
+ font_size->set_value(16);
+ font_size->connect("value_changed",this,"_font_size_changed");
+ dest = memnew( EditorLineEditFileChooser );
+ //
+ List<String> fl;
+ Ref<BitmapFont> font= memnew(BitmapFont);
+ dest->get_file_dialog()->add_filter("*.fnt ; Font" );
+ /*
+ ResourceSaver::get_recognized_extensions(font,&fl);
+ for(List<String>::Element *E=fl.front();E;E=E->next()) {
+ dest->get_file_dialog()->add_filter("*."+E->get());
+ }
+ */
+
+ vbl->add_margin_child(TTR("Dest Resource:"),dest);
+ HBoxContainer *testhb = memnew( HBoxContainer );
+ test_string = memnew( LineEdit );
+ test_string->set_text(TTR("The quick brown fox jumps over the lazy dog."));
+ test_string->set_h_size_flags(SIZE_EXPAND_FILL);
+ test_string->set_stretch_ratio(5);
+
+ testhb->add_child(test_string);
+ test_color = memnew( ColorPickerButton );
+ test_color->set_pick_color(get_color("font_color","Label"));
+ test_color->set_h_size_flags(SIZE_EXPAND_FILL);
+ test_color->set_stretch_ratio(1);
+ test_color->connect("color_changed",this,"_update_text3");
+ testhb->add_child(test_color);
+
+ vbl->add_spacer();
+ vbl->add_margin_child(TTR("Test:")+" ",testhb);
+ /*
+ HBoxContainer *upd_hb = memnew( HBoxContainer );
+ //vbl->add_child(upd_hb);
+ upd_hb->add_spacer();
+ Button *update = memnew( Button);
+ upd_hb->add_child(update);
+ update->set_text("Update");
+ update->connect("pressed",this,"_update");
+*/
+ options = memnew( _EditorFontImportOptions );
+ prop_edit = memnew( PropertyEditor() );
+ vbr->add_margin_child(TTR("Options:"),prop_edit,true);
+ options->connect("changed",this,"_prop_changed");
+
+ prop_edit->hide_top_label();
+
+ Panel *panel = memnew( Panel );
+ vbc->add_child(panel);
+ test_label = memnew( Label );
+ test_label->set_autowrap(true);
+ panel->add_child(test_label);
+ test_label->set_area_as_parent_rect();
+ panel->set_v_size_flags(SIZE_EXPAND_FILL);
+ test_string->connect("text_changed",this,"_update_text2");
+ set_title(TTR("Font Import"));
+ timer = memnew( Timer );
+ add_child(timer);
+ timer->connect("timeout",this,"_update");
+ timer->set_wait_time(0.4);
+ timer->set_one_shot(true);
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+ error_dialog = memnew ( ConfirmationDialog );
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ set_hide_on_ok(false);
+
+
+ }
+
+ ~EditorFontImportDialog() {
+ memdelete(options);
+ }
+};
+
+
+///////////////////////////////////////
+
+
+
+struct _EditorFontData {
+
+ Vector<uint8_t> bitmap;
+ int width,height;
+ int ofs_x; //ofset to center, from ABOVE
+ int ofs_y; //ofset to begining, from LEFT
+ int valign; //vertical alignment
+ int halign;
+ float advance;
+ int character;
+ int glyph;
+
+ int texture;
+ Image blit;
+ Point2i blit_ofs;
+ //bool printable;
+
+};
+
+
+struct _EditorFontDataSort {
+
+ bool operator()(const _EditorFontData *p_A,const _EditorFontData *p_B) const {
+ return p_A->height > p_B->height;
+ };
+};
+
+struct _EditorKerningKey {
+
+ CharType A,B;
+ bool operator<(const _EditorKerningKey& p_k) const { return (A==p_k.A)?(B<p_k.B):(A<p_k.A); }
+
+};
+
+
+static unsigned char get_SDF_radial(
+ unsigned char *fontmap,
+ int w, int h,
+ int x, int y,
+ int max_radius )
+{
+ //hideous brute force method
+ float d2 = max_radius*max_radius+1.0;
+ unsigned char v = fontmap[x+y*w];
+ for( int radius = 1; (radius <= max_radius) && (radius*radius < d2); ++radius )
+ {
+ int line, lo, hi;
+ //north
+ line = y - radius;
+ if( (line >= 0) && (line < h) )
+ {
+ lo = x - radius;
+ hi = x + radius;
+ if( lo < 0 ) { lo = 0; }
+ if( hi >= w ) { hi = w-1; }
+ int idx = line * w + lo;
+ for( int i = lo; i <= hi; ++i )
+ {
+ //check this pixel
+ if( fontmap[idx] != v )
+ {
+ float nx = i - x;
+ float ny = line - y;
+ float nd2 = nx*nx+ny*ny;
+ if( nd2 < d2 )
+ {
+ d2 = nd2;
+ }
+ }
+ //move on
+ ++idx;
+ }
+ }
+ //south
+ line = y + radius;
+ if( (line >= 0) && (line < h) )
+ {
+ lo = x - radius;
+ hi = x + radius;
+ if( lo < 0 ) { lo = 0; }
+ if( hi >= w ) { hi = w-1; }
+ int idx = line * w + lo;
+ for( int i = lo; i <= hi; ++i )
+ {
+ //check this pixel
+ if( fontmap[idx] != v )
+ {
+ float nx = i - x;
+ float ny = line - y;
+ float nd2 = nx*nx+ny*ny;
+ if( nd2 < d2 )
+ {
+ d2 = nd2;
+ }
+ }
+ //move on
+ ++idx;
+ }
+ }
+ //west
+ line = x - radius;
+ if( (line >= 0) && (line < w) )
+ {
+ lo = y - radius + 1;
+ hi = y + radius - 1;
+ if( lo < 0 ) { lo = 0; }
+ if( hi >= h ) { hi = h-1; }
+ int idx = lo * w + line;
+ for( int i = lo; i <= hi; ++i )
+ {
+ //check this pixel
+ if( fontmap[idx] != v )
+ {
+ float nx = line - x;
+ float ny = i - y;
+ float nd2 = nx*nx+ny*ny;
+ if( nd2 < d2 )
+ {
+ d2 = nd2;
+ }
+ }
+ //move on
+ idx += w;
+ }
+ }
+ //east
+ line = x + radius;
+ if( (line >= 0) && (line < w) )
+ {
+ lo = y - radius + 1;
+ hi = y + radius - 1;
+ if( lo < 0 ) { lo = 0; }
+ if( hi >= h ) { hi = h-1; }
+ int idx = lo * w + line;
+ for( int i = lo; i <= hi; ++i )
+ {
+ //check this pixel
+ if( fontmap[idx] != v )
+ {
+ float nx = line - x;
+ float ny = i - y;
+ float nd2 = nx*nx+ny*ny;
+ if( nd2 < d2 )
+ {
+ d2 = nd2;
+ }
+ }
+ //move on
+ idx += w;
+ }
+ }
+ }
+ d2 = sqrtf( d2 );
+ if( v==0 )
+ {
+ d2 = -d2;
+ }
+ d2 *= 127.5 / max_radius;
+ d2 += 127.5;
+ if( d2 < 0.0 ) d2 = 0.0;
+ if( d2 > 255.0 ) d2 = 255.0;
+ return (unsigned char)(d2 + 0.5);
+}
+
+
+Ref<BitmapFont> EditorFontImportPlugin::generate_font(const Ref<ResourceImportMetadata>& p_from, const String &p_existing) {
+
+
+
+ Ref<ResourceImportMetadata> from = p_from;
+ ERR_FAIL_COND_V(from->get_source_count()!=1,Ref<BitmapFont>());
+
+ String src_path = EditorImportPlugin::expand_source_path(from->get_source_path(0));
+
+ if (src_path.get_extension().to_lower()=="fnt") {
+
+ if (ResourceLoader::load(src_path).is_valid()) {
+ EditorNode::get_singleton()->show_warning(TTR("Path:")+" "+src_path+"\n"+TTR("This file is already a Godot font file, please supply a BMFont type file instead."));
+ return Ref<BitmapFont>();
+ }
+
+ Ref<BitmapFont> font;
+ font.instance();
+ Error err = font->create_from_fnt(src_path);
+ if (err) {
+ EditorNode::get_singleton()->show_warning(TTR("Path:")+" "+src_path+"\n"+TTR("Failed opening as BMFont file."));
+ return Ref<BitmapFont>();
+ }
+
+ return font;
+ }
+
+ int size = from->get_option("font/size");
+
+#ifdef FREETYPE_ENABLED
+ FT_Library library; /* handle to library */
+ FT_Face face; /* handle to face object */
+
+ Vector<_EditorFontData*> font_data_list;
+
+ int error = FT_Init_FreeType( &library );
+
+ ERR_EXPLAIN(TTR("Error initializing FreeType."));
+ ERR_FAIL_COND_V( error !=0, Ref<BitmapFont>() );
+
+ print_line("loadfrom: "+src_path);
+ error = FT_New_Face( library, src_path.utf8().get_data(),0,&face );
+
+ if ( error == FT_Err_Unknown_File_Format ) {
+ ERR_EXPLAIN(TTR("Unknown font format."));
+ FT_Done_FreeType( library );
+ } else if ( error ) {
+
+ ERR_EXPLAIN(TTR("Error loading font."));
+ FT_Done_FreeType( library );
+
+ }
+
+ ERR_FAIL_COND_V(error,Ref<BitmapFont>());
+
+
+ int height=0;
+ int ascent=0;
+ int font_spacing=0;
+
+ error = FT_Set_Char_Size(face,0,64*size,512,512);
+
+ if ( error ) {
+ FT_Done_FreeType( library );
+ ERR_EXPLAIN(TTR("Invalid font size."));
+ ERR_FAIL_COND_V( error,Ref<BitmapFont>() );
+
+ }
+
+ int font_mode = from->get_option("mode/mode");
+
+ int scaler=(font_mode==_EditorFontImportOptions::FONT_DISTANCE_FIELD)?16:1;
+
+ error = FT_Set_Pixel_Sizes(face,0,size*scaler);
+
+ FT_GlyphSlot slot = face->glyph;
+
+ //error = FT_Set_Charmap(face,ft_encoding_unicode ); /* encoding.. */
+
+
+ /* PRINT CHARACTERS TO INDIVIDUAL BITMAPS */
+
+
+ //int space_size=5; //size for space, if none found.. 5!
+ //int min_valign=500; //some ridiculous number
+
+ FT_ULong charcode;
+ FT_UInt gindex;
+
+ int max_up=-1324345; ///gibberish
+ int max_down=124232;
+
+ Map<_EditorKerningKey,int> kerning_map;
+
+ charcode = FT_Get_First_Char( face, &gindex );
+
+ Set<CharType> import_chars;
+
+ int import_mode = from->get_option("character_set/mode");
+ bool round_advance = from->get_option("advanced/round_advance");
+
+ if (import_mode>=_EditorFontImportOptions::CHARSET_CUSTOM) {
+
+ //load from custom text
+ String path = from->get_option("character_set/custom");
+
+ FileAccess *fa = FileAccess::open(EditorImportPlugin::expand_source_path(path),FileAccess::READ);
+
+ if ( !fa ) {
+
+ FT_Done_FreeType( library );
+ ERR_EXPLAIN(TTR("Invalid font custom source."));
+ ERR_FAIL_COND_V( !fa,Ref<BitmapFont>() );
+
+ }
+
+
+ while(!fa->eof_reached()) {
+
+ String line = fa->get_line();
+ for(int i=0;i<line.length();i++) {
+ import_chars.insert(line[i]);
+ }
+ }
+
+ if (import_mode==_EditorFontImportOptions::CHARSET_CUSTOM_LATIN) {
+
+ for(int i=32;i<128;i++)
+ import_chars.insert(i);
+ }
+
+ memdelete(fa);
+ }
+
+ int xsize=0;
+ while ( gindex != 0 )
+ {
+
+ bool skip=false;
+ error = FT_Load_Char( face, charcode, font_mode==_EditorFontImportOptions::FONT_BITMAP?FT_LOAD_RENDER:FT_LOAD_MONOCHROME );
+ if (error) skip=true;
+ else error = FT_Render_Glyph( face->glyph, font_mode==_EditorFontImportOptions::FONT_BITMAP?ft_render_mode_normal:ft_render_mode_mono );
+ if (error) {
+ skip=true;
+ } else if (!skip) {
+
+ switch(import_mode) {
+
+ case _EditorFontImportOptions::CHARSET_ASCII: skip = charcode>127; break;
+ case _EditorFontImportOptions::CHARSET_LATIN: skip = charcode>255 ;break;
+ case _EditorFontImportOptions::CHARSET_UNICODE: break; //none
+ case _EditorFontImportOptions::CHARSET_CUSTOM:
+ case _EditorFontImportOptions::CHARSET_CUSTOM_LATIN: skip = !import_chars.has(charcode); break;
+
+ }
+ }
+
+ if (charcode<=32) //??
+ skip=true;
+
+ if (skip) {
+ charcode=FT_Get_Next_Char(face,charcode,&gindex);
+ continue;
+ }
+
+ _EditorFontData * fdata = memnew( _EditorFontData );
+
+
+ int w = slot->bitmap.width;
+ int h = slot->bitmap.rows;
+ int p = slot->bitmap.pitch;
+
+ //print_line("W: "+itos(w)+" P: "+itos(slot->bitmap.pitch));
+
+ if (font_mode==_EditorFontImportOptions::FONT_DISTANCE_FIELD) {
+
+ //oversize the holding buffer so I can smooth it!
+ int sw = w + scaler * 4;
+ int sh = h + scaler * 4;
+ //do the SDF
+ int sdfw = sw / scaler;
+ int sdfh = sh / scaler;
+
+ fdata->width=sdfw;
+ fdata->height=sdfh;
+ } else {
+ fdata->width=w;
+ fdata->height=h;
+ }
+
+ fdata->character=charcode;
+ fdata->glyph=FT_Get_Char_Index(face,charcode);
+ if (charcode=='x')
+ xsize=w/scaler;
+
+
+
+ fdata->valign=slot->bitmap_top;
+ fdata->halign=slot->bitmap_left;
+
+ if (round_advance)
+ fdata->advance=(slot->advance.x+(1<<5))>>6;
+ else
+ fdata->advance=slot->advance.x/float(1<<6);
+
+ if (font_mode==_EditorFontImportOptions::FONT_DISTANCE_FIELD) {
+
+ fdata->halign = fdata->halign / scaler - 1.5;
+ fdata->valign = fdata->valign / scaler + 1.5;
+ fdata->advance/=scaler;
+
+ }
+
+ fdata->advance+=font_spacing;
+
+
+ if (charcode<127) {
+ int top = fdata->valign;
+ int hmax = h/scaler;
+
+ if (top>max_up) {
+
+ max_up=top;
+ }
+
+
+ if ( (top - hmax)<max_down ) {
+
+ max_down=top - hmax;
+ }
+ }
+
+ if (font_mode==_EditorFontImportOptions::FONT_DISTANCE_FIELD) {
+
+
+ //oversize the holding buffer so I can smooth it!
+ int sw = w + scaler * 4;
+ int sh = h + scaler * 4;
+
+ unsigned char *smooth_buf = new unsigned char[sw*sh];
+
+ for( int i = 0; i < sw*sh; ++i ) {
+ smooth_buf[i] = 0;
+ }
+
+ // copy the glyph into the buffer to be smoothed
+ unsigned char *buf = slot->bitmap.buffer;
+ for( int j = 0; j < h; ++j ) {
+ for( int i = 0; i < w; ++i ) {
+ smooth_buf[scaler*2+i+(j+scaler*2)*sw] = 255 * ((buf[j*p+(i>>3)] >> (7 - (i & 7))) & 1);
+ }
+ }
+
+ // do the SDF
+ int sdfw = fdata->width;
+ int sdfh = fdata->height;
+
+ fdata->bitmap.resize( sdfw*sdfh );
+
+ for( int j = 0; j < sdfh; ++j ) {
+ for( int i = 0; i < sdfw; ++i ) {
+ int pd_idx = j*sdfw+i;
+
+ //fdata->bitmap[j*slot->bitmap.width+i]=slot->bitmap.buffer[j*slot->bitmap.width+i];
+
+ fdata->bitmap[pd_idx] =
+ //get_SDF
+ get_SDF_radial
+ ( smooth_buf, sw, sh,
+ i*scaler + (scaler >>1), j*scaler + (scaler >>1),
+ 2*scaler );
+
+ }
+ }
+
+ delete [] smooth_buf;
+
+ } else {
+ fdata->bitmap.resize( slot->bitmap.width*slot->bitmap.rows );
+ for (int i=0;i<slot->bitmap.width;i++) {
+ for (int j=0;j<slot->bitmap.rows;j++) {
+
+ fdata->bitmap[j*slot->bitmap.width+i]=slot->bitmap.buffer[j*slot->bitmap.width+i];
+ }
+ }
+ }
+
+ font_data_list.push_back(fdata);
+ charcode=FT_Get_Next_Char(face,charcode,&gindex);
+// printf("reading char %i\n",charcode);
+ }
+
+ /* SPACE */
+
+ _EditorFontData *spd = memnew( _EditorFontData );
+ spd->advance=0;
+ spd->character=' ';
+ spd->halign=0;
+ spd->valign=0;
+ spd->width=0;
+ spd->height=0;
+ spd->ofs_x=0;
+ spd->ofs_y=0;
+
+ if (!FT_Load_Char( face, ' ', FT_LOAD_RENDER ) && !FT_Render_Glyph( face->glyph, font_mode==_EditorFontImportOptions::FONT_BITMAP?ft_render_mode_normal:ft_render_mode_mono )) {
+
+ spd->advance = slot->advance.x>>6; //round to nearest or store as float
+ spd->advance/=scaler;
+ spd->advance+=font_spacing;
+ } else {
+
+ spd->advance=xsize;
+ spd->advance+=font_spacing;
+ }
+
+ font_data_list.push_back(spd);
+
+ Set<CharType> exported;
+ for (int i=0; i<font_data_list.size(); i++) {
+ exported.insert(font_data_list[i]->character);
+ };
+ int missing = 0;
+ for(Set<CharType>::Element *E=import_chars.front();E;E=E->next()) {
+ CharType c = E->get();
+ if (!exported.has(c)) {
+ CharType str[2] = {c, 0};
+ printf("** Warning: character %i (%ls) not exported\n", (int)c, str);
+ ++missing;
+ };
+ };
+ print_line("total_chars: "+itos(font_data_list.size()));
+
+ /* KERNING */
+
+
+ for(int i=0;i<font_data_list.size();i++) {
+
+ if (font_data_list[i]->character>512)
+ continue;
+ for(int j=0;j<font_data_list.size();j++) {
+
+ if (font_data_list[j]->character>512)
+ continue;
+
+ FT_Vector delta;
+ FT_Get_Kerning( face, font_data_list[i]->glyph,font_data_list[j]->glyph, FT_KERNING_DEFAULT, &delta );
+
+ if (delta.x!=0) {
+
+ _EditorKerningKey kpk;
+ kpk.A = font_data_list[i]->character;
+ kpk.B = font_data_list[j]->character;
+ int kern = ((-delta.x)+(1<<5))>>6;
+
+ if (kern==0)
+ continue;
+ kerning_map[kpk]=kern/scaler;
+ }
+ }
+ }
+
+ height=max_up-max_down;
+ ascent=max_up;
+
+ /* FIND OUT WHAT THE FONT HEIGHT FOR THIS IS */
+
+ /* ADJUST THE VALIGN FOR EACH CHARACTER */
+
+ for (int i=0;i<(int)font_data_list.size();i++) {
+
+ font_data_list[i]->valign=max_up-font_data_list[i]->valign;
+ }
+
+
+
+ /* ADD THE SPACEBAR CHARACTER */
+/*
+ _EditorFontData * fdata = new _EditorFontData;
+
+ fdata->character=32;
+ fdata->bitmap=0;
+ fdata->width=xsize;
+ fdata->height=1;
+ fdata->valign=0;
+
+ font_data_list.push_back(fdata);
+*/
+ /* SORT BY HEIGHT, SO THEY FIT BETTER ON THE TEXTURE */
+
+ font_data_list.sort_custom<_EditorFontDataSort>();
+ Color *color=memnew_arr(Color,height);
+
+ int gradient_type=from->get_option("color/mode");
+ switch(gradient_type) {
+ case _EditorFontImportOptions::COLOR_WHITE: {
+
+ for(int i=0;i<height;i++){
+ color[i]=Color(1,1,1,1);
+ }
+
+ } break;
+ case _EditorFontImportOptions::COLOR_CUSTOM: {
+
+ Color cc = from->get_option("color/color");
+ for(int i=0;i<height;i++){
+ color[i]=cc;
+ }
+
+ } break;
+ case _EditorFontImportOptions::COLOR_GRADIENT_RANGE: {
+
+ Color src=from->get_option("color/begin");
+ Color to=from->get_option("color/end");
+ for(int i=0;i<height;i++){
+ color[i]=src.linear_interpolate(to,i/float(height));
+ }
+
+ } break;
+ case _EditorFontImportOptions::COLOR_GRADIENT_IMAGE: {
+
+ String fp = EditorImportPlugin::expand_source_path(from->get_option("color/image"));
+ Image img;
+ Error err = ImageLoader::load_image(fp,&img);
+ if (err==OK) {
+
+ for(int i=0;i<height;i++){
+ //color[i]=img.get_pixel(0,i*img.get_height()/height);
+ }
+ } else {
+
+ for(int i=0;i<height;i++){
+ color[i]=Color(1,1,1,1);
+ }
+ }
+
+ } break;
+ }
+
+
+ for(int i=0;i<font_data_list.size();i++) {
+
+ if (font_data_list[i]->bitmap.size()==0)
+ continue;
+
+ int margin[4]={0,0,0,0};
+
+ if (from->get_option("shadow/enabled").operator bool()) {
+ int r=from->get_option("shadow/radius");
+ Point2i ofs=Point2(from->get_option("shadow/offset"));
+ margin[ MARGIN_LEFT ] = MAX( r - ofs.x, 0);
+ margin[ MARGIN_RIGHT ] = MAX( r + ofs.x, 0);
+ margin[ MARGIN_TOP ] = MAX( r - ofs.y, 0);
+ margin[ MARGIN_BOTTOM ] = MAX( r + ofs.y, 0);
+
+ }
+
+ if (from->get_option("shadow2/enabled").operator bool()) {
+ int r=from->get_option("shadow2/radius");
+ Point2i ofs=Point2(from->get_option("shadow2/offset"));
+ margin[ MARGIN_LEFT ] = MAX( r - ofs.x, margin[ MARGIN_LEFT ]);
+ margin[ MARGIN_RIGHT ] = MAX( r + ofs.x, margin[ MARGIN_RIGHT ]);
+ margin[ MARGIN_TOP ] = MAX( r - ofs.y, margin[ MARGIN_TOP ]);
+ margin[ MARGIN_BOTTOM ] = MAX( r + ofs.y, margin[ MARGIN_BOTTOM ]);
+
+ }
+
+ Size2i s;
+ s.width=font_data_list[i]->width+margin[MARGIN_LEFT]+margin[MARGIN_RIGHT];
+ s.height=font_data_list[i]->height+margin[MARGIN_TOP]+margin[MARGIN_BOTTOM];
+ Point2i o;
+ o.x=margin[MARGIN_LEFT];
+ o.y=margin[MARGIN_TOP];
+
+ int ow=font_data_list[i]->width;
+ int oh=font_data_list[i]->height;
+
+ PoolVector<uint8_t> pixels;
+ pixels.resize(s.x*s.y*4);
+
+ PoolVector<uint8_t>::Write w = pixels.write();
+ //print_line("val: "+itos(font_data_list[i]->valign));
+ for(int y=0;y<s.height;y++) {
+
+ int yc=CLAMP(y-o.y+font_data_list[i]->valign,0,height-1);
+ Color c=color[yc];
+ c.a=0;
+
+ for(int x=0;x<s.width;x++) {
+
+ int ofs=y*s.x+x;
+ w[ofs*4+0]=c.r*255.0;
+ w[ofs*4+1]=c.g*255.0;
+ w[ofs*4+2]=c.b*255.0;
+ w[ofs*4+3]=c.a*255.0;
+ }
+ }
+
+
+ for(int si=0;si<2;si++) {
+
+#define S_VAR(m_v) (String(si==0?"shadow/":"shadow2/")+m_v)
+ if (from->get_option(S_VAR("enabled")).operator bool()) {
+ int r = from->get_option(S_VAR("radius"));
+
+ Color sc = from->get_option(S_VAR("color"));
+ Point2i so=Point2(from->get_option(S_VAR("offset")));
+
+ float tr = from->get_option(S_VAR("transition"));
+ print_line("shadow enabled: "+itos(si));
+
+ Vector<uint8_t> s2buf;
+ s2buf.resize(s.x*s.y);
+ uint8_t *wa=s2buf.ptr();
+
+ for(int j=0;j<s.x*s.y;j++){
+
+ wa[j]=0;
+ }
+
+ // blit shadowa
+ for(int x=0;x<ow;x++) {
+ for(int y=0;y<oh;y++) {
+ int ofs = (o.y+y+so.y)*s.x+x+o.x+so.x;
+ wa[ofs]=font_data_list[i]->bitmap[y*ow+x];
+ }
+ }
+ //blur shadow2 with separatable convolution
+
+ if (r>0) {
+
+ Vector<uint8_t> pixels2;
+ pixels2.resize(s2buf.size());
+ uint8_t *w2=pixels2.ptr();
+ //vert
+ for(int x=0;x<s.width;x++) {
+ for(int y=0;y<s.height;y++) {
+
+ int ofs = y*s.width+x;
+ int sum=wa[ofs];
+
+ for(int k=1;k<=r;k++) {
+
+ int ofs_d=MIN(y+k,s.height-1)*s.width+x;
+ int ofs_u=MAX(y-k,0)*s.width+x;
+ sum+=wa[ofs_d];
+ sum+=wa[ofs_u];
+ }
+
+ w2[ofs]=sum/(r*2+1);
+
+ }
+ }
+ //horiz
+ for(int x=0;x<s.width;x++) {
+ for(int y=0;y<s.height;y++) {
+
+ int ofs = y*s.width+x;
+ int sum=w2[ofs];
+
+ for(int k=1;k<=r;k++) {
+
+ int ofs_r=MIN(x+k,s.width-1)+s.width*y;
+ int ofs_l=MAX(x-k,0)+s.width*y;
+ sum+=w2[ofs_r];
+ sum+=w2[ofs_l];
+ }
+
+ wa[ofs]=Math::pow(float(sum/(r*2+1))/255.0f,tr)*255.0f;
+
+ }
+ }
+
+ }
+
+ //blend back
+
+ for(int j=0;j<s.x*s.y;j++){
+ Color wd(w[j*4+0]/255.0,w[j*4+1]/255.0,w[j*4+2]/255.0,w[j*4+3]/255.0);
+ Color ws(sc.r,sc.g,sc.b,sc.a*(wa[j]/255.0));
+ Color b = wd.blend(ws);
+
+ w[j*4+0]=b.r*255.0;
+ w[j*4+1]=b.g*255.0;
+ w[j*4+2]=b.b*255.0;
+ w[j*4+3]=b.a*255.0;
+
+ }
+ }
+ }
+
+ for(int y=0;y<oh;y++) {
+ int yc=CLAMP(y+font_data_list[i]->valign,0,height-1);
+ Color sc=color[yc];
+ for(int x=0;x<ow;x++) {
+ int ofs = (o.y+y)*s.x+x+o.x;
+ float c = font_data_list[i]->bitmap[y*ow+x]/255.0;
+ Color src_col=sc;
+ src_col.a*=c;
+ Color dst_col(w[ofs*4+0]/255.0,w[ofs*4+1]/255.0,w[ofs*4+2]/255.0,w[ofs*4+3]/255.0);
+ dst_col = dst_col.blend(src_col);
+ w[ofs*4+0]=dst_col.r*255.0;
+ w[ofs*4+1]=dst_col.g*255.0;
+ w[ofs*4+2]=dst_col.b*255.0;
+ w[ofs*4+3]=dst_col.a*255.0;
+ }
+ }
+
+
+ w=PoolVector<uint8_t>::Write();
+
+ Image img(s.width,s.height,0,Image::FORMAT_RGBA8,pixels);
+
+ font_data_list[i]->blit=img;
+ font_data_list[i]->blit_ofs=o;
+
+ }
+
+ //make atlas
+ int spacing=2;
+ Vector<Size2i> sizes;
+ sizes.resize(font_data_list.size());
+ for(int i=0;i<font_data_list.size();i++) {
+
+ sizes[i]=Size2(font_data_list[i]->blit.get_width()+spacing*2,font_data_list[i]->blit.get_height()+spacing*2);
+
+ }
+ Vector<Point2i> res;
+ Size2i res_size;
+ EditorAtlas::fit(sizes,res,res_size);
+ res_size.x=nearest_power_of_2(res_size.x);
+ res_size.y=nearest_power_of_2(res_size.y);
+ print_line("Atlas size: "+res_size);
+
+ Image atlas(res_size.x,res_size.y,0,Image::FORMAT_RGBA8);
+
+ for(int i=0;i<font_data_list.size();i++) {
+
+ if (font_data_list[i]->bitmap.size()==0)
+ continue;
+ atlas.blit_rect(font_data_list[i]->blit,Rect2(0,0,font_data_list[i]->blit.get_width(),font_data_list[i]->blit.get_height()),res[i]+Size2(spacing,spacing));
+ font_data_list[i]->ofs_x=res[i].x+spacing;
+ font_data_list[i]->ofs_y=res[i].y+spacing;
+
+
+ }
+
+ if (from->has_option("advanced/premultiply_alpha") && bool(from->get_option("advanced/premultiply_alpha"))) {
+
+ PoolVector<uint8_t> data = atlas.get_data();
+ int dl = data.size();
+ {
+ PoolVector<uint8_t>::Write w = data.write();
+
+ for(int i=0;i<dl;i+=4) {
+
+ w[i+0]= uint8_t(int(w[i+0])*int(w[i+3])/255);
+ w[i+1]= uint8_t(int(w[i+1])*int(w[i+3])/255);
+ w[i+2]= uint8_t(int(w[i+2])*int(w[i+3])/255);
+ }
+ }
+
+ atlas=Image(res_size.x,res_size.y,0,Image::FORMAT_RGBA8,data);
+ }
+
+ if (from->has_option("color/monochrome") && bool(from->get_option("color/monochrome"))) {
+
+ atlas.convert(Image::FORMAT_LA8);
+ }
+
+
+ if (0) {
+ //debug the texture
+ Ref<ImageTexture> atlast = memnew( ImageTexture );
+ atlast->create_from_image(atlas);
+ //atlast->create_from_image(font_data_list[5]->blit);
+ TextureRect *tf = memnew( TextureRect );
+ tf->set_texture(atlast);
+ dialog->add_child(tf);
+ }
+
+
+ /* CREATE FONT */
+
+ int char_space = from->get_option("extra_space/char");
+ int space_space = from->get_option("extra_space/space");
+ int top_space = from->get_option("extra_space/top");
+ int bottom_space = from->get_option("extra_space/bottom");
+ bool enable_filter = from->get_option("advanced/enable_filter");
+ if (from->has_option("advanced/disable_filter")){ // this is a compatibility check for a deprecated option
+ enable_filter = !from->get_option("advanced/disable_filter");
+ }
+
+ Ref<BitmapFont> font;
+
+ if (p_existing!=String() && ResourceCache::has(p_existing)) {
+
+ font = Ref<BitmapFont>( ResourceCache::get(p_existing)->cast_to<BitmapFont>());
+ }
+
+ if (font.is_null()) {
+ font = Ref<BitmapFont>( memnew( BitmapFont ) );
+ }
+
+ font->clear();
+ font->set_height(height+bottom_space+top_space);
+ font->set_ascent(ascent+top_space);
+ font->set_distance_field_hint(font_mode==_EditorFontImportOptions::FONT_DISTANCE_FIELD);
+
+ //register texures
+ {
+ Ref<ImageTexture> t = memnew(ImageTexture);
+ int flags;
+ if (!enable_filter)
+ flags=0;
+ else
+ flags=Texture::FLAG_FILTER;
+ t->create_from_image(atlas,flags);
+ t->set_storage( ImageTexture::STORAGE_COMPRESS_LOSSLESS );
+ font->add_texture(t);
+
+ }
+ //register characters
+
+
+ for(int i=0;i<font_data_list.size();i++) {
+ _EditorFontData *fd=font_data_list[i];
+ int tex_idx=0;
+
+ font->add_char(fd->character,tex_idx,Rect2( fd->ofs_x, fd->ofs_y, fd->blit.get_width(), fd->blit.get_height()),Point2(fd->halign-fd->blit_ofs.x,fd->valign-fd->blit_ofs.y+top_space), fd->advance+char_space+(fd->character==' '?space_space:0));
+ memdelete(fd);
+ }
+
+ for(Map<_EditorKerningKey,int>::Element *E=kerning_map.front();E;E=E->next()) {
+
+ font->add_kerning_pair(E->key().A,E->key().B,E->get());
+ }
+
+ FT_Done_FreeType( library );
+
+ return font;
+#else
+
+ return Ref<BitmapFont>();
+#endif
+}
+
+
+String EditorFontImportPlugin::get_name() const {
+
+ return "font";
+}
+String EditorFontImportPlugin::get_visible_name() const{
+
+ return TTR("Font");
+}
+void EditorFontImportPlugin::import_dialog(const String& p_from){
+
+ dialog->popup_import(p_from);
+}
+Error EditorFontImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from){
+
+
+ Ref<BitmapFont> font = EditorFontImportPlugin::generate_font(p_from,p_path);
+ if (!font.is_valid())
+ return ERR_CANT_CREATE;
+
+ Ref<ResourceImportMetadata> from=p_from;
+ from->set_source_md5(0,FileAccess::get_md5(EditorImportPlugin::expand_source_path(from->get_source_path(0))));
+ from->set_editor(get_name());
+ font->set_import_metadata(from);
+
+ return ResourceSaver::save(p_path,font);
+
+}
+
+void EditorFontImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+ for(int i=0;i<p_drop.size();i++) {
+ String ext = p_drop[i].get_extension().to_lower();
+ String file = p_drop[i].get_file();
+ if (ext=="ttf" || ext=="otf" || ext=="fnt") {
+
+ import_dialog();
+ dialog->set_source_and_dest(p_drop[i],p_dest_path.plus_file(file.get_basename()+".fnt"));
+ break;
+ }
+ }
+}
+
+
+EditorFontImportPlugin::EditorFontImportPlugin(EditorNode* p_editor) {
+
+ dialog = memnew( EditorFontImportDialog(this) );
+ p_editor->get_gui_base()->add_child(dialog);
+}
+#endif
diff --git a/editor/io_plugins/editor_font_import_plugin.h b/editor/io_plugins/editor_font_import_plugin.h
new file mode 100644
index 0000000000..315a80e8cd
--- /dev/null
+++ b/editor/io_plugins/editor_font_import_plugin.h
@@ -0,0 +1,58 @@
+/*************************************************************************/
+/* editor_font_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_FONT_IMPORT_PLUGIN_H
+#define EDITOR_FONT_IMPORT_PLUGIN_H
+
+#include "editor/editor_export.h"
+#include "scene/resources/font.h"
+#if 0
+class EditorNode;
+class EditorFontImportDialog;
+
+class EditorFontImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorFontImportPlugin,EditorImportPlugin);
+
+ EditorFontImportDialog *dialog;
+public:
+
+ Ref<BitmapFont> generate_font(const Ref<ResourceImportMetadata>& p_from,const String& p_existing=String()); //used by editor
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path);
+
+
+ EditorFontImportPlugin(EditorNode* p_editor);
+};
+
+#endif // EDITOR_FONT_IMPORT_PLUGIN_H
+#endif
diff --git a/editor/io_plugins/editor_mesh_import_plugin.cpp b/editor/io_plugins/editor_mesh_import_plugin.cpp
new file mode 100644
index 0000000000..df9d0a62e6
--- /dev/null
+++ b/editor/io_plugins/editor_mesh_import_plugin.cpp
@@ -0,0 +1,593 @@
+/*************************************************************************/
+/* editor_mesh_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_mesh_import_plugin.h"
+
+#if 0
+
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_dir_dialog.h"
+#include "editor/editor_node.h"
+#include "editor/property_editor.h"
+//#include "scene/resources/sample.h"
+#include "io/resource_saver.h"
+#include "os/file_access.h"
+#include "io/marshalls.h"
+#include "scene/resources/surface_tool.h"
+
+class _EditorMeshImportOptions : public Object {
+
+ GDCLASS(_EditorMeshImportOptions,Object);
+public:
+
+
+ bool generate_tangents;
+ bool generate_normals;
+ bool flip_faces;
+ bool smooth_shading;
+ bool weld_vertices;
+ bool import_material;
+ bool import_textures;
+ float weld_tolerance;
+
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+ if (n=="generate/tangents")
+ generate_tangents=p_value;
+ else if (n=="generate/normals")
+ generate_normals=p_value;
+ else if (n=="import/materials")
+ import_material=p_value;
+ else if (n=="import/textures")
+ import_textures=p_value;
+ else if (n=="force/flip_faces")
+ flip_faces=p_value;
+ else if (n=="force/smooth_shading")
+ smooth_shading=p_value;
+ else if (n=="force/weld_vertices")
+ weld_vertices=p_value;
+ else if (n=="force/weld_tolerance")
+ weld_tolerance=p_value;
+ else
+ return false;
+
+ return true;
+
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const{
+
+ String n = p_name;
+ if (n=="generate/tangents")
+ r_ret=generate_tangents;
+ else if (n=="generate/normals")
+ r_ret=generate_normals;
+ else if (n=="import/materials")
+ r_ret=import_material;
+ else if (n=="import/textures")
+ r_ret=import_textures;
+ else if (n=="force/flip_faces")
+ r_ret=flip_faces;
+ else if (n=="force/smooth_shading")
+ r_ret=smooth_shading;
+ else if (n=="force/weld_vertices")
+ r_ret=weld_vertices;
+ else if (n=="force/weld_tolerance")
+ r_ret=weld_tolerance;
+ else
+ return false;
+
+ return true;
+
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const{
+
+ p_list->push_back(PropertyInfo(Variant::BOOL,"generate/tangents"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"generate/normals"));
+ //not for nowp
+ //p_list->push_back(PropertyInfo(Variant::BOOL,"import/materials"));
+ //p_list->push_back(PropertyInfo(Variant::BOOL,"import/textures"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/flip_faces"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/smooth_shading"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/weld_vertices"));
+ p_list->push_back(PropertyInfo(Variant::REAL,"force/weld_tolerance",PROPERTY_HINT_RANGE,"0.00001,16,0.00001"));
+ //p_list->push_back(PropertyInfo(Variant::BOOL,"compress/enable"));
+ //p_list->push_back(PropertyInfo(Variant::INT,"compress/bitrate",PROPERTY_HINT_ENUM,"64,96,128,192"));
+
+
+ }
+
+
+ static void _bind_methods() {
+
+
+ ADD_SIGNAL( MethodInfo("changed"));
+ }
+
+
+ _EditorMeshImportOptions() {
+
+ generate_tangents=true;
+ generate_normals=false;
+ flip_faces=false;
+ smooth_shading=false;
+ weld_vertices=true;
+ weld_tolerance=0.0001;
+ import_material=false;
+ import_textures=false;
+
+ }
+
+
+};
+
+class EditorMeshImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorMeshImportDialog,ConfirmationDialog);
+
+ EditorMeshImportPlugin *plugin;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ EditorFileDialog *file_select;
+ EditorDirDialog *save_select;
+ AcceptDialog *error_dialog;
+ PropertyEditor *option_editor;
+
+ _EditorMeshImportOptions *options;
+
+
+public:
+
+ void _choose_files(const Vector<String>& p_path) {
+
+ String files;
+ for(int i=0;i<p_path.size();i++) {
+
+ if (i>0)
+ files+=",";
+ files+=p_path[i];
+ }
+ /*
+ if (p_path.size()) {
+ String srctex=p_path[0];
+ String ipath = EditorImportDB::get_singleton()->find_source_path(srctex);
+
+ if (ipath!="")
+ save_path->set_text(ipath.get_base_dir());
+ }*/
+ import_path->set_text(files);
+
+ }
+ void _choose_save_dir(const String& p_path) {
+
+ save_path->set_text(p_path);
+ }
+
+ void _browse() {
+
+ file_select->popup_centered_ratio();
+ }
+
+ void _browse_target() {
+
+ save_select->popup_centered_ratio();
+ }
+
+ void popup_import(const String& p_path) {
+
+ popup_centered(Size2(400,400)*EDSCALE);
+
+ if (p_path!="") {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+ ERR_FAIL_COND(!rimd.is_valid());
+
+ save_path->set_text(p_path.get_base_dir());
+ List<String> opts;
+ rimd->get_options(&opts);
+ for(List<String>::Element *E=opts.front();E;E=E->next()) {
+
+ options->_set(E->get(),rimd->get_option(E->get()));
+ }
+
+ String src = "";
+ for(int i=0;i<rimd->get_source_count();i++) {
+ if (i>0)
+ src+=",";
+ src+=EditorImportPlugin::expand_source_path(rimd->get_source_path(i));
+ }
+ import_path->set_text(src);
+ }
+ }
+
+ void _import() {
+
+ Vector<String> meshes = import_path->get_text().split(",");
+ if (meshes.size()==0) {
+ error_dialog->set_text(TTR("No meshes to import!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ String dst = save_path->get_text();
+ if (dst=="") {
+ error_dialog->set_text(TTR("Save path is empty!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ for(int i=0;i<meshes.size();i++) {
+
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+
+ List<PropertyInfo> pl;
+ options->_get_property_list(&pl);
+ for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) {
+
+ Variant v;
+ String opt=E->get().name;
+ options->_get(opt,v);
+ imd->set_option(opt,v);
+
+ }
+
+ imd->add_source(EditorImportPlugin::validate_source_path(meshes[i]));
+
+ String file_path = dst.plus_file(meshes[i].get_file().get_basename()+".msh");
+
+ plugin->import(file_path,imd);
+ }
+
+ hide();
+ }
+
+ void _notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ option_editor->edit(options);
+ }
+ }
+
+ static void _bind_methods() {
+
+ ClassDB::bind_method("_choose_files",&EditorMeshImportDialog::_choose_files);
+ ClassDB::bind_method("_choose_save_dir",&EditorMeshImportDialog::_choose_save_dir);
+ ClassDB::bind_method("_import",&EditorMeshImportDialog::_import);
+ ClassDB::bind_method("_browse",&EditorMeshImportDialog::_browse);
+ ClassDB::bind_method("_browse_target",&EditorMeshImportDialog::_browse_target);
+ }
+
+ EditorMeshImportDialog(EditorMeshImportPlugin *p_plugin) {
+
+ plugin=p_plugin;
+
+ set_title(TTR("Single Mesh Import"));
+ set_hide_on_ok(false);
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Source Mesh(es):"),hbc);
+
+ import_path = memnew( LineEdit );
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+
+ Button * import_choose = memnew( Button );
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this,"_browse");
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Target Path:"),hbc);
+
+ save_path = memnew( LineEdit );
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew( Button );
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this,"_browse_target");
+
+ file_select = memnew( EditorFileDialog );
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ file_select->add_filter("*.obj ; Wavefront OBJ");
+ add_child(file_select);
+ file_select->connect("files_selected", this,"_choose_files");
+
+ save_select = memnew( EditorDirDialog );
+ add_child(save_select);
+ save_select->connect("dir_selected", this,"_choose_save_dir");
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+ error_dialog = memnew( AcceptDialog );
+ add_child(error_dialog);
+
+ options = memnew( _EditorMeshImportOptions );
+
+ option_editor = memnew( PropertyEditor );
+ option_editor->hide_top_label();
+ vbc->add_margin_child(TTR("Options:"),option_editor,true);
+ }
+
+ ~EditorMeshImportDialog() {
+ memdelete(options);
+ }
+
+};
+
+
+String EditorMeshImportPlugin::get_name() const {
+
+ return "mesh";
+}
+String EditorMeshImportPlugin::get_visible_name() const{
+
+ return TTR("Mesh");
+}
+void EditorMeshImportPlugin::import_dialog(const String& p_from){
+
+ dialog->popup_import(p_from);
+}
+Error EditorMeshImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from){
+
+
+ ERR_FAIL_COND_V(p_from->get_source_count()!=1,ERR_INVALID_PARAMETER);
+
+ Ref<ResourceImportMetadata> from=p_from;
+
+ String src_path=EditorImportPlugin::expand_source_path(from->get_source_path(0));
+ FileAccessRef f = FileAccess::open(src_path,FileAccess::READ);
+ ERR_FAIL_COND_V(!f,ERR_CANT_OPEN);
+
+ Ref<Mesh> mesh;
+ Map<String,Ref<Material> > name_map;
+
+ if (FileAccess::exists(p_path)) {
+ mesh=ResourceLoader::load(p_path,"Mesh");
+ if (mesh.is_valid()) {
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ if (!mesh->surface_get_material(i).is_valid())
+ continue;
+ String name;
+ if (mesh->surface_get_name(i)!="")
+ name=mesh->surface_get_name(i);
+ else
+ name=vformat(TTR("Surface %d"),i+1);
+
+ name_map[name]=mesh->surface_get_material(i);
+ }
+
+ while(mesh->get_surface_count()) {
+ mesh->surface_remove(0);
+ }
+ }
+ }
+
+ if (!mesh.is_valid())
+ mesh = Ref<Mesh>( memnew( Mesh ) );
+
+
+ bool generate_normals=from->get_option("generate/normals");
+ bool generate_tangents=from->get_option("generate/tangents");
+ bool flip_faces=from->get_option("force/flip_faces");
+ bool force_smooth=from->get_option("force/smooth_shading");
+ bool weld_vertices=from->get_option("force/weld_vertices");
+ float weld_tolerance=from->get_option("force/weld_tolerance");
+ Vector<Vector3> vertices;
+ Vector<Vector3> normals;
+ Vector<Vector2> uvs;
+ String name;
+
+ Ref<SurfaceTool> surf_tool = memnew( SurfaceTool) ;
+ surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
+ if (force_smooth)
+ surf_tool->add_smooth_group(true);
+ int has_index_data=false;
+
+ while(true) {
+
+
+ String l = f->get_line().strip_edges();
+
+ if (l.begins_with("v ")) {
+ //vertex
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+ Vector3 vtx;
+ vtx.x=v[1].to_float();
+ vtx.y=v[2].to_float();
+ vtx.z=v[3].to_float();
+ vertices.push_back(vtx);
+ } else if (l.begins_with("vt ")) {
+ //uv
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<3,ERR_INVALID_DATA);
+ Vector2 uv;
+ uv.x=v[1].to_float();
+ uv.y=1.0-v[2].to_float();
+ uvs.push_back(uv);
+
+ } else if (l.begins_with("vn ")) {
+ //normal
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+ Vector3 nrm;
+ nrm.x=v[1].to_float();
+ nrm.y=v[2].to_float();
+ nrm.z=v[3].to_float();
+ normals.push_back(nrm);
+ } if (l.begins_with("f ")) {
+ //vertex
+
+ has_index_data=true;
+ Vector<String> v = l.split(" ",false);
+ ERR_FAIL_COND_V(v.size()<4,ERR_INVALID_DATA);
+
+ //not very fast, could be sped up
+
+
+ Vector<String> face[3];
+ face[0] = v[1].split("/");
+ face[1] = v[2].split("/");
+ ERR_FAIL_COND_V(face[0].size()==0,ERR_PARSE_ERROR);
+ ERR_FAIL_COND_V(face[0].size()!=face[1].size(),ERR_PARSE_ERROR);
+ for(int i=2;i<v.size()-1;i++) {
+
+ face[2] = v[i+1].split("/");
+ ERR_FAIL_COND_V(face[0].size()!=face[2].size(),ERR_PARSE_ERROR);
+ for(int j=0;j<3;j++) {
+
+ int idx=j;
+
+ if (!flip_faces && idx<2) {
+ idx=1^idx;
+ }
+
+
+ if (face[idx].size()==3) {
+ int norm = face[idx][2].to_int()-1;
+ ERR_FAIL_INDEX_V(norm,normals.size(),ERR_PARSE_ERROR);
+ surf_tool->add_normal(normals[norm]);
+ }
+
+ if (face[idx].size()>=2 && face[idx][1]!=String()) {
+
+ int uv = face[idx][1].to_int()-1;
+ ERR_FAIL_INDEX_V(uv,uvs.size(),ERR_PARSE_ERROR);
+ surf_tool->add_uv(uvs[uv]);
+ }
+
+ int vtx = face[idx][0].to_int()-1;
+ ERR_FAIL_INDEX_V(vtx,vertices.size(),ERR_PARSE_ERROR);
+
+ Vector3 vertex = vertices[vtx];
+ if (weld_vertices)
+ vertex=vertex.snapped(weld_tolerance);
+ surf_tool->add_vertex(vertex);
+ }
+
+ face[1]=face[2];
+ }
+ } else if (l.begins_with("s ") && !force_smooth) { //smoothing
+ String what = l.substr(2,l.length()).strip_edges();
+ if (what=="off")
+ surf_tool->add_smooth_group(false);
+ else
+ surf_tool->add_smooth_group(true);
+
+ } else if (l.begins_with("o ") || f->eof_reached()) { //new surface or done
+
+ if (has_index_data) {
+ //new object/surface
+ if (generate_normals || force_smooth)
+ surf_tool->generate_normals();
+ if (uvs.size() && (normals.size() || generate_normals) && generate_tangents)
+ surf_tool->generate_tangents();
+
+ surf_tool->index();
+ mesh = surf_tool->commit(mesh);
+ if (name=="")
+ name=vformat(TTR("Surface %d"),mesh->get_surface_count()-1);
+ mesh->surface_set_name(mesh->get_surface_count()-1,name);
+ name="";
+ surf_tool->clear();
+ surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
+ if (force_smooth)
+ surf_tool->add_smooth_group(true);
+
+ has_index_data=false;
+
+ if (f->eof_reached())
+ break;
+ }
+
+ if (l.begins_with("o ")) //name
+ name=l.substr(2,l.length()).strip_edges();
+ }
+ }
+
+
+ from->set_source_md5(0,FileAccess::get_md5(src_path));
+ from->set_editor(get_name());
+ mesh->set_import_metadata(from);
+
+ //re-apply materials if exist
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ String n = mesh->surface_get_name(i);
+ if (name_map.has(n))
+ mesh->surface_set_material(i,name_map[n]);
+ }
+
+ Error err = ResourceSaver::save(p_path,mesh);
+
+ return err;
+}
+
+
+void EditorMeshImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+
+ Vector<String> files;
+ for(int i=0;i<p_drop.size();i++) {
+ String ext = p_drop[i].get_extension().to_lower();
+ String file = p_drop[i].get_file();
+ if (ext=="obj") {
+
+ files.push_back(p_drop[i]);
+ }
+ }
+
+ if (files.size()) {
+ import_dialog();
+ dialog->_choose_files(files);
+ dialog->_choose_save_dir(p_dest_path);
+ }
+}
+
+EditorMeshImportPlugin::EditorMeshImportPlugin(EditorNode* p_editor) {
+
+ dialog = memnew( EditorMeshImportDialog(this));
+ p_editor->get_gui_base()->add_child(dialog);
+}
+#endif
diff --git a/editor/io_plugins/editor_mesh_import_plugin.h b/editor/io_plugins/editor_mesh_import_plugin.h
new file mode 100644
index 0000000000..df374549d4
--- /dev/null
+++ b/editor/io_plugins/editor_mesh_import_plugin.h
@@ -0,0 +1,59 @@
+/*************************************************************************/
+/* editor_mesh_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_MESH_IMPORT_PLUGIN_H
+#define EDITOR_MESH_IMPORT_PLUGIN_H
+
+#if 0
+#include "editor/editor_import_export.h"
+#include "scene/resources/font.h"
+
+class EditorNode;
+class EditorMeshImportDialog;
+
+class EditorMeshImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorMeshImportPlugin,EditorImportPlugin);
+
+ EditorMeshImportDialog *dialog;
+
+
+public:
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path);
+
+
+ EditorMeshImportPlugin(EditorNode* p_editor);
+};
+
+#endif
+#endif // EDITOR_MESH_IMPORT_PLUGIN_H
diff --git a/editor/io_plugins/editor_sample_import_plugin.cpp b/editor/io_plugins/editor_sample_import_plugin.cpp
new file mode 100644
index 0000000000..d446d39027
--- /dev/null
+++ b/editor/io_plugins/editor_sample_import_plugin.cpp
@@ -0,0 +1,929 @@
+/*************************************************************************/
+/* editor_sample_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_sample_import_plugin.h"
+
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_dir_dialog.h"
+#include "editor/editor_node.h"
+#include "editor/property_editor.h"
+#include "io/resource_saver.h"
+#include "os/file_access.h"
+#include "io/marshalls.h"
+#include "editor/editor_settings.h"
+
+#if 0
+
+class _EditorSampleImportOptions : public Object {
+
+ GDCLASS(_EditorSampleImportOptions,Object);
+public:
+
+ enum CompressMode {
+ COMPRESS_MODE_DISABLED,
+ COMPRESS_MODE_RAM,
+ COMPRESS_MODE_DISK
+ };
+
+ enum CompressBitrate {
+ COMPRESS_64,
+ COMPRESS_96,
+ COMPRESS_128,
+ COMPRESS_192
+ };
+
+ bool force_8_bit;
+ bool force_mono;
+ bool force_rate;
+ float force_rate_hz;
+
+ bool edit_trim;
+ bool edit_normalize;
+ bool edit_loop;
+
+ CompressMode compress_mode;
+ CompressBitrate compress_bitrate;
+
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ String n = p_name;
+ if (n=="force/8_bit")
+ force_8_bit=p_value;
+ else if (n=="force/mono")
+ force_mono=p_value;
+ else if (n=="force/max_rate")
+ force_rate=p_value;
+ else if (n=="force/max_rate_hz")
+ force_rate_hz=p_value;
+ else if (n=="edit/trim")
+ edit_trim=p_value;
+ else if (n=="edit/normalize")
+ edit_normalize=p_value;
+ else if (n=="edit/loop")
+ edit_loop=p_value;
+ else if (n=="compress/mode")
+ compress_mode=CompressMode(int(p_value));
+ else if (n=="compress/bitrate")
+ compress_bitrate=CompressBitrate(int(p_value));
+ else
+ return false;
+
+ return true;
+
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const{
+
+ String n = p_name;
+ if (n=="force/8_bit")
+ r_ret=force_8_bit;
+ else if (n=="force/mono")
+ r_ret=force_mono;
+ else if (n=="force/max_rate")
+ r_ret=force_rate;
+ else if (n=="force/max_rate_hz")
+ r_ret=force_rate_hz;
+ else if (n=="edit/trim")
+ r_ret=edit_trim;
+ else if (n=="edit/normalize")
+ r_ret=edit_normalize;
+ else if (n=="edit/loop")
+ r_ret=edit_loop;
+ else if (n=="compress/mode")
+ r_ret=compress_mode;
+ else if (n=="compress/bitrate")
+ r_ret=compress_bitrate;
+ else
+ return false;
+
+ return true;
+
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const{
+
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/8_bit"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/mono"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"force/max_rate"));
+ p_list->push_back(PropertyInfo(Variant::REAL,"force/max_rate_hz",PROPERTY_HINT_EXP_RANGE,"11025,192000,1"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"edit/trim"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"edit/normalize"));
+ p_list->push_back(PropertyInfo(Variant::BOOL,"edit/loop"));
+ p_list->push_back(PropertyInfo(Variant::INT,"compress/mode",PROPERTY_HINT_ENUM,"Disabled,RAM (Ima-ADPCM)"));
+ //p_list->push_back(PropertyInfo(Variant::INT,"compress/bitrate",PROPERTY_HINT_ENUM,"64,96,128,192"));
+
+
+ }
+
+
+ static void _bind_methods() {
+
+
+ ADD_SIGNAL( MethodInfo("changed"));
+ }
+
+
+ _EditorSampleImportOptions() {
+
+ force_8_bit=false;
+ force_mono=false;
+ force_rate=true;
+ force_rate_hz=44100;
+
+ edit_trim=true;
+ edit_normalize=true;
+ edit_loop=false;
+
+ compress_mode=COMPRESS_MODE_RAM;
+ compress_bitrate=COMPRESS_128;
+ }
+
+
+};
+
+class EditorSampleImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorSampleImportDialog,ConfirmationDialog);
+
+ EditorSampleImportPlugin *plugin;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ EditorFileDialog *file_select;
+ EditorDirDialog *save_select;
+ ConfirmationDialog *error_dialog;
+ PropertyEditor *option_editor;
+
+ _EditorSampleImportOptions *options;
+
+
+public:
+
+ void _choose_files(const Vector<String>& p_path) {
+
+ String files;
+ for(int i=0;i<p_path.size();i++) {
+
+ if (i>0)
+ files+=",";
+ files+=p_path[i];
+ }
+ /*
+ if (p_path.size()) {
+ String srctex=p_path[0];
+ String ipath = EditorImportDB::get_singleton()->find_source_path(srctex);
+
+ if (ipath!="")
+ save_path->set_text(ipath.get_base_dir());
+ }*/
+ import_path->set_text(files);
+
+ }
+ void _choose_save_dir(const String& p_path) {
+
+ save_path->set_text(p_path);
+ }
+
+ void _browse() {
+
+ file_select->popup_centered_ratio();
+ }
+
+ void _browse_target() {
+
+ save_select->popup_centered_ratio();
+
+ }
+
+
+ void popup_import(const String& p_path) {
+
+ popup_centered(Size2(400,400)*EDSCALE);
+ if (p_path!="") {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+ ERR_FAIL_COND(!rimd.is_valid());
+
+ save_path->set_text(p_path.get_base_dir());
+ List<String> opts;
+ rimd->get_options(&opts);
+ for(List<String>::Element *E=opts.front();E;E=E->next()) {
+
+ options->_set(E->get(),rimd->get_option(E->get()));
+ }
+
+ String src = "";
+ for(int i=0;i<rimd->get_source_count();i++) {
+ if (i>0)
+ src+=",";
+ src+=EditorImportPlugin::expand_source_path(rimd->get_source_path(i));
+ }
+ import_path->set_text(src);
+ }
+ }
+
+
+ void _import() {
+
+ Vector<String> samples = import_path->get_text().split(",");
+
+ if (samples.size()==0) {
+ error_dialog->set_text(TTR("No samples to import!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ }
+
+ if (save_path->get_text().strip_edges()=="") {
+ error_dialog->set_text(TTR("Target path is empty."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!save_path->get_text().begins_with("res://")) {
+ error_dialog->set_text(TTR("Target path must be a complete resource path."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!DirAccess::exists(save_path->get_text())) {
+ error_dialog->set_text(TTR("Target path must exist."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ for(int i=0;i<samples.size();i++) {
+
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+
+ List<PropertyInfo> pl;
+ options->_get_property_list(&pl);
+ for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) {
+
+ Variant v;
+ String opt=E->get().name;
+ options->_get(opt,v);
+ imd->set_option(opt,v);
+
+ }
+
+ imd->add_source(EditorImportPlugin::validate_source_path(samples[i]));
+
+ String dst = save_path->get_text();
+ if (dst=="") {
+ error_dialog->set_text(TTR("Save path is empty!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ }
+
+ dst = dst.plus_file(samples[i].get_file().get_basename()+".smp");
+
+ plugin->import(dst,imd);
+ }
+
+ hide();
+
+ }
+
+
+ void _notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ option_editor->edit(options);
+ }
+ }
+
+ static void _bind_methods() {
+
+
+ ClassDB::bind_method("_choose_files",&EditorSampleImportDialog::_choose_files);
+ ClassDB::bind_method("_choose_save_dir",&EditorSampleImportDialog::_choose_save_dir);
+ ClassDB::bind_method("_import",&EditorSampleImportDialog::_import);
+ ClassDB::bind_method("_browse",&EditorSampleImportDialog::_browse);
+ ClassDB::bind_method("_browse_target",&EditorSampleImportDialog::_browse_target);
+ //ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) );
+ }
+
+ EditorSampleImportDialog(EditorSampleImportPlugin *p_plugin) {
+
+ plugin=p_plugin;
+
+
+ set_title(TTR("Import Audio Samples"));
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Source Sample(s):"),hbc);
+
+ import_path = memnew( LineEdit );
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+
+ Button * import_choose = memnew( Button );
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this,"_browse");
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Target Path:"),hbc);
+
+ save_path = memnew( LineEdit );
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew( Button );
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this,"_browse_target");
+
+ file_select = memnew(EditorFileDialog);
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ add_child(file_select);
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ file_select->connect("files_selected", this,"_choose_files");
+ file_select->add_filter("*.wav ; MS Waveform");
+ save_select = memnew( EditorDirDialog );
+ add_child(save_select);
+
+ //save_select->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ save_select->connect("dir_selected", this,"_choose_save_dir");
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+
+ error_dialog = memnew ( ConfirmationDialog );
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ //error_dialog->get_cancel()->hide();
+
+ set_hide_on_ok(false);
+ options = memnew( _EditorSampleImportOptions );
+
+ option_editor = memnew( PropertyEditor );
+ option_editor->hide_top_label();
+ vbc->add_margin_child(TTR("Options:"),option_editor,true);
+ }
+
+ ~EditorSampleImportDialog() {
+ memdelete(options);
+ }
+
+};
+
+
+String EditorSampleImportPlugin::get_name() const {
+
+ return "sample";
+}
+String EditorSampleImportPlugin::get_visible_name() const{
+
+ return TTR("Audio Sample");
+}
+void EditorSampleImportPlugin::import_dialog(const String& p_from){
+
+ dialog->popup_import(p_from);
+}
+Error EditorSampleImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from){
+
+ ERR_FAIL_COND_V(p_from->get_source_count()!=1,ERR_INVALID_PARAMETER);
+
+ Ref<ResourceImportMetadata> from=p_from;
+
+ String src_path=EditorImportPlugin::expand_source_path(from->get_source_path(0));
+ Ref<Sample> smp = ResourceLoader::load(src_path);
+ ERR_FAIL_COND_V(smp.is_null(),ERR_CANT_OPEN);
+
+
+ float rate = smp->get_mix_rate();
+ bool is16 = smp->get_format()==Sample::FORMAT_PCM16;
+ int chans = smp->is_stereo()?2:1;
+ int len = smp->get_length();
+ Sample::LoopFormat loop= smp->get_loop_format();
+ int loop_beg = smp->get_loop_begin();
+ int loop_end = smp->get_loop_end();
+
+ print_line("Input Sample: ");
+ print_line("\tlen: "+itos(len));
+ print_line("\tchans: "+itos(chans));
+ print_line("\t16bits: "+itos(is16));
+ print_line("\trate: "+itos(rate));
+ print_line("\tloop: "+itos(loop));
+ print_line("\tloop begin: "+itos(loop_beg));
+ print_line("\tloop end: "+itos(loop_end));
+ Vector<float> data;
+ data.resize(len*chans);
+
+ {
+ PoolVector<uint8_t> src_data = smp->get_data();
+ PoolVector<uint8_t>::Read sr = src_data.read();
+
+
+ for(int i=0;i<len*chans;i++) {
+
+ float s=0;
+ if (is16) {
+
+ int16_t i16 = decode_uint16(&sr[i*2]);
+ s=i16/32767.0;
+ } else {
+
+ int8_t i8 = sr[i];
+ s=i8/127.0;
+ }
+ data[i]=s;
+ }
+ }
+
+ //apply frequency limit
+
+ bool limit_rate = from->get_option("force/max_rate");
+ int limit_rate_hz = from->get_option("force/max_rate_hz");
+ if (limit_rate && rate > limit_rate_hz) {
+ //resampleeee!!!
+ int new_data_len = len * limit_rate_hz / rate;
+ Vector<float> new_data;
+ new_data.resize( new_data_len * chans );
+ for(int c=0;c<chans;c++) {
+
+ for(int i=0;i<new_data_len;i++) {
+
+ //simple cubic interpolation should be enough.
+ float pos = float(i) * len / new_data_len;
+ float mu = pos-Math::floor(pos);
+ int ipos = int(Math::floor(pos));
+
+ float y0=data[MAX(0,ipos-1)*chans+c];
+ float y1=data[ipos*chans+c];
+ float y2=data[MIN(len-1,ipos+1)*chans+c];
+ float y3=data[MIN(len-1,ipos+2)*chans+c];
+
+ float mu2 = mu*mu;
+ float a0 = y3 - y2 - y0 + y1;
+ float a1 = y0 - y1 - a0;
+ float a2 = y2 - y0;
+ float a3 = y1;
+
+ float res=(a0*mu*mu2+a1*mu2+a2*mu+a3);
+
+ new_data[i*chans+c]=res;
+ }
+ }
+
+ if (loop) {
+
+ loop_beg=loop_beg*new_data_len/len;
+ loop_end=loop_end*new_data_len/len;
+ }
+ data=new_data;
+ rate=limit_rate_hz;
+ len=new_data_len;
+ }
+
+
+ bool normalize = from->get_option("edit/normalize");
+
+ if (normalize) {
+
+ float max=0;
+ for(int i=0;i<data.size();i++) {
+
+ float amp = Math::abs(data[i]);
+ if (amp>max)
+ max=amp;
+ }
+
+ if (max>0) {
+
+ float mult=1.0/max;
+ for(int i=0;i<data.size();i++) {
+
+ data[i]*=mult;
+ }
+
+ }
+ }
+
+ bool trim = from->get_option("edit/trim");
+
+ if (trim && !loop) {
+
+ int first=0;
+ int last=(len*chans)-1;
+ bool found=false;
+ float limit = Math::db2linear((float)-30);
+ for(int i=0;i<data.size();i++) {
+ float amp = Math::abs(data[i]);
+
+ if (!found && amp > limit) {
+ first=i;
+ found=true;
+ }
+
+ if (found && amp > limit) {
+ last=i;
+ }
+ }
+
+ first/=chans;
+ last/=chans;
+
+ if (first<last) {
+
+ Vector<float> new_data;
+ new_data.resize((last-first+1)*chans);
+ for(int i=first*chans;i<=last*chans;i++) {
+ new_data[i-first*chans]=data[i];
+ }
+
+ data=new_data;
+ len=data.size()/chans;
+ }
+
+ }
+
+ bool make_loop = from->get_option("edit/loop");
+
+ if (make_loop && !loop) {
+
+ loop=Sample::LOOP_FORWARD;
+ loop_beg=0;
+ loop_end=len;
+ }
+
+ int compression = from->get_option("compress/mode");
+ bool force_mono = from->get_option("force/mono");
+
+
+ if (force_mono && chans==2) {
+
+ Vector<float> new_data;
+ new_data.resize(data.size()/2);
+ for(int i=0;i<len;i++) {
+ new_data[i]=(data[i*2+0]+data[i*2+1])/2.0;
+ }
+
+ data=new_data;
+ chans=1;
+ }
+
+ bool force_8_bit = from->get_option("force/8_bit");
+ if (force_8_bit) {
+
+ is16=false;
+ }
+
+
+ PoolVector<uint8_t> dst_data;
+ Sample::Format dst_format;
+
+ if ( compression == _EditorSampleImportOptions::COMPRESS_MODE_RAM) {
+
+ dst_format=Sample::FORMAT_IMA_ADPCM;
+ if (chans==1) {
+ _compress_ima_adpcm(data,dst_data);
+ } else {
+
+ print_line("INTERLEAAVE!");
+
+
+
+ //byte interleave
+ Vector<float> left;
+ Vector<float> right;
+
+ int tlen = data.size()/2;
+ left.resize(tlen);
+ right.resize(tlen);
+
+ for(int i=0;i<tlen;i++) {
+ left[i]=data[i*2+0];
+ right[i]=data[i*2+1];
+ }
+
+ PoolVector<uint8_t> bleft;
+ PoolVector<uint8_t> bright;
+
+ _compress_ima_adpcm(left,bleft);
+ _compress_ima_adpcm(right,bright);
+
+ int dl = bleft.size();
+ dst_data.resize( dl *2 );
+
+ PoolVector<uint8_t>::Write w=dst_data.write();
+ PoolVector<uint8_t>::Read rl=bleft.read();
+ PoolVector<uint8_t>::Read rr=bright.read();
+
+ for(int i=0;i<dl;i++) {
+ w[i*2+0]=rl[i];
+ w[i*2+1]=rr[i];
+ }
+ }
+
+ //print_line("compressing ima-adpcm, resulting buffersize is "+itos(dst_data.size())+" from "+itos(data.size()));
+
+ } else {
+
+ dst_format=is16?Sample::FORMAT_PCM16:Sample::FORMAT_PCM8;
+ dst_data.resize( data.size() * (is16?2:1));
+ {
+ PoolVector<uint8_t>::Write w = dst_data.write();
+
+ int ds=data.size();
+ for(int i=0;i<ds;i++) {
+
+ if (is16) {
+ int16_t v = CLAMP(data[i]*32767,-32768,32767);
+ encode_uint16(v,&w[i*2]);
+ } else {
+ int8_t v = CLAMP(data[i]*127,-128,127);
+ w[i]=v;
+ }
+ }
+ }
+ }
+
+
+ Ref<Sample> target;
+
+ if (ResourceCache::has(p_path)) {
+
+ target = Ref<Sample>( ResourceCache::get(p_path)->cast_to<Sample>() );
+ } else {
+
+ target = smp;
+ }
+
+ target->create(dst_format,chans==2?true:false,len);
+ target->set_data(dst_data);
+ target->set_mix_rate(rate);
+ target->set_loop_format(loop);
+ target->set_loop_begin(loop_beg);
+ target->set_loop_end(loop_end);
+
+ from->set_source_md5(0,FileAccess::get_md5(src_path));
+ from->set_editor(get_name());
+ target->set_import_metadata(from);
+
+
+ Error err = ResourceSaver::save(p_path,smp);
+
+ return err;
+
+}
+
+void EditorSampleImportPlugin::_compress_ima_adpcm(const Vector<float>& p_data,PoolVector<uint8_t>& dst_data) {
+
+
+ /*p_sample_data->data = (void*)malloc(len);
+ xm_s8 *dataptr=(xm_s8*)p_sample_data->data;*/
+
+ static const int16_t _ima_adpcm_step_table[89] = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+ };
+
+ static const int8_t _ima_adpcm_index_table[16] = {
+ -1, -1, -1, -1, 2, 4, 6, 8,
+ -1, -1, -1, -1, 2, 4, 6, 8
+ };
+
+
+ int datalen = p_data.size();
+ int datamax=datalen;
+ if (datalen&1)
+ datalen++;
+
+ dst_data.resize(datalen/2+4);
+ PoolVector<uint8_t>::Write w = dst_data.write();
+
+
+ int i,step_idx=0,prev=0;
+ uint8_t *out = w.ptr();
+ //int16_t xm_prev=0;
+ const float *in=p_data.ptr();
+
+
+ /* initial value is zero */
+ *(out++) =0;
+ *(out++) =0;
+ /* Table index initial value */
+ *(out++) =0;
+ /* unused */
+ *(out++) =0;
+
+ for (i=0;i<datalen;i++) {
+ int step,diff,vpdiff,mask;
+ uint8_t nibble;
+ int16_t xm_sample;
+
+ if (i>=datamax)
+ xm_sample=0;
+ else {
+
+
+ xm_sample=CLAMP(in[i]*32767.0,-32768,32767);
+ /*
+ if (xm_sample==32767 || xm_sample==-32768)
+ printf("clippy!\n",xm_sample);
+ */
+ }
+
+ //xm_sample=xm_sample+xm_prev;
+ //xm_prev=xm_sample;
+
+ diff = (int)xm_sample - prev ;
+
+ nibble=0 ;
+ step = _ima_adpcm_step_table[ step_idx ];
+ vpdiff = step >> 3 ;
+ if (diff < 0) {
+ nibble=8;
+ diff=-diff ;
+ }
+ mask = 4 ;
+ while (mask) {
+
+ if (diff >= step) {
+
+ nibble |= mask;
+ diff -= step;
+ vpdiff += step;
+ }
+
+ step >>= 1 ;
+ mask >>= 1 ;
+ };
+
+ if (nibble&8)
+ prev-=vpdiff ;
+ else
+ prev+=vpdiff ;
+
+ if (prev > 32767) {
+ //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip up %i\n",i,xm_sample,prev,diff,vpdiff,prev);
+ prev=32767;
+ } else if (prev < -32768) {
+ //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip down %i\n",i,xm_sample,prev,diff,vpdiff,prev);
+ prev = -32768 ;
+ }
+
+ step_idx += _ima_adpcm_index_table[nibble];
+ if (step_idx< 0)
+ step_idx= 0 ;
+ else if (step_idx> 88)
+ step_idx= 88 ;
+
+
+ if (i&1) {
+ *out|=nibble<<4;
+ out++;
+ } else {
+ *out=nibble;
+ }
+ /*dataptr[i]=prev>>8;*/
+ }
+
+}
+
+
+EditorSampleImportPlugin* EditorSampleImportPlugin::singleton=NULL;
+
+
+void EditorSampleImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+
+ Vector<String> files;
+ for(int i=0;i<p_drop.size();i++) {
+ String ext = p_drop[i].get_extension().to_lower();
+
+ if (ext=="wav") {
+
+ files.push_back(p_drop[i]);
+ }
+ }
+
+ if (files.size()) {
+ import_dialog();
+ dialog->_choose_files(files);
+ dialog->_choose_save_dir(p_dest_path);
+ }
+}
+
+void EditorSampleImportPlugin::reimport_multiple_files(const Vector<String>& p_list) {
+
+ if (p_list.size()==0)
+ return;
+
+ Vector<String> sources;
+ for(int i=0;i<p_list.size();i++) {
+ int idx;
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(p_list[i],&idx);
+ if (efsd) {
+ for(int j=0;j<efsd->get_source_count(idx);j++) {
+ String file = expand_source_path(efsd->get_source_file(idx,j));
+ if (sources.find(file)==-1) {
+ sources.push_back(file);
+ }
+
+ }
+ }
+ }
+
+ if (sources.size()) {
+
+ dialog->popup_import(p_list[0]);
+ dialog->_choose_files(sources);
+ dialog->_choose_save_dir(p_list[0].get_base_dir());
+ }
+}
+
+bool EditorSampleImportPlugin::can_reimport_multiple_files() const {
+
+ return true;
+}
+
+EditorSampleImportPlugin::EditorSampleImportPlugin(EditorNode* p_editor) {
+
+ singleton=this;
+ dialog = memnew( EditorSampleImportDialog(this));
+ p_editor->get_gui_base()->add_child(dialog);
+}
+
+Vector<uint8_t> EditorSampleExportPlugin::custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform) {
+
+
+
+ if (EditorImportExport::get_singleton()->sample_get_action()==EditorImportExport::SAMPLE_ACTION_NONE || p_path.get_extension().to_lower()!="wav") {
+
+ return Vector<uint8_t>();
+ }
+
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+
+ imd->add_source(EditorImportPlugin::validate_source_path(p_path));
+
+ imd->set_option("force/8_bit",false);
+ imd->set_option("force/mono",false);
+ imd->set_option("force/max_rate",true);
+ imd->set_option("force/max_rate_hz",EditorImportExport::get_singleton()->sample_get_max_hz());
+ imd->set_option("edit/trim",EditorImportExport::get_singleton()->sample_get_trim());
+ imd->set_option("edit/normalize",false);
+ imd->set_option("edit/loop",false);
+ imd->set_option("compress/mode",1);
+
+ String savepath = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp/smpconv.smp");
+ Error err = EditorSampleImportPlugin::singleton->import(savepath,imd);
+
+
+ ERR_FAIL_COND_V(err!=OK,Vector<uint8_t>());
+
+ p_path=p_path.get_basename()+".converted.smp";
+ return FileAccess::get_file_as_array(savepath);
+
+}
+
+
+
+EditorSampleExportPlugin::EditorSampleExportPlugin() {
+
+}
+
+#endif
diff --git a/editor/io_plugins/editor_sample_import_plugin.h b/editor/io_plugins/editor_sample_import_plugin.h
new file mode 100644
index 0000000000..6085043a83
--- /dev/null
+++ b/editor/io_plugins/editor_sample_import_plugin.h
@@ -0,0 +1,74 @@
+/*************************************************************************/
+/* editor_sample_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SAMPLE_IMPORT_PLUGIN_H
+#define EDITOR_SAMPLE_IMPORT_PLUGIN_H
+
+#if 0
+#include "editor/editor_import_export.h"
+#include "scene/resources/font.h"
+
+class EditorNode;
+class EditorSampleImportDialog;
+
+class EditorSampleImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorSampleImportPlugin,EditorImportPlugin);
+
+ EditorSampleImportDialog *dialog;
+ void _compress_ima_adpcm(const Vector<float>& p_data,PoolVector<uint8_t>& dst_data);
+public:
+
+ static EditorSampleImportPlugin *singleton;
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path);
+ virtual void reimport_multiple_files(const Vector<String>& p_list);
+ virtual bool can_reimport_multiple_files() const;
+
+
+ EditorSampleImportPlugin(EditorNode* p_editor);
+};
+
+class EditorSampleExportPlugin : public EditorExportPlugin {
+
+ GDCLASS( EditorSampleExportPlugin, EditorExportPlugin);
+
+
+public:
+
+ virtual Vector<uint8_t> custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform);
+
+ EditorSampleExportPlugin();
+};
+
+#endif // EDITOR_SAMPLE_IMPORT_PLUGIN_H
+#endif
diff --git a/editor/io_plugins/editor_scene_import_plugin.cpp b/editor/io_plugins/editor_scene_import_plugin.cpp
new file mode 100644
index 0000000000..963968ce47
--- /dev/null
+++ b/editor/io_plugins/editor_scene_import_plugin.cpp
@@ -0,0 +1,2992 @@
+/*************************************************************************/
+/* editor_scene_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_scene_import_plugin.h"
+#if 0
+#include "global_config.h"
+#include "editor/editor_node.h"
+#include "scene/resources/packed_scene.h"
+#include "scene/resources/box_shape.h"
+#include "os/file_access.h"
+#include "scene/3d/path.h"
+#include "scene/animation/animation_player.h"
+#include "io/resource_saver.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/navigation.h"
+#include "scene/3d/room_instance.h"
+#include "scene/3d/body_shape.h"
+#include "scene/3d/physics_body.h"
+#include "scene/3d/portal.h"
+#include "scene/3d/vehicle_body.h"
+#include "scene/resources/sphere_shape.h"
+#include <scene/resources/box_shape.h>
+#include <scene/resources/ray_shape.h>
+#include <scene/resources/plane_shape.h>
+#include "editor/create_dialog.h"
+#include "os/os.h"
+
+
+
+
+EditorSceneImporter::EditorSceneImporter() {
+
+
+}
+
+void EditorScenePostImport::_bind_methods() {
+
+ BIND_VMETHOD( MethodInfo("post_import",PropertyInfo(Variant::OBJECT,"scene")) );
+
+}
+
+Node *EditorScenePostImport::post_import(Node* p_scene) {
+
+ if (get_script_instance())
+ return get_script_instance()->call("post_import",p_scene);
+
+ return p_scene;
+}
+
+EditorScenePostImport::EditorScenePostImport() {
+
+
+}
+
+
+/////////////////////////////
+
+
+class EditorImportAnimationOptions : public VBoxContainer {
+
+ GDCLASS( EditorImportAnimationOptions, VBoxContainer );
+
+
+
+ TreeItem *fps;
+ TreeItem* optimize_linear_error;
+ TreeItem* optimize_angular_error;
+ TreeItem* optimize_max_angle;
+
+ TreeItem *clips_base;
+
+ TextEdit *filters;
+ Vector<TreeItem*> clips;
+
+ Tree *flags;
+ Tree *clips_tree;
+ Tree *optimization_tree;
+ Vector<TreeItem*> items;
+
+
+ bool updating;
+ bool validating;
+
+
+
+ void _changed();
+ void _item_edited();
+ void _button_action(Object *p_obj,int p_col,int p_id);
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+
+ void set_flags(uint32_t p_flags);
+ uint32_t get_flags() const;
+
+ void set_fps(int p_fps);
+ int get_fps() const;
+
+ void set_optimize_linear_error(float p_error);
+ float get_optimize_linear_error() const;
+
+ void set_optimize_angular_error(float p_error);
+ float get_optimize_angular_error() const;
+
+ void set_optimize_max_angle(float p_error);
+ float get_optimize_max_angle() const;
+
+ void setup_clips(const Array& p_clips);
+ Array get_clips() const;
+
+ void set_filter(const String& p_filter);
+ String get_filter() const;
+
+ EditorImportAnimationOptions();
+
+
+};
+
+////////////////////////////
+
+class EditorSceneImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorSceneImportDialog,ConfirmationDialog);
+
+
+ struct FlagInfo {
+ int value;
+ const char *category;
+ const char *text;
+ bool defval;
+ };
+
+ static const FlagInfo scene_flag_names[];
+
+ EditorImportTextureOptions *texture_options;
+ EditorImportAnimationOptions *animation_options;
+
+ EditorSceneImportPlugin *plugin;
+
+ EditorNode *editor;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ LineEdit *script_path;
+ Tree *import_options;
+ EditorFileDialog *file_select;
+ EditorFileDialog *script_select;
+ EditorDirDialog *save_select;
+ OptionButton *texture_action;
+ CreateDialog *root_type_choose;
+ LineEdit *root_node_name;
+
+ ConfirmationDialog *confirm_open;
+
+ ConfirmationDialog *confirm_import;
+ RichTextLabel *missing_files;
+
+ Vector<TreeItem*> scene_flags;
+
+ Map<Ref<Mesh>,Ref<Shape> > collision_map;
+ ConfirmationDialog *error_dialog;
+
+ Button *root_type;
+ CheckBox *root_default;
+
+
+ void _root_default_pressed();
+ void _root_type_pressed();
+ void _set_root_type();
+
+ void _choose_file(const String& p_path);
+ void _choose_save_file(const String& p_path);
+ void _choose_script(const String& p_path);
+ void _browse();
+ void _browse_target();
+ void _browse_script();
+ void _import(bool p_and_open=false);
+ void _import_confirm();
+
+ Ref<ResourceImportMetadata> wip_rimd;
+ Node *wip_import;
+ String wip_save_file;
+ bool wip_blocked;
+ bool wip_open;
+
+ void _dialog_hid();
+ void _open_and_import();
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void setup_popup(const String& p_from,const String& p_to_path) {
+ _choose_file(p_from);
+ _choose_save_file(p_to_path);
+ }
+
+ Error import(const String& p_from, const String& p_to, const String& p_preset);
+ void popup_import(const String& p_from);
+ EditorSceneImportDialog(EditorNode *p_editor,EditorSceneImportPlugin *p_plugin);
+};
+
+///////////////////////////////////
+
+
+static const char *anim_flag_names[]={
+ "Detect Loop (-loop,-cycle)",
+ "Keep Value Tracks",
+ "Optimize",
+ "Force All Tracks in All Clips",
+ NULL
+};
+
+static const char *anim_flag_descript[]={
+ "Set loop flag for animation names that\ncontain 'cycle' or 'loop' in the name.",
+ "When merging an existing aimation,\nkeep the user-created value-tracks.",
+ "Remove redundant keyframes in\n transform tacks.",
+ "Some exporters will rely on default pose for some bones.\nThis forces those bones to have at least one animation key.",
+ NULL
+};
+
+
+
+void EditorImportAnimationOptions::set_flags(uint32_t p_flags){
+
+ updating=true;
+ for(int i=0;i<items.size();i++) {
+
+ items[i]->set_checked(0,p_flags&(1<<i));
+ }
+ updating=false;
+
+}
+uint32_t EditorImportAnimationOptions::get_flags() const{
+
+ uint32_t f=0;
+ for(int i=0;i<items.size();i++) {
+
+ if (items[i]->is_checked(0))
+ f|=(1<<i);
+ }
+
+ return f;
+}
+
+
+void EditorImportAnimationOptions::_changed() {
+
+ if (updating)
+ return;
+ emit_signal("changed");
+}
+
+
+void EditorImportAnimationOptions::_button_action(Object *p_obj,int p_col,int p_id) {
+
+ memdelete(p_obj);
+
+}
+
+
+void EditorImportAnimationOptions::_item_edited() {
+
+ if (validating)
+ return;
+
+ if (clips.size()==0)
+ return;
+ validating=true;
+ print_line("edited");
+ TreeItem *item = clips_tree->get_edited();
+ if (item==clips[clips.size()-1]) {
+ //add new
+ print_line("islast");
+ if (item->get_text(0).find("<")!=-1 || item->get_text(0).find(">")!=-1) {
+ validating=false;
+ return; //fuckit
+ }
+
+ item->set_editable(1,true);
+ item->set_editable(2,true);
+ item->add_button(0,EditorNode::get_singleton()->get_gui_base()->get_icon("Del","EditorIcons"));
+ item->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ item->set_range_config(1,0,3600,0.01);
+ item->set_range(1,0);
+ item->set_editable(1,true);
+ item->set_cell_mode(2,TreeItem::CELL_MODE_RANGE);
+ item->set_range_config(2,0,3600,0.01);
+ item->set_range(2,0);
+ item->set_cell_mode(3,TreeItem::CELL_MODE_CHECK);
+ item->set_editable(3,true);
+
+ TreeItem *newclip = clips_tree->create_item(clips_base);
+ newclip->set_text(0,"<new clip>");
+ newclip->set_editable(0,true);
+ newclip->set_editable(1,false);
+ newclip->set_editable(2,false);
+ clips.push_back(newclip);
+
+
+
+ }
+
+
+ //make name unique JUST IN CASE
+ String name = item->get_text(0);
+ name=name.replace("/","_").replace(":","_").strip_edges();
+ if (name=="")
+ name=TTR("New Clip");
+
+ if (clips.size()>2) {
+ int index=1;
+ while(true) {
+ bool valid = true;
+ String try_name=name;
+ if (index>1)
+ try_name+=" "+itos(index);
+
+ for(int i=0;i<clips.size()-1;i++) {
+
+ if (clips[i]==item)
+ continue;
+ if (clips[i]->get_text(0)==try_name) {
+ index++;
+ valid=false;
+ break;
+ }
+ }
+
+ if (valid) {
+ name=try_name;
+ break;
+ }
+
+ }
+ }
+
+ if (item->get_text(0)!=name)
+ item->set_text(0,name);
+
+ validating=false;
+
+}
+
+void EditorImportAnimationOptions::_bind_methods() {
+
+ ClassDB::bind_method("_changed",&EditorImportAnimationOptions::_changed);
+ ClassDB::bind_method("_item_edited",&EditorImportAnimationOptions::_item_edited);
+ ClassDB::bind_method("_button_action",&EditorImportAnimationOptions::_button_action);
+ //ClassDB::bind_method("_changedp",&EditorImportAnimationOptions::_changedp);
+
+ ADD_SIGNAL(MethodInfo("changed"));
+}
+
+
+void EditorImportAnimationOptions::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ flags->connect("item_edited",this,"_changed");
+ clips_tree->connect("item_edited",this,"_item_edited");
+ clips_tree->connect("button_pressed",this,"_button_action",varray(),CONNECT_DEFERRED);
+ //format->connect("item_selected",this,"_changedp");
+ }
+}
+
+
+Array EditorImportAnimationOptions::get_clips() const {
+
+ Array arr;
+ for(int i=0;i<clips.size()-1;i++) {
+
+ arr.push_back(clips[i]->get_text(0));
+ arr.push_back(clips[i]->get_range(1));
+ arr.push_back(clips[i]->get_range(2));
+ arr.push_back(clips[i]->is_checked(3));
+ }
+
+ return arr;
+}
+
+
+void EditorImportAnimationOptions::setup_clips(const Array& p_clips) {
+
+ ERR_FAIL_COND(p_clips.size()%4!=0);
+ for(int i=0;i<clips.size();i++) {
+
+ memdelete(clips[i]);
+ }
+
+
+ clips.clear();
+
+ for(int i=0;i<p_clips.size();i+=4) {
+
+ TreeItem *clip = clips_tree->create_item(clips_base);
+ clip->set_text(0,p_clips[i]);
+ clip->add_button(0,EditorNode::get_singleton()->get_gui_base()->get_icon("Del","EditorIcons"));
+ clip->set_editable(0,true);
+ clip->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ clip->set_range_config(1,0,3600,0.01);
+ clip->set_range(1,p_clips[i+1]);
+ clip->set_editable(1,true);
+ clip->set_cell_mode(2,TreeItem::CELL_MODE_RANGE);
+ clip->set_range_config(2,0,3600,0.01);
+ clip->set_range(2,p_clips[i+2]);
+ clip->set_editable(2,true);
+ clip->set_cell_mode(3,TreeItem::CELL_MODE_CHECK);
+ clip->set_editable(3,true);
+ clip->set_checked(3,p_clips[i+3]);
+ clips.push_back(clip);
+
+ }
+
+ TreeItem *newclip = clips_tree->create_item(clips_base);
+ newclip->set_text(0,"<new clip>");
+ newclip->set_editable(0,true);
+ newclip->set_editable(1,false);
+ newclip->set_editable(2,false);
+ newclip->set_editable(3,false);
+ clips.push_back(newclip);
+
+}
+
+
+EditorImportAnimationOptions::EditorImportAnimationOptions() {
+
+
+ updating=false;
+ validating=false;
+
+ TabContainer *tab= memnew(TabContainer);
+ add_margin_child(TTR("Animation Options"),tab,true);
+
+ flags = memnew( Tree );
+ flags->set_hide_root(true);
+ tab->add_child(flags);
+ flags->set_name(TTR("Flags"));
+ TreeItem *root = flags->create_item();
+
+ const char ** fname=anim_flag_names;
+ const char ** fdescr=anim_flag_descript;
+
+ while( *fname ) {
+
+ TreeItem*ti = flags->create_item(root);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ ti->set_text(0,*fname);
+ ti->set_editable(0,true);
+ ti->set_tooltip(0,*fdescr);
+ items.push_back(ti);
+ fname++;
+ fdescr++;
+ }
+
+
+ TreeItem *fps_base = flags->create_item(root);
+ fps_base->set_text(0,TTR("Bake FPS:"));
+ fps_base->set_editable(0,false);
+ fps = flags->create_item(fps_base);
+ fps->set_cell_mode(0,TreeItem::CELL_MODE_RANGE);
+ fps->set_editable(0,true);
+ fps->set_range_config(0,1,120,1);
+ fps->set_range(0,15);
+
+ optimization_tree = memnew( Tree );
+ optimization_tree->set_columns(2);
+ tab->add_child(optimization_tree);
+ optimization_tree->set_name(TTR("Optimizer"));
+ optimization_tree->set_column_expand(0,true);
+ optimization_tree->set_column_expand(1,false);
+ optimization_tree->set_column_min_width(1,80);
+ optimization_tree->set_hide_root(true);
+
+
+ TreeItem *optimize_root = optimization_tree->create_item();
+
+ optimize_linear_error = optimization_tree->create_item(optimize_root);
+ optimize_linear_error->set_text(0,TTR("Max Linear Error"));
+ optimize_linear_error->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ optimize_linear_error->set_editable(1,true);
+ optimize_linear_error->set_range_config(1,0,1,0.001);
+ optimize_linear_error->set_range(1,0.05);
+
+ optimize_angular_error = optimization_tree->create_item(optimize_root);
+ optimize_angular_error->set_text(0,TTR("Max Angular Error"));
+ optimize_angular_error->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ optimize_angular_error->set_editable(1,true);
+ optimize_angular_error->set_range_config(1,0,1,0.001);
+ optimize_angular_error->set_range(1,0.01);
+
+ optimize_max_angle = optimization_tree->create_item(optimize_root);
+ optimize_max_angle->set_text(0,TTR("Max Angle"));
+ optimize_max_angle->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ optimize_max_angle->set_editable(1,true);
+ optimize_max_angle->set_range_config(1,0,360,0.001);
+ optimize_max_angle->set_range(1,int(180*0.125));
+
+ clips_tree = memnew( Tree );
+ clips_tree->set_hide_root(true);
+ tab->add_child(clips_tree);
+ clips_tree->set_name(TTR("Clips"));
+
+ clips_tree->set_columns(4);
+ clips_tree->set_column_expand(0,1);
+ clips_tree->set_column_expand(1,0);
+ clips_tree->set_column_expand(2,0);
+ clips_tree->set_column_expand(3,0);
+ clips_tree->set_column_min_width(1,60);
+ clips_tree->set_column_min_width(2,60);
+ clips_tree->set_column_min_width(3,40);
+ clips_tree->set_column_titles_visible(true);
+ clips_tree->set_column_title(0,TTR("Name"));
+ clips_tree->set_column_title(1,TTR("Start(s)"));
+ clips_tree->set_column_title(2,TTR("End(s)"));
+ clips_tree->set_column_title(3,TTR("Loop"));
+ clips_base =clips_tree->create_item(0);
+
+
+ setup_clips(Array());
+
+
+ filters = memnew( TextEdit );
+ tab->add_child(filters);
+ filters->set_name(TTR("Filters"));
+}
+
+
+
+void EditorImportAnimationOptions::set_fps(int p_fps) {
+
+ fps->set_range(0,p_fps);
+}
+
+int EditorImportAnimationOptions::get_fps() const {
+
+ return fps->get_range(0);
+}
+
+
+void EditorImportAnimationOptions::set_optimize_linear_error(float p_optimize_linear_error) {
+
+ optimize_linear_error->set_range(1,p_optimize_linear_error);
+}
+
+float EditorImportAnimationOptions::get_optimize_linear_error() const {
+
+ return optimize_linear_error->get_range(1);
+}
+
+void EditorImportAnimationOptions::set_optimize_angular_error(float p_optimize_angular_error) {
+
+ optimize_angular_error->set_range(1,p_optimize_angular_error);
+}
+
+float EditorImportAnimationOptions::get_optimize_angular_error() const {
+
+ return optimize_angular_error->get_range(1);
+}
+
+void EditorImportAnimationOptions::set_optimize_max_angle(float p_optimize_max_angle) {
+
+ optimize_max_angle->set_range(1,p_optimize_max_angle);
+}
+
+float EditorImportAnimationOptions::get_optimize_max_angle() const {
+
+ return optimize_max_angle->get_range(1);
+}
+
+
+void EditorImportAnimationOptions::set_filter(const String& p_filter) {
+
+ filters->set_text(p_filter);
+}
+
+String EditorImportAnimationOptions::get_filter() const {
+
+ return filters->get_text();
+}
+
+
+
+
+
+////////////////////////////////////////////////////////
+
+
+
+void EditorSceneImportDialog::_choose_file(const String& p_path) {
+#if 0
+ StringName sn = EditorImportDB::get_singleton()->find_source_path(p_path);
+ if (sn!=StringName()) {
+
+ EditorImportDB::ImportScene isc;
+ if (EditorImportDB::get_singleton()->get_scene(sn,isc)==OK) {
+
+ save_path->set_text(String(sn).get_base_dir());
+ texture_options->set_flags( isc.image_flags );
+ texture_options->set_quality( isc.image_quality );
+ texture_options->set_format( isc.image_format );
+ animation_options->set_flags( isc.anim_flags );
+ script_path->set_text( isc.import_script );
+ uint32_t f = isc.flags;
+ for(int i=0;i<scene_flags.size();i++) {
+
+ scene_flags[i]->set_checked(0,f&(1<<i));
+ }
+ }
+ } else {
+#endif
+ save_path->set_text("");
+ root_node_name->set_text("");
+ //save_path->set_text(p_path.get_file().basename()+".scn");
+#if 0
+ }
+#endif
+
+ if (p_path!=String()) {
+
+ String from_path = EditorFileSystem::get_singleton()->find_resource_from_source(EditorImportPlugin::validate_source_path(p_path));
+ print_line("from path.."+from_path);
+ if (from_path!=String()) {
+ popup_import(from_path);
+
+ }
+ }
+
+
+ import_path->set_text(p_path);
+ if (root_node_name->get_text().size()==0){
+ root_node_name->set_text(import_path->get_text().get_file().get_basename());
+ }
+
+}
+void EditorSceneImportDialog::_choose_save_file(const String& p_path) {
+
+ save_path->set_text(p_path);
+}
+
+void EditorSceneImportDialog::_choose_script(const String& p_path) {
+
+ String p = GlobalConfig::get_singleton()->localize_path(p_path);
+ if (!p.is_resource_file())
+ p=GlobalConfig::get_singleton()->get_resource_path().path_to(p_path.get_base_dir())+p_path.get_file();
+ script_path->set_text(p);
+
+}
+
+
+void EditorSceneImportDialog::_open_and_import() {
+
+ bool unsaved=EditorNode::has_unsaved_changes();
+
+ if (unsaved) {
+
+ confirm_open->popup_centered_minsize(Size2(300,80)*EDSCALE);
+ } else {
+ _import(true);
+ }
+}
+
+void EditorSceneImportDialog::_import(bool p_and_open) {
+
+ wip_open=p_and_open;
+//' ImportMonitorBlock imb;
+
+
+ if (import_path->get_text().strip_edges()=="") {
+ error_dialog->set_text(TTR("Source path is empty."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (save_path->get_text().strip_edges()=="") {
+ error_dialog->set_text(TTR("Target path is empty."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!save_path->get_text().begins_with("res://")) {
+ error_dialog->set_text(TTR("Target path must be a complete resource path."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!DirAccess::exists(save_path->get_text())) {
+ error_dialog->set_text(TTR("Target path must exist."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ String dst_path;
+
+ if (texture_action->get_selected()==0)
+ dst_path=save_path->get_text();//.get_base_dir();
+ else
+ dst_path=GlobalConfig::get_singleton()->get("import/shared_textures");
+
+ uint32_t flags=0;
+
+ for(int i=0;i<scene_flags.size();i++) {
+
+ if (scene_flags[i]->is_checked(0)) {
+ int md = scene_flags[i]->get_metadata(0);
+ flags|=md;
+ }
+ }
+
+
+
+
+
+ if (script_path->get_text()!="") {
+ Ref<Script> scr = ResourceLoader::load(script_path->get_text());
+ if (!scr.is_valid()) {
+ error_dialog->set_text(TTR("Couldn't load post-import script."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ Ref<EditorScenePostImport> pi = Ref<EditorScenePostImport>( memnew( EditorScenePostImport ) );
+ pi->set_script(scr.get_ref_ptr());
+ if (!pi->get_script_instance()) {
+
+ error_dialog->set_text(TTR("Invalid/broken script for post-import."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ }
+
+
+ // Scenes should always be imported as binary format since vertex data is large and would take
+ // up a lot of space and time to load if imported as text format (GH-5778)
+ String save_file = save_path->get_text().plus_file(import_path->get_text().get_file().get_basename()+".scn");
+ print_line("Saving to: "+save_file);
+
+
+
+
+
+ Node *scene=NULL;
+
+
+ Ref<ResourceImportMetadata> rim = memnew( ResourceImportMetadata );
+
+ rim->add_source(EditorImportPlugin::validate_source_path(import_path->get_text()));
+ rim->set_option("flags",flags);
+ print_line("GET FLAGS: "+itos(texture_options->get_flags()));
+ rim->set_option("texture_flags",texture_options->get_flags());
+ rim->set_option("texture_format",texture_options->get_format());
+ rim->set_option("texture_quality",texture_options->get_quality());
+ rim->set_option("animation_flags",animation_options->get_flags());
+ rim->set_option("animation_bake_fps",animation_options->get_fps());
+ rim->set_option("animation_optimizer_linear_error",animation_options->get_optimize_linear_error());
+ rim->set_option("animation_optimizer_angular_error",animation_options->get_optimize_angular_error());
+ rim->set_option("animation_optimizer_max_angle",animation_options->get_optimize_max_angle());
+ rim->set_option("animation_filters",animation_options->get_filter());
+ rim->set_option("animation_clips",animation_options->get_clips());
+ rim->set_option("post_import_script",script_path->get_text());
+ rim->set_option("reimport",true);
+ if (!root_default->is_pressed()) {
+ rim->set_option("root_type",root_type->get_text());
+ }
+ if (root_node_name->get_text().size()==0) {
+ root_node_name->set_text(import_path->get_text().get_file().get_basename());
+ }
+ rim->set_option("root_name",root_node_name->get_text());
+
+ List<String> missing;
+ Error err = plugin->import1(rim,&scene,&missing);
+
+ if (err || !scene) {
+
+ error_dialog->set_text(TTR("Error importing scene."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ if (missing.size()) {
+
+ missing_files->clear();
+ for(List<String>::Element *E=missing.front();E;E=E->next()) {
+
+ missing_files->add_text(E->get());
+ missing_files->add_newline();
+ }
+ wip_import=scene;
+ wip_rimd=rim;
+ wip_save_file=save_file;
+ confirm_import->popup_centered_ratio();
+ return;
+
+ } else {
+
+ err = plugin->import2(scene,save_file,rim);
+
+ if (err) {
+
+ error_dialog->set_text(TTR("Error importing scene."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+ if (wip_open)
+ EditorNode::get_singleton()->load_scene(save_file,false,false,false);
+
+ }
+
+ hide();
+
+ /*
+ editor->clear_scene();
+
+ Error err = EditorImport::import_scene(import_path->get_text(),save_file,dst_path,flags,texture_options->get_format(),compression,texture_options->get_flags(),texture_options->get_quality(),animation_options->get_flags(), &scene,pi);
+
+ if (err) {
+
+ error_dialog->set_text("Error importing scene.");
+ error_dialog->popup_centered(Size2(200,100));
+ return;
+ }
+
+ editor->save_import_export();
+ if (scene)
+ editor->set_edited_scene(scene);
+
+ hide();
+ */
+};
+
+
+void EditorSceneImportDialog::_import_confirm() {
+
+ wip_blocked=true;
+ print_line("import confirm!");
+ Error err = plugin->import2(wip_import,wip_save_file,wip_rimd);
+ wip_blocked=false;
+ wip_import=NULL;
+ wip_rimd=Ref<ResourceImportMetadata>();
+ confirm_import->hide();
+ if (err) {
+
+ wip_save_file="";
+ error_dialog->set_text(TTR("Error importing scene."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ if (wip_open)
+ EditorNode::get_singleton()->load_scene(wip_save_file,false,false,false);
+ wip_open=false;
+ wip_save_file="";
+
+ hide();
+
+}
+
+
+void EditorSceneImportDialog::_browse() {
+
+ file_select->popup_centered_ratio();
+}
+
+void EditorSceneImportDialog::_browse_target() {
+
+ save_select->popup_centered_ratio();
+ if (save_path->get_text()!="")
+ save_select->set_current_path(save_path->get_text());
+
+}
+
+void EditorSceneImportDialog::_browse_script() {
+
+ script_select->popup_centered_ratio();
+
+}
+
+void EditorSceneImportDialog::popup_import(const String &p_from) {
+
+ popup_centered(Size2(750,550)*EDSCALE);
+ if (p_from!="") {
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_from);
+ if (rimd.is_null())
+ return;
+
+ int flags = rimd->get_option("flags");
+
+ for(int i=0;i<scene_flags.size();i++) {
+
+ int md = scene_flags[i]->get_metadata(0);
+ scene_flags[i]->set_checked(0,flags&md);
+ }
+
+ texture_options->set_flags(rimd->get_option("texture_flags"));
+ texture_options->set_format(EditorTextureImportPlugin::ImageFormat(int(rimd->get_option("texture_format"))));
+ texture_options->set_quality(rimd->get_option("texture_quality"));
+ animation_options->set_flags(rimd->get_option("animation_flags"));
+ if (rimd->has_option("animation_clips"))
+ animation_options->setup_clips(rimd->get_option("animation_clips"));
+ if (rimd->has_option("animation_filters"))
+ animation_options->set_filter(rimd->get_option("animation_filters"));
+ if (rimd->has_option("animation_bake_fps"))
+ animation_options->set_fps(rimd->get_option("animation_bake_fps"));
+ if (rimd->has_option("animation_optimizer_linear_error"))
+ animation_options->set_optimize_linear_error(rimd->get_option("animation_optimizer_linear_error"));
+ if (rimd->has_option("animation_optimizer_angular_error"))
+ animation_options->set_optimize_angular_error(rimd->get_option("animation_optimizer_angular_error"));
+ if (rimd->has_option("animation_optimizer_max_angle"))
+ animation_options->set_optimize_max_angle(rimd->get_option("animation_optimizer_max_angle"));
+
+ if (rimd->has_option("root_type")) {
+ root_default->set_pressed(false);
+ String type = rimd->get_option("root_type");
+ root_type->set_text(type);
+ root_type->set_disabled(false);
+
+ if (has_icon(type,"EditorIcons")) {
+ root_type->set_icon(get_icon(type,"EditorIcons"));
+ } else {
+ root_type->set_icon(get_icon("Object","EditorIcons"));
+ }
+
+ } else {
+ root_default->set_pressed(true);
+ root_type->set_disabled(true);
+ }
+ if (rimd->has_option("root_name")) {
+ root_node_name->set_text(rimd->get_option("root_name"));
+ } else {
+ root_node_name->set_text(root_type->get_text()); // backward compatibility for 2.1 or before
+ }
+ script_path->set_text(rimd->get_option("post_import_script"));
+
+ save_path->set_text(p_from.get_base_dir());
+ import_path->set_text(EditorImportPlugin::expand_source_path(rimd->get_source_path(0)));
+
+ }
+}
+
+
+void EditorSceneImportDialog::_notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+
+ List<String> extensions;
+ file_select->clear_filters();
+ root_type->set_icon(get_icon("Spatial","EditorIcons"));
+ root_type->set_text("Spatial");
+ root_type->set_disabled(true);
+
+ for(int i=0;i<plugin->get_importers().size();i++) {
+ plugin->get_importers()[i]->get_extensions(&extensions);
+ }
+
+
+ for(int i=0;i<extensions.size();i++) {
+
+ file_select->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ extensions.clear();
+
+ //EditorImport::get_import_extensions(&extensions)
+ /* ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+ save_select->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ save_select->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }*/
+
+
+ }
+}
+
+Error EditorSceneImportDialog::import(const String& p_from, const String& p_to, const String& p_preset) {
+
+ import_path->set_text(p_from);
+ save_path->set_text(p_to);
+ script_path->set_text(p_preset);
+
+ _import();
+
+
+
+ return OK;
+}
+
+void EditorSceneImportDialog::_dialog_hid() {
+
+ if (wip_blocked)
+ return;
+ print_line("DIALOGHID!");
+ if (wip_import) {
+ memdelete(wip_import);
+ wip_import=NULL;
+ wip_save_file="";
+ wip_rimd=Ref<ResourceImportMetadata>();
+ }
+}
+void EditorSceneImportDialog::_root_default_pressed() {
+
+ root_type->set_disabled(root_default->is_pressed());
+}
+
+void EditorSceneImportDialog::_root_type_pressed() {
+
+
+ root_type_choose->popup(false);
+}
+
+
+void EditorSceneImportDialog::_set_root_type() {
+
+ String type = root_type_choose->get_selected_type();
+ if (type==String())
+ return;
+ root_type->set_text(type);
+ if (has_icon(type,"EditorIcons")) {
+ root_type->set_icon(get_icon(type,"EditorIcons"));
+ } else {
+ root_type->set_icon(get_icon("Object","EditorIcons"));
+ }
+}
+
+void EditorSceneImportDialog::_bind_methods() {
+
+
+ ClassDB::bind_method("_choose_file",&EditorSceneImportDialog::_choose_file);
+ ClassDB::bind_method("_choose_save_file",&EditorSceneImportDialog::_choose_save_file);
+ ClassDB::bind_method("_choose_script",&EditorSceneImportDialog::_choose_script);
+ ClassDB::bind_method("_import",&EditorSceneImportDialog::_import,DEFVAL(false));
+ ClassDB::bind_method("_browse",&EditorSceneImportDialog::_browse);
+ ClassDB::bind_method("_browse_target",&EditorSceneImportDialog::_browse_target);
+ ClassDB::bind_method("_browse_script",&EditorSceneImportDialog::_browse_script);
+ ClassDB::bind_method("_dialog_hid",&EditorSceneImportDialog::_dialog_hid);
+ ClassDB::bind_method("_import_confirm",&EditorSceneImportDialog::_import_confirm);
+ ClassDB::bind_method("_open_and_import",&EditorSceneImportDialog::_open_and_import);
+ ClassDB::bind_method("_root_default_pressed",&EditorSceneImportDialog::_root_default_pressed);
+ ClassDB::bind_method("_root_type_pressed",&EditorSceneImportDialog::_root_type_pressed);
+ ClassDB::bind_method("_set_root_type",&EditorSceneImportDialog::_set_root_type);
+
+
+ ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) );
+}
+
+
+
+const EditorSceneImportDialog::FlagInfo EditorSceneImportDialog::scene_flag_names[]={
+
+ {EditorSceneImportPlugin::SCENE_FLAG_REMOVE_NOIMP,("Actions"),"Remove Nodes (-noimp)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_IMPORT_ANIMATIONS,("Actions"),"Import Animations",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_COMPRESS_GEOMETRY,("Actions"),"Compress Geometry",false},
+ {EditorSceneImportPlugin::SCENE_FLAG_GENERATE_TANGENT_ARRAYS,("Actions"),"Force Generation of Tangent Arrays",false},
+ {EditorSceneImportPlugin::SCENE_FLAG_LINEARIZE_DIFFUSE_TEXTURES,("Actions"),"SRGB->Linear Of Diffuse Textures",false},
+ {EditorSceneImportPlugin::SCENE_FLAG_CONVERT_NORMALMAPS_TO_XY,("Actions"),"Convert Normal Maps to XY",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_SET_LIGHTMAP_TO_UV2_IF_EXISTS,("Actions"),"Set Material Lightmap to UV2 if Tex2Array Exists",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_MERGE_KEEP_MATERIALS,("Merge"),"Keep Materials after first import (delete them for re-import).",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_MERGE_KEEP_EXTRA_ANIM_TRACKS,("Merge"),"Keep user-added Animation tracks.",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_DETECT_ALPHA,("Materials"),"Set Alpha in Materials (-alpha)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_DETECT_VCOLOR,("Materials"),"Set Vert. Color in Materials (-vcol)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_COLLISIONS,("Create"),"Create Collisions and/or Rigid Bodies (-col,-colonly,-rigid)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_PORTALS,("Create"),"Create Portals (-portal)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_ROOMS,("Create"),"Create Rooms (-room)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_SIMPLIFY_ROOMS,("Create"),"Simplify Rooms",false},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_BILLBOARDS,("Create"),"Create Billboards (-bb)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_IMPOSTORS,("Create"),"Create Impostors (-imp:dist)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_LODS,("Create"),"Create LODs (-lod:dist)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_CARS,("Create"),"Create Vehicles (-vehicle)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_WHEELS,("Create"),"Create Vehicle Wheels (-wheel)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_CREATE_NAVMESH,("Create"),"Create Navigation Meshes (-navmesh)",true},
+ {EditorSceneImportPlugin::SCENE_FLAG_DETECT_LIGHTMAP_LAYER,("Create"),"Detect LightMap Layer (-lm:<int>).",true},
+ {-1,NULL,NULL,false}
+};
+
+
+EditorSceneImportDialog::EditorSceneImportDialog(EditorNode *p_editor, EditorSceneImportPlugin *p_plugin) {
+
+
+ editor=p_editor;
+ plugin=p_plugin;
+
+ set_title(TTR("Import 3D Scene"));
+ HBoxContainer *import_hb = memnew( HBoxContainer );
+ add_child(import_hb);
+ //set_child_rect(import_hb);
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ import_hb->add_child(vbc);
+ vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Source Scene:"),hbc);
+
+ import_path = memnew( LineEdit );
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+
+ Button * import_choose = memnew( Button );
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this,"_browse");
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Target Path:"),hbc);
+
+ save_path = memnew( LineEdit );
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew( Button );
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this,"_browse_target");
+
+ texture_action = memnew( OptionButton );
+ texture_action->add_item(TTR("Same as Target Scene"));
+ texture_action->add_item(TTR("Shared"));
+ texture_action->select(0);
+ vbc->add_margin_child(TTR("Target Texture Folder:"),texture_action);
+
+ import_options = memnew( Tree );
+ vbc->set_v_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_margin_child(TTR("Options:"),import_options,true);
+
+ file_select = memnew(EditorFileDialog);
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ add_child(file_select);
+
+
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+
+ file_select->connect("file_selected", this,"_choose_file");
+
+ save_select = memnew(EditorDirDialog);
+ add_child(save_select);
+
+ //save_select->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ save_select->connect("dir_selected", this,"_choose_save_file");
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+ TreeItem *root = import_options->create_item(NULL);
+ import_options->set_hide_root(true);
+
+ const FlagInfo* fn=scene_flag_names;
+
+ Map<String,TreeItem*> categories;
+
+ while(fn->text) {
+
+ String cat = fn->category;
+ TreeItem *parent;
+ if (!categories.has(cat)) {
+ parent = import_options->create_item(root);
+ parent->set_text(0,cat);
+ categories[cat]=parent;
+ } else {
+ parent=categories[cat];
+ }
+
+ TreeItem *opt = import_options->create_item(parent);
+ opt->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ opt->set_checked(0,fn->defval);
+ opt->set_editable(0,true);
+ opt->set_text(0,fn->text);
+ opt->set_metadata(0,fn->value);
+
+ scene_flags.push_back(opt);
+ fn++;
+ }
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Post-Process Script:"),hbc);
+
+ script_path = memnew( LineEdit );
+ script_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(script_path);
+
+ Button * script_choose = memnew( Button );
+ script_choose->set_text(" .. ");
+ hbc->add_child(script_choose);
+
+ script_choose->connect("pressed", this,"_browse_script");
+
+ script_select = memnew(EditorFileDialog);
+ add_child(script_select);
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+
+ ScriptLanguage *sl=ScriptServer::get_language(i);
+ String ext = sl->get_extension();
+ if (ext=="")
+ continue;
+ script_select->add_filter("*."+ext+" ; "+sl->get_name());
+ }
+
+
+ script_select->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+
+ script_select->connect("file_selected", this,"_choose_script");
+
+ error_dialog = memnew ( ConfirmationDialog );
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ //error_dialog->get_cancel()->hide();
+
+
+ HBoxContainer *custom_root_hb = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Custom Root Node Type:"),custom_root_hb);
+ root_type = memnew(Button);
+ root_type->set_h_size_flags(SIZE_EXPAND_FILL);
+ root_type->set_text_align(Button::ALIGN_LEFT);
+ root_type->connect("pressed",this,"_root_type_pressed");
+ custom_root_hb->add_child(root_type);
+
+ root_default = memnew(CheckBox);
+ root_default->set_text(TTR("Auto"));
+ root_default->set_pressed(true);
+ root_default->connect("pressed",this,"_root_default_pressed");
+ custom_root_hb->add_child(root_default);
+
+ root_node_name = memnew( LineEdit );
+ root_node_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_margin_child(TTR("Root Node Name:"),root_node_name);
+ /*
+ this_import = memnew( OptionButton );
+ this_import->add_item("Overwrite Existing Scene");
+ this_import->add_item("Overwrite Existing, Keep Materials");
+ this_import->add_item("Keep Existing, Merge with New");
+ this_import->add_item("Keep Existing, Ignore New");
+ vbc->add_margin_child("This Time:",this_import);
+
+ next_import = memnew( OptionButton );
+ next_import->add_item("Overwrite Existing Scene");
+ next_import->add_item("Overwrite Existing, Keep Materials");
+ next_import->add_item("Keep Existing, Merge with New");
+ next_import->add_item("Keep Existing, Ignore New");
+ vbc->add_margin_child("Next Time:",next_import);
+*/
+ set_hide_on_ok(false);
+
+ GLOBAL_DEF("import/shared_textures","res://");
+ GlobalConfig::get_singleton()->set_custom_property_info("import/shared_textures",PropertyInfo(Variant::STRING,"import/shared_textures",PROPERTY_HINT_DIR));
+
+ import_hb->add_constant_override("separation",30);
+
+
+ VBoxContainer *ovb = memnew( VBoxContainer);
+ ovb->set_h_size_flags(SIZE_EXPAND_FILL);
+ import_hb->add_child(ovb);
+
+ texture_options = memnew( EditorImportTextureOptions );
+ ovb->add_child(texture_options);
+ texture_options->set_v_size_flags(SIZE_EXPAND_FILL);
+ //animation_options->set_flags(EditorImport::
+ texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM);
+ texture_options->set_flags( EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA | EditorTextureImportPlugin::IMAGE_FLAG_REPEAT | EditorTextureImportPlugin::IMAGE_FLAG_FILTER );
+
+
+ animation_options = memnew( EditorImportAnimationOptions );
+ ovb->add_child(animation_options);
+ animation_options->set_v_size_flags(SIZE_EXPAND_FILL);
+ animation_options->set_flags(EditorSceneAnimationImportPlugin::ANIMATION_DETECT_LOOP|EditorSceneAnimationImportPlugin::ANIMATION_KEEP_VALUE_TRACKS|EditorSceneAnimationImportPlugin::ANIMATION_OPTIMIZE|EditorSceneAnimationImportPlugin::ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS);
+
+
+ confirm_import = memnew( ConfirmationDialog );
+ add_child(confirm_import);
+ VBoxContainer *cvb = memnew( VBoxContainer );
+ confirm_import->add_child(cvb);
+ //confirm_import->set_child_rect(cvb);
+
+ PanelContainer *pc = memnew( PanelContainer );
+ pc->add_style_override("panel",get_stylebox("normal","TextEdit"));
+ //ec->add_child(pc);
+ missing_files = memnew( RichTextLabel );
+ cvb->add_margin_child(TTR("The Following Files are Missing:"),pc,true);
+ pc->add_child(missing_files);
+ confirm_import->get_ok()->set_text(TTR("Import Anyway"));
+ confirm_import->get_cancel()->set_text(TTR("Cancel"));
+ confirm_import->connect("popup_hide",this,"_dialog_hid");
+ confirm_import->connect("confirmed",this,"_import_confirm");
+ confirm_import->set_hide_on_ok(false);
+
+ add_button(TTR("Import & Open"),!OS::get_singleton()->get_swap_ok_cancel())->connect("pressed",this,"_open_and_import");
+
+ confirm_open = memnew( ConfirmationDialog );
+ add_child(confirm_open);
+ confirm_open->set_text(TTR("Edited scene has not been saved, open imported scene anyway?"));
+ confirm_open->connect("confirmed",this,"_import",varray(true));
+
+
+ wip_import=NULL;
+ wip_blocked=false;
+ wip_open=false;
+ //texture_options->set_format(EditorImport::IMAGE_FORMAT_C);
+
+ root_type_choose = memnew( CreateDialog );
+ add_child(root_type_choose);
+ root_type_choose->set_base_type("Node");
+ root_type_choose->connect("create",this,"_set_root_type");
+}
+
+
+
+////////////////////////////////
+
+
+
+String EditorSceneImportPlugin::get_name() const {
+
+ return "scene_3d";
+}
+
+String EditorSceneImportPlugin::get_visible_name() const{
+
+ return TTR("Scene");
+}
+
+void EditorSceneImportPlugin::import_dialog(const String& p_from){
+
+ dialog->popup_import(p_from);
+}
+
+
+//////////////////////////
+
+
+static bool _teststr(const String& p_what,const String& p_str) {
+
+ if (p_what.findn("$"+p_str)!=-1) //blender and other stuff
+ return true;
+ if (p_what.to_lower().ends_with("-"+p_str)) //collada only supports "_" and "-" besides letters
+ return true;
+ if (p_what.to_lower().ends_with("_"+p_str)) //collada only supports "_" and "-" besides letters
+ return true;
+ return false;
+}
+
+static String _fixstr(const String& p_what,const String& p_str) {
+
+ if (p_what.findn("$"+p_str)!=-1) //blender and other stuff
+ return p_what.replace("$"+p_str,"");
+ if (p_what.to_lower().ends_with("-"+p_str)) //collada only supports "_" and "-" besides letters
+ return p_what.substr(0,p_what.length()-(p_str.length()+1));
+ if (p_what.to_lower().ends_with("_"+p_str)) //collada only supports "_" and "-" besides letters
+ return p_what.substr(0,p_what.length()-(p_str.length()+1));
+ return p_what;
+}
+
+
+
+void EditorSceneImportPlugin::_find_resources(const Variant& p_var, Map<Ref<ImageTexture>, TextureRole> &image_map,int p_flags) {
+
+
+ switch(p_var.get_type()) {
+
+ case Variant::OBJECT: {
+
+ Ref<Resource> res = p_var;
+ if (res.is_valid()) {
+
+ if (res->is_class("Texture") && !image_map.has(res)) {
+
+ image_map.insert(res,TEXTURE_ROLE_DEFAULT);
+
+
+ } else {
+
+
+ List<PropertyInfo> pl;
+ res->get_property_list(&pl);
+ for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) {
+
+ if (E->get().type==Variant::OBJECT || E->get().type==Variant::ARRAY || E->get().type==Variant::DICTIONARY) {
+ if (E->get().type==Variant::OBJECT && res->cast_to<FixedSpatialMaterial>() && (E->get().name=="textures/diffuse" || E->get().name=="textures/detail" || E->get().name=="textures/emission")) {
+
+ Ref<ImageTexture> tex =res->get(E->get().name);
+ if (tex.is_valid()) {
+
+ image_map.insert(tex,TEXTURE_ROLE_DIFFUSE);
+ }
+
+ } else if (E->get().type==Variant::OBJECT && res->cast_to<FixedSpatialMaterial>() && (E->get().name=="textures/normal")) {
+
+ Ref<ImageTexture> tex =res->get(E->get().name);
+ if (tex.is_valid()) {
+
+ image_map.insert(tex,TEXTURE_ROLE_NORMALMAP);
+ /*
+ if (p_flags&SCENE_FLAG_CONVERT_NORMALMAPS_TO_XY)
+ res->cast_to<FixedSpatialMaterial>()->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_XY_NORMALMAP,true);
+ */
+ }
+
+
+ } else {
+ _find_resources(res->get(E->get().name),image_map,p_flags);
+ }
+ }
+ }
+
+ }
+ }
+
+ } break;
+ case Variant::DICTIONARY: {
+
+ Dictionary d= p_var;
+
+ List<Variant> keys;
+ d.get_key_list(&keys);
+
+ for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
+
+
+ _find_resources(E->get(),image_map,p_flags);
+ _find_resources(d[E->get()],image_map,p_flags);
+
+ }
+
+
+ } break;
+ case Variant::ARRAY: {
+
+ Array a = p_var;
+ for(int i=0;i<a.size();i++) {
+
+ _find_resources(a[i],image_map,p_flags);
+ }
+
+ } break;
+ default: {}
+
+ }
+
+}
+
+
+Node* EditorSceneImportPlugin::_fix_node(Node *p_node,Node *p_root,Map<Ref<Mesh>,Ref<Shape> > &collision_map,uint32_t p_flags,Map<Ref<ImageTexture>,TextureRole >& image_map) {
+
+ // children first..
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+
+ Node *r = _fix_node(p_node->get_child(i),p_root,collision_map,p_flags,image_map);
+ if (!r) {
+ print_line("was erased..");
+ i--; //was erased
+ }
+ }
+
+ String name = p_node->get_name();
+
+ bool isroot = p_node==p_root;
+
+
+ if (!isroot && p_flags&SCENE_FLAG_REMOVE_NOIMP && _teststr(name,"noimp")) {
+
+ memdelete(p_node);
+ return NULL;
+ }
+
+ {
+
+ List<PropertyInfo> pl;
+ p_node->get_property_list(&pl);
+ for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) {
+
+ if (E->get().type==Variant::OBJECT || E->get().type==Variant::ARRAY || E->get().type==Variant::DICTIONARY) {
+ _find_resources(p_node->get(E->get().name),image_map,p_flags);
+ }
+ }
+
+ }
+
+
+
+
+ if (p_flags&SCENE_FLAG_CREATE_BILLBOARDS && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ bool bb=false;
+
+ if ((_teststr(name,"bb"))) {
+ bb=true;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"bb"))) {
+ bb=true;
+
+ }
+
+ if (bb) {
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD,true);
+ if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ //fm->set_flag(Material::FLAG_UNSHADED,true);
+ //fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ //fm->set_depth_draw_mode(Material::DEPTH_DRAW_NEVER);
+ //fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (p_flags&(SCENE_FLAG_DETECT_ALPHA|SCENE_FLAG_DETECT_VCOLOR|SCENE_FLAG_SET_LIGHTMAP_TO_UV2_IF_EXISTS) && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> m = mi->get_mesh();
+
+ if (m.is_valid()) {
+
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> mat = m->surface_get_material(i);
+ if (!mat.is_valid())
+ continue;
+
+ if (p_flags&SCENE_FLAG_DETECT_ALPHA && _teststr(mat->get_name(),"alpha")) {
+
+ //mat->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ //mat->set_name(_fixstr(mat->get_name(),"alpha"));
+ }
+ if (p_flags&SCENE_FLAG_DETECT_VCOLOR && _teststr(mat->get_name(),"vcol")) {
+
+ //mat->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY,true);
+ //mat->set_name(_fixstr(mat->get_name(),"vcol"));
+ }
+
+ if (p_flags&SCENE_FLAG_SET_LIGHTMAP_TO_UV2_IF_EXISTS && m->surface_get_format(i)&Mesh::ARRAY_FORMAT_TEX_UV2) {
+ //mat->set_flag(Material::FLAG_LIGHTMAP_ON_UV2,true);
+ }
+
+ }
+ }
+ }
+
+ if (p_flags&SCENE_FLAG_REMOVE_NOIMP && p_node->cast_to<AnimationPlayer>()) {
+ //remove animations referencing non-importable nodes
+ AnimationPlayer *ap = p_node->cast_to<AnimationPlayer>();
+
+ List<StringName> anims;
+ ap->get_animation_list(&anims);
+ for(List<StringName>::Element *E=anims.front();E;E=E->next()) {
+
+ Ref<Animation> anim=ap->get_animation(E->get());
+ ERR_CONTINUE(anim.is_null());
+ for(int i=0;i<anim->get_track_count();i++) {
+ NodePath path = anim->track_get_path(i);
+
+ for(int j=0;j<path.get_name_count();j++) {
+ String node = path.get_name(j);
+ if (_teststr(node,"noimp")) {
+ anim->remove_track(i);
+ i--;
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+
+ if (p_flags&SCENE_FLAG_CREATE_IMPOSTORS && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str;
+
+ if ((_teststr(name,"imp"))) {
+ str=name;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"imp"))) {
+ str=mi->get_mesh()->get_name();
+
+ }
+
+
+ if (p_node->get_parent() && p_node->get_parent()->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ MeshInstance *mip = p_node->get_parent()->cast_to<MeshInstance>();
+ String d=str.substr(str.find("imp")+3,str.length());
+ if (d!="") {
+ if ((d[0]<'0' || d[0]>'9'))
+ d=d.substr(1,d.length());
+ if (d.length() && d[0]>='0' && d[0]<='9') {
+ float dist = d.to_double();
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD,true);
+ mi->set_flag(GeometryInstance::FLAG_BILLBOARD_FIX_Y,true);
+ //mi->set_draw_range_begin(dist);
+ //mi->set_draw_range_end(100000);
+
+ //mip->set_draw_range_begin(0);
+ //mip->set_draw_range_end(dist);
+
+ if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ //fm->set_flag(Material::FLAG_UNSHADED,true);
+ //fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ //fm->set_depth_draw_mode(Material::DEPTH_DRAW_NEVER);
+ //fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (p_flags&SCENE_FLAG_CREATE_LODS && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str;
+
+ if ((_teststr(name,"lod"))) {
+ str=name;
+ } else if (mi->get_mesh().is_valid() && (_teststr(mi->get_mesh()->get_name(),"lod"))) {
+ str=mi->get_mesh()->get_name();
+
+ }
+
+
+ if (p_node->get_parent() && p_node->get_parent()->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ MeshInstance *mip = p_node->get_parent()->cast_to<MeshInstance>();
+ String d=str.substr(str.find("lod")+3,str.length());
+ if (d!="") {
+ if ((d[0]<'0' || d[0]>'9'))
+ d=d.substr(1,d.length());
+ if (d.length() && d[0]>='0' && d[0]<='9') {
+ float dist = d.to_double();
+ /// mi->set_draw_range_begin(dist);
+ // mi->set_draw_range_end(100000);
+
+ // mip->set_draw_range_begin(0);
+ // mip->set_draw_range_end(dist);
+
+ /*if (mi->get_mesh().is_valid()) {
+
+ Ref<Mesh> m = mi->get_mesh();
+ for(int i=0;i<m->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = m->surface_get_material(i);
+ if (fm.is_valid()) {
+ fm->set_flag(Material::FLAG_UNSHADED,true);
+ fm->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ fm->set_hint(Material::HINT_NO_DEPTH_DRAW,true);
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ }
+ }
+ }*/
+ }
+ }
+ }
+ }
+
+
+ if (p_flags&SCENE_FLAG_DETECT_LIGHTMAP_LAYER && _teststr(name,"lm") && p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ String str=name;
+ int layer = str.substr(str.find("lm")+3,str.length()).to_int();
+ //mi->set_baked_light_texture_id(layer);
+ }
+
+ if (p_flags&SCENE_FLAG_CREATE_COLLISIONS && _teststr(name,"colonly")) {
+
+ if (isroot)
+ return p_node;
+
+ if (p_node->cast_to<MeshInstance>()) {
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ Node * col = mi->create_trimesh_collision_node();
+ ERR_FAIL_COND_V(!col,NULL);
+
+ col->set_name(_fixstr(name,"colonly"));
+ col->cast_to<Spatial>()->set_transform(mi->get_transform());
+ p_node->replace_by(col);
+ memdelete(p_node);
+ p_node=col;
+
+ StaticBody *sb = col->cast_to<StaticBody>();
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_shape(sb->get_shape(0));
+ colshape->set_name("shape");
+ sb->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+ } else if (p_node->has_meta("empty_draw_type")) {
+ String empty_draw_type = String(p_node->get_meta("empty_draw_type"));
+ print_line(empty_draw_type);
+ StaticBody *sb = memnew( StaticBody);
+ sb->set_name(_fixstr(name,"colonly"));
+ sb->cast_to<Spatial>()->set_transform(p_node->cast_to<Spatial>()->get_transform());
+ p_node->replace_by(sb);
+ memdelete(p_node);
+ CollisionShape *colshape = memnew( CollisionShape);
+ if (empty_draw_type == "CUBE") {
+ BoxShape *boxShape = memnew( BoxShape);
+ boxShape->set_extents(Vector3(1, 1, 1));
+ colshape->set_shape(boxShape);
+ colshape->set_name("BoxShape");
+ } else if (empty_draw_type == "SINGLE_ARROW") {
+ RayShape *rayShape = memnew( RayShape);
+ rayShape->set_length(1);
+ colshape->set_shape(rayShape);
+ colshape->set_name("RayShape");
+ sb->cast_to<Spatial>()->rotate_x(Math_PI / 2);
+ } else if (empty_draw_type == "IMAGE") {
+ PlaneShape *planeShape = memnew( PlaneShape);
+ colshape->set_shape(planeShape);
+ colshape->set_name("PlaneShape");
+ } else {
+ SphereShape *sphereShape = memnew( SphereShape);
+ sphereShape->set_radius(1);
+ colshape->set_shape(sphereShape);
+ colshape->set_name("SphereShape");
+ }
+ sb->add_child(colshape);
+ colshape->set_owner(sb->get_owner());
+ }
+
+ } else if (p_flags&SCENE_FLAG_CREATE_COLLISIONS && _teststr(name,"rigid") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ // get mesh instance and bounding box
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ Rect3 aabb = mi->get_aabb();
+
+ // create a new rigid body collision node
+ RigidBody * rigid_body = memnew( RigidBody );
+ Node * col = rigid_body;
+ ERR_FAIL_COND_V(!col,NULL);
+
+ // remove node name postfix
+ col->set_name(_fixstr(name,"rigid"));
+ // get mesh instance xform matrix to the rigid body collision node
+ col->cast_to<Spatial>()->set_transform(mi->get_transform());
+ // save original node by duplicating it into a new instance and correcting the name
+ Node * mesh = p_node->duplicate();
+ mesh->set_name(_fixstr(name,"rigid"));
+ // reset the xform matrix of the duplicated node so it can inherit parent node xform
+ mesh->cast_to<Spatial>()->set_transform(Transform(Basis()));
+ // reparent the new mesh node to the rigid body collision node
+ p_node->add_child(mesh);
+ mesh->set_owner(p_node->get_owner());
+ // replace the original node with the rigid body collision node
+ p_node->replace_by(col);
+ memdelete(p_node);
+ p_node=col;
+
+ // create an alias for the rigid body collision node
+ RigidBody *rb = col->cast_to<RigidBody>();
+ // create a new Box collision shape and set the right extents
+ Ref<BoxShape> shape = memnew( BoxShape );
+ shape->set_extents(aabb.get_size() * 0.5);
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_name("shape");
+ colshape->set_shape(shape);
+ // reparent the new collision shape to the rigid body collision node
+ rb->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+
+ } else if (p_flags&SCENE_FLAG_CREATE_COLLISIONS &&_teststr(name,"col") && p_node->cast_to<MeshInstance>()) {
+
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ mi->set_name(_fixstr(name,"col"));
+ Node *col= mi->create_trimesh_collision_node();
+ ERR_FAIL_COND_V(!col,NULL);
+
+ col->set_name("col");
+ p_node->add_child(col);
+
+ StaticBody *sb=col->cast_to<StaticBody>();
+ CollisionShape *colshape = memnew( CollisionShape);
+ colshape->set_shape(sb->get_shape(0));
+ colshape->set_name("shape");
+ col->add_child(colshape);
+ colshape->set_owner(p_node->get_owner());
+ sb->set_owner(p_node->get_owner());
+
+ } else if (p_flags&SCENE_FLAG_CREATE_NAVMESH &&_teststr(name,"navmesh") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> mesh=mi->get_mesh();
+ ERR_FAIL_COND_V(mesh.is_null(),NULL);
+ NavigationMeshInstance *nmi = memnew( NavigationMeshInstance );
+
+
+ nmi->set_name(_fixstr(name,"navmesh"));
+ Ref<NavigationMesh> nmesh = memnew( NavigationMesh);
+ nmesh->create_from_mesh(mesh);
+ nmi->set_navigation_mesh(nmesh);
+ nmi->cast_to<Spatial>()->set_transform(mi->get_transform());
+ p_node->replace_by(nmi);
+ memdelete(p_node);
+ p_node=nmi;
+ } else if (p_flags&SCENE_FLAG_CREATE_CARS &&_teststr(name,"vehicle")) {
+
+ if (isroot)
+ return p_node;
+
+ Node *owner = p_node->get_owner();
+ Spatial *s = p_node->cast_to<Spatial>();
+ VehicleBody *bv = memnew( VehicleBody );
+ String n = _fixstr(p_node->get_name(),"vehicle");
+ bv->set_name(n);
+ p_node->replace_by(bv);
+ p_node->set_name(n);
+ bv->add_child(p_node);
+ bv->set_owner(owner);
+ p_node->set_owner(owner);
+ bv->set_transform(s->get_transform());
+ s->set_transform(Transform());
+
+ p_node=bv;
+
+
+ } else if (p_flags&SCENE_FLAG_CREATE_CARS &&_teststr(name,"wheel")) {
+
+ if (isroot)
+ return p_node;
+
+ Node *owner = p_node->get_owner();
+ Spatial *s = p_node->cast_to<Spatial>();
+ VehicleWheel *bv = memnew( VehicleWheel );
+ String n = _fixstr(p_node->get_name(),"wheel");
+ bv->set_name(n);
+ p_node->replace_by(bv);
+ p_node->set_name(n);
+ bv->add_child(p_node);
+ bv->set_owner(owner);
+ p_node->set_owner(owner);
+ bv->set_transform(s->get_transform());
+ s->set_transform(Transform());
+
+ p_node=bv;
+
+ } else if (p_flags&SCENE_FLAG_CREATE_ROOMS && _teststr(name,"room") && p_node->cast_to<MeshInstance>()) {
+
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ PoolVector<Face3> faces = mi->get_faces(VisualInstance::FACES_SOLID);
+
+
+ BSP_Tree bsptree(faces);
+
+ Ref<RoomBounds> area = memnew( RoomBounds );
+ //area->set_bounds(faces);
+ //area->set_geometry_hint(faces);
+
+
+ Room * room = memnew( Room );
+ room->set_name(_fixstr(name,"room"));
+ room->set_transform(mi->get_transform());
+ room->set_room(area);
+
+ p_node->replace_by(room);
+ memdelete(p_node);
+ p_node=room;
+
+ } else if (p_flags&SCENE_FLAG_CREATE_ROOMS &&_teststr(name,"room")) {
+
+ if (isroot)
+ return p_node;
+
+ Spatial *dummy = p_node->cast_to<Spatial>();
+ ERR_FAIL_COND_V(!dummy,NULL);
+
+ Room * room = memnew( Room );
+ room->set_name(_fixstr(name,"room"));
+ room->set_transform(dummy->get_transform());
+
+ p_node->replace_by(room);
+ memdelete(p_node);
+ p_node=room;
+
+ //room->compute_room_from_subtree();
+
+ } else if (p_flags&SCENE_FLAG_CREATE_PORTALS &&_teststr(name,"portal") && p_node->cast_to<MeshInstance>()) {
+
+ if (isroot)
+ return p_node;
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+ PoolVector<Face3> faces = mi->get_faces(VisualInstance::FACES_SOLID);
+
+ ERR_FAIL_COND_V(faces.size()==0,NULL);
+ //step 1 compute the plane
+ Set<Vector3> points;
+ Plane plane;
+
+ Vector3 center;
+
+ for(int i=0;i<faces.size();i++) {
+
+ Face3 f = faces.get(i);
+ Plane p = f.get_plane();
+ plane.normal+=p.normal;
+ plane.d+=p.d;
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 v = f.vertex[i].snapped(0.01);
+ if (!points.has(v)) {
+ points.insert(v);
+ center+=v;
+ }
+ }
+ }
+
+ plane.normal.normalize();
+ plane.d/=faces.size();
+ center/=points.size();
+
+ //step 2, create points
+
+ Transform t;
+ t.basis.from_z(plane.normal);
+ t.basis.transpose();
+ t.origin=center;
+
+ Vector<Point2> portal_points;
+
+ for(Set<Vector3>::Element *E=points.front();E;E=E->next()) {
+
+ Vector3 local = t.xform_inv(E->get());
+ portal_points.push_back(Point2(local.x,local.y));
+ }
+ // step 3 bubbly sort points
+
+ int swaps=0;
+
+ do {
+ swaps=0;
+
+ for(int i=0;i<portal_points.size()-1;i++) {
+
+ float a = portal_points[i].angle();
+ float b = portal_points[i+1].angle();
+
+ if (a>b) {
+ SWAP( portal_points[i], portal_points[i+1] );
+ swaps++;
+ }
+
+ }
+
+ } while(swaps);
+
+
+ Portal *portal = memnew( Portal );
+
+ portal->set_shape(portal_points);
+ portal->set_transform( mi->get_transform() * t);
+
+ p_node->replace_by(portal);
+ memdelete(p_node);
+ p_node=portal;
+
+ } else if (p_node->cast_to<MeshInstance>()) {
+
+ //last attempt, maybe collision insde the mesh data
+
+ MeshInstance *mi = p_node->cast_to<MeshInstance>();
+
+ Ref<Mesh> mesh = mi->get_mesh();
+ if (!mesh.is_null()) {
+
+ if (p_flags&SCENE_FLAG_CREATE_COLLISIONS && _teststr(mesh->get_name(),"col")) {
+
+ mesh->set_name( _fixstr(mesh->get_name(),"col") );
+ Ref<Shape> shape;
+
+ if (collision_map.has(mesh)) {
+ shape = collision_map[mesh];
+
+ } else {
+
+ shape = mesh->create_trimesh_shape();
+ if (!shape.is_null())
+ collision_map[mesh]=shape;
+
+
+ }
+
+ if (!shape.is_null()) {
+#if 0
+ StaticBody* static_body = memnew( StaticBody );
+ ERR_FAIL_COND_V(!static_body,NULL);
+ static_body->set_name( String(mesh->get_name()) + "_col" );
+ shape->set_name(static_body->get_name());
+ static_body->add_shape(shape);
+
+ mi->add_child(static_body);
+ if (mi->get_owner())
+ static_body->set_owner( mi->get_owner() );
+#endif
+ }
+
+ }
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ Ref<FixedSpatialMaterial> fm = mesh->surface_get_material(i);
+ if (fm.is_valid()) {
+ String name = fm->get_name();
+ /* if (_teststr(name,"alpha")) {
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ name=_fixstr(name,"alpha");
+ }
+
+ if (_teststr(name,"vcol")) {
+ fm->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY,true);
+ name=_fixstr(name,"vcol");
+ }*/
+ fm->set_name(name);
+ }
+ }
+
+ }
+
+ }
+
+
+ return p_node;
+}
+
+
+
+
+#if 0
+
+Error EditorImport::import_scene(const String& p_path,const String& p_dest_path,const String& p_resource_path,uint32_t p_flags,ImageFormat p_image_format,ImageCompression p_image_compression,uint32_t p_image_flags,float p_quality,uint32_t animation_flags,Node **r_scene,Ref<EditorPostImport> p_post_import) {
+
+
+}
+#endif
+
+void EditorSceneImportPlugin::_tag_import_paths(Node *p_scene,Node *p_node) {
+
+ if (p_scene!=p_node && p_node->get_owner()!=p_scene)
+ return;
+
+ NodePath path = p_scene->get_path_to(p_node);
+ p_node->set_import_path( path );
+
+ Spatial *snode=p_node->cast_to<Spatial>();
+
+ if (snode) {
+
+ snode->set_import_transform(snode->get_transform());
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+ _tag_import_paths(p_scene,p_node->get_child(i));
+ }
+
+}
+
+Error EditorSceneImportPlugin::import1(const Ref<ResourceImportMetadata>& p_from,Node**r_node,List<String> *r_missing) {
+
+ Ref<ResourceImportMetadata> from=p_from;
+
+ ERR_FAIL_COND_V(from->get_source_count()!=1,ERR_INVALID_PARAMETER);
+
+ String src_path=EditorImportPlugin::expand_source_path(from->get_source_path(0));
+
+ Ref<EditorSceneImporter> importer;
+ String ext=src_path.get_extension().to_lower();
+
+
+ EditorProgress progress("import",TTR("Import Scene"),104);
+ progress.step(TTR("Importing Scene.."),0);
+
+ for(int i=0;i<importers.size();i++) {
+
+ List<String> extensions;
+ importers[i]->get_extensions(&extensions);
+
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+
+ if (E->get().to_lower()==ext) {
+
+ importer = importers[i];
+ break;
+ }
+ }
+
+ if (importer.is_valid())
+ break;
+ }
+
+ ERR_FAIL_COND_V(!importer.is_valid(),ERR_FILE_UNRECOGNIZED);
+
+ int animation_flags=p_from->get_option("animation_flags");
+ int scene_flags = from->get_option("flags");
+ int fps = 24;
+ if (from->has_option("animation_bake_fps"))
+ fps=from->get_option("animation_bake_fps");
+
+
+ Array clips;
+ if (from->has_option("animation_clips"))
+ clips=from->get_option("animation_clips");
+
+ uint32_t import_flags=0;
+ if (animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_DETECT_LOOP)
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION_DETECT_LOOP;
+ if (animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_KEEP_VALUE_TRACKS)
+ import_flags |= EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS;
+ if (animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_OPTIMIZE)
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION_OPTIMIZE;
+ if (animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS)
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS;
+ if (scene_flags&SCENE_FLAG_IMPORT_ANIMATIONS)
+ import_flags|=EditorSceneImporter::IMPORT_ANIMATION;
+ /*
+ if (scene_flags&SCENE_FLAG_FAIL_ON_MISSING_IMAGES)
+ import_flags|=EditorSceneImporter::IMPORT_FAIL_ON_MISSING_DEPENDENCIES;
+ */
+ if (scene_flags&SCENE_FLAG_GENERATE_TANGENT_ARRAYS)
+ import_flags|=EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS;
+
+
+
+
+
+ Error err=OK;
+ Node *scene = importer->import_scene(src_path,import_flags,fps,r_missing,&err);
+ if (!scene || err!=OK) {
+ return err;
+ }
+
+ if (from->has_option("root_type")) {
+ String type = from->get_option("root_type");
+ Object *base = ClassDB::instance(type);
+ Node *base_node = NULL;
+ if (base)
+ base_node=base->cast_to<Node>();
+
+ if (base_node) {
+
+ scene->replace_by(base_node);
+ memdelete(scene);
+ scene=base_node;
+ }
+ }
+
+ scene->set_name(from->get_option("root_name"));
+ _tag_import_paths(scene,scene);
+
+ *r_node=scene;
+ return OK;
+}
+
+
+void EditorSceneImportPlugin::_create_clips(Node *scene, const Array& p_clips,bool p_bake_all) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+ if (!anim->has_animation("default"))
+ return;
+
+
+ Ref<Animation> default_anim = anim->get_animation("default");
+
+ for(int i=0;i<p_clips.size();i+=4) {
+
+ String name = p_clips[i];
+ float from=p_clips[i+1];
+ float to=p_clips[i+2];
+ bool loop=p_clips[i+3];
+ if (from>=to)
+ continue;
+
+ Ref<Animation> new_anim = memnew( Animation );
+
+ for(int j=0;j<default_anim->get_track_count();j++) {
+
+
+ List<float> keys;
+ int kc = default_anim->track_get_key_count(j);
+ int dtrack=-1;
+ for(int k=0;k<kc;k++) {
+
+ float kt = default_anim->track_get_key_time(j,k);
+ if (kt>=from && kt<to) {
+
+ //found a key within range, so create track
+ if (dtrack==-1) {
+ new_anim->add_track(default_anim->track_get_type(j));
+ dtrack = new_anim->get_track_count()-1;
+ new_anim->track_set_path(dtrack,default_anim->track_get_path(j));
+
+ if (kt>(from+0.01) && k>0) {
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,from,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,0,p,q,s);
+ }
+ }
+
+ }
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_get_key(j,k,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,kt-from,p,q,s);
+ }
+
+ }
+
+ if (dtrack!=-1 && kt>=to) {
+
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,to,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,to-from,p,q,s);
+ }
+ }
+
+ }
+
+ if (dtrack==-1 && p_bake_all) {
+ new_anim->add_track(default_anim->track_get_type(j));
+ dtrack = new_anim->get_track_count()-1;
+ new_anim->track_set_path(dtrack,default_anim->track_get_path(j));
+ if (default_anim->track_get_type(j)==Animation::TYPE_TRANSFORM) {
+
+
+ Quat q;
+ Vector3 p;
+ Vector3 s;
+ default_anim->transform_track_interpolate(j,from,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,0,p,q,s);
+ default_anim->transform_track_interpolate(j,to,&p,&q,&s);
+ new_anim->transform_track_insert_key(dtrack,to-from,p,q,s);
+ }
+
+ }
+ }
+
+
+ new_anim->set_loop(loop);
+ new_anim->set_length(to-from);
+ anim->add_animation(name,new_anim);
+ }
+
+ anim->remove_animation("default"); //remove default (no longer needed)
+}
+
+void EditorSceneImportPlugin::_filter_anim_tracks(Ref<Animation> anim,Set<String> &keep) {
+
+ Ref<Animation> a = anim;
+ ERR_FAIL_COND(!a.is_valid());
+
+ print_line("From Anim "+anim->get_name()+":");
+
+ for(int j=0;j<a->get_track_count();j++) {
+
+ String path = a->track_get_path(j);
+
+ if (!keep.has(path)) {
+
+ print_line("Remove: "+path);
+ a->remove_track(j);
+ j--;
+ }
+
+ }
+}
+
+
+void EditorSceneImportPlugin::_filter_tracks(Node *scene, const String& p_text) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+ Vector<String> strings = p_text.split("\n");
+ for(int i=0;i<strings.size();i++) {
+
+ strings[i]=strings[i].strip_edges();
+ }
+
+ List<StringName> anim_names;
+ anim->get_animation_list(&anim_names);
+ for(List<StringName>::Element *E=anim_names.front();E;E=E->next()) {
+
+ String name = E->get();
+ bool valid_for_this=false;
+ bool valid=false;
+
+ Set<String> keep;
+ Set<String> keep_local;
+
+
+ for(int i=0;i<strings.size();i++) {
+
+
+ if (strings[i].begins_with("@")) {
+
+ valid_for_this=false;
+ for(Set<String>::Element *F=keep_local.front();F;F=F->next()) {
+ keep.insert(F->get());
+ }
+ keep_local.clear();
+
+ Vector<String> filters=strings[i].substr(1,strings[i].length()).split(",");
+ for(int j=0;j<filters.size();j++) {
+
+ String fname = filters[j].strip_edges();
+ if (fname=="")
+ continue;
+ int fc = fname[0];
+ bool plus;
+ if (fc=='+')
+ plus=true;
+ else if (fc=='-')
+ plus=false;
+ else
+ continue;
+
+ String filter=fname.substr(1,fname.length()).strip_edges();
+
+ if (!name.matchn(filter))
+ continue;
+ valid_for_this=plus;
+ }
+
+ if (valid_for_this)
+ valid=true;
+
+ } else if (valid_for_this) {
+
+ Ref<Animation> a = anim->get_animation(name);
+ if (!a.is_valid())
+ continue;
+
+ for(int j=0;j<a->get_track_count();j++) {
+
+ String path = a->track_get_path(j);
+
+ String tname = strings[i];
+ if (tname=="")
+ continue;
+ int fc = tname[0];
+ bool plus;
+ if (fc=='+')
+ plus=true;
+ else if (fc=='-')
+ plus=false;
+ else
+ continue;
+
+ String filter=tname.substr(1,tname.length()).strip_edges();
+
+ if (!path.matchn(filter))
+ continue;
+
+ if (plus)
+ keep_local.insert(path);
+ else if (!keep.has(path)) {
+ keep_local.erase(path);
+ }
+ }
+
+ }
+
+ }
+
+ if (valid) {
+ for(Set<String>::Element *F=keep_local.front();F;F=F->next()) {
+ keep.insert(F->get());
+ }
+ print_line("FILTERING ANIM: "+String(E->get()));
+ _filter_anim_tracks(anim->get_animation(name),keep);
+ } else {
+ print_line("NOT FILTERING ANIM: "+String(E->get()));
+
+ }
+
+ }
+
+
+
+}
+
+void EditorSceneImportPlugin::_optimize_animations(Node *scene, float p_max_lin_error,float p_max_ang_error,float p_max_angle) {
+
+ if (!scene->has_node(String("AnimationPlayer")))
+ return;
+ Node* n = scene->get_node(String("AnimationPlayer"));
+ ERR_FAIL_COND(!n);
+ AnimationPlayer *anim = n->cast_to<AnimationPlayer>();
+ ERR_FAIL_COND(!anim);
+
+
+ List<StringName> anim_names;
+ anim->get_animation_list(&anim_names);
+ for(List<StringName>::Element *E=anim_names.front();E;E=E->next()) {
+
+ Ref<Animation> a = anim->get_animation(E->get());
+ a->optimize(p_max_lin_error,p_max_ang_error,Math::deg2rad(p_max_angle));
+ }
+}
+
+
+void EditorSceneImportPlugin::_find_resources_to_merge(Node *scene, Node *node, bool p_merge_material, Map<String, Ref<Material> > &materials, bool p_merge_anims, Map<String,Ref<Animation> >& merged_anims,Set<Ref<Mesh> > &tested_meshes) {
+
+ if (node!=scene && node->get_owner()!=scene)
+ return;
+
+ String path = scene->get_path_to(node);
+
+ if (p_merge_anims && node->cast_to<AnimationPlayer>()) {
+
+ AnimationPlayer *ap = node->cast_to<AnimationPlayer>();
+ List<StringName> anims;
+ ap->get_animation_list(&anims);
+ for (List<StringName>::Element *E=anims.front();E;E=E->next()) {
+ Ref<Animation> anim = ap->get_animation(E->get());
+ Ref<Animation> clone;
+
+ bool has_user_tracks=false;
+
+ for(int i=0;i<anim->get_track_count();i++) {
+
+ if (!anim->track_is_imported(i)) {
+ has_user_tracks=true;
+ break;
+ }
+ }
+
+ if (has_user_tracks) {
+
+ clone = anim->duplicate();
+ for(int i=0;i<clone->get_track_count();i++) {
+ if (clone->track_is_imported(i)) {
+ clone->remove_track(i);
+ i--;
+ }
+ }
+
+ merged_anims[path+"::"+String(E->get())]=clone;
+ }
+ }
+ }
+
+
+
+ if (p_merge_material && node->cast_to<MeshInstance>()) {
+ MeshInstance *mi=node->cast_to<MeshInstance>();
+ Ref<Mesh> mesh = mi->get_mesh();
+ if (mesh.is_valid() && mesh->get_name()!=String() && !tested_meshes.has(mesh)) {
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+ Ref<Material> material = mesh->surface_get_material(i);
+
+ if (material.is_valid()) {
+
+ String sname = mesh->surface_get_name(i);
+ if (sname=="")
+ sname="surf_"+itos(i);
+
+ sname=mesh->get_name()+":surf:"+sname;
+ materials[sname]=material;
+ }
+ }
+
+ tested_meshes.insert(mesh);
+ }
+
+ if (mesh.is_valid()) {
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+ Ref<Material> material = mi->get_surface_material(i);
+ if (material.is_valid()) {
+ String sname = mesh->surface_get_name(i);
+ if (sname=="")
+ sname="surf_"+itos(i);
+
+ sname=path+":inst_surf:"+sname;
+ materials[sname]=material;
+ }
+ }
+
+ }
+
+ Ref<Material> override = mi->get_material_override();
+
+ if (override.is_valid()) {
+
+ materials[path+":override"]=override;
+ }
+ }
+
+
+
+ for(int i=0;i<node->get_child_count();i++) {
+ _find_resources_to_merge(scene,node->get_child(i),p_merge_material,materials,p_merge_anims,merged_anims,tested_meshes);
+ }
+
+}
+
+
+void EditorSceneImportPlugin::_merge_found_resources(Node *scene, Node *node, bool p_merge_material, const Map<String, Ref<Material> > &materials, bool p_merge_anims, const Map<String,Ref<Animation> >& merged_anims, Set<Ref<Mesh> > &tested_meshes) {
+
+ if (node!=scene && node->get_owner()!=scene)
+ return;
+
+ String path = scene->get_path_to(node);
+
+ print_line("at path: "+path);
+
+ if (node->cast_to<AnimationPlayer>()) {
+
+ AnimationPlayer *ap = node->cast_to<AnimationPlayer>();
+ List<StringName> anims;
+ ap->get_animation_list(&anims);
+ for (List<StringName>::Element *E=anims.front();E;E=E->next()) {
+ Ref<Animation> anim = ap->get_animation(E->get());
+
+ String anim_path = path+"::"+String(E->get());
+
+ if (merged_anims.has(anim_path)) {
+
+ Ref<Animation> user_tracks = merged_anims[anim_path];
+ for(int i=0;i<user_tracks->get_track_count();i++) {
+
+ int idx = anim->get_track_count();
+ anim->add_track(user_tracks->track_get_type(i));
+ anim->track_set_path(idx,user_tracks->track_get_path(i));
+ anim->track_set_interpolation_type(idx,user_tracks->track_get_interpolation_type(i));
+ for(int j=0;j<user_tracks->track_get_key_count(i);j++) {
+
+ float ofs = user_tracks->track_get_key_time(i,j);
+ float trans = user_tracks->track_get_key_transition(i,j);
+ Variant value = user_tracks->track_get_key_value(i,j);
+
+ anim->track_insert_key(idx,ofs,value,trans);
+ }
+ }
+ }
+ }
+ }
+
+
+
+ if (node->cast_to<MeshInstance>()) {
+ MeshInstance *mi=node->cast_to<MeshInstance>();
+ Ref<Mesh> mesh = mi->get_mesh();
+ if (mesh.is_valid() && mesh->get_name()!=String() && !tested_meshes.has(mesh)) {
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ String sname = mesh->surface_get_name(i);
+ if (sname=="")
+ sname="surf_"+itos(i);
+
+ sname=mesh->get_name()+":surf:"+sname;
+
+
+ if (materials.has(sname)) {
+
+ mesh->surface_set_material(i,materials[sname]);
+ }
+ }
+
+ tested_meshes.insert(mesh);
+ }
+
+ if (mesh.is_valid()) {
+
+ for(int i=0;i<mesh->get_surface_count();i++) {
+
+ String sname = mesh->surface_get_name(i);
+ if (sname=="")
+ sname="surf_"+itos(i);
+
+ sname=path+":inst_surf:"+sname;
+
+
+ if (materials.has(sname)) {
+
+ mi->set_surface_material(i,materials[sname]);
+ }
+ }
+
+ }
+
+
+ String opath = path+":override";
+ if (materials.has(opath)) {
+ mi->set_material_override(materials[opath]);
+ }
+
+ }
+
+
+
+ for(int i=0;i<node->get_child_count();i++) {
+ _merge_found_resources(scene,node->get_child(i),p_merge_material,materials,p_merge_anims,merged_anims,tested_meshes);
+ }
+
+}
+
+Error EditorSceneImportPlugin::import2(Node *scene, const String& p_dest_path, const Ref<ResourceImportMetadata>& p_from) {
+
+ Error err=OK;
+ Ref<ResourceImportMetadata> from=p_from;
+ String src_path=EditorImportPlugin::expand_source_path(from->get_source_path(0));
+ int animation_flags=p_from->get_option("animation_flags");
+ Array animation_clips = p_from->get_option("animation_clips");
+ String animation_filter = p_from->get_option("animation_filters");
+ int scene_flags = from->get_option("flags");
+ float anim_optimizer_linerr=0.05;
+ float anim_optimizer_angerr=0.01;
+ float anim_optimizer_maxang=22;
+
+ if (from->has_option("animation_optimizer_linear_error"))
+ anim_optimizer_linerr=from->get_option("animation_optimizer_linear_error");
+ if (from->has_option("animation_optimizer_angular_error"))
+ anim_optimizer_angerr=from->get_option("animation_optimizer_angular_error");
+ if (from->has_option("animation_optimizer_max_angle"))
+ anim_optimizer_maxang=from->get_option("animation_optimizer_max_angle");
+
+ EditorProgress progress("import",TTR("Import Scene"),104);
+ progress.step(TTR("Importing Scene.."),2);
+
+
+ from->set_source_md5(0,FileAccess::get_md5(src_path));
+ from->set_editor(get_name());
+
+ from->set_option("reimport",false);
+ String target_res_path=p_dest_path.get_base_dir();
+
+ Map<Ref<Mesh>,Ref<Shape> > collision_map;
+
+ Map< Ref<ImageTexture>,TextureRole > imagemap;
+
+ scene=_fix_node(scene,scene,collision_map,scene_flags,imagemap);
+ if (animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_OPTIMIZE)
+ _optimize_animations(scene,anim_optimizer_linerr,anim_optimizer_angerr,anim_optimizer_maxang);
+ if (animation_clips.size())
+ _create_clips(scene,animation_clips,animation_flags&EditorSceneAnimationImportPlugin::ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS);
+
+ _filter_tracks(scene,animation_filter);
+
+
+ if (scene_flags&(SCENE_FLAG_MERGE_KEEP_MATERIALS|SCENE_FLAG_MERGE_KEEP_EXTRA_ANIM_TRACKS) && FileAccess::exists(p_dest_path)) {
+ //must merge!
+
+ print_line("MUST MERGE");
+ Ref<PackedScene> pscene = ResourceLoader::load(p_dest_path,"PackedScene",true);
+ if (pscene.is_valid()) {
+
+ Node *instance = pscene->instance();
+ if (instance) {
+ Map<String,Ref<Animation> > merged_anims;
+ Map<String,Ref<Material> > merged_materials;
+ Set<Ref<Mesh> > tested_meshes;
+
+ _find_resources_to_merge(instance,instance,scene_flags&SCENE_FLAG_MERGE_KEEP_MATERIALS,merged_materials,scene_flags&SCENE_FLAG_MERGE_KEEP_EXTRA_ANIM_TRACKS,merged_anims,tested_meshes);
+
+ tested_meshes.clear();
+ _merge_found_resources(scene,scene,scene_flags&SCENE_FLAG_MERGE_KEEP_MATERIALS,merged_materials,scene_flags&SCENE_FLAG_MERGE_KEEP_EXTRA_ANIM_TRACKS,merged_anims,tested_meshes);
+
+ memdelete(instance);
+ }
+
+ }
+
+ }
+
+ /// BEFORE ANYTHING, RUN SCRIPT
+
+ progress.step(TTR("Running Custom Script.."),2);
+
+ String post_import_script_path = from->get_option("post_import_script");
+ Ref<EditorScenePostImport> post_import_script;
+
+ if (post_import_script_path!="") {
+ post_import_script_path = post_import_script_path;
+ Ref<Script> scr = ResourceLoader::load(post_import_script_path);
+ if (!scr.is_valid()) {
+ EditorNode::add_io_error(TTR("Couldn't load post-import script:")+" "+post_import_script_path);
+ } else {
+
+ post_import_script = Ref<EditorScenePostImport>( memnew( EditorScenePostImport ) );
+ post_import_script->set_script(scr.get_ref_ptr());
+ if (!post_import_script->get_script_instance()) {
+ EditorNode::add_io_error(TTR("Invalid/broken script for post-import (check console):")+" "+post_import_script_path);
+ post_import_script.unref();
+ return ERR_CANT_CREATE;
+ }
+ }
+ }
+
+
+ if (post_import_script.is_valid()) {
+ scene = post_import_script->post_import(scene);
+ if (!scene) {
+ EditorNode::add_io_error(TTR("Error running post-import script:")+" "+post_import_script_path);
+ return err;
+ }
+
+
+ }
+
+
+ /// IMPORT IMAGES
+
+
+ int idx=0;
+
+ int image_format = from->get_option("texture_format");
+ int image_flags = from->get_option("texture_flags");
+ float image_quality = from->get_option("texture_quality");
+
+ for (Map< Ref<ImageTexture>,TextureRole >::Element *E=imagemap.front();E;E=E->next()) {
+
+ //texture could be converted to something more useful for 3D, that could load individual mipmaps and stuff
+ //but not yet..
+
+ Ref<ImageTexture> texture = E->key();
+
+ ERR_CONTINUE(!texture.is_valid());
+
+ String path = texture->get_path();
+ String fname= path.get_file();
+ String target_path = GlobalConfig::get_singleton()->localize_path(target_res_path.plus_file(fname));
+ progress.step(TTR("Import Image:")+" "+fname,3+(idx)*100/imagemap.size());
+
+ idx++;
+
+ if (path==target_path) {
+
+ EditorNode::add_io_error(TTR("Can't import a file over itself:")+" "+target_path);
+ continue;
+ }
+
+ if (!target_path.begins_with("res://")) {
+ EditorNode::add_io_error(vformat(TTR("Couldn't localize path: %s (already local)"),target_path));
+ continue;
+ }
+
+
+ {
+
+
+ target_path=target_path.get_basename()+".tex";
+
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+
+ uint32_t flags = image_flags;
+ if (E->get()==TEXTURE_ROLE_DIFFUSE && scene_flags&SCENE_FLAG_LINEARIZE_DIFFUSE_TEXTURES)
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_CONVERT_TO_LINEAR;
+
+ if (E->get()==TEXTURE_ROLE_NORMALMAP && scene_flags&SCENE_FLAG_CONVERT_NORMALMAPS_TO_XY)
+ flags|=EditorTextureImportPlugin::IMAGE_FLAG_CONVERT_NORMAL_TO_XY;
+
+ imd->set_option("flags",flags);
+ imd->set_option("format",image_format);
+ imd->set_option("quality",image_quality);
+ imd->set_option("atlas",false);
+ imd->add_source(EditorImportPlugin::validate_source_path(path));
+
+
+ if (FileAccess::exists(target_path)) {
+
+ Ref<ResourceImportMetadata> rimdex = ResourceLoader::load_import_metadata(target_path);
+ if (rimdex.is_valid()) {
+ //make sure the options are the same, otherwise re-import
+ List<String> opts;
+ imd->get_options(&opts);
+ bool differ=false;
+ for (List<String>::Element *E=opts.front();E;E=E->next()) {
+ if (!(rimdex->get_option(E->get())==imd->get_option(E->get()))) {
+ differ=true;
+ break;
+ }
+ }
+
+ if (!differ) {
+ texture->set_path(target_path);
+ continue; //already imported
+ }
+ }
+ }
+
+ EditorTextureImportPlugin::get_singleton()->import(target_path,imd);
+
+ }
+ }
+
+
+
+ progress.step(TTR("Saving.."),104);
+
+ Ref<PackedScene> packer = memnew( PackedScene );
+ packer->pack(scene);
+ //packer->set_path(p_dest_path); do not take over, let the changed files reload themselves
+ packer->set_import_metadata(from);
+
+ print_line("SAVING TO: "+p_dest_path);
+ err = ResourceSaver::save(p_dest_path,packer); //do not take over, let the changed files reload themselves
+
+ //EditorFileSystem::get_singleton()->update_resource(packer);
+
+ memdelete(scene);
+
+ /*
+ scene->set_filename(p_dest_path);
+ if (r_scene) {
+ *r_scene=scene;
+ } else {
+ memdelete(scene);
+ }
+
+ String sp;
+ if (p_post_import.is_valid() && !p_post_import->get_script().is_null()) {
+ Ref<Script> scr = p_post_import->get_script();
+ if (scr.is_valid())
+ sp=scr->get_path();
+ }
+
+ String op=_getrelpath(p_path,p_dest_path);
+
+ */
+
+ EditorNode::get_singleton()->reload_scene(p_dest_path);
+
+ return err;
+
+}
+
+
+Error EditorSceneImportPlugin::import(const String& p_dest_path, const Ref<ResourceImportMetadata>& p_from){
+
+
+ Node *n=NULL;
+ Error err = import1(p_from,&n);
+ if (err!=OK) {
+ if (n) {
+ memdelete(n);
+ }
+ return err;
+ }
+ return import2(n,p_dest_path,p_from);
+}
+
+void EditorSceneImportPlugin::add_importer(const Ref<EditorSceneImporter>& p_importer) {
+
+ importers.push_back(p_importer);
+}
+
+void EditorSceneImportPlugin::import_from_drop(const Vector<String>& p_drop,const String& p_dest_path) {
+
+ List<String> extensions;
+ for(int i=0;i<importers.size();i++) {
+ importers[i]->get_extensions(&extensions);
+ }
+ //bool warn_compatible=false;
+ for(int i=0;i<p_drop.size();i++) {
+
+ String extension = p_drop[i].get_extension().to_lower();
+
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+
+ if (E->get()==extension) {
+
+ dialog->popup_import(String());
+ dialog->setup_popup(p_drop[i],p_dest_path);
+ return;
+ }
+ }
+ }
+
+}
+
+
+EditorSceneImportPlugin::EditorSceneImportPlugin(EditorNode* p_editor) {
+
+ dialog = memnew( EditorSceneImportDialog(p_editor,this) );
+ p_editor->get_gui_base()->add_child(dialog);
+}
+
+
+///////////////////////////////
+
+
+String EditorSceneAnimationImportPlugin::get_name() const {
+
+ return "anim_3d";
+}
+String EditorSceneAnimationImportPlugin::get_visible_name() const{
+
+
+ return TTR("3D Scene Animation");
+}
+void EditorSceneAnimationImportPlugin::import_dialog(const String& p_from){
+
+
+}
+Error EditorSceneAnimationImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from){
+
+ return OK;
+}
+
+EditorSceneAnimationImportPlugin::EditorSceneAnimationImportPlugin(EditorNode* p_editor) {
+
+
+}
+#endif
diff --git a/editor/io_plugins/editor_scene_import_plugin.h b/editor/io_plugins/editor_scene_import_plugin.h
new file mode 100644
index 0000000000..2ae0693600
--- /dev/null
+++ b/editor/io_plugins/editor_scene_import_plugin.h
@@ -0,0 +1,200 @@
+/*************************************************************************/
+/* editor_scene_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SCENE_IMPORT_PLUGIN_H
+#define EDITOR_SCENE_IMPORT_PLUGIN_H
+#if 0
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/progress_bar.h"
+#include "scene/gui/slider.h"
+#include "scene/gui/spin_box.h"
+#include "scene/resources/mesh.h"
+#include "editor/editor_file_system.h"
+#include "editor/editor_dir_dialog.h"
+#include "editor/editor_import_export.h"
+#include "editor/io_plugins/editor_texture_import_plugin.h"
+#include "scene/resources/animation.h"
+
+
+class EditorNode;
+class EditorSceneImportDialog;
+
+class EditorSceneImporter : public Reference {
+
+ GDCLASS(EditorSceneImporter,Reference );
+public:
+
+ enum ImportFlags {
+ IMPORT_SCENE=1,
+ IMPORT_ANIMATION=2,
+ IMPORT_ANIMATION_DETECT_LOOP=4,
+ IMPORT_ANIMATION_OPTIMIZE=8,
+ IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS=16,
+ IMPORT_ANIMATION_KEEP_VALUE_TRACKS=32,
+ IMPORT_GENERATE_TANGENT_ARRAYS=256,
+ IMPORT_FAIL_ON_MISSING_DEPENDENCIES=512
+
+ };
+
+ virtual uint32_t get_import_flags() const=0;
+ virtual void get_extensions(List<String> *r_extensions) const=0;
+ virtual Node* import_scene(const String& p_path,uint32_t p_flags,int p_bake_fps,List<String> *r_missing_deps,Error* r_err=NULL)=0;
+ virtual Ref<Animation> import_animation(const String& p_path,uint32_t p_flags)=0;
+
+
+
+ EditorSceneImporter();
+};
+
+/////////////////////////////////////////
+
+
+//Plugin for post processing scenes or images
+
+class EditorScenePostImport : public Reference {
+
+ GDCLASS(EditorScenePostImport,Reference );
+protected:
+
+ static void _bind_methods();
+public:
+
+ virtual Node* post_import(Node* p_scene);
+ EditorScenePostImport();
+};
+
+
+class EditorSceneImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorSceneImportPlugin,EditorImportPlugin);
+
+ EditorSceneImportDialog *dialog;
+
+ Vector<Ref<EditorSceneImporter> > importers;
+
+ enum TextureRole {
+ TEXTURE_ROLE_DEFAULT,
+ TEXTURE_ROLE_DIFFUSE,
+ TEXTURE_ROLE_NORMALMAP
+ };
+
+ void _find_resources(const Variant& p_var,Map<Ref<ImageTexture>,TextureRole >& image_map,int p_flags);
+ Node* _fix_node(Node *p_node,Node *p_root,Map<Ref<Mesh>,Ref<Shape> > &collision_map,uint32_t p_flags,Map<Ref<ImageTexture>,TextureRole >& image_map);
+ void _create_clips(Node *scene, const Array& p_clips, bool p_bake_all);
+ void _filter_anim_tracks(Ref<Animation> anim,Set<String> &keep);
+ void _filter_tracks(Node *scene, const String& p_text);
+ void _optimize_animations(Node *scene, float p_max_lin_error,float p_max_ang_error,float p_max_angle);
+
+ void _tag_import_paths(Node *p_scene,Node *p_node);
+
+ void _find_resources_to_merge(Node *scene, Node *node, bool p_merge_material, Map<String,Ref<Material> >&materials, bool p_merge_anims, Map<String,Ref<Animation> >& merged_anims, Set<Ref<Mesh> > &tested_meshes);
+ void _merge_found_resources(Node *scene, Node *node, bool p_merge_material, const Map<String, Ref<Material> > &materials, bool p_merge_anims, const Map<String,Ref<Animation> >& merged_anims, Set<Ref<Mesh> > &tested_meshes);
+
+
+public:
+
+ enum SceneFlags {
+
+ SCENE_FLAG_CREATE_COLLISIONS=1<<0,
+ SCENE_FLAG_CREATE_PORTALS=1<<1,
+ SCENE_FLAG_CREATE_ROOMS=1<<2,
+ SCENE_FLAG_SIMPLIFY_ROOMS=1<<3,
+ SCENE_FLAG_CREATE_BILLBOARDS=1<<4,
+ SCENE_FLAG_CREATE_IMPOSTORS=1<<5,
+ SCENE_FLAG_CREATE_LODS=1<<6,
+ SCENE_FLAG_CREATE_CARS=1<<8,
+ SCENE_FLAG_CREATE_WHEELS=1<<9,
+ SCENE_FLAG_DETECT_ALPHA=1<<15,
+ SCENE_FLAG_DETECT_VCOLOR=1<<16,
+ SCENE_FLAG_CREATE_NAVMESH=1<<17,
+ SCENE_FLAG_DETECT_LIGHTMAP_LAYER=1<<18,
+
+ SCENE_FLAG_MERGE_KEEP_MATERIALS=1<<20,
+ SCENE_FLAG_MERGE_KEEP_EXTRA_ANIM_TRACKS=1<<21,
+
+ SCENE_FLAG_REMOVE_NOIMP=1<<24,
+ SCENE_FLAG_IMPORT_ANIMATIONS=1<<25,
+ SCENE_FLAG_COMPRESS_GEOMETRY=1<<26,
+ SCENE_FLAG_GENERATE_TANGENT_ARRAYS=1<<27,
+ SCENE_FLAG_LINEARIZE_DIFFUSE_TEXTURES=1<<28,
+ SCENE_FLAG_SET_LIGHTMAP_TO_UV2_IF_EXISTS=1<<29,
+ SCENE_FLAG_CONVERT_NORMALMAPS_TO_XY=1<<30,
+ };
+
+
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+
+ Error import1(const Ref<ResourceImportMetadata>& p_from,Node**r_node,List<String> *r_missing=NULL);
+ Error import2(Node* p_scene,const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+
+ void add_importer(const Ref<EditorSceneImporter>& p_importer);
+ const Vector<Ref<EditorSceneImporter> >& get_importers() { return importers; }
+
+ virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path);
+
+ EditorSceneImportPlugin(EditorNode* p_editor=NULL);
+
+
+};
+
+
+class EditorSceneAnimationImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorSceneAnimationImportPlugin,EditorImportPlugin);
+public:
+
+
+ enum AnimationFlags {
+
+ ANIMATION_DETECT_LOOP=1,
+ ANIMATION_KEEP_VALUE_TRACKS=2,
+ ANIMATION_OPTIMIZE=4,
+ ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS=8
+ };
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+
+ EditorSceneAnimationImportPlugin(EditorNode* p_editor=NULL);
+
+
+};
+
+#endif
+#endif // EDITOR_SCENE_IMPORT_PLUGIN_H
diff --git a/editor/io_plugins/editor_scene_importer_fbxconv.cpp b/editor/io_plugins/editor_scene_importer_fbxconv.cpp
new file mode 100644
index 0000000000..d75a26a948
--- /dev/null
+++ b/editor/io_plugins/editor_scene_importer_fbxconv.cpp
@@ -0,0 +1,1136 @@
+/*************************************************************************/
+/* editor_scene_importer_fbxconv.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_scene_importer_fbxconv.h"
+
+#include "os/file_access.h"
+#include "os/os.h"
+#include "editor/editor_settings.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/animation/animation_player.h"
+
+#if 0
+String EditorSceneImporterFBXConv::_id(const String& p_id) const {
+
+ return p_id.replace(":","_").replace("/","_");
+}
+
+uint32_t EditorSceneImporterFBXConv::get_import_flags() const {
+
+ return IMPORT_SCENE|IMPORT_ANIMATION;
+}
+void EditorSceneImporterFBXConv::get_extensions(List<String> *r_extensions) const{
+
+ r_extensions->push_back("fbx");
+ r_extensions->push_back("g3dj");
+}
+
+
+Color EditorSceneImporterFBXConv::_get_color(const Array& a) {
+
+ if (a.size()<3)
+ return Color();
+ Color c;
+ c.r=a[0];
+ c.g=a[1];
+ c.b=a[2];
+ if (a.size()>=4)
+ c.a=a[3];
+ return c;
+
+}
+
+Transform EditorSceneImporterFBXConv::_get_transform_mixed(const Dictionary& d,const Dictionary& dbase) {
+
+
+
+
+ Array translation;
+
+ if (d.has("translation"))
+ translation=d["translation"];
+ else if (dbase.has("translation"))
+ translation=dbase["translation"];
+
+ Array rotation;
+
+ if (d.has("rotation"))
+ rotation=d["rotation"];
+ else if (dbase.has("rotation"))
+ rotation=dbase["rotation"];
+
+ Array scale;
+
+ if (d.has("scale"))
+ scale=d["scale"];
+ else if (dbase.has("scale"))
+ scale=dbase["scale"];
+
+ Transform t;
+
+
+ if (translation.size()) {
+ Array tr = translation;
+ if (tr.size()>=3) {
+ t.origin.x=tr[0];
+ t.origin.y=tr[1];
+ t.origin.z=tr[2];
+ }
+ }
+
+ if (rotation.size()) {
+
+ Array r = rotation;
+ if (r.size()>=4) {
+
+ Quat q;
+ q.x = r[0];
+ q.y = r[1];
+ q.z = r[2];
+ q.w = r[3];
+ t.basis=Matrix3(q);
+ }
+ }
+
+
+ if (scale.size()) {
+
+ Array sc = scale;
+ if (sc.size()>=3) {
+ Vector3 s;
+ s.x=sc[0];
+ s.y=sc[1];
+ s.z=sc[2];
+ t.basis.scale(s);
+ }
+ }
+
+ return t;
+
+
+}
+
+Transform EditorSceneImporterFBXConv::_get_transform(const Dictionary& d) {
+
+
+ Transform t;
+
+ if (d.has("translation")) {
+ Array tr = d["translation"];
+ if (tr.size()>=3) {
+ t.origin.x=tr[0];
+ t.origin.y=tr[1];
+ t.origin.z=tr[2];
+ }
+ }
+
+ if (d.has("rotation")) {
+
+ Array r = d["rotation"];
+ if (r.size()>=4) {
+
+ Quat q;
+ q.x = r[0];
+ q.y = r[1];
+ q.z = r[2];
+ q.w = r[3];
+ t.basis=Matrix3(q);
+ }
+ }
+
+
+ if (d.has("scale")) {
+
+ Array sc = d["scale"];
+ if (sc.size()>=3) {
+ Vector3 s;
+ s.x=sc[0];
+ s.y=sc[1];
+ s.z=sc[2];
+ t.basis.scale(s);
+ }
+ }
+
+ return t;
+}
+
+
+void EditorSceneImporterFBXConv::_detect_bones_in_nodes(State& state,const Array& p_nodes) {
+
+
+ for(int i=0;i<p_nodes.size();i++) {
+
+ Dictionary d = p_nodes[i];
+ if (d.has("isBone") && bool(d["isBone"])) {
+
+ String bone_name=_id(d["id"]);
+ print_line("IS BONE: "+bone_name);
+ if (!state.bones.has(bone_name)) {
+ state.bones.insert(bone_name,BoneInfo());
+ }
+
+ if (!state.bones[bone_name].has_rest) {
+ state.bones[bone_name].rest=_get_transform(d).affine_inverse();
+ }
+
+ state.bones[bone_name].node=d;
+
+ //state.bones[name].rest=_get_transform(b);
+ }
+
+ if (d.has("parts")) {
+
+ Array parts=d["parts"];
+ for(int j=0;j<parts.size();j++) {
+
+ Dictionary p=parts[j];
+ if (p.has("bones")) {
+ Array bones=p["bones"];
+ //omfg
+ for(int k=0;k<bones.size();k++) {
+
+ Dictionary b = bones[k];
+ if (b.has("node")) {
+
+ String name = _id(b["node"]);
+ if (!state.bones.has(name)) {
+ state.bones.insert(name,BoneInfo());
+ }
+
+ state.bones[name].rest=_get_transform(b);
+ state.bones[name].has_rest=true;
+ }
+ }
+ }
+
+ }
+ }
+
+ if (d.has("children")) {
+
+ _detect_bones_in_nodes(state,d["children"]);
+ }
+ }
+
+}
+
+void EditorSceneImporterFBXConv::_parse_skeletons(const String& p_name,State& state, const Array &p_nodes, Skeleton *p_skeleton,int p_parent) {
+
+
+
+ for(int i=0;i<p_nodes.size();i++) {
+
+
+ Dictionary d = p_nodes[i];
+ int bone_idx=-1;
+ String id;
+ Skeleton* skeleton=p_skeleton;
+ if (d.has("id")) {
+
+ id=_id(d["id"]);
+ if (state.bones.has(id)) {
+ //BONER
+ if (!skeleton) {
+ skeleton=memnew( Skeleton );
+ state.skeletons[id]=skeleton;
+ }
+ bone_idx = skeleton->get_bone_count();
+ skeleton->add_bone(id);
+ skeleton->set_bone_parent(bone_idx,p_parent);
+ skeleton->set_bone_rest(bone_idx,state.bones[id].rest);
+ state.bones[id].skeleton=skeleton;
+ }
+ }
+
+ if (d.has("children")) {
+
+ _parse_skeletons(id,state,d["children"],skeleton,bone_idx);
+ }
+ }
+
+}
+
+void EditorSceneImporterFBXConv::_detect_bones(State& state) {
+ //This format should mark when a node is a bone,
+ //which is the only thing that Collada does right.
+ //think about others implementing a parser.
+ //Just _one_ string and you avoid loads of lines of code to other people.
+
+ for(int i=0;i<state.animations.size();i++) {
+
+ Dictionary an = state.animations[i];
+ if (an.has("bones")) {
+
+ Array bo=an["bones"];
+ for(int j=0;j<bo.size();j++) {
+
+ Dictionary b=bo[j];
+ if (b.has("boneId")) {
+
+ String id = b["boneId"];
+ if (!state.bones.has(id)) {
+ state.bones.insert(id,BoneInfo());
+ }
+ state.bones[id].has_anim_chan=true; //used in anim
+
+
+ }
+ }
+ }
+ }
+
+ _detect_bones_in_nodes(state,state.nodes);
+ _parse_skeletons("",state,state.nodes,NULL,-1);
+
+ print_line("found bones: "+itos(state.bones.size()));
+ print_line("found skeletons: "+itos(state.skeletons.size()));
+}
+
+Error EditorSceneImporterFBXConv::_parse_bones(State& state,const Array &p_bones,Skeleton* p_skeleton) {
+
+
+
+ return OK;
+}
+
+
+void EditorSceneImporterFBXConv::_add_surface(State& state,Ref<Mesh>& m,const Dictionary &part) {
+
+ if (part.has("meshpartid")) {
+
+ String id = part["meshpartid"];
+ ERR_FAIL_COND(!state.surface_cache.has(id));
+
+
+ Ref<Material> mat;
+ if (part.has("materialid")) {
+ String matid=part["materialid"];
+ if (state.material_cache.has(matid)) {
+ mat=state.material_cache[matid];
+ }
+ }
+ int idx = m->get_surface_count();
+
+ Array array = state.surface_cache[id].array;
+ PoolVector<float> indices = array[Mesh::ARRAY_BONES];
+ if (indices.size() && part.has("bones")) {
+
+
+ Map<int,int> index_map;
+
+ Array bones=part["bones"];
+
+ for(int i=0;i<bones.size();i++) {
+
+ Dictionary bone=bones[i];
+ String name=_id(bone["node"]);
+
+ if (state.bones.has(name)) {
+ int idx=state.bones[name].skeleton->find_bone(name);
+ if (idx==-1)
+ idx=0;
+ index_map[i]=idx;
+ }
+ }
+
+
+
+ int ilen=indices.size();
+ {
+ PoolVector<float>::Write iw=indices.write();
+ for(int j=0;j<ilen;j++) {
+ int b = iw[j];
+ ERR_CONTINUE(!index_map.has(b));
+ b=index_map[b];
+ iw[j]=b;
+ }
+ }
+
+ array[Mesh::ARRAY_BONES]=indices;
+
+
+ }
+
+ m->add_surface(state.surface_cache[id].primitive,array);
+ m->surface_set_material(idx,mat);
+ m->surface_set_name(idx,id);
+ }
+
+}
+
+Error EditorSceneImporterFBXConv::_parse_nodes(State& state,const Array &p_nodes,Node* p_base) {
+
+ for(int i=0;i<p_nodes.size();i++) {
+
+ Dictionary n = p_nodes[i];
+ Spatial *node=NULL;
+ bool skip=false;
+
+ String id;
+ if (n.has("id")) {
+ id=_id(n["id"]);
+ }
+
+ print_line("ID: "+id);
+
+ if (state.skeletons.has(id)) {
+
+ Skeleton *skeleton = state.skeletons[id];
+ node=skeleton;
+ skeleton->localize_rests();
+ print_line("IS SKELETON! ");
+ } else if (state.bones.has(id)) {
+ if (p_base)
+ node=p_base->cast_to<Spatial>();
+ if (!state.bones[id].has_anim_chan) {
+ print_line("no has anim "+id);
+ }
+ skip=true;
+ } else if (n.has("parts")) {
+ //is a mesh
+ MeshInstance *mesh = memnew( MeshInstance );
+ node=mesh;
+
+ Array parts=n["parts"];
+ String long_identifier;
+ for(int j=0;j<parts.size();j++) {
+
+ Dictionary part=parts[j];
+ if (part.has("meshpartid")) {
+ String partid=part["meshpartid"];
+ long_identifier+=partid;
+ }
+ }
+
+ Ref<Mesh> m;
+
+ if (state.mesh_cache.has(long_identifier)) {
+ m=state.mesh_cache[long_identifier];
+ } else {
+ m = Ref<Mesh>( memnew( Mesh ) );
+
+ //and parts are surfaces
+ for(int j=0;j<parts.size();j++) {
+
+ Dictionary part=parts[j];
+ if (part.has("meshpartid")) {
+ _add_surface(state,m,part);
+ }
+ }
+
+
+ state.mesh_cache[long_identifier]=m;
+ }
+
+ mesh->set_mesh(m);
+ }
+
+ if (!skip) {
+
+ if (!node) {
+ node = memnew( Spatial );
+ }
+
+ node->set_name(id);
+ node->set_transform(_get_transform(n));
+ p_base->add_child(node);
+ node->set_owner(state.scene);
+ }
+
+
+ if (n.has("children")) {
+ Error err = _parse_nodes(state,n["children"],node);
+ if (err)
+ return err;
+ }
+ }
+
+ return OK;
+}
+
+
+void EditorSceneImporterFBXConv::_parse_materials(State& state) {
+
+ for(int i=0;i<state.materials.size();i++) {
+
+ Dictionary material = state.materials[i];
+
+ ERR_CONTINUE(!material.has("id"));
+ String id = _id(material["id"]);
+
+ Ref<FixedSpatialMaterial> mat = memnew( FixedSpatialMaterial );
+
+ if (material.has("diffuse")) {
+ mat->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,_get_color(material["diffuse"]));
+ }
+
+ if (material.has("specular")) {
+ mat->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR,_get_color(material["specular"]));
+ }
+
+ if (material.has("emissive")) {
+ mat->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,_get_color(material["emissive"]));
+ }
+
+ if (material.has("shininess")) {
+ float exp = material["shininess"];
+ mat->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR_EXP,exp);
+ }
+
+ if (material.has("opacity")) {
+ Color c = mat->get_parameter(FixedSpatialMaterial::PARAM_DIFFUSE);
+ c.a=material["opacity"];
+ mat->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,c);
+ }
+
+
+ if (material.has("textures")) {
+
+ Array textures = material["textures"];
+ for(int j=0;j<textures.size();j++) {
+
+ Dictionary texture=textures[j];
+ Ref<Texture> tex;
+ if (texture.has("filename")) {
+
+
+ String filename=texture["filename"];
+ String path=state.base_path+"/"+filename.replace("\\","/");
+ if (state.texture_cache.has(path)) {
+ tex=state.texture_cache[path];
+ } else {
+ tex = ResourceLoader::load(path,"ImageTexture");
+ if (tex.is_null()) {
+ if (state.missing_deps)
+ state.missing_deps->push_back(path);
+ }
+ state.texture_cache[path]=tex; //add anyway
+ }
+ }
+
+ if (tex.is_valid() && texture.has("type")) {
+
+ String type=texture["type"];
+ if (type=="DIFFUSE")
+ mat->set_texture(FixedSpatialMaterial::PARAM_DIFFUSE,tex);
+ else if (type=="SPECULAR")
+ mat->set_texture(FixedSpatialMaterial::PARAM_SPECULAR,tex);
+ else if (type=="SHININESS")
+ mat->set_texture(FixedSpatialMaterial::PARAM_SPECULAR_EXP,tex);
+ else if (type=="NORMAL")
+ mat->set_texture(FixedSpatialMaterial::PARAM_NORMAL,tex);
+ else if (type=="EMISSIVE")
+ mat->set_texture(FixedSpatialMaterial::PARAM_EMISSION,tex);
+ }
+
+ }
+ }
+
+ state.material_cache[id]=mat;
+
+ }
+
+}
+
+void EditorSceneImporterFBXConv::_parse_surfaces(State& state) {
+
+ for(int i=0;i<state.meshes.size();i++) {
+
+ Dictionary mesh = state.meshes[i];
+
+ ERR_CONTINUE(!mesh.has("attributes"));
+ ERR_CONTINUE(!mesh.has("vertices"));
+ ERR_CONTINUE(!mesh.has("parts"));
+
+ print_line("MESH #"+itos(i));
+
+ Array attrlist=mesh["attributes"];
+ Array vertices=mesh["vertices"];
+ bool exists[Mesh::ARRAY_MAX];
+ int ofs[Mesh::ARRAY_MAX];
+ int weight_max=0;
+ int binormal_ofs=-1;
+ int weight_ofs[4];
+
+ for(int j=0;j<Mesh::ARRAY_MAX;j++) {
+ exists[j]=false;
+ ofs[j]=0;
+ }
+ exists[Mesh::ARRAY_INDEX]=true;
+ float stride=0;
+
+ for(int j=0;j<attrlist.size();j++) {
+
+ String attr=attrlist[j];
+ if (attr=="POSITION") {
+ exists[Mesh::ARRAY_VERTEX]=true;
+ ofs[Mesh::ARRAY_VERTEX]=stride;
+ stride+=3;
+ } else if (attr=="NORMAL") {
+ exists[Mesh::ARRAY_NORMAL]=true;
+ ofs[Mesh::ARRAY_NORMAL]=stride;
+ stride+=3;
+ } else if (attr=="COLOR") {
+ exists[Mesh::ARRAY_COLOR]=true;
+ ofs[Mesh::ARRAY_COLOR]=stride;
+ stride+=4;
+ } else if (attr=="COLORPACKED") {
+ stride+=1; //ignore
+ } else if (attr=="TANGENT") {
+ exists[Mesh::ARRAY_TANGENT]=true;
+ ofs[Mesh::ARRAY_TANGENT]=stride;
+ stride+=3;
+ } else if (attr=="BINORMAL") {
+ binormal_ofs=stride;
+ stride+=3;
+ } else if (attr=="TEXCOORD0") {
+ exists[Mesh::ARRAY_TEX_UV]=true;
+ ofs[Mesh::ARRAY_TEX_UV]=stride;
+ stride+=2;
+ } else if (attr=="TEXCOORD1") {
+ exists[Mesh::ARRAY_TEX_UV2]=true;
+ ofs[Mesh::ARRAY_TEX_UV2]=stride;
+ stride+=2;
+ } else if (attr.begins_with("TEXCOORD")) {
+ stride+=2;
+ } else if (attr.begins_with("BLENDWEIGHT")) {
+ int idx=attr.replace("BLENDWEIGHT","").to_int();
+ if (idx==0) {
+ exists[Mesh::ARRAY_BONES]=true;
+ ofs[Mesh::ARRAY_BONES]=stride;
+ exists[Mesh::ARRAY_WEIGHTS]=true;
+ ofs[Mesh::ARRAY_WEIGHTS]=stride+1;
+ } if (idx<4) {
+ weight_ofs[idx]=stride;
+ weight_max=MAX(weight_max,idx+1);
+ }
+
+ stride+=2;
+ }
+
+ print_line("ATTR "+attr+" OFS: "+itos(stride));
+
+ }
+
+ Array parts=mesh["parts"];
+
+ for(int j=0;j<parts.size();j++) {
+
+
+
+ Dictionary part=parts[j];
+ ERR_CONTINUE(!part.has("indices"));
+ ERR_CONTINUE(!part.has("id"));
+
+ print_line("PART: "+String(part["id"]));
+ Array indices=part["indices"];
+ Map<int,int> iarray;
+ Map<int,int> array;
+
+ for(int k=0;k<indices.size();k++) {
+
+ int idx = indices[k];
+ if (!iarray.has(idx)) {
+ int map_to=array.size();
+ iarray[idx]=map_to;
+ array[map_to]=idx;
+ }
+ }
+
+ print_line("indices total "+itos(indices.size())+" vertices used: "+itos(array.size()));
+
+ Array arrays;
+ arrays.resize(Mesh::ARRAY_MAX);
+
+
+
+ for(int k=0;k<Mesh::ARRAY_MAX;k++) {
+
+
+ if (!exists[k])
+ continue;
+ print_line("exists: "+itos(k));
+ int lofs = ofs[k];
+ switch(k) {
+
+ case Mesh::ARRAY_VERTEX:
+ case Mesh::ARRAY_NORMAL: {
+
+ PoolVector<Vector3> vtx;
+ vtx.resize(array.size());
+ {
+ int len=array.size();
+ PoolVector<Vector3>::Write w = vtx.write();
+ for(int l=0;l<len;l++) {
+
+ int pos = array[l];
+ w[l].x=vertices[pos*stride+lofs+0];
+ w[l].y=vertices[pos*stride+lofs+1];
+ w[l].z=vertices[pos*stride+lofs+2];
+ }
+ }
+ arrays[k]=vtx;
+
+ } break;
+ case Mesh::ARRAY_TANGENT: {
+
+ if (binormal_ofs<0)
+ break;
+
+ PoolVector<float> tangents;
+ tangents.resize(array.size()*4);
+ {
+ int len=array.size();
+
+ PoolVector<float>::Write w = tangents.write();
+ for(int l=0;l<len;l++) {
+
+ int pos = array[l];
+ Vector3 n;
+ n.x=vertices[pos*stride+ofs[Mesh::ARRAY_NORMAL]+0];
+ n.y=vertices[pos*stride+ofs[Mesh::ARRAY_NORMAL]+1];
+ n.z=vertices[pos*stride+ofs[Mesh::ARRAY_NORMAL]+2];
+ Vector3 t;
+ t.x=vertices[pos*stride+lofs+0];
+ t.y=vertices[pos*stride+lofs+1];
+ t.z=vertices[pos*stride+lofs+2];
+ Vector3 bi;
+ bi.x=vertices[pos*stride+binormal_ofs+0];
+ bi.y=vertices[pos*stride+binormal_ofs+1];
+ bi.z=vertices[pos*stride+binormal_ofs+2];
+ float d = bi.dot(n.cross(t));
+
+ w[l*4+0]=t.x;
+ w[l*4+1]=t.y;
+ w[l*4+2]=t.z;
+ w[l*4+3]=d;
+
+ }
+ }
+ arrays[k]=tangents;
+
+ } break;
+ case Mesh::ARRAY_COLOR: {
+
+ PoolVector<Color> cols;
+ cols.resize(array.size());
+ {
+ int len=array.size();
+ PoolVector<Color>::Write w = cols.write();
+ for(int l=0;l<len;l++) {
+
+ int pos = array[l];
+ w[l].r=vertices[pos*stride+lofs+0];
+ w[l].g=vertices[pos*stride+lofs+1];
+ w[l].b=vertices[pos*stride+lofs+2];
+ w[l].a=vertices[pos*stride+lofs+3];
+ }
+ }
+ arrays[k]=cols;
+
+ } break;
+ case Mesh::ARRAY_TEX_UV:
+ case Mesh::ARRAY_TEX_UV2: {
+
+ PoolVector<Vector2> uvs;
+ uvs.resize(array.size());
+ {
+ int len=array.size();
+ PoolVector<Vector2>::Write w = uvs.write();
+ for(int l=0;l<len;l++) {
+
+ int pos = array[l];
+ w[l].x=vertices[pos*stride+lofs+0];
+ w[l].y=vertices[pos*stride+lofs+1];
+ w[l].y=1.0-w[l].y;
+ }
+ }
+ arrays[k]=uvs;
+
+ } break;
+ case Mesh::ARRAY_BONES:
+ case Mesh::ARRAY_WEIGHTS: {
+
+ PoolVector<float> arr;
+ arr.resize(array.size()*4);
+ int po=k==Mesh::ARRAY_WEIGHTS?1:0;
+ lofs=ofs[Mesh::ARRAY_BONES];
+ {
+ int len=array.size();
+
+ PoolVector<float>::Write w = arr.write();
+ for(int l=0;l<len;l++) {
+
+ int pos = array[l];
+
+ for(int m=0;m<4;m++) {
+
+ float val=0;
+ if (m<=weight_max)
+ val=vertices[pos*stride+lofs+m*2+po];
+ w[l*4+m]=val;
+ }
+ }
+ }
+
+ arrays[k]=arr;
+ } break;
+ case Mesh::ARRAY_INDEX: {
+
+ PoolVector<int> arr;
+ arr.resize(indices.size());
+ {
+ int len=indices.size();
+
+ PoolVector<int>::Write w = arr.write();
+ for(int l=0;l<len;l++) {
+
+ w[l]=iarray[ indices[l] ];
+ }
+ }
+
+ arrays[k]=arr;
+
+ } break;
+
+
+ }
+
+
+ }
+
+ Mesh::PrimitiveType pt=Mesh::PRIMITIVE_TRIANGLES;
+
+ if (part.has("type")) {
+ String type=part["type"];
+ if (type=="LINES")
+ pt=Mesh::PRIMITIVE_LINES;
+ else if (type=="POINTS")
+ pt=Mesh::PRIMITIVE_POINTS;
+ else if (type=="TRIANGLE_STRIP")
+ pt=Mesh::PRIMITIVE_TRIANGLE_STRIP;
+ else if (type=="LINE_STRIP")
+ pt=Mesh::PRIMITIVE_LINE_STRIP;
+ }
+
+ if (pt==Mesh::PRIMITIVE_TRIANGLES) {
+ PoolVector<int> ia=arrays[Mesh::ARRAY_INDEX];
+ int len=ia.size();
+ {
+ PoolVector<int>::Write w=ia.write();
+ for(int l=0;l<len;l+=3) {
+ SWAP(w[l+1],w[l+2]);
+ }
+ }
+ arrays[Mesh::ARRAY_INDEX]=ia;
+
+
+ }
+ SurfaceInfo si;
+ si.array=arrays;
+ si.primitive=pt;
+ state.surface_cache[_id(part["id"])]=si;
+
+ }
+ }
+}
+
+
+Error EditorSceneImporterFBXConv::_parse_animations(State& state) {
+
+ AnimationPlayer *ap = memnew( AnimationPlayer );
+
+ state.scene->add_child(ap);
+ ap->set_owner(state.scene);
+
+ for(int i=0;i<state.animations.size();i++) {
+
+ Dictionary anim = state.animations[i];
+ ERR_CONTINUE(!anim.has("id"));
+ Ref<Animation> an = memnew( Animation );
+ an->set_name(_id(anim["id"]));
+
+
+ if (anim.has("bones")) {
+
+ Array bone_tracks = anim["bones"];
+ for(int j=0;j<bone_tracks.size();j++) {
+ Dictionary bone_track=bone_tracks[j];
+ String bone = bone_track["boneId"];
+ if (!bone_track.has("keyframes"))
+ continue;
+ if (!state.bones.has(bone))
+ continue;
+
+ Skeleton *sk = state.bones[bone].skeleton;
+
+ if (!sk)
+ continue;
+ int bone_idx=sk->find_bone(bone);
+ if (bone_idx==-1)
+ continue;
+
+
+
+ String path = state.scene->get_path_to(sk);
+ path+=":"+bone;
+ an->add_track(Animation::TYPE_TRANSFORM);
+ int tidx = an->get_track_count()-1;
+ an->track_set_path(tidx,path);
+
+
+ Dictionary parent_xform_dict;
+ Dictionary xform_dict;
+
+ if (state.bones.has(bone)) {
+ xform_dict=state.bones[bone].node;
+ }
+
+
+ Array parent_keyframes;
+ if (sk->get_bone_parent(bone_idx)!=-1) {
+ String parent_name = sk->get_bone_name(sk->get_bone_parent(bone_idx));
+ if (state.bones.has(parent_name)) {
+ parent_xform_dict=state.bones[parent_name].node;
+ }
+
+ print_line("parent for "+bone+"? "+parent_name+" XFD: "+String(Variant(parent_xform_dict)));
+ for(int k=0;k<bone_tracks.size();k++) {
+ Dictionary d = bone_tracks[k];
+ if (d["boneId"]==parent_name) {
+ parent_keyframes=d["keyframes"];
+ print_line("found keyframes");
+ break;
+ }
+ }
+
+
+ }
+
+ print_line("BONE XFD "+String(Variant(xform_dict)));
+
+ Array keyframes=bone_track["keyframes"];
+
+ for(int k=0;k<keyframes.size();k++) {
+
+ Dictionary key=keyframes[k];
+ Transform xform=_get_transform_mixed(key,xform_dict);
+ float time = key["keytime"];
+ time=time/1000.0;
+#if 0
+ if (parent_keyframes.size()) {
+ //localize
+ print_line(itos(k)+" localizate for: "+bone);
+
+ float prev_kt=-1;
+ float kt;
+ int idx=0;
+
+ for(int l=0;l<parent_keyframes.size();l++) {
+
+ Dictionary d=parent_keyframes[l];
+ kt=d["keytime"];
+ kt=kt/1000.0;
+ if (kt>time)
+ break;
+ prev_kt=kt;
+ idx++;
+
+ }
+
+ Transform t;
+ if (idx==0) {
+ t=_get_transform_mixed(parent_keyframes[0],parent_xform_dict);
+ } else if (idx==parent_keyframes.size()){
+ t=_get_transform_mixed(parent_keyframes[idx-1],parent_xform_dict);
+ } else {
+ t=_get_transform_mixed(parent_keyframes[idx-1],parent_xform_dict);
+ float d = (time-prev_kt)/(kt-prev_kt);
+ if (d>0) {
+ Transform t2=_get_transform_mixed(parent_keyframes[idx],parent_xform_dict);
+ t=t.interpolate_with(t2,d);
+ } else {
+ print_line("exact: "+rtos(kt));
+ }
+ }
+
+ xform = t.affine_inverse() * xform; //localize
+ } else if (!parent_xform_dict.empty()) {
+ Transform t = _get_transform(parent_xform_dict);
+ xform = t.affine_inverse() * xform; //localize
+ }
+#endif
+
+ xform = sk->get_bone_rest(bone_idx).affine_inverse() * xform;
+
+
+ Quat q = xform.basis;
+ q.normalize();
+ Vector3 s = xform.basis.get_scale();
+ Vector3 l = xform.origin;
+
+
+
+ an->transform_track_insert_key(tidx,time,l,q,s);
+
+ }
+
+ }
+
+
+ }
+
+
+ ap->add_animation(_id(anim["id"]),an);
+
+ }
+
+ return OK;
+}
+
+Error EditorSceneImporterFBXConv::_parse_json(State& state, const String &p_path) {
+
+ //not the happiest....
+ Vector<uint8_t> data = FileAccess::get_file_as_array(p_path);
+ ERR_FAIL_COND_V(!data.size(),ERR_FILE_CANT_OPEN);
+ String str;
+ bool utferr = str.parse_utf8((const char*)data.ptr(),data.size());
+ ERR_FAIL_COND_V(utferr,ERR_PARSE_ERROR);
+
+ Dictionary dict;
+ Error err = dict.parse_json(str);
+ str=String(); //free mem immediately
+ ERR_FAIL_COND_V(err,err);
+
+ if (dict.has("meshes"))
+ state.meshes=dict["meshes"];
+ if (dict.has("materials"))
+ state.materials=dict["materials"];
+ if (dict.has("nodes"))
+ state.nodes=dict["nodes"];
+ if (dict.has("animations"))
+ state.animations=dict["animations"];
+
+
+ state.scene = memnew( Spatial );
+ _detect_bones(state);
+ _parse_surfaces(state);
+ _parse_materials(state);
+ err = _parse_nodes(state,state.nodes,state.scene);
+ if (err)
+ return err;
+
+ if (state.import_animations) {
+ err = _parse_animations(state);
+ if (err)
+ return err;
+ }
+
+ print_line("JSON PARSED O-K!");
+
+ return OK;
+}
+
+Error EditorSceneImporterFBXConv::_parse_fbx(State& state,const String& p_path) {
+
+ state.base_path=p_path.get_base_dir();
+
+ if (p_path.to_lower().ends_with("g3dj")) {
+ return _parse_json(state,p_path.basename()+".g3dj");
+ }
+
+ String tool = EDITOR_DEF("fbxconv/path","");
+ ERR_FAIL_COND_V( !FileAccess::exists(tool),ERR_UNCONFIGURED);
+ String wine = EDITOR_DEF("fbxconv/use_wine","");
+
+ List<String> args;
+ String path=p_path;
+ if (wine!="") {
+ List<String> wpargs;
+ wpargs.push_back("-w");
+ wpargs.push_back(p_path);
+ String pipe; //winepath to convert to windows path
+ int wpres;
+ Error wperr = OS::get_singleton()->execute(wine+"path",wpargs,true,NULL,&pipe,&wpres);
+ ERR_FAIL_COND_V(wperr!=OK,ERR_CANT_CREATE);
+ ERR_FAIL_COND_V(wpres!=0,ERR_CANT_CREATE);
+ path=pipe.strip_edges();
+ args.push_back(tool);
+ tool=wine;
+ }
+
+ args.push_back("-o");
+ args.push_back("G3DJ");
+ args.push_back(path);
+
+ int res;
+ Error err = OS::get_singleton()->execute(tool,args,true,NULL,NULL,&res);
+ ERR_FAIL_COND_V(err!=OK,ERR_CANT_CREATE);
+ ERR_FAIL_COND_V(res!=0,ERR_CANT_CREATE);
+
+ return _parse_json(state,p_path.basename()+".g3dj");
+
+
+}
+
+Node* EditorSceneImporterFBXConv::import_scene(const String& p_path,uint32_t p_flags,List<String> *r_missing_deps,Error* r_err){
+
+ State state;
+ state.scene=NULL;
+ state.missing_deps=r_missing_deps;
+ state.import_animations=p_flags&IMPORT_ANIMATION;
+ Error err = _parse_fbx(state,p_path);
+ if (err!=OK) {
+ if (r_err)
+ *r_err=err;
+ return NULL;
+ }
+
+
+ return state.scene;
+}
+Ref<Animation> EditorSceneImporterFBXConv::import_animation(const String& p_path,uint32_t p_flags){
+
+
+ return Ref<Animation>();
+}
+
+
+EditorSceneImporterFBXConv::EditorSceneImporterFBXConv() {
+
+ EDITOR_DEF("fbxconv/path","");
+#ifndef WINDOWS_ENABLED
+ EDITOR_DEF("fbxconv/use_wine","");
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"fbxconv/use_wine",PROPERTY_HINT_GLOBAL_FILE));
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"fbxconv/path",PROPERTY_HINT_GLOBAL_FILE));
+#else
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"fbxconv/path",PROPERTY_HINT_GLOBAL_FILE,"exe"));
+#endif
+
+}
+#endif
diff --git a/editor/io_plugins/editor_scene_importer_fbxconv.h b/editor/io_plugins/editor_scene_importer_fbxconv.h
new file mode 100644
index 0000000000..da7058ad88
--- /dev/null
+++ b/editor/io_plugins/editor_scene_importer_fbxconv.h
@@ -0,0 +1,111 @@
+/*************************************************************************/
+/* editor_scene_importer_fbxconv.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_SCENE_IMPORTER_FBXCONV_H
+#define EDITOR_SCENE_IMPORTER_FBXCONV_H
+
+#include "editor/io_plugins/editor_scene_import_plugin.h"
+#include "scene/3d/skeleton.h"
+
+#if 0
+
+class EditorSceneImporterFBXConv : public EditorSceneImporter {
+
+ GDCLASS(EditorSceneImporterFBXConv,EditorSceneImporter );
+
+
+ struct BoneInfo {
+
+ Skeleton *skeleton;
+ Transform rest;
+ int index;
+ bool has_anim_chan;
+ bool has_rest;
+ Dictionary node;
+ BoneInfo() {
+ has_rest=false;
+ skeleton=NULL;
+ index=-1;
+ has_anim_chan=false;
+ }
+ };
+
+ struct SurfaceInfo {
+ Array array;
+ Mesh::PrimitiveType primitive;
+ };
+
+ struct State {
+
+ Node *scene;
+ Array meshes;
+ Array materials;
+ Array nodes;
+ Array animations;
+ Map<String,BoneInfo > bones;
+ Map<String,Skeleton*> skeletons;
+ Map<String,Ref<Mesh> > mesh_cache;
+ Map<String,SurfaceInfo> surface_cache;
+ Map<String,Ref<Material> > material_cache;
+ Map<String,Ref<Texture> > texture_cache;
+ List<String> *missing_deps;
+ String base_path;
+ bool import_animations;
+ };
+
+ String _id(const String& p_id) const;
+
+ Transform _get_transform_mixed(const Dictionary& d, const Dictionary& dbase);
+ Transform _get_transform(const Dictionary& d);
+ Color _get_color(const Array& a);
+ void _detect_bones_in_nodes(State& state,const Array& p_nodes);
+ void _detect_bones(State& state);
+
+ Error _parse_bones(State& state,const Array &p_bones,Skeleton* p_skeleton);
+ void _parse_skeletons(const String& p_name,State& state, const Array &p_nodes, Skeleton*p_skeleton=NULL, int p_parent=-1);
+
+ void _add_surface(State& state,Ref<Mesh>& m,const Dictionary &part);
+ Error _parse_nodes(State& state,const Array &p_nodes,Node* p_base);
+ Error _parse_animations(State& state);
+ void _parse_materials(State& state);
+ void _parse_surfaces(State& state);
+ Error _parse_json(State& state,const String& p_path);
+ Error _parse_fbx(State &state, const String &p_path);
+
+public:
+
+ virtual uint32_t get_import_flags() const;
+ virtual void get_extensions(List<String> *r_extensions) const;
+ virtual Node* import_scene(const String& p_path,uint32_t p_flags,List<String> *r_missing_deps=NULL,Error* r_err=NULL);
+ virtual Ref<Animation> import_animation(const String& p_path,uint32_t p_flags);
+
+ EditorSceneImporterFBXConv();
+};
+
+#endif // EDITOR_SCENE_IMPORTER_FBXCONV_H
+#endif
diff --git a/editor/io_plugins/editor_texture_import_plugin.cpp b/editor/io_plugins/editor_texture_import_plugin.cpp
new file mode 100644
index 0000000000..8bafe80673
--- /dev/null
+++ b/editor/io_plugins/editor_texture_import_plugin.cpp
@@ -0,0 +1,1893 @@
+/*************************************************************************/
+/* editor_texture_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_texture_import_plugin.h"
+#if 0
+#include "io/image_loader.h"
+#include "editor/editor_node.h"
+#include "io/resource_saver.h"
+#include "editor_atlas.h"
+#include "editor/editor_settings.h"
+#include "io/md5.h"
+#include "io/marshalls.h"
+#include "global_config.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/button_group.h"
+#include "scene/gui/margin_container.h"
+#include "scene/io/resource_format_image.h"
+
+static const char *flag_names[]={
+ ("Streaming Format"),
+ ("Fix Border Alpha"),
+ ("Alpha Bit Hint"),
+ ("Compress Extra (PVRTC2)"),
+ ("No MipMaps"),
+ ("Repeat"),
+ ("Filter (Magnifying)"),
+ ("Premultiply Alpha"),
+ ("Convert SRGB->Linear"),
+ ("Convert NormalMap to XY"),
+ ("Use Anisotropy"),
+ NULL
+};
+
+#if 0 // not used
+static const char *flag_short_names[]={
+ "Stream",
+ "FixBorder",
+ "AlphBit",
+ "ExtComp",
+ "NoMipMap",
+ "Repeat",
+ "Filter",
+ "PMAlpha",
+ "ToLinear",
+ "ToRG",
+ "Anisoropic",
+ NULL
+};
+#endif
+
+
+void EditorImportTextureOptions::set_format(EditorTextureImportPlugin::ImageFormat p_format) {
+
+ updating=true;
+ format->select(p_format);
+ if (p_format==EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
+ quality_vb->show();
+ } else {
+ quality_vb->hide();
+ }
+
+ updating=false;
+
+}
+
+EditorTextureImportPlugin::ImageFormat EditorImportTextureOptions::get_format() const{
+
+ return (EditorTextureImportPlugin::ImageFormat)format->get_selected();
+
+}
+
+void EditorImportTextureOptions::set_flags(uint32_t p_flags){
+
+ updating=true;
+ for(int i=0;i<items.size();i++) {
+
+ items[i]->set_checked(0,p_flags&(1<<i));
+ }
+ updating=false;
+
+}
+
+void EditorImportTextureOptions::set_quality(float p_quality) {
+
+ quality->set_value(p_quality);
+}
+
+float EditorImportTextureOptions::get_quality() const {
+
+ return quality->get_value();
+}
+
+
+uint32_t EditorImportTextureOptions::get_flags() const{
+
+ uint32_t f=0;
+ for(int i=0;i<items.size();i++) {
+
+ if (items[i]->is_checked(0))
+ f|=(1<<i);
+ }
+
+ return f;
+}
+
+void EditorImportTextureOptions::_changedp(int p_value) {
+
+ _changed();
+}
+
+void EditorImportTextureOptions::_changed() {
+
+ if (updating)
+ return;
+ if (format->get_selected()==EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
+ quality_vb->show();
+ } else {
+ quality_vb->hide();
+ }
+
+ emit_signal("changed");
+}
+
+
+void EditorImportTextureOptions::_bind_methods() {
+
+ ClassDB::bind_method("_changed",&EditorImportTextureOptions::_changed);
+ ClassDB::bind_method("_changedp",&EditorImportTextureOptions::_changedp);
+
+ ADD_SIGNAL(MethodInfo("changed"));
+}
+
+
+void EditorImportTextureOptions::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ flags->connect("item_edited",this,"_changed");
+ format->connect("item_selected",this,"_changedp");
+ }
+}
+
+void EditorImportTextureOptions::show_2d_notice() {
+
+ //notice_for_2d->show();
+}
+
+EditorImportTextureOptions::EditorImportTextureOptions() {
+
+
+ add_constant_override("separation",3);
+ updating=false;
+ format = memnew( OptionButton );
+
+ format->add_item(TTR("Uncompressed"),EditorTextureImportPlugin::IMAGE_FORMAT_UNCOMPRESSED);
+ format->add_item(TTR("Compress Lossless (PNG)"),EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS);
+ format->add_item(TTR("Compress Lossy (WebP)"),EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY);
+ format->add_item(TTR("Compress (VRAM)"),EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM);
+
+
+ add_margin_child(TTR("Texture Format"),format);
+
+ quality_vb = memnew( VBoxContainer );
+
+ HBoxContainer *quality_hb = memnew(HBoxContainer);
+ HSlider *hs = memnew( HSlider );
+ hs->set_h_size_flags(SIZE_EXPAND_FILL);
+ hs->set_stretch_ratio(0.8);
+ quality_hb->add_child(hs);
+ quality_hb->set_h_size_flags(SIZE_EXPAND_FILL);
+ SpinBox *sb = memnew( SpinBox );
+ sb->set_h_size_flags(SIZE_EXPAND_FILL);
+ sb->set_stretch_ratio(0.2);
+ quality_hb->add_child(sb);
+ sb->share(hs);
+ hs->set_min(0);
+ hs->set_max(1.0);
+ hs->set_step(0.01);
+ hs->set_value(0.7);
+ quality=hs;
+ quality_vb->add_margin_child(TTR("Texture Compression Quality (WebP):"),quality_hb);
+
+ add_child(quality_vb);
+
+ flags = memnew( Tree );
+ flags->set_hide_root(true);
+ TreeItem *root = flags->create_item();
+
+
+
+ const char ** fname=flag_names;
+
+ while( *fname ) {
+
+ TreeItem*ti = flags->create_item(root);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ ti->set_text(0,*fname);
+ ti->set_editable(0,true);
+ items.push_back(ti);
+ fname++;
+ }
+
+ add_margin_child(TTR("Texture Options"),flags,true);
+
+
+}
+
+///////////////////////////////////////////////////////////
+
+
+
+
+class EditorTextureImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorTextureImportDialog,ConfirmationDialog);
+
+
+
+ HBoxContainer *mode_hb;
+ CheckBox *mode_check[EditorTextureImportPlugin::MODE_MAX];
+
+ EditorImportTextureOptions *texture_options;
+
+ EditorTextureImportPlugin::Mode mode;
+ //EditorNode *editor;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ EditorFileDialog *file_select;
+ EditorFileDialog *save_file_select;
+ EditorDirDialog *save_select;
+ OptionButton *texture_action;
+ ConfirmationDialog *error_dialog;
+ CheckButton *crop_source;
+ SpinBox *size;
+
+ MarginContainer *size_mc;
+ Label* size_label;
+
+ Label* source_label;
+ Label *notice_for_2d;
+
+ EditorTextureImportPlugin *plugin;
+
+ void _mode_changed(int p_mode);
+ void _choose_files(const Vector<String>& p_path);
+ void _choose_file(const String& p_path);
+ void _choose_save_dir(const String& p_path);
+ void _browse();
+ void _browse_target();
+ void _import();
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+
+ void setup_multiple_import_3d(const Vector<String>& p_path,const String& p_dest) {
+
+ _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_3D);
+ _choose_files(p_path);
+ _choose_save_dir(p_dest);
+ }
+
+ void add_sources_and_dest(const Vector<String>& p_path,const String& p_dest) {
+
+ _choose_files(p_path);
+ _choose_save_dir(p_dest);
+ }
+
+ Error import(const String& p_from, const String& p_to, const String& p_preset);
+ void popup_import(const String &p_from=String());
+ EditorTextureImportDialog(EditorTextureImportPlugin *p_plugin=NULL);
+};
+
+
+/////////////////////////////////////////////////////////
+
+
+
+
+void EditorTextureImportDialog::_choose_files(const Vector<String>& p_path) {
+
+ String files;
+ for(int i=0;i<p_path.size();i++) {
+
+ if (i>0)
+ files+=",";
+ files+=p_path[i];
+ }
+ /*
+ if (p_path.size()) {
+ String srctex=p_path[0];
+ String ipath = EditorImportDB::get_singleton()->find_source_path(srctex);
+
+ if (ipath!="")
+ save_path->set_text(ipath.get_base_dir());
+ }*/
+ import_path->set_text(files);
+
+}
+
+
+
+void EditorTextureImportDialog::_choose_file(const String& p_path) {
+
+
+ import_path->set_text(p_path);
+
+}
+void EditorTextureImportDialog::_choose_save_dir(const String& p_path) {
+
+ save_path->set_text(p_path);
+}
+
+
+void EditorTextureImportDialog::_import() {
+
+
+ //ImportMonitorBlock imb;
+
+ Vector<String> files=import_path->get_text().split(",");
+
+ if (!files.size()) {
+
+ error_dialog->set_text(TTR("Please specify some files!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+ }
+
+ String dst_path=save_path->get_text();
+
+ if (save_path->get_text().strip_edges()=="") {
+ error_dialog->set_text(TTR("Target path is empty."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (!save_path->get_text().begins_with("res://")) {
+ error_dialog->set_text(TTR("Target path must be a complete resource path."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+
+ if (mode!=EditorTextureImportPlugin::MODE_ATLAS && mode!=EditorTextureImportPlugin::MODE_LARGE && !DirAccess::exists(save_path->get_text())) {
+ error_dialog->set_text(TTR("Target path must exist."));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (mode==EditorTextureImportPlugin::MODE_ATLAS) { //atlas
+
+ if (files.size()==0) {
+
+ error_dialog->set_text(TTR("At least one file needed for Atlas."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+ String dst_file = dst_path;
+ //dst_file=dst_file.basename()+".tex";
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ //imd->set_editor();
+ for(int i=0;i<files.size();i++) {
+ imd->add_source(EditorImportPlugin::validate_source_path(files[i]));
+ }
+ imd->set_option("format",texture_options->get_format());
+ imd->set_option("flags",texture_options->get_flags());
+ imd->set_option("quality",texture_options->get_quality());
+ imd->set_option("atlas",true);
+ imd->set_option("atlas_size",int(size->get_value()));
+ imd->set_option("large",false);
+ imd->set_option("crop",crop_source->is_pressed());
+ imd->set_option("mode",mode);
+
+ Error err = plugin->import(dst_file,imd);
+ if (err) {
+
+ error_dialog->set_text(TTR("Error importing:")+" "+dst_file.get_file());
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+ } else if (mode==EditorTextureImportPlugin::MODE_LARGE) { //large
+
+ if (files.size()!=1) {
+
+ error_dialog->set_text(TTR("Only one file is required for large texture."));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+ String dst_file = dst_path;
+ //dst_file=dst_file.basename()+".tex";
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ //imd->set_editor();
+ for(int i=0;i<files.size();i++) {
+ imd->add_source(EditorImportPlugin::validate_source_path(files[i]));
+ }
+ imd->set_option("format",texture_options->get_format());
+ imd->set_option("flags",texture_options->get_flags());
+ imd->set_option("quality",texture_options->get_quality());
+ imd->set_option("atlas",false);
+ imd->set_option("large",true);
+ imd->set_option("large_cell_size",int(size->get_value()));
+ imd->set_option("crop",crop_source->is_pressed());
+ imd->set_option("mode",mode);
+
+ Error err = plugin->import(dst_file,imd);
+ if (err) {
+
+ error_dialog->set_text(TTR("Error importing:")+" "+dst_file.get_file());
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+ } else {
+
+
+ for(int i=0;i<files.size();i++) {
+
+ String dst_file = dst_path.plus_file(files[i].get_file());
+ dst_file=dst_file.get_basename()+".tex";
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ //imd->set_editor();
+ imd->add_source(EditorImportPlugin::validate_source_path(files[i]));
+ imd->set_option("format",texture_options->get_format());
+ imd->set_option("flags",texture_options->get_flags());
+ imd->set_option("quality",texture_options->get_quality());
+ imd->set_option("atlas",false);
+ imd->set_option("large",false);
+ imd->set_option("mode",mode);
+
+ Error err = plugin->import(dst_file,imd);
+ if (err) {
+
+ error_dialog->set_text(TTR("Error importing:")+" "+dst_file.get_file());
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+ }
+ }
+
+ hide();
+}
+
+void EditorTextureImportDialog::_browse() {
+
+ file_select->popup_centered_ratio();
+}
+
+void EditorTextureImportDialog::_browse_target() {
+
+ if (mode==EditorTextureImportPlugin::MODE_ATLAS || mode==EditorTextureImportPlugin::MODE_LARGE) {
+ save_file_select->popup_centered_ratio();
+ } else {
+ save_select->popup_centered_ratio();
+ }
+
+}
+
+
+void EditorTextureImportDialog::popup_import(const String& p_from) {
+
+ popup_centered(Size2(600,500)*EDSCALE);
+ if (p_from!="") {
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_from);
+ ERR_FAIL_COND(!rimd.is_valid());
+
+ if (rimd->has_option("mode")) {
+ //new imported stuff uses this option
+ _mode_changed(rimd->get_option("mode"));
+ } else {
+ //this one is for compatibility, will have to guess it
+ if (rimd->has_option("atlas") && rimd->get_option("atlas")) {
+ _mode_changed(EditorTextureImportPlugin::MODE_ATLAS);
+ } else if (rimd->has_option("large") && rimd->get_option("large")) {
+ _mode_changed(EditorTextureImportPlugin::MODE_LARGE);
+ } else {
+ //guess by usage of mipmaps..?
+ _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_2D);
+ }
+
+ }
+
+ if (mode==EditorTextureImportPlugin::MODE_ATLAS || mode==EditorTextureImportPlugin::MODE_LARGE)
+ save_path->set_text(p_from);
+ else
+ save_path->set_text(p_from.get_base_dir());
+
+ texture_options->set_format(EditorTextureImportPlugin::ImageFormat(int(rimd->get_option("format"))));
+ texture_options->set_flags(rimd->get_option("flags"));
+ texture_options->set_quality(rimd->get_option("quality"));
+ String src = "";
+ for(int i=0;i<rimd->get_source_count();i++) {
+ if (i>0)
+ src+=",";
+ src+=EditorImportPlugin::expand_source_path(rimd->get_source_path(i));
+ }
+ import_path->set_text(src);
+ }
+}
+
+
+void EditorTextureImportDialog::_notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+
+ List<String> extensions;
+ ImageLoader::get_recognized_extensions(&extensions);
+ //ResourceLoader::get_recognized_extensions_for_type("PackedTexture",&extensions);
+ file_select->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file_select->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+ }
+}
+
+Error EditorTextureImportDialog::import(const String& p_from, const String& p_to, const String& p_preset) {
+
+
+ import_path->set_text(p_from);
+ save_path->set_text(p_to);
+ _import();
+
+ return OK;
+}
+
+void EditorTextureImportDialog::_mode_changed(int p_mode) {
+
+ mode = EditorTextureImportPlugin::Mode(p_mode);
+
+ for(int i=0;i<EditorTextureImportPlugin::MODE_MAX;i++) {
+ mode_check[i]->set_pressed(i==mode);
+ }
+
+ if (p_mode==EditorTextureImportPlugin::MODE_ATLAS) {
+
+ size_label->set_text(TTR("Max Texture Size:"));
+ size->set_value(2048);
+ crop_source->show();
+ size_label->show();
+ size->show();
+
+ texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER);
+ texture_options->set_quality(0.7);
+ texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY);
+ set_title(TTR("Import Textures for Atlas (2D)"));
+
+ } else {
+ crop_source->hide();
+ }
+
+
+ if (p_mode==EditorTextureImportPlugin::MODE_LARGE) {
+
+ size_label->set_text(TTR("Cell Size:"));
+ size->set_value(256);
+ size_label->show();
+ size->show();
+
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ save_file_select->add_filter("*.ltex;"+TTR("Large Texture"));
+
+ texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER);
+ texture_options->set_quality(0.7);
+ texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS);
+ set_title(TTR("Import Large Textures (2D)"));
+ source_label->set_text(TTR("Source Texture"));
+
+ } else {
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ save_file_select->add_filter("*.tex;"+TTR("Base Atlas Texture"));
+ source_label->set_text(TTR("Source Texture(s)"));
+ }
+
+ if (p_mode==EditorTextureImportPlugin::MODE_TEXTURE_2D) {
+
+ size_label->hide();
+ size->hide();
+
+ texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER);
+ texture_options->set_quality(0.7);
+ texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY);
+ notice_for_2d->show();
+ set_title(TTR("Import Textures for 2D"));
+
+ } else {
+ notice_for_2d->hide();
+ }
+
+ if (p_mode==EditorTextureImportPlugin::MODE_TEXTURE_3D) {
+
+ size_label->hide();
+ size->hide();
+ //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_);
+ //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS);
+ texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER|EditorTextureImportPlugin::IMAGE_FLAG_REPEAT);
+ texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM);
+ set_title(TTR("Import Textures for 3D"));
+ }
+}
+
+void EditorTextureImportDialog::_bind_methods() {
+
+
+ ClassDB::bind_method("_choose_files",&EditorTextureImportDialog::_choose_files);
+ ClassDB::bind_method("_choose_file",&EditorTextureImportDialog::_choose_file);
+ ClassDB::bind_method("_choose_save_dir",&EditorTextureImportDialog::_choose_save_dir);
+ ClassDB::bind_method("_import",&EditorTextureImportDialog::_import);
+ ClassDB::bind_method("_browse",&EditorTextureImportDialog::_browse);
+ ClassDB::bind_method("_browse_target",&EditorTextureImportDialog::_browse_target);
+ ClassDB::bind_method("_mode_changed",&EditorTextureImportDialog::_mode_changed);
+ //ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) );
+}
+
+EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* p_plugin) {
+
+
+
+
+
+ plugin=p_plugin;
+ set_title(TTR("Import Textures"));
+
+ mode_hb = memnew( HBoxContainer );
+ add_child(mode_hb);
+ //set_child_rect(mode_hb);
+
+ VBoxContainer *vbcg = memnew( VBoxContainer);
+
+
+ mode_hb->add_child(vbcg);
+ mode_hb->add_constant_override("separation",15);
+ VBoxContainer *bg = memnew( VBoxContainer );
+ vbcg->add_margin_child("Import Mode",bg);
+
+ for(int i=0;i<EditorTextureImportPlugin::MODE_MAX;i++) {
+ String mode_name[EditorTextureImportPlugin::MODE_MAX]={
+ TTR("2D Texture"),
+ TTR("3D Texture"),
+ TTR("Atlas Texture"),
+ TTR("Large Texture")
+ };
+
+
+ mode_check[i]=memnew(CheckBox);
+ bg->add_child(mode_check[i]);
+ mode_check[i]->set_text(mode_name[i]);
+ mode_check[i]->connect("pressed",this,"_mode_changed",varray(i));
+ }
+
+ VBoxContainer *vbc = memnew(VBoxContainer);
+ mode_hb->add_child(vbc);
+ vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_constant_override("separation",4);
+
+ notice_for_2d = memnew( Label );
+ notice_for_2d->set_text(TTR("NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to the project."));
+ //notice_for_2d->set_custom_minimum_size(Size2(0,50));
+ notice_for_2d->set_autowrap(true);
+ notice_for_2d->hide();
+ vbcg->add_child(notice_for_2d);
+ notice_for_2d->set_v_size_flags(SIZE_EXPAND_FILL);
+ notice_for_2d->set_valign(Label::VALIGN_BOTTOM);
+
+ VBoxContainer *source_vb=memnew(VBoxContainer);
+ MarginContainer *source_mc = vbc->add_margin_child(TTR("Source Texture(s):"),source_vb);
+
+ source_label = vbc->get_child(source_mc->get_index()-1)->cast_to<Label>();
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ source_vb->add_child(hbc);
+
+ import_path = memnew( LineEdit );
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+ crop_source = memnew( CheckButton );
+ crop_source->set_pressed(true);
+ source_vb->add_child(crop_source);
+ crop_source->set_text(TTR("Crop empty space."));
+
+
+ Button * import_choose = memnew( Button );
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this,"_browse");
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_margin_child(TTR("Target Path:"),hbc);
+
+ size = memnew( SpinBox );
+ size->set_min(128);
+ size->set_max(16384);
+
+
+ size->set_value(256);
+ size_mc=vbc->add_margin_child(TTR("Cell Size:"),size);
+ size_label=vbc->get_child(size_mc->get_index()-1)->cast_to<Label>();
+
+
+ save_path = memnew( LineEdit );
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew( Button );
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this,"_browse_target");
+
+ file_select = memnew(EditorFileDialog);
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ add_child(file_select);
+
+ file_select->connect("files_selected", this,"_choose_files");
+ file_select->connect("file_selected", this,"_choose_file");
+
+ save_file_select = memnew(EditorFileDialog);
+ save_file_select->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ add_child(save_file_select);
+ save_file_select->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ save_file_select->clear_filters();
+
+ save_file_select->connect("file_selected", this,"_choose_save_dir");
+
+ save_select = memnew( EditorDirDialog );
+ add_child(save_select);
+
+ //save_select->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ save_select->connect("dir_selected", this,"_choose_save_dir");
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+ //move stuff up
+ /*
+ for(int i=0;i<4;i++)
+ vbc->move_child( vbc->get_child( vbc->get_child_count() -1), 0);
+ */
+
+ error_dialog = memnew ( ConfirmationDialog );
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ //error_dialog->get_cancel()->hide();
+
+ set_hide_on_ok(false);
+
+ texture_options = memnew( EditorImportTextureOptions );
+ vbc->add_child(texture_options);
+ texture_options->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_3D);
+
+
+ //GLOBAL_DEF("import/shared_textures","res://");
+ //Globals::get_singleton()->set_custom_property_info("import/shared_textures",PropertyInfo(Variant::STRING,"import/shared_textures",PROPERTY_HINT_DIR));
+
+
+}
+
+
+
+///////////////////////////////////////////////////////////
+
+
+String EditorTextureImportPlugin::get_name() const {
+
+ return "texture";
+#if 0 //old names, kept for compatibility reference
+ switch(mode) {
+ case MODE_TEXTURE_2D: {
+
+ return "texture_2d";
+ } break;
+ case MODE_TEXTURE_3D: {
+
+ return "texture_3d";
+
+ } break;
+ case MODE_ATLAS: {
+
+ return "texture_atlas";
+ } break;
+ case MODE_LARGE: {
+
+ return "texture_large";
+ } break;
+
+ }
+
+
+ return "";
+#endif
+}
+
+String EditorTextureImportPlugin::get_visible_name() const {
+
+ return TTR("Texture");
+
+}
+void EditorTextureImportPlugin::import_dialog(const String& p_from) {
+
+ dialog->popup_import(p_from);
+}
+
+void EditorTextureImportPlugin::compress_image(EditorExportPlatform::ImageCompression p_mode,Image& image,bool p_smaller) {
+
+
+ switch(p_mode) {
+ case EditorExportPlatform::IMAGE_COMPRESSION_NONE: {
+
+ //do absolutely nothing
+
+ } break;
+ case EditorExportPlatform::IMAGE_COMPRESSION_BC: {
+
+
+ // for maximum compatibility, BC shall always use mipmaps and be PO2
+ image.resize_to_po2();
+ if (!image.has_mipmaps())
+ image.generate_mipmaps();
+
+ image.compress(Image::COMPRESS_S3TC);
+ /*
+ if (has_alpha) {
+
+ if (flags&IMAGE_FLAG_ALPHA_BIT) {
+ image.convert(Image::FORMAT_DXT5);
+ } else {
+ image.convert(Image::FORMAT_DXT3);
+ }
+ } else {
+
+ image.convert(Image::FORMAT_DXT1);
+ }*/
+
+
+ } break;
+ case EditorExportPlatform::IMAGE_COMPRESSION_PVRTC:
+ case EditorExportPlatform::IMAGE_COMPRESSION_PVRTC_SQUARE: {
+
+ // for maximum compatibility (hi apple!), PVRT shall always
+ // use mipmaps, be PO2 and square
+
+ if (!image.has_mipmaps())
+ image.generate_mipmaps();
+ image.resize_to_po2(true);
+
+ if (p_smaller) {
+
+ image.compress(Image::COMPRESS_PVRTC2);
+ //image.convert(has_alpha ? Image::FORMAT_PVRTC2A : Image::FORMAT_PVRTC2);
+ } else {
+ image.compress(Image::COMPRESS_PVRTC4);
+ //image.convert(has_alpha ? Image::FORMAT_PVRTC4A : Image::FORMAT_PVRTC4);
+ }
+
+ } break;
+ case EditorExportPlatform::IMAGE_COMPRESSION_ETC1: {
+
+ image.resize_to_po2(); //square or not?
+ if (!image.has_mipmaps())
+ image.generate_mipmaps();
+ if (!image.detect_alpha()) {
+ //ETC1 is only opaque
+ image.compress(Image::COMPRESS_ETC);
+ }
+
+ } break;
+ case EditorExportPlatform::IMAGE_COMPRESSION_ETC2: {
+
+
+ } break;
+ }
+
+
+}
+
+Error EditorTextureImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from) {
+
+
+ return import2(p_path,p_from,EditorExportPlatform::IMAGE_COMPRESSION_BC,false);
+}
+
+
+Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &texture,int format, float quality,int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink) {
+
+
+ if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS || format==IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
+
+ Image image=texture->get_data();
+ ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);
+
+ bool has_alpha=image.detect_alpha();
+ if (!has_alpha && image.get_format()==Image::FORMAT_RGBA8) {
+
+ image.convert(Image::FORMAT_RGB8);
+
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {
+
+ image.fix_alpha_edges();
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_PREMULT_ALPHA) {
+
+ image.premultiply_alpha();
+ }
+
+ if (flags&IMAGE_FLAG_CONVERT_NORMAL_TO_XY) {
+ image.normalmap_to_xy();
+ }
+
+ /*
+ if ((image.get_format()==Image::FORMAT_RGB8 || image.get_format()==Image::FORMAT_RGBA8) && flags&IMAGE_FLAG_CONVERT_TO_LINEAR) {
+
+ image.srgb_to_linear();
+ }
+ */
+
+ if (shrink>1) {
+
+ int orig_w=image.get_width();
+ int orig_h=image.get_height();
+ image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
+ texture->create_from_image(image,tex_flags);
+ texture->set_size_override(Size2(orig_w,orig_h));
+
+
+ } else {
+
+ texture->create_from_image(image,tex_flags);
+ }
+
+
+ if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS) {
+ texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSLESS);
+ } else {
+ texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
+ }
+
+
+
+ texture->set_lossy_storage_quality(quality);
+
+
+ } else {
+
+
+ Image image=texture->get_data();
+ ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);
+
+
+ bool has_alpha=image.detect_alpha();
+ if (!has_alpha && image.get_format()==Image::FORMAT_RGBA8) {
+
+ image.convert(Image::FORMAT_RGB8);
+
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {
+
+ image.fix_alpha_edges();
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_PREMULT_ALPHA) {
+
+ image.premultiply_alpha();
+ }
+
+ if (flags&IMAGE_FLAG_CONVERT_NORMAL_TO_XY) {
+ image.normalmap_to_xy();
+ }
+
+ /*
+ if ((image.get_format()==Image::FORMAT_RGB8 || image.get_format()==Image::FORMAT_RGBA8) && flags&IMAGE_FLAG_CONVERT_TO_LINEAR) {
+
+ print_line("CONVERT BECAUSE: "+itos(flags));
+ image.srgb_to_linear();
+ }
+ */
+
+ int orig_w=image.get_width();
+ int orig_h=image.get_height();
+
+ if (shrink>1) {
+ image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
+ texture->create_from_image(image,tex_flags);
+ texture->set_size_override(Size2(orig_w,orig_h));
+ }
+
+ if (!(flags&IMAGE_FLAG_NO_MIPMAPS)) {
+ image.generate_mipmaps();
+
+ }
+
+ if (format!=IMAGE_FORMAT_UNCOMPRESSED) {
+
+ compress_image(p_compr,image,flags&IMAGE_FLAG_COMPRESS_EXTRA);
+ }
+
+
+ texture->create_from_image(image,tex_flags);
+
+
+ if (shrink>1 || (format!=IMAGE_FORMAT_UNCOMPRESSED && (image.get_width()!=orig_w || image.get_height()!=orig_h))) {
+ texture->set_size_override(Size2(orig_w,orig_h));
+ }
+
+ //uint32_t save_flags=ResourceSaver::FLAG_COMPRESS;
+ }
+
+ return OK;
+}
+
+
+Error EditorTextureImportPlugin::import2(const String& p_path, const Ref<ResourceImportMetadata>& p_from,EditorExportPlatform::ImageCompression p_compr, bool p_external){
+
+
+
+ ERR_FAIL_COND_V(p_from->get_source_count()==0,ERR_INVALID_PARAMETER);
+
+ Ref<ResourceImportMetadata> from=p_from;
+
+ Ref<ImageTexture> texture;
+ Vector<Ref<AtlasTexture> > atlases;
+ bool atlas = from->get_option("atlas");
+ bool large = from->get_option("large");
+
+ int flags=from->get_option("flags");
+ int format=from->get_option("format");
+ float quality=from->get_option("quality");
+
+ uint32_t tex_flags=0;
+
+ if (flags&EditorTextureImportPlugin::IMAGE_FLAG_REPEAT)
+ tex_flags|=Texture::FLAG_REPEAT;
+ if (flags&EditorTextureImportPlugin::IMAGE_FLAG_FILTER)
+ tex_flags|=Texture::FLAG_FILTER;
+ if (!(flags&EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS))
+ tex_flags|=Texture::FLAG_MIPMAPS;
+ if (flags&EditorTextureImportPlugin::IMAGE_FLAG_CONVERT_TO_LINEAR)
+ tex_flags|=Texture::FLAG_CONVERT_TO_LINEAR;
+ if (flags&EditorTextureImportPlugin::IMAGE_FLAG_USE_ANISOTROPY)
+ tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
+
+ print_line("path: "+p_path+" flags: "+itos(tex_flags));
+ float shrink=1;
+ if (from->has_option("shrink"))
+ shrink=from->get_option("shrink");
+
+ if (large) {
+ ERR_FAIL_COND_V(from->get_source_count()!=1,ERR_INVALID_PARAMETER);
+
+ String src_path = EditorImportPlugin::expand_source_path(from->get_source_path(0));
+
+
+ int cell_size=from->get_option("large_cell_size");
+ ERR_FAIL_COND_V(cell_size<128 || cell_size>16384,ERR_CANT_OPEN);
+
+ EditorProgress pg("ltex",TTR("Import Large Texture"),3);
+
+ pg.step(TTR("Load Source Image"),0);
+ Image img;
+ Error err = ImageLoader::load_image(src_path,&img);
+ if (err) {
+ return err;
+ }
+
+ pg.step(TTR("Slicing"),1);
+
+ Map<Vector2,Image> pieces;
+ for(int i=0;i<img.get_width();i+=cell_size) {
+ int w = MIN(img.get_width()-i,cell_size);
+ for(int j=0;j<img.get_height();j+=cell_size) {
+ int h = MIN(img.get_height()-j,cell_size);
+
+ Image piece(w,h,0,img.get_format());
+ piece.blit_rect(img,Rect2(i,j,w,h),Point2(0,0));
+ if (!piece.is_invisible()) {
+ pieces[Vector2(i,j)]=piece;
+ //print_line("ADDING PIECE AT "+Vector2(i,j));
+ }
+ }
+ }
+
+ Ref<LargeTexture> existing;
+ if (ResourceCache::has(p_path)) {
+ existing = ResourceCache::get(p_path);
+ }
+
+ if (existing.is_valid()) {
+ existing->clear();
+ } else {
+ existing = Ref<LargeTexture>(memnew( LargeTexture ));
+ }
+
+ existing->set_size(Size2(img.get_width(),img.get_height()));
+ pg.step(TTR("Inserting"),2);
+
+ for (Map<Vector2,Image>::Element *E=pieces.front();E;E=E->next()) {
+
+ Ref<ImageTexture> imgtex = Ref<ImageTexture>( memnew( ImageTexture ) );
+ imgtex->create_from_image(E->get(),tex_flags);
+ _process_texture_data(imgtex,format,quality,flags,p_compr,tex_flags,shrink);
+ existing->add_piece(E->key(),imgtex);
+ }
+
+ if (!p_external) {
+ from->set_editor(get_name());
+ from->set_source_md5(0,FileAccess::get_md5(src_path));
+ existing->set_path(p_path);
+ existing->set_import_metadata(from);
+ }
+ pg.step(TTR("Saving"),3);
+
+ err = ResourceSaver::save(p_path,existing);
+ if (err!=OK) {
+ EditorNode::add_io_error(TTR("Couldn't save large texture:")+" "+p_path);
+ return err;
+ }
+
+ return OK;
+
+
+ } else if (atlas) {
+
+ //prepare atlas!
+ Vector< Image > sources;
+ Vector< Image > tsources;
+ bool alpha=false;
+ bool crop = from->get_option("crop");
+
+ EditorProgress ep("make_atlas",TTR("Build Atlas For:")+" "+p_path.get_file(),from->get_source_count()+3);
+
+ print_line("sources: "+itos(from->get_source_count()));
+
+ for(int i=0;i<from->get_source_count();i++) {
+
+ String path = EditorImportPlugin::expand_source_path(from->get_source_path(i));
+ String md5 = FileAccess::get_md5(path);
+ from->set_source_md5(i,FileAccess::get_md5(path));
+ ep.step(TTR("Loading Image:")+" "+path,i);
+ print_line("source path: "+path+" md5 "+md5);
+ Image src;
+ Error err = ImageLoader::load_image(path,&src);
+ if (err) {
+ EditorNode::add_io_error(TTR("Couldn't load image:")+" "+path);
+ return err;
+ }
+
+ if (src.detect_alpha())
+ alpha=true;
+
+ tsources.push_back(src);
+ }
+ ep.step(TTR("Converting Images"),sources.size());
+
+
+ Map<uint64_t,int> source_md5;
+ Map<int,List<int> > source_map;
+
+ for(int i=0;i<tsources.size();i++) {
+
+ Image src = tsources[i];
+
+ if (alpha) {
+ src.convert(Image::FORMAT_RGBA8);
+ } else {
+ src.convert(Image::FORMAT_RGB8);
+ }
+
+ PoolVector<uint8_t> data = src.get_data();
+ MD5_CTX md5;
+ PoolVector<uint8_t>::Read r=data.read();
+ MD5Init(&md5);
+ int len=data.size();
+ for(int j=0;j<len;j++) {
+ uint8_t b = r[j];
+ b>>=2; //to aid in comparing
+ MD5Update(&md5,(unsigned char*)&b,1);
+ }
+ MD5Final(&md5);
+ uint64_t *cmp = (uint64_t*)md5.digest; //less bits, but still useful for this
+
+ tsources[i]=Image(); //clear
+
+ if (source_md5.has(*cmp)) {
+ int sidx=source_md5[*cmp];
+ source_map[sidx].push_back(i);
+ print_line("REUSING "+from->get_source_path(i));
+
+ } else {
+ int sidx=sources.size();
+ source_md5[*cmp]=sidx;
+ sources.push_back(src);
+ List<int> sm;
+ sm.push_back(i);
+ source_map[sidx]=sm;
+
+ }
+
+
+ }
+
+ //texturepacker is not really good for optimizing, so..
+ //will at some point likely replace with my own
+ //first, will find the nearest to a square packing
+ int border=1;
+
+ Vector<Size2i> src_sizes;
+ Vector<Rect2> crops;
+
+ ep.step(TTR("Cropping Images"),sources.size()+1);
+
+ for(int j=0;j<sources.size();j++) {
+
+ Size2i s;
+ if (crop) {
+ Rect2 crop = sources[j].get_used_rect();
+ print_line("CROP: "+crop);
+ s=crop.size;
+ crops.push_back(crop);
+ } else {
+
+ s=Size2i(sources[j].get_width(),sources[j].get_height());
+ }
+ s+=Size2i(border*2,border*2);
+ src_sizes.push_back(s); //add a line to constraint width
+ }
+
+ Vector<Point2i> dst_positions;
+ Size2i dst_size;
+ EditorAtlas::fit(src_sizes,dst_positions,dst_size);
+
+ print_line("size that worked: "+itos(dst_size.width)+","+itos(dst_size.height));
+
+ ep.step(TTR("Blitting Images"),sources.size()+2);
+
+ bool blit_to_po2=tex_flags&Texture::FLAG_MIPMAPS;
+ int atlas_w=dst_size.width;
+ int atlas_h=dst_size.height;
+ if (blit_to_po2) {
+ atlas_w=nearest_power_of_2(dst_size.width);
+ atlas_h=nearest_power_of_2(dst_size.height);
+ }
+ Image atlas;
+ atlas.create(atlas_w,atlas_h,0,alpha?Image::FORMAT_RGBA8:Image::FORMAT_RGB8);
+
+
+ atlases.resize(from->get_source_count());
+
+ for(int i=0;i<sources.size();i++) {
+
+ int x=dst_positions[i].x;
+ int y=dst_positions[i].y;
+
+ Size2 sz = Size2(sources[i].get_width(),sources[i].get_height());
+
+ Rect2 region;
+ Rect2 margin;
+
+ if (crop && sz!=crops[i].size) {
+ Rect2 rect = crops[i];
+ rect.size=sz-rect.size;
+ region=Rect2(x+border,y+border,crops[i].size.width,crops[i].size.height);
+ margin=rect;
+ atlas.blit_rect(sources[i],crops[i],Point2(x+border,y+border));
+ } else {
+ region=Rect2(x+border,y+border,sz.x,sz.y);
+ atlas.blit_rect(sources[i],Rect2(0,0,sources[i].get_width(),sources[i].get_height()),Point2(x+border,y+border));
+ }
+
+ ERR_CONTINUE( !source_map.has(i) );
+ for (List<int>::Element *E=source_map[i].front();E;E=E->next()) {
+
+ String apath;
+ String spath = from->get_source_path(E->get()).get_file();
+
+ if (p_external) {
+ apath = p_path.get_base_dir().plus_file(spath.get_basename()+"."+from->get_source_path(E->get()).md5_text()+".atex");
+ } else {
+ apath = p_path.get_base_dir().plus_file(spath.get_basename()+".atex");
+ }
+
+ Ref<AtlasTexture> at;
+
+ if (ResourceCache::has(apath)) {
+
+ at = Ref<AtlasTexture>( ResourceCache::get(apath)->cast_to<AtlasTexture>() );
+ } else {
+
+ at = Ref<AtlasTexture>( memnew( AtlasTexture ) );
+
+ }
+ at->set_region(region);
+ at->set_margin(margin);
+ at->set_path(apath);
+ atlases[E->get()]=at;
+
+ }
+ }
+ if (ResourceCache::has(p_path)) {
+ texture = Ref<ImageTexture> ( ResourceCache::get(p_path)->cast_to<ImageTexture>() );
+ } else {
+ texture = Ref<ImageTexture>( memnew( ImageTexture ) );
+ }
+ texture->create_from_image(atlas,tex_flags);
+
+ } else {
+ ERR_FAIL_COND_V(from->get_source_count()!=1,ERR_INVALID_PARAMETER);
+
+ String src_path = EditorImportPlugin::expand_source_path(from->get_source_path(0));
+
+ if (ResourceCache::has(p_path)) {
+ Resource *r = ResourceCache::get(p_path);
+
+ texture = Ref<ImageTexture> ( r->cast_to<ImageTexture>() );
+
+ Image img;
+ Error err = img.load(src_path);
+ ERR_FAIL_COND_V(err!=OK,ERR_CANT_OPEN);
+ texture->create_from_image(img);
+ } else {
+ texture=ResourceLoader::load(src_path,"ImageTexture");
+ }
+
+ ERR_FAIL_COND_V(texture.is_null(),ERR_CANT_OPEN);
+ if (!p_external)
+ from->set_source_md5(0,FileAccess::get_md5(src_path));
+
+ }
+
+
+
+ if (!p_external) {
+ from->set_editor(get_name());
+ texture->set_path(p_path);
+ texture->set_import_metadata(from);
+ }
+
+ if (atlas) {
+
+ if (p_external) {
+ //used by exporter
+ Array rects;
+ for(int i=0;i<atlases.size();i++) {
+ rects.push_back(atlases[i]->get_region());
+ rects.push_back(atlases[i]->get_margin());
+ }
+ from->set_option("rects",rects);
+
+ } else {
+ //used by importer
+ for(int i=0;i<atlases.size();i++) {
+ String apath = atlases[i]->get_path();
+ atlases[i]->set_atlas(texture);
+ Error err = ResourceSaver::save(apath,atlases[i]);
+ if (err) {
+ EditorNode::add_io_error(TTR("Couldn't save atlas image:")+" "+apath);
+ return err;
+ }
+ //from->set_source_md5(i,FileAccess::get_md5(apath));
+ }
+ }
+ }
+
+ bool compress=false;
+#if 1
+
+ _process_texture_data(texture,format,quality,flags,p_compr,tex_flags,shrink);
+#else
+ if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS || format==IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
+
+ Image image=texture->get_data();
+ ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);
+
+ bool has_alpha=image.detect_alpha();
+ if (!has_alpha && image.get_format()==Image::FORMAT_RGBA8) {
+
+ image.convert(Image::FORMAT_RGB8);
+
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {
+
+ image.fix_alpha_edges();
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_PREMULT_ALPHA) {
+
+ image.premultiply_alpha();
+ }
+
+ if (flags&IMAGE_FLAG_CONVERT_NORMAL_TO_XY) {
+ image.normalmap_to_xy();
+ }
+
+ /*
+ if ((image.get_format()==Image::FORMAT_RGB8 || image.get_format()==Image::FORMAT_RGBA8) && flags&IMAGE_FLAG_CONVERT_TO_LINEAR) {
+
+ image.srgb_to_linear();
+ }
+ */
+
+ if (shrink>1) {
+
+ int orig_w=image.get_width();
+ int orig_h=image.get_height();
+ image.resize(orig_w/shrink,orig_h/shrink);
+ texture->create_from_image(image,tex_flags);
+ texture->set_size_override(Size2(orig_w,orig_h));
+
+
+ } else {
+
+ texture->create_from_image(image,tex_flags);
+ }
+
+
+ if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS) {
+ texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSLESS);
+ } else {
+ texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
+ }
+
+
+
+ texture->set_lossy_storage_quality(quality);
+
+
+ } else {
+
+
+ Image image=texture->get_data();
+ ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);
+
+
+ bool has_alpha=image.detect_alpha();
+ if (!has_alpha && image.get_format()==Image::FORMAT_RGBA8) {
+
+ image.convert(Image::FORMAT_RGB8);
+
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {
+
+ image.fix_alpha_edges();
+ }
+
+ if (image.get_format()==Image::FORMAT_RGBA8 && flags&IMAGE_FLAG_PREMULT_ALPHA) {
+
+ image.premultiply_alpha();
+ }
+
+ if (flags&IMAGE_FLAG_CONVERT_NORMAL_TO_XY) {
+ image.normalmap_to_xy();
+ }
+
+ /*
+ if ((image.get_format()==Image::FORMAT_RGB8 || image.get_format()==Image::FORMAT_RGBA8) && flags&IMAGE_FLAG_CONVERT_TO_LINEAR) {
+
+ print_line("CONVERT BECAUSE: "+itos(flags));
+ image.srgb_to_linear();
+ }
+ */
+
+ int orig_w=image.get_width();
+ int orig_h=image.get_height();
+
+ if (shrink>1) {
+ image.resize(orig_w/shrink,orig_h/shrink);
+ texture->create_from_image(image,tex_flags);
+ texture->set_size_override(Size2(orig_w,orig_h));
+ }
+
+ if (!(flags&IMAGE_FLAG_NO_MIPMAPS)) {
+ image.generate_mipmaps();
+
+ }
+
+ if (format!=IMAGE_FORMAT_UNCOMPRESSED) {
+
+ compress_image(p_compr,image,flags&IMAGE_FLAG_COMPRESS_EXTRA);
+ }
+
+
+ texture->create_from_image(image,tex_flags);
+
+
+ if (shrink>1 || (format!=IMAGE_FORMAT_UNCOMPRESSED && (image.get_width()!=orig_w || image.get_height()!=orig_h))) {
+ texture->set_size_override(Size2(orig_w,orig_h));
+ }
+
+ compress=true;
+
+
+ }
+#endif
+ uint32_t save_flags=0;
+ if (compress)
+ save_flags=ResourceSaver::FLAG_COMPRESS;
+
+ Error err = ResourceSaver::save(p_path,texture,save_flags);
+ if (err!=OK) {
+ EditorNode::add_io_error(TTR("Couldn't save converted texture:")+" "+p_path);
+ return err;
+ }
+
+ return OK;
+}
+
+Vector<uint8_t> EditorTextureImportPlugin::custom_export(const String& p_path, const Ref<EditorExportPlatform> &p_platform) {
+
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+
+ if (rimd.is_null()) {
+
+ StringName group = EditorImportExport::get_singleton()->image_get_export_group(p_path);
+
+ if (group!=StringName()) {
+ //handled by export group
+ rimd = Ref<ResourceImportMetadata>( memnew( ResourceImportMetadata ) );
+
+ int group_format=0;
+ float group_lossy_quality=EditorImportExport::get_singleton()->image_export_group_get_lossy_quality(group);
+ int group_shrink=EditorImportExport::get_singleton()->image_export_group_get_shrink(group);
+ group_shrink*=EditorImportExport::get_singleton()->get_export_image_shrink();
+
+ switch(EditorImportExport::get_singleton()->image_export_group_get_image_action(group)) {
+ case EditorImportExport::IMAGE_ACTION_NONE: {
+
+ switch(EditorImportExport::get_singleton()->get_export_image_action()) {
+ case EditorImportExport::IMAGE_ACTION_NONE: {
+
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS; //?
+
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_DISK: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY;
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_RAM: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM;
+ } break; //use default
+ }
+
+ group_lossy_quality=EditorImportExport::get_singleton()->get_export_image_quality();
+
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_DISK: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY;
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_RAM: {
+ group_format=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM;
+ } break; //use default
+ case EditorImportExport::IMAGE_ACTION_KEEP: {
+ return Vector<uint8_t>();
+ } break; //use default
+ }
+
+ String validated_path=EditorImportPlugin::validate_source_path(p_path);
+
+ int flags=texture_flags_to_export_flags(ResourceFormatLoaderImage::load_image_flags(validated_path));
+ flags|=IMAGE_FLAG_FIX_BORDER_ALPHA;
+
+ print_line("group format"+itos(group_format));
+ rimd->set_option("format",group_format);
+ rimd->set_option("flags",flags);
+ rimd->set_option("quality",group_lossy_quality);
+ rimd->set_option("atlas",false);
+ rimd->set_option("shrink",group_shrink);
+ rimd->add_source(validated_path,FileAccess::get_md5(p_path));
+
+ } else if (EditorImportExport::get_singleton()->get_image_formats().has(p_path.get_extension().to_lower()) && EditorImportExport::get_singleton()->get_export_image_action()!=EditorImportExport::IMAGE_ACTION_NONE) {
+ //handled by general image export settings
+
+ rimd = Ref<ResourceImportMetadata>( memnew( ResourceImportMetadata ) );
+
+ switch(EditorImportExport::get_singleton()->get_export_image_action()) {
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_DISK: rimd->set_option("format",IMAGE_FORMAT_COMPRESS_DISK_LOSSY); break;
+ case EditorImportExport::IMAGE_ACTION_COMPRESS_RAM: rimd->set_option("format",IMAGE_FORMAT_COMPRESS_RAM); break;
+ }
+
+ String validated_path=EditorImportPlugin::validate_source_path(p_path);
+
+ int flags=texture_flags_to_export_flags(ResourceFormatLoaderImage::load_image_flags(validated_path));
+ flags|=IMAGE_FLAG_FIX_BORDER_ALPHA;
+
+ rimd->set_option("shrink",EditorImportExport::get_singleton()->get_export_image_shrink());
+ rimd->set_option("flags",flags);
+ rimd->set_option("quality",EditorImportExport::get_singleton()->get_export_image_quality());
+ rimd->set_option("atlas",false);
+ rimd->add_source(validated_path,FileAccess::get_md5(p_path));
+
+ } else {
+ return Vector<uint8_t>();
+ }
+ }
+
+ int fmt = rimd->get_option("format");
+
+ if (fmt!=IMAGE_FORMAT_COMPRESS_RAM && fmt!=IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
+ print_line("no compress ram or lossy");
+ return Vector<uint8_t>(); //pointless to do anything, since no need to reconvert
+ }
+
+ uint32_t flags = rimd->get_option("flags");
+ uint8_t shrink = rimd->has_option("shrink") ? rimd->get_option("shrink"): Variant(1);
+ uint8_t format = rimd->get_option("format");
+ uint8_t comp = (format==EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM)?uint8_t(p_platform->get_image_compression()):uint8_t(255);
+
+ MD5_CTX ctx;
+ uint8_t f4[4];
+ encode_uint32(flags,&f4[0]);
+ MD5Init(&ctx);
+ String gp = GlobalConfig::get_singleton()->globalize_path(p_path);
+ CharString cs = gp.utf8();
+ MD5Update(&ctx,(unsigned char*)cs.get_data(),cs.length());
+ MD5Update(&ctx,f4,4);
+ MD5Update(&ctx,&format,1);
+ MD5Update(&ctx,&comp,1);
+ MD5Update(&ctx,&shrink,1);
+ MD5Final(&ctx);
+
+
+
+ uint64_t sd=0;
+ String smd5;
+
+ String md5 = String::md5(ctx.digest);
+ print_line(p_path+" MD5: "+md5+" FLAGS: "+itos(flags));
+
+ String tmp_path = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp/");
+
+ bool valid=false;
+ {
+ //if existing, make sure it's valid
+ FileAccessRef f = FileAccess::open(tmp_path+"imgexp-"+md5+".txt",FileAccess::READ);
+ if (f) {
+
+ uint64_t d = f->get_line().strip_edges().to_int64();
+ sd = FileAccess::get_modified_time(p_path);
+
+ if (d==sd) {
+ valid=true;
+ } else {
+ String cmd5 = f->get_line().strip_edges();
+ smd5 = FileAccess::get_md5(p_path);
+ if (cmd5==smd5) {
+ valid=true;
+ }
+ }
+
+
+ }
+ }
+
+ if (!valid) {
+ //cache failed, convert
+ Error err = import2(tmp_path+"imgexp-"+md5+".tex",rimd,p_platform->get_image_compression(),true);
+ ERR_FAIL_COND_V(err!=OK,Vector<uint8_t>());
+ FileAccessRef f = FileAccess::open(tmp_path+"imgexp-"+md5+".txt",FileAccess::WRITE);
+
+ if (sd==0)
+ sd = FileAccess::get_modified_time(p_path);
+ if (smd5==String())
+ smd5 = FileAccess::get_md5(p_path);
+
+ f->store_line(String::num(sd));
+ f->store_line(smd5);
+ f->store_line(gp); //source path for reference
+ }
+
+
+ Vector<uint8_t> ret;
+ FileAccessRef f = FileAccess::open(tmp_path+"imgexp-"+md5+".tex",FileAccess::READ);
+ ERR_FAIL_COND_V(!f,ret);
+
+ ret.resize(f->get_len());
+ f->get_buffer(ret.ptr(),ret.size());
+
+ return ret;
+}
+
+uint32_t EditorTextureImportPlugin::texture_flags_to_export_flags(uint32_t p_tex_flags) const {
+
+ uint32_t flags=0;
+
+ if (!(p_tex_flags&Texture::FLAG_MIPMAPS)) {
+ flags|=IMAGE_FLAG_NO_MIPMAPS;
+ }
+ if (p_tex_flags&Texture::FLAG_REPEAT) {
+ flags|=IMAGE_FLAG_REPEAT;
+ }
+ if (p_tex_flags&Texture::FLAG_FILTER) {
+ flags|=IMAGE_FLAG_FILTER;
+ }
+ if (p_tex_flags&Texture::FLAG_ANISOTROPIC_FILTER) {
+ flags|=IMAGE_FLAG_USE_ANISOTROPY;
+ }
+ if (p_tex_flags&Texture::FLAG_CONVERT_TO_LINEAR) {
+ flags|=IMAGE_FLAG_CONVERT_TO_LINEAR;
+ }
+ /* // no correspondence yet
+ if (p_tex_flags&Texture::TEXTURE_FLAG_MIRRORED_REPEAT) {
+ flags|=;
+ }*/
+
+ return flags;
+}
+
+void EditorTextureImportPlugin::import_from_drop(const Vector<String>& p_drop,const String& p_dest_path) {
+
+ Vector<String> valid;
+
+ List<String> valid_extensions;
+ ImageLoader::get_recognized_extensions(&valid_extensions);
+ for(int i=0;i<p_drop.size();i++) {
+
+ String extension=p_drop[i].get_extension().to_lower();
+
+ for (List<String>::Element *E=valid_extensions.front();E;E=E->next()) {
+
+ if (E->get()==extension) {
+ valid.push_back(p_drop[i]);
+ break;
+ }
+ }
+ }
+
+ if (valid.size()) {
+ dialog->popup_import();
+ dialog->setup_multiple_import_3d(valid,p_dest_path);
+ }
+}
+
+void EditorTextureImportPlugin::reimport_multiple_files(const Vector<String>& p_list) {
+
+ Vector<String> valid;
+
+
+ for(int i=0;i<p_list.size();i++) {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_list[i]);
+ String type = rimd->get_editor();
+ if (type=="texture" || type.begins_with("texture_")) {
+
+ if ((rimd->has_option("atlas") && rimd->get_option("atlas")) || (rimd->has_option("large") && rimd->get_option("large"))) {
+ continue;
+ }
+
+ valid.push_back(p_list[i]);
+ }
+ }
+
+ if (valid.size()) {
+
+ dialog->popup_import(valid[0]);
+
+ Vector<String> sources;
+ for(int i=0;i<valid.size();i++) {
+ int idx;
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(valid[i],&idx);
+ if (efsd) {
+ for(int j=0;j<efsd->get_source_count(idx);j++) {
+ String file = expand_source_path(efsd->get_source_file(idx,j));
+ if (sources.find(file)==-1) {
+ sources.push_back(file);
+ }
+
+ }
+ }
+ }
+
+ if (sources.size()) {
+
+ dialog->add_sources_and_dest(sources,valid[0].get_base_dir());
+ }
+ }
+}
+
+bool EditorTextureImportPlugin::can_reimport_multiple_files() const {
+
+ return true;
+
+}
+
+
+
+EditorTextureImportPlugin *EditorTextureImportPlugin::singleton=NULL;
+
+EditorTextureImportPlugin::EditorTextureImportPlugin(EditorNode *p_editor) {
+
+ singleton=this;
+ editor=p_editor;
+ dialog = memnew( EditorTextureImportDialog(this) );
+ editor->get_gui_base()->add_child(dialog);
+
+}
+
+////////////////////////////
+
+
+ Vector<uint8_t> EditorTextureExportPlugin::custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform) {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_path);
+
+ if (rimd.is_valid()) {
+
+ if (rimd->get_editor()!="") {
+ int compression = rimd->get_option("format");
+ if (compression!=EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM)
+ return Vector<uint8_t>(); //only useful for RAM compression to reconvert
+ Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name(rimd->get_editor());
+ if (pl.is_valid()) {
+ Vector<uint8_t> ce = pl->custom_export(p_path,p_platform);
+ if (ce.size())
+ return ce;
+ }
+ }
+ } else if (EditorImportExport::get_singleton()->image_get_export_group(p_path)) {
+
+
+ Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture");
+ if (pl.is_valid()) {
+ Vector<uint8_t> ce = pl->custom_export(p_path,p_platform);
+ if (ce.size()) {
+ p_path=p_path.get_basename()+".converted.tex";
+ return ce;
+ }
+ }
+
+ } else if (EditorImportExport::get_singleton()->get_export_image_action()!=EditorImportExport::IMAGE_ACTION_NONE){
+
+ String xt = p_path.get_extension().to_lower();
+ if (EditorImportExport::get_singleton()->get_image_formats().has(xt)) { //should check for more I guess?
+
+ Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture");
+ if (pl.is_valid()) {
+ Vector<uint8_t> ce = pl->custom_export(p_path,p_platform);
+ if (ce.size()) {
+ p_path=p_path.get_basename()+".converted.tex";
+ return ce;
+ }
+ }
+ }
+ }
+
+ return Vector<uint8_t>();
+}
+
+EditorTextureExportPlugin::EditorTextureExportPlugin() {
+
+
+}
+#endif
diff --git a/editor/io_plugins/editor_texture_import_plugin.h b/editor/io_plugins/editor_texture_import_plugin.h
new file mode 100644
index 0000000000..f63bc57ecd
--- /dev/null
+++ b/editor/io_plugins/editor_texture_import_plugin.h
@@ -0,0 +1,179 @@
+/*************************************************************************/
+/* editor_texture_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_TEXTURE_IMPORT_PLUGIN_H
+#define EDITOR_TEXTURE_IMPORT_PLUGIN_H
+
+
+
+
+
+
+#if 0
+#include "editor/editor_import_export.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/progress_bar.h"
+#include "scene/gui/slider.h"
+#include "scene/gui/spin_box.h"
+#include "editor/editor_file_system.h"
+#include "editor/editor_dir_dialog.h"
+
+
+
+class EditorNode;
+class EditorTextureImportDialog;
+
+class EditorTextureImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorTextureImportPlugin,EditorImportPlugin);
+public:
+
+
+ enum Mode {
+ MODE_TEXTURE_2D,
+ MODE_TEXTURE_3D,
+ MODE_ATLAS,
+ MODE_LARGE,
+ MODE_MAX
+ };
+
+
+
+private:
+
+ EditorNode *editor;
+ EditorTextureImportDialog *dialog;
+ static EditorTextureImportPlugin *singleton;
+ //used by other importers such as mesh
+
+ Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink);
+ void compress_image(EditorExportPlatform::ImageCompression p_mode,Image& image,bool p_smaller);
+
+ uint32_t texture_flags_to_export_flags(uint32_t p_tex_flags) const;
+public:
+
+
+ static EditorTextureImportPlugin *get_singleton() { return singleton; }
+
+ enum ImageFormat {
+
+ IMAGE_FORMAT_UNCOMPRESSED,
+ IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS,
+ IMAGE_FORMAT_COMPRESS_DISK_LOSSY,
+ IMAGE_FORMAT_COMPRESS_RAM,
+ };
+
+ enum ImageFlags {
+
+ IMAGE_FLAG_STREAM_FORMAT=1,
+ IMAGE_FLAG_FIX_BORDER_ALPHA=2,
+ IMAGE_FLAG_ALPHA_BIT=4, //hint for compressions that use a bit for alpha
+ IMAGE_FLAG_COMPRESS_EXTRA=8, // used for pvrtc2
+ IMAGE_FLAG_NO_MIPMAPS=16, //normal for 2D games
+ IMAGE_FLAG_REPEAT=32, //usually disabled in 2D
+ IMAGE_FLAG_FILTER=64, //almost always enabled
+ IMAGE_FLAG_PREMULT_ALPHA=128,//almost always enabled
+ IMAGE_FLAG_CONVERT_TO_LINEAR=256, //convert image to linear
+ IMAGE_FLAG_CONVERT_NORMAL_TO_XY=512, //convert image to linear
+ IMAGE_FLAG_USE_ANISOTROPY=1024, //convert image to linear
+ };
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ virtual Error import2(const String& p_path, const Ref<ResourceImportMetadata>& p_from,EditorExportPlatform::ImageCompression p_compr, bool p_external=false);
+ virtual Vector<uint8_t> custom_export(const String& p_path,const Ref<EditorExportPlatform> &p_platform);
+
+ virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path);
+ virtual void reimport_multiple_files(const Vector<String>& p_list);
+ virtual bool can_reimport_multiple_files() const;
+
+ EditorTextureImportPlugin(EditorNode* p_editor=NULL);
+};
+
+
+class EditorTextureExportPlugin : public EditorExportPlugin {
+
+ GDCLASS( EditorTextureExportPlugin, EditorExportPlugin);
+
+
+public:
+
+ virtual Vector<uint8_t> custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform);
+ EditorTextureExportPlugin();
+};
+
+class EditorImportTextureOptions : public VBoxContainer {
+
+ GDCLASS( EditorImportTextureOptions, VBoxContainer );
+
+
+ OptionButton *format;
+ VBoxContainer *quality_vb;
+ HSlider *quality;
+ Tree *flags;
+ Vector<TreeItem*> items;
+
+
+ bool updating;
+
+ void _changedp(int p_value);
+ void _changed();
+
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+
+
+
+ void set_format(EditorTextureImportPlugin::ImageFormat p_format);
+ EditorTextureImportPlugin::ImageFormat get_format() const;
+
+ void set_flags(uint32_t p_flags);
+ uint32_t get_flags() const;
+
+ void set_quality(float p_quality);
+ float get_quality() const;
+
+ void show_2d_notice();
+
+ EditorImportTextureOptions();
+
+
+};
+#endif // EDITOR_TEXTURE_IMPORT_PLUGIN_H
+#endif
diff --git a/editor/io_plugins/editor_translation_import_plugin.cpp b/editor/io_plugins/editor_translation_import_plugin.cpp
new file mode 100644
index 0000000000..0fd298d6d3
--- /dev/null
+++ b/editor/io_plugins/editor_translation_import_plugin.cpp
@@ -0,0 +1,479 @@
+/*************************************************************************/
+/* editor_translation_import_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_translation_import_plugin.h"
+
+#if 0
+#include "scene/gui/file_dialog.h"
+#include "editor/editor_dir_dialog.h"
+#include "editor/editor_node.h"
+#include "editor/property_editor.h"
+//#include "scene/resources/sample.h"
+#include "io/resource_saver.h"
+#include "os/file_access.h"
+#include "translation.h"
+#include "compressed_translation.h"
+#include "editor/project_settings.h"
+
+
+class EditorTranslationImportDialog : public ConfirmationDialog {
+
+ GDCLASS(EditorTranslationImportDialog,ConfirmationDialog);
+
+ EditorTranslationImportPlugin *plugin;
+
+ LineEdit *import_path;
+ LineEdit *save_path;
+ EditorFileDialog *file_select;
+ CheckButton *ignore_first;
+ CheckButton *compress;
+ CheckButton *add_to_project;
+ EditorDirDialog *save_select;
+ ConfirmationDialog *error_dialog;
+ Vector<TreeItem*> items;
+ Tree *columns;
+
+public:
+
+ void _choose_file(const String& p_path) {
+
+ import_path->set_text(p_path);
+ FileAccess *f = FileAccess::open(p_path,FileAccess::READ);
+ if (!f) {
+
+ error_dialog->set_text(TTR("Invalid source!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+
+ Vector<String> csvh = f->get_csv_line();
+ memdelete(f);
+
+ if (csvh.size()<2) {
+
+ error_dialog->set_text(TTR("Invalid translation source!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ return;
+
+ }
+
+ columns->clear();
+ columns->set_columns(2);
+ TreeItem *root = columns->create_item();
+ columns->set_hide_root(true);
+ columns->set_column_titles_visible(true);
+ columns->set_column_title(0,TTR("Column"));
+ columns->set_column_title(1,TTR("Language"));
+ Vector<String> langs = TranslationServer::get_all_locales();
+ Vector<String> names = TranslationServer::get_all_locale_names();
+ if (csvh[0]=="")
+ ignore_first->set_pressed(true);
+
+
+ items.clear();
+
+ for(int i=1;i<csvh.size();i++) {
+
+ TreeItem *ti = columns->create_item(root);
+
+ ti->set_editable(0,true);
+ ti->set_selectable(0,false);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ ti->set_checked(0,true);
+ ti->set_text(0,itos(i));
+ items.push_back(ti);
+
+ String lname = csvh[i].to_lower().strip_edges();
+ int idx=-1;
+ String hint;
+ for(int j=0;j<langs.size();j++) {
+
+ if (langs[j]==lname.substr(0,langs[j].length()).to_lower()) {
+ idx=j;
+ }
+ if (j>0) {
+ hint+=",";
+ }
+ hint+=names[j].replace(","," ");
+ }
+
+ ti->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ ti->set_text(1,hint);
+ ti->set_editable(1,true);
+
+
+ if (idx!=-1) {
+ ignore_first->set_pressed(true);
+ ti->set_range(1,idx);
+ } else {
+
+ //not found, maybe used stupid name
+ if (lname.begins_with("br")) //brazilian
+ ti->set_range(1,langs.find("pt"));
+ else if (lname.begins_with("ch")) //chinese
+ ti->set_range(1,langs.find("zh"));
+ else if (lname.begins_with("sp")) //spanish
+ ti->set_range(1,langs.find("es"));
+ else if (lname.begins_with("kr"))// kprean
+ ti->set_range(1,langs.find("ko"));
+ else if (i==0)
+ ti->set_range(1,langs.find("en"));
+ else
+ ti->set_range(1,langs.find("es"));
+ }
+
+ ti->set_metadata(1,names[ti->get_range(1)]);
+ }
+
+
+
+ }
+ void _choose_save_dir(const String& p_path) {
+
+ save_path->set_text(p_path);
+ }
+
+ void _browse() {
+
+ file_select->popup_centered_ratio();
+ }
+
+ void _browse_target() {
+
+ save_select->popup_centered_ratio();
+
+ }
+
+
+ void popup_import(const String& p_from) {
+
+ popup_centered(Size2(400,400)*EDSCALE);
+
+ if (p_from!="") {
+
+ Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_from);
+ ERR_FAIL_COND(!rimd.is_valid());
+ ERR_FAIL_COND(rimd->get_source_count()!=1);
+ _choose_file(EditorImportPlugin::expand_source_path(rimd->get_source_path(0)));
+ _choose_save_dir(p_from.get_base_dir());
+ String locale = rimd->get_option("locale");
+ bool skip_first=rimd->get_option("skip_first");
+ bool compressed = rimd->get_option("compress");
+
+ int idx=-1;
+
+ for(int i=0;i<items.size();i++) {
+
+ String il = TranslationServer::get_all_locales()[items[i]->get_range(1)];
+ if (il==locale) {
+ idx=i;
+ break;
+ }
+ }
+
+ if (idx!=-1) {
+ idx=rimd->get_option("index");
+ }
+
+ for(int i=0;i<items.size();i++) {
+
+ if (i==idx) {
+
+ Vector<String> locs = TranslationServer::get_all_locales();
+ for(int j=0;j<locs.size();j++) {
+ if (locs[j]==locale) {
+ items[i]->set_range(1,j);
+ }
+
+ }
+ items[i]->set_checked(0,true);
+ } else {
+ items[i]->set_checked(0,false);
+
+ }
+ }
+
+ ignore_first->set_pressed(skip_first);
+ compress->set_pressed(compressed);
+
+
+
+ }
+
+ }
+
+
+ void _import() {
+
+
+ if (items.size()==0) {
+ error_dialog->set_text(TTR("No items to import!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ }
+
+ if (!save_path->get_text().begins_with("res://")) {
+ error_dialog->set_text(TTR("No target path!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ }
+
+ EditorProgress progress("import_xl",TTR("Import Translations"),items.size());
+ for(int i=0;i<items.size();i++) {
+
+ progress.step(items[i]->get_metadata(1),i);
+ if (!items[i]->is_checked(0))
+ continue;
+
+ String locale = TranslationServer::get_all_locales()[items[i]->get_range(1)];
+ Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
+ imd->add_source(EditorImportPlugin::validate_source_path(import_path->get_text()));
+ imd->set_option("locale",locale);
+ imd->set_option("index",i);
+ imd->set_option("skip_first",ignore_first->is_pressed());
+ imd->set_option("compress",compress->is_pressed());
+
+ String savefile = save_path->get_text().plus_file(import_path->get_text().get_file().get_basename()+"."+locale+".xl");
+ Error err = plugin->import(savefile,imd);
+ if (err!=OK) {
+ error_dialog->set_text(TTR("Couldn't import!"));
+ error_dialog->popup_centered(Size2(200,100)*EDSCALE);
+ } else if (add_to_project->is_pressed()) {
+
+ ProjectSettings::get_singleton()->add_translation(savefile);
+ }
+ }
+ hide();
+
+ }
+
+
+ void _notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+
+ }
+ }
+
+ static void _bind_methods() {
+
+
+ ClassDB::bind_method("_choose_file",&EditorTranslationImportDialog::_choose_file);
+ ClassDB::bind_method("_choose_save_dir",&EditorTranslationImportDialog::_choose_save_dir);
+ ClassDB::bind_method("_import",&EditorTranslationImportDialog::_import);
+ ClassDB::bind_method("_browse",&EditorTranslationImportDialog::_browse);
+ ClassDB::bind_method("_browse_target",&EditorTranslationImportDialog::_browse_target);
+ //ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) );
+ }
+
+ EditorTranslationImportDialog(EditorTranslationImportPlugin *p_plugin) {
+
+ plugin=p_plugin;
+
+
+ set_title(TTR("Import Translation"));
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+
+
+ VBoxContainer *csvb = memnew( VBoxContainer );
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ csvb->add_child(hbc);
+ vbc->add_margin_child(TTR("Source CSV:"),csvb);
+
+ import_path = memnew( LineEdit );
+ import_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(import_path);
+ ignore_first = memnew( CheckButton );
+ ignore_first->set_text(TTR("Ignore First Row"));
+ csvb->add_child(ignore_first);
+
+ Button * import_choose = memnew( Button );
+ import_choose->set_text(" .. ");
+ hbc->add_child(import_choose);
+
+ import_choose->connect("pressed", this,"_browse");
+
+ VBoxContainer *tcomp = memnew( VBoxContainer);
+ hbc = memnew( HBoxContainer );
+ tcomp->add_child(hbc);
+ vbc->add_margin_child(TTR("Target Path:"),tcomp);
+
+ save_path = memnew( LineEdit );
+ save_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(save_path);
+
+ Button * save_choose = memnew( Button );
+ save_choose->set_text(" .. ");
+ hbc->add_child(save_choose);
+
+ save_choose->connect("pressed", this,"_browse_target");
+
+ compress = memnew( CheckButton);
+ compress->set_pressed(true);
+ compress->set_text(TTR("Compress"));
+ tcomp->add_child(compress);
+
+ add_to_project = memnew( CheckButton);
+ add_to_project->set_pressed(true);
+ add_to_project->set_text(TTR("Add to Project (godot.cfg)"));
+ tcomp->add_child(add_to_project);
+
+ file_select = memnew(EditorFileDialog);
+ file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ add_child(file_select);
+ file_select->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_select->connect("file_selected", this,"_choose_file");
+ file_select->add_filter("*.csv ; Translation CSV");
+ save_select = memnew( EditorDirDialog );
+ add_child(save_select);
+
+ //save_select->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ save_select->connect("dir_selected", this,"_choose_save_dir");
+
+ get_ok()->connect("pressed", this,"_import");
+ get_ok()->set_text(TTR("Import"));
+
+
+ error_dialog = memnew ( ConfirmationDialog );
+ add_child(error_dialog);
+ error_dialog->get_ok()->set_text(TTR("Accept"));
+ //error_dialog->get_cancel()->hide();
+
+ set_hide_on_ok(false);
+
+ columns = memnew( Tree );
+ vbc->add_margin_child(TTR("Import Languages:"),columns,true);
+ }
+
+ ~EditorTranslationImportDialog() {
+
+ }
+
+};
+
+
+String EditorTranslationImportPlugin::get_name() const {
+
+ return "translation";
+}
+String EditorTranslationImportPlugin::get_visible_name() const {
+
+ return TTR("Translation");
+}
+void EditorTranslationImportPlugin::import_dialog(const String& p_from) {
+
+ dialog->popup_import(p_from);
+}
+
+
+
+void EditorTranslationImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) {
+
+
+ for(int i=0;i<p_drop.size();i++) {
+ String ext = p_drop[i].get_extension().to_lower();
+
+ if (ext=="csv") {
+
+ import_dialog();
+ dialog->_choose_file(p_drop[i]);
+ dialog->_choose_save_dir(p_dest_path);
+ break;
+ }
+ }
+
+
+}
+
+Error EditorTranslationImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from) {
+
+ Ref<ResourceImportMetadata> from = p_from;
+ ERR_FAIL_COND_V( from->get_source_count()!=1, ERR_INVALID_PARAMETER);
+
+ String source = EditorImportPlugin::expand_source_path( from->get_source_path(0) );
+
+ FileAccessRef f = FileAccess::open(source,FileAccess::READ);
+
+ ERR_FAIL_COND_V( !f, ERR_INVALID_PARAMETER );
+
+ bool skip_first = from->get_option("skip_first");
+ int index = from->get_option("index");
+ index+=1;
+ String locale = from->get_option("locale");
+
+ Ref<Translation> translation = memnew( Translation );
+
+ translation->set_locale( locale );
+
+ Vector<String> line = f->get_csv_line();
+
+ while(line.size()>1) {
+
+ if (!skip_first) {
+ ERR_FAIL_INDEX_V(index,line.size(),ERR_INVALID_DATA );
+ translation->add_message(line[0].strip_edges(),line[index]);
+
+ } else {
+
+ skip_first=false;
+ }
+
+ line = f->get_csv_line();
+ }
+
+ from->set_source_md5(0,FileAccess::get_md5(source));
+ from->set_editor(get_name());
+
+ String dst_path = p_path;
+
+ if (from->get_option("compress")) {
+
+ Ref<PHashTranslation> cxl = memnew( PHashTranslation );
+ cxl->generate( translation );
+ translation=cxl;
+ }
+
+ translation->set_import_metadata(from);
+ return ResourceSaver::save(dst_path,translation);
+
+}
+
+
+EditorTranslationImportPlugin::EditorTranslationImportPlugin(EditorNode* p_editor) {
+
+ dialog = memnew(EditorTranslationImportDialog(this));
+ p_editor->get_gui_base()->add_child(dialog);
+}
+
+#endif
diff --git a/editor/io_plugins/editor_translation_import_plugin.h b/editor/io_plugins/editor_translation_import_plugin.h
new file mode 100644
index 0000000000..030c5bbf6f
--- /dev/null
+++ b/editor/io_plugins/editor_translation_import_plugin.h
@@ -0,0 +1,56 @@
+/*************************************************************************/
+/* editor_translation_import_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_TRANSLATION_IMPORT_PLUGIN_H
+#define EDITOR_TRANSLATION_IMPORT_PLUGIN_H
+
+#include "editor/editor_export.h"
+#include "scene/resources/font.h"
+#if 0
+class EditorNode;
+class EditorTranslationImportDialog;
+
+class EditorTranslationImportPlugin : public EditorImportPlugin {
+
+ GDCLASS(EditorTranslationImportPlugin,EditorImportPlugin);
+
+ EditorTranslationImportDialog *dialog;
+public:
+
+ virtual String get_name() const;
+ virtual String get_visible_name() const;
+ virtual void import_dialog(const String& p_from="");
+ virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from);
+ void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path);
+
+
+ EditorTranslationImportPlugin(EditorNode* p_editor);
+};
+
+#endif
+#endif // EDITOR_TRANSLATION_IMPORT_PLUGIN_H
diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp
new file mode 100644
index 0000000000..0428d7ef30
--- /dev/null
+++ b/editor/multi_node_edit.cpp
@@ -0,0 +1,191 @@
+/*************************************************************************/
+/* multi_node_edit.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "multi_node_edit.h"
+
+#include "editor_node.h"
+#include "core/helper/math_fieldwise.h"
+
+bool MultiNodeEdit::_set(const StringName& p_name, const Variant& p_value){
+
+ return _set_impl(p_name, p_value, "");
+}
+
+bool MultiNodeEdit::_set_impl(const StringName& p_name, const Variant& p_value, const String& p_field) {
+
+ Node *es = EditorNode::get_singleton()->get_edited_scene();
+ if (!es)
+ return false;
+
+ String name = p_name;
+
+ if (name=="scripts") { // script set is intercepted at object level (check Variant Object::get() ) ,so use a different name
+ name="script";
+ }
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("MultiNode Set")+" "+String(name));
+ for (const List<NodePath>::Element *E=nodes.front();E;E=E->next()) {
+
+ if (!es->has_node(E->get()))
+ continue;
+
+ Node*n=es->get_node(E->get());
+ if (!n)
+ continue;
+
+ if (p_value.get_type() == Variant::NODE_PATH) {
+ Node *tonode = n->get_node(p_value);
+ NodePath p_path = n->get_path_to(tonode);
+ ur->add_do_property(n,name,p_path);
+ } else {
+ Variant new_value;
+ if (p_field=="") {
+ // whole value
+ new_value=p_value;
+ } else {
+ // only one field
+ new_value=fieldwise_assign(n->get(name),p_value,p_field);
+ }
+ ur->add_do_property(n,name,new_value);
+ }
+
+ ur->add_undo_property(n,name,n->get(name));
+
+
+ }
+ ur->add_do_method(EditorNode::get_singleton()->get_property_editor(),"refresh");
+ ur->add_undo_method(EditorNode::get_singleton()->get_property_editor(),"refresh");
+
+ ur->commit_action();
+ return true;
+}
+
+bool MultiNodeEdit::_get(const StringName& p_name,Variant &r_ret) const {
+
+ Node *es = EditorNode::get_singleton()->get_edited_scene();
+ if (!es)
+ return false;
+
+ String name=p_name;
+ if (name=="scripts") { // script set is intercepted at object level (check Variant Object::get() ) ,so use a different name
+ name="script";
+ }
+
+ for (const List<NodePath>::Element *E=nodes.front();E;E=E->next()) {
+
+ if (!es->has_node(E->get()))
+ continue;
+
+ const Node*n=es->get_node(E->get());
+ if (!n)
+ continue;
+
+ bool found;
+ r_ret=n->get(name,&found);
+ if (found)
+ return true;
+
+ }
+
+ return false;
+}
+
+void MultiNodeEdit::_get_property_list( List<PropertyInfo> *p_list) const{
+
+ HashMap<String,PLData> usage;
+
+ Node *es = EditorNode::get_singleton()->get_edited_scene();
+ if (!es)
+ return;
+
+ int nc=0;
+
+ List<PLData*> datas;
+
+ for (const List<NodePath>::Element *E=nodes.front();E;E=E->next()) {
+
+ if (!es->has_node(E->get()))
+ continue;
+
+ Node*n=es->get_node(E->get());
+ if (!n)
+ continue;
+
+ List<PropertyInfo> plist;
+ n->get_property_list(&plist,true);
+
+ for(List<PropertyInfo>::Element *F=plist.front();F;F=F->next()) {
+
+ if (F->get().name=="script")
+ continue; //added later manually, since this is intercepted before being set (check Variant Object::get() )
+ if (!usage.has(F->get().name)) {
+ PLData pld;
+ pld.uses=0;
+ pld.info=F->get();
+ usage[F->get().name]=pld;
+ datas.push_back(usage.getptr(F->get().name));
+ }
+
+ usage[F->get().name].uses++;
+ }
+
+ nc++;
+ }
+
+ for (List<PLData*>::Element *E=datas.front();E;E=E->next()) {
+
+ if (nc==E->get()->uses) {
+ p_list->push_back(E->get()->info);
+ }
+ }
+
+ p_list->push_back(PropertyInfo(Variant::OBJECT,"scripts",PROPERTY_HINT_RESOURCE_TYPE,"Script"));
+
+
+}
+
+void MultiNodeEdit::clear_nodes() {
+
+ nodes.clear();
+}
+
+void MultiNodeEdit::add_node(const NodePath& p_node){
+
+ nodes.push_back(p_node);
+}
+
+void MultiNodeEdit::set_property_field(const StringName& p_property, const Variant& p_value, const String& p_field) {
+
+ _set_impl(p_property, p_value, p_field);
+}
+
+MultiNodeEdit::MultiNodeEdit()
+{
+}
diff --git a/editor/multi_node_edit.h b/editor/multi_node_edit.h
new file mode 100644
index 0000000000..26e557c1cb
--- /dev/null
+++ b/editor/multi_node_edit.h
@@ -0,0 +1,65 @@
+/*************************************************************************/
+/* multi_node_edit.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef MULTI_NODE_EDIT_H
+#define MULTI_NODE_EDIT_H
+
+#include "scene/main/node.h"
+
+class MultiNodeEdit : public Reference {
+
+ GDCLASS(MultiNodeEdit,Reference);
+
+ List<NodePath> nodes;
+ struct PLData {
+ int uses;
+ PropertyInfo info;
+ };
+
+ bool _set_impl(const StringName& p_name, const Variant& p_value, const String& p_field);
+
+
+protected:
+
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list( List<PropertyInfo> *p_list) const;
+
+public:
+
+
+
+ void clear_nodes();
+ void add_node(const NodePath& p_node);
+
+ void set_property_field(const StringName& p_property, const Variant& p_value, const String& p_field);
+
+ MultiNodeEdit();
+};
+
+#endif // MULTI_NODE_EDIT_H
diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp
new file mode 100644
index 0000000000..fed3d2efb4
--- /dev/null
+++ b/editor/node_dock.cpp
@@ -0,0 +1,133 @@
+/*************************************************************************/
+/* node_dock.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "node_dock.h"
+
+#include "editor_node.h"
+
+void NodeDock::show_groups() {
+
+ groups_button->set_pressed(true);
+ connections_button->set_pressed(false);
+ groups->show();
+ connections->hide();
+}
+
+void NodeDock::show_connections(){
+
+ groups_button->set_pressed(false);
+ connections_button->set_pressed(true);
+ groups->hide();
+ connections->show();
+}
+
+
+void NodeDock::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("show_groups"),&NodeDock::show_groups);
+ ClassDB::bind_method(D_METHOD("show_connections"),&NodeDock::show_connections);
+}
+
+void NodeDock::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ connections_button->set_icon(get_icon("Connect","EditorIcons"));
+ groups_button->set_icon(get_icon("Groups","EditorIcons"));
+ }
+}
+
+NodeDock *NodeDock::singleton=NULL;
+
+void NodeDock::set_node(Node* p_node) {
+
+ connections->set_node(p_node);
+ groups->set_current(p_node);
+
+ if (p_node) {
+ if (connections_button->is_pressed())
+ connections->show();
+ else
+ groups->show();
+
+ mode_hb->show();
+ select_a_node->hide();
+ } else {
+ connections->hide();
+ groups->hide();
+ mode_hb->hide();
+ select_a_node->show();
+ }
+}
+
+NodeDock::NodeDock()
+{
+ singleton=this;
+
+ set_name(TTR("Node"));
+ mode_hb = memnew( HBoxContainer );
+ add_child(mode_hb);
+ mode_hb->hide();
+
+
+ connections_button = memnew( ToolButton );
+ connections_button->set_text(TTR("Signals"));
+ connections_button->set_toggle_mode(true);
+ connections_button->set_pressed(true);
+ connections_button->set_h_size_flags(SIZE_EXPAND_FILL);
+ mode_hb->add_child(connections_button);
+ connections_button->connect("pressed",this,"show_connections");
+
+ groups_button = memnew( ToolButton );
+ groups_button->set_text(TTR("Groups"));
+ groups_button->set_toggle_mode(true);
+ groups_button->set_pressed(false);
+ groups_button->set_h_size_flags(SIZE_EXPAND_FILL);
+ mode_hb->add_child(groups_button);
+ groups_button->connect("pressed",this,"show_groups");
+
+ connections = memnew( ConnectionsDock(EditorNode::get_singleton()) );
+ connections->set_undoredo(EditorNode::get_singleton()->get_undo_redo());
+ add_child(connections);
+ connections->set_v_size_flags(SIZE_EXPAND_FILL);
+ connections->hide();
+
+ groups = memnew( GroupsEditor );
+ groups->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
+ add_child(groups);
+ groups->set_v_size_flags(SIZE_EXPAND_FILL);
+ groups->hide();
+
+ select_a_node = memnew( Label );
+ select_a_node->set_text(TTR("Select a Node to edit Signals and Groups."));
+ select_a_node->set_v_size_flags(SIZE_EXPAND_FILL);
+ select_a_node->set_valign(Label::VALIGN_CENTER);
+ select_a_node->set_align(Label::ALIGN_CENTER);
+ select_a_node->set_autowrap(true);
+ add_child(select_a_node);
+
+}
diff --git a/editor/node_dock.h b/editor/node_dock.h
new file mode 100644
index 0000000000..df41ecf5bd
--- /dev/null
+++ b/editor/node_dock.h
@@ -0,0 +1,66 @@
+/*************************************************************************/
+/* node_dock.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef NODE_DOCK_H
+#define NODE_DOCK_H
+
+#include "connections_dialog.h"
+#include "groups_editor.h"
+
+class NodeDock : public VBoxContainer {
+
+ GDCLASS(NodeDock,VBoxContainer);
+
+ ToolButton *connections_button;
+ ToolButton *groups_button;
+
+ ConnectionsDock *connections;
+ GroupsEditor *groups;
+
+ HBoxContainer *mode_hb;
+
+ Label* select_a_node;
+
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+
+ static NodeDock *singleton;
+
+ void set_node(Node* p_node);
+
+ void show_groups();
+ void show_connections();
+
+ NodeDock();
+};
+
+#endif // NODE_DOCK_H
diff --git a/editor/output_strings.cpp b/editor/output_strings.cpp
new file mode 100644
index 0000000000..cb43bb9230
--- /dev/null
+++ b/editor/output_strings.cpp
@@ -0,0 +1,215 @@
+/*************************************************************************/
+/* output_strings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "output_strings.h"
+
+
+
+void OutputStrings::update_scrollbars() {
+
+ Size2 hmin = h_scroll->get_combined_minimum_size();
+ Size2 vmin = v_scroll->get_combined_minimum_size();
+
+ v_scroll->set_anchor( MARGIN_LEFT, ANCHOR_END );
+ v_scroll->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ v_scroll->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+
+ v_scroll->set_begin( Point2(vmin.width, 0) );
+ v_scroll->set_end( Point2(0,0 ) );
+
+ h_scroll->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ h_scroll->set_anchor( MARGIN_TOP, ANCHOR_END );
+ h_scroll->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+
+ h_scroll->set_begin( Point2( 0, hmin.y) );
+ h_scroll->set_end( Point2(vmin.x, 0) );
+
+ margin.y=hmin.y;
+ margin.x=vmin.x;
+
+ Ref<StyleBox> tree_st = get_stylebox("bg","Tree");
+ int page = ((size_height-(int)margin.y-tree_st->get_margin(MARGIN_TOP)) / font_height);
+ v_scroll->set_page(page);
+
+}
+
+void OutputStrings::_notification(int p_what) {
+
+ switch(p_what) {
+
+
+ case NOTIFICATION_DRAW: {
+
+ if (following) {
+
+ updating=true;
+ v_scroll->set_value( v_scroll->get_max() - v_scroll->get_page() );
+ updating=false;
+ }
+
+ RID ci = get_canvas_item();
+ Size2 size = get_size();
+
+ Ref<Font> font = get_font("font","Tree");
+ Ref<StyleBox> tree_st = get_stylebox("bg","Tree");
+ tree_st->draw(ci,Rect2(Point2(),size));
+ Color color = get_color("font_color","Tree");
+ Ref<Texture> icon_error = get_icon("Error","EditorIcons");
+ Ref<Texture> icon_warning = get_icon("Warning","EditorIcons");
+
+ //int lines = (size_height-(int)margin.y) / font_height;
+ Point2 ofs=tree_st->get_offset();
+
+ LineMap::Element *E = line_map.find(v_scroll->get_value());
+ float h_ofs = (int)h_scroll->get_value();
+ Point2 icon_ofs=Point2(0,(font_height-(int)icon_error->get_height())/2);
+
+ while( E && ofs.y < (size_height-(int)margin.y) ) {
+
+ String str = E->get().text;
+ Point2 line_ofs=ofs;
+
+ switch(E->get().type) {
+
+ case LINE_WARNING: {
+ icon_warning->draw(ci,line_ofs+icon_ofs);
+
+ } break;
+ case LINE_ERROR: {
+ icon_error->draw(ci,line_ofs+icon_ofs);
+ } break;
+ case LINE_LINK: {
+
+ } break;
+ default: {}
+ }
+
+ line_ofs.y+=font->get_ascent();
+ line_ofs.x+=icon_error->get_width()+4;
+
+ for(int i=0;i<str.length();i++) {
+ if (line_ofs.x-h_ofs < 0 ) {
+ line_ofs.x+=font->get_char_size(str[i],str[i+1]).width;
+ } else if (line_ofs.x-h_ofs > size.width - margin.width) {
+ break;
+ } else {
+ line_ofs.x+=font->draw_char(ci,Point2(line_ofs.x-h_ofs,line_ofs.y),str[i],str[i+1],color);
+ }
+ }
+
+ ofs.y+=font_height;
+ E=E->next();
+ }
+
+ } break;
+
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_RESIZED: {
+
+
+ font_height = get_font("font","Tree")->get_height();
+ size_height = get_size().height;
+ update_scrollbars();
+ } break;
+ }
+
+}
+
+void OutputStrings::_hscroll_changed(float p_value) {
+
+ if (updating)
+ return;
+
+ update();
+}
+void OutputStrings::_vscroll_changed(float p_value) {
+
+ if (updating)
+ return;
+ //user changed scroll
+ following=(p_value+v_scroll->get_page())>=v_scroll->get_max();
+ update();
+}
+
+void OutputStrings::add_line(const String& p_text, const Variant& p_meta, const LineType p_type) {
+
+
+ Vector<String> strings=p_text.split("\n");
+
+ for(int i=0;i<strings.size();i++) {
+
+ if (strings[i].length()==0)
+ continue;
+
+ int last = line_map.empty() ? 0 : (line_map.back()->key() + 1);
+
+ Line l;
+ l.text=strings[i];
+ l.meta=p_meta;
+ l.type=p_type;
+ line_map.insert(last,l);
+
+ updating=true;
+ v_scroll->set_max(last+1);
+ v_scroll->set_min(line_map.front()->key());
+ updating=false;
+
+ }
+
+ while (line_map.size() > line_max_count) {
+
+ line_map.erase(line_map.front());
+ }
+
+
+ update();
+
+}
+
+
+void OutputStrings::_bind_methods() {
+
+ ClassDB::bind_method("_vscroll_changed",&OutputStrings::_vscroll_changed);
+ ClassDB::bind_method("_hscroll_changed",&OutputStrings::_hscroll_changed);
+}
+
+OutputStrings::OutputStrings() {
+
+ following=true;
+ updating=false;
+ line_max_count=4096;
+ h_scroll = memnew( HScrollBar );
+ v_scroll = memnew( VScrollBar );
+ add_child(h_scroll);
+ add_child(v_scroll);
+ size_height=1;
+ font_height=1;
+ update_scrollbars();
+ h_scroll->connect("value_changed", this,"_hscroll_changed");
+ v_scroll->connect("value_changed", this,"_vscroll_changed");
+}
diff --git a/editor/output_strings.h b/editor/output_strings.h
new file mode 100644
index 0000000000..cc721ef652
--- /dev/null
+++ b/editor/output_strings.h
@@ -0,0 +1,89 @@
+/*************************************************************************/
+/* output_strings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef OUTPUT_STRINGS_H
+#define OUTPUT_STRINGS_H
+
+
+#include "scene/gui/control.h"
+#include "scene/gui/scroll_bar.h"
+#include "map.h"
+
+class OutputStrings : public Control {
+
+ GDCLASS( OutputStrings, Control );
+public:
+
+ enum LineType {
+
+ LINE_NORMAL,
+ LINE_WARNING,
+ LINE_ERROR,
+ LINE_LINK
+ };
+private:
+
+ struct Line {
+
+
+ LineType type;
+ Variant meta;
+ String text;
+ };
+
+
+ int font_height;
+ int size_height;
+
+ Size2 margin;
+ typedef Map<int,Line> LineMap;
+ Map<int,Line> line_map;
+
+ VScrollBar *v_scroll;
+ HScrollBar *h_scroll;
+
+ bool following;
+ int line_max_count;
+ bool updating;
+
+ void _vscroll_changed(float p_value);
+ void _hscroll_changed(float p_value);
+ void update_scrollbars();
+protected:
+
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+
+ void add_line(const String& p_text, const Variant& p_meta=Variant(), const LineType p_type=LINE_NORMAL);
+
+ OutputStrings();
+};
+
+#endif // OUTPUT_STRINGS_H
diff --git a/editor/pane_drag.cpp b/editor/pane_drag.cpp
new file mode 100644
index 0000000000..122abd37b9
--- /dev/null
+++ b/editor/pane_drag.cpp
@@ -0,0 +1,75 @@
+/*************************************************************************/
+/* pane_drag.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "pane_drag.h"
+
+
+void PaneDrag::_gui_input(const InputEvent& p_input) {
+
+ if (p_input.type==InputEvent::MOUSE_MOTION && p_input.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+
+ emit_signal("dragged",Point2(p_input.mouse_motion.relative_x,p_input.mouse_motion.relative_y));
+ }
+}
+
+void PaneDrag::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_DRAW: {
+
+ Ref<Texture> icon = mouse_over?get_icon("PaneDragHover","EditorIcons"):get_icon("PaneDrag","EditorIcons");
+ if (!icon.is_null())
+ icon->draw(get_canvas_item(),Point2(0,0));
+
+ } break;
+ case NOTIFICATION_MOUSE_ENTER: mouse_over=true; update(); break;
+ case NOTIFICATION_MOUSE_EXIT: mouse_over=false; update(); break;
+ }
+
+}
+Size2 PaneDrag::get_minimum_size() const {
+
+ Ref<Texture> icon=get_icon("PaneDrag","EditorIcons");
+ if (!icon.is_null())
+ return icon->get_size();
+ return Size2();
+
+}
+
+void PaneDrag::_bind_methods() {
+
+ ClassDB::bind_method("_gui_input",&PaneDrag::_gui_input);
+ ADD_SIGNAL(MethodInfo("dragged",PropertyInfo(Variant::VECTOR2,"amount")));
+}
+
+PaneDrag::PaneDrag() {
+
+ mouse_over=false;
+
+}
diff --git a/editor/pane_drag.h b/editor/pane_drag.h
new file mode 100644
index 0000000000..8796fc2594
--- /dev/null
+++ b/editor/pane_drag.h
@@ -0,0 +1,51 @@
+/*************************************************************************/
+/* pane_drag.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PANE_DRAG_H
+#define PANE_DRAG_H
+
+#include "scene/gui/control.h"
+
+class PaneDrag : public Control {
+
+ GDCLASS( PaneDrag, Control );
+
+ bool mouse_over;
+
+
+protected:
+
+ void _gui_input(const InputEvent& p_input);
+ void _notification(int p_what);
+ virtual Size2 get_minimum_size() const;
+ static void _bind_methods();
+public:
+ PaneDrag();
+};
+
+#endif // PANE_DRAG_H
diff --git a/editor/plugins/SCsub b/editor/plugins/SCsub
new file mode 100644
index 0000000000..f1fa50148f
--- /dev/null
+++ b/editor/plugins/SCsub
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import('env')
+Export('env')
+env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
new file mode 100644
index 0000000000..2e6792bbaa
--- /dev/null
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -0,0 +1,1604 @@
+/*************************************************************************/
+/* animation_player_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "animation_player_editor_plugin.h"
+
+#include "global_config.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "os/keyboard.h"
+#include "editor/editor_settings.h"
+#include "editor/animation_editor.h"
+
+void AnimationPlayerEditor::_node_removed(Node *p_node) {
+
+ if (player && player == p_node) {
+ player=NULL;
+
+ set_process(false);
+
+ key_editor->set_animation(Ref<Animation>());
+ key_editor->set_root(NULL);
+ key_editor->show_select_node_warning(true);
+ _update_player();
+ //editor->animation_editor_make_visible(false);
+
+ }
+}
+
+void AnimationPlayerEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void AnimationPlayerEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ if (!player)
+ return;
+
+ updating = true;
+
+ if (player->is_playing()) {
+
+ {
+ String animname=player->get_current_animation();
+
+ if (player->has_animation(animname)) {
+ Ref<Animation> anim = player->get_animation(animname);
+ if (!anim.is_null()) {
+
+ frame->set_max(anim->get_length());
+ }
+ }
+ }
+ frame->set_value(player->get_current_animation_pos());
+ key_editor->set_anim_pos(player->get_current_animation_pos());
+ EditorNode::get_singleton()->get_property_editor()->refresh();
+
+ } else if (last_active) {
+ //need the last frame after it stopped
+
+ frame->set_value(player->get_current_animation_pos());
+ }
+
+ last_active=player->is_playing();
+ //seek->set_val(player->get_pos());
+ updating = false;
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ //editor->connect("hide_animation_player_editors",this,"_hide_anim_editors");
+ add_anim->set_icon( get_icon("New","EditorIcons") );
+ rename_anim->set_icon( get_icon("Rename","EditorIcons") );
+ duplicate_anim->set_icon( get_icon("Duplicate","EditorIcons") );
+ autoplay->set_icon( get_icon("AutoPlay","EditorIcons") );
+ load_anim->set_icon( get_icon("Folder","EditorIcons") );
+ save_anim->set_icon(get_icon("Save", "EditorIcons"));
+ save_anim->get_popup()->connect("id_pressed", this, "_animation_save_menu");
+ remove_anim->set_icon( get_icon("Remove","EditorIcons") );
+
+ blend_anim->set_icon( get_icon("Blend","EditorIcons") );
+ play->set_icon( get_icon("PlayStart","EditorIcons") );
+ play_from->set_icon( get_icon("Play","EditorIcons") );
+ play_bw->set_icon( get_icon("PlayStartBackwards","EditorIcons") );
+ play_bw_from->set_icon( get_icon("PlayBackwards","EditorIcons") );
+
+ autoplay_icon=get_icon("AutoPlay","EditorIcons");
+ stop->set_icon( get_icon("Stop","EditorIcons") );
+ resource_edit_anim->set_icon( get_icon("EditResource","EditorIcons") );
+ pin->set_icon(get_icon("Pin","EditorIcons") );
+ tool_anim->set_icon(get_icon("Tools","EditorIcons"));
+ tool_anim->get_popup()->connect("id_pressed",this,"_animation_tool_menu");
+
+ blend_editor.next->connect("item_selected", this, "_blend_editor_next_changed");
+
+ nodename->set_icon(get_icon("AnimationPlayer","EditorIcons"));
+
+/*
+ anim_editor_load->set_normal_texture( get_icon("AnimGet","EditorIcons"));
+ anim_editor_store->set_normal_texture( get_icon("AnimSet","EditorIcons"));
+ anim_editor_load->set_pressed_texture( get_icon("AnimGet","EditorIcons"));
+ anim_editor_store->set_pressed_texture( get_icon("AnimSet","EditorIcons"));
+ anim_editor_load->set_hover_texture( get_icon("AnimGetHl","EditorIcons"));
+ anim_editor_store->set_hover_texture( get_icon("AnimSetHl","EditorIcons"));
+*/
+
+ get_tree()->connect("node_removed",this,"_node_removed");
+ }
+}
+
+void AnimationPlayerEditor::_autoplay_pressed() {
+
+ if (updating)
+ return;
+ if (animation->get_item_count()==0) {
+ return;
+ }
+
+ String current = animation->get_item_text( animation->get_selected() );
+ if (player->get_autoplay()==current) {
+ //unset
+ undo_redo->create_action(TTR("Toggle Autoplay"));
+ undo_redo->add_do_method(player,"set_autoplay","");
+ undo_redo->add_undo_method(player,"set_autoplay",player->get_autoplay());
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+
+ } else {
+ //set
+ undo_redo->create_action(TTR("Toggle Autoplay"));
+ undo_redo->add_do_method(player,"set_autoplay",current);
+ undo_redo->add_undo_method(player,"set_autoplay",player->get_autoplay());
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+ }
+
+}
+
+void AnimationPlayerEditor::_play_pressed() {
+
+ String current;
+ if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
+
+ current = animation->get_item_text( animation->get_selected() );
+ }
+
+ if (current!="") {
+
+ if (current==player->get_current_animation())
+ player->stop(); //so it wont blend with itself
+ player->play(current );
+ }
+
+ //unstop
+ stop->set_pressed(false);
+ //unpause
+ //pause->set_pressed(false);
+}
+
+void AnimationPlayerEditor::_play_from_pressed() {
+
+ String current;
+ if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
+
+ current = animation->get_item_text( animation->get_selected() );
+ }
+
+ if (current!="") {
+
+ float time = player->get_current_animation_pos();
+
+ if (current==player->get_current_animation() && player->is_playing()) {
+
+ player->stop(); //so it wont blend with itself
+ }
+
+ player->play( current );
+ player->seek(time);
+ }
+
+ //unstop
+ stop->set_pressed(false);
+ //unpause
+ //pause->set_pressed(false);
+}
+
+
+void AnimationPlayerEditor::_play_bw_pressed() {
+
+ String current;
+ if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
+
+ current = animation->get_item_text( animation->get_selected() );
+ }
+
+ if (current!="") {
+
+ if (current==player->get_current_animation())
+ player->stop(); //so it wont blend with itself
+ player->play(current,-1,-1,true);
+ }
+
+ //unstop
+ stop->set_pressed(false);
+ //unpause
+ //pause->set_pressed(false);
+}
+
+void AnimationPlayerEditor::_play_bw_from_pressed() {
+
+ String current;
+ if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
+
+ current = animation->get_item_text( animation->get_selected() );
+ }
+
+ if (current!="") {
+
+ float time = player->get_current_animation_pos();
+ if (current==player->get_current_animation())
+ player->stop(); //so it wont blend with itself
+
+ player->play(current,-1,-1,true);
+ player->seek(time);
+ }
+
+ //unstop
+ stop->set_pressed(false);
+ //unpause
+ //pause->set_pressed(false);
+}
+void AnimationPlayerEditor::_stop_pressed() {
+
+ player->stop(false);
+ play->set_pressed(false);
+ stop->set_pressed(true);
+ //pause->set_pressed(false);
+ //player->set_pause(false);
+}
+
+void AnimationPlayerEditor::_pause_pressed() {
+
+ //player->set_pause( pause->is_pressed() );
+}
+void AnimationPlayerEditor::_animation_selected(int p_which) {
+
+ if (updating)
+ return;
+ // when selecting an animation, the idea is that the only interesting behavior
+ // ui-wise is that it should play/blend the next one if currently playing
+ String current;
+ if (animation->get_selected()>=0 && animation->get_selected()<animation->get_item_count()) {
+
+ current = animation->get_item_text( animation->get_selected() );
+ }
+
+ if (current!="") {
+
+
+ player->set_current_animation( current );
+
+ Ref<Animation> anim = player->get_animation(current);
+ {
+
+ key_editor->set_animation(anim);
+ Node *root = player->get_node(player->get_root());
+ if (root) {
+ key_editor->set_root(root);
+ }
+ }
+ frame->set_max(anim->get_length());
+ if (anim->get_step())
+ frame->set_step(anim->get_step());
+ else
+ frame->set_step(0.00001);
+
+
+
+ } else {
+ key_editor->set_animation(Ref<Animation>());
+ key_editor->set_root(NULL);
+
+ }
+
+
+ autoplay->set_pressed(current==player->get_autoplay());
+}
+
+void AnimationPlayerEditor::_animation_new() {
+
+ renaming=false;
+ name_title->set_text(TTR("New Animation Name:"));
+
+ int count=1;
+ String base=TTR("New Anim");
+ while(true) {
+ String attempt = base;
+ if (count>1)
+ attempt+=" ("+itos(count)+")";
+ if (player->has_animation(attempt)) {
+ count++;
+ continue;
+ }
+ base=attempt;
+ break;
+ }
+
+ name->set_text(base);
+ name_dialog->popup_centered(Size2(300,90));
+ name->select_all();
+ name->grab_focus();
+}
+void AnimationPlayerEditor::_animation_rename() {
+
+ if (animation->get_item_count()==0)
+ return;
+ int selected = animation->get_selected();
+ String selected_name = animation->get_item_text(selected);
+
+ name_title->set_text(TTR("Change Animation Name:"));
+ name->set_text(selected_name);
+ renaming=true;
+ name_dialog->popup_centered(Size2(300,90));
+ name->select_all();
+ name->grab_focus();
+
+}
+void AnimationPlayerEditor::_animation_load() {
+ ERR_FAIL_COND(!player);
+ file->set_mode( EditorFileDialog::MODE_OPEN_FILE );
+ file->clear_filters();
+ List<String> extensions;
+
+ ResourceLoader::get_recognized_extensions_for_type("Animation",&extensions);
+ for (List<String>::Element *E=extensions.front();E;E=E->next()) {
+
+ file->add_filter("*."+E->get()+" ; "+E->get().to_upper() );
+
+ }
+
+ file->popup_centered_ratio();
+ current_option = RESOURCE_LOAD;
+}
+
+
+void AnimationPlayerEditor::_animation_save_in_path(const Ref<Resource>& p_resource, const String& p_path) {
+
+ int flg = 0;
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ flg |= ResourceSaver::FLAG_COMPRESS;
+ /*
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/save_paths_as_relative"))
+ flg |= ResourceSaver::FLAG_RELATIVE_PATHS;
+ */
+
+ String path = GlobalConfig::get_singleton()->localize_path(p_path);
+ Error err = ResourceSaver::save(path, p_resource, flg | ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS);
+
+ if (err != OK) {
+ accept->set_text(TTR("Error saving resource!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+ //EditorFileSystem::get_singleton()->update_file(path,p_resource->get_type());
+
+ ((Resource*)p_resource.ptr())->set_path(path);
+ editor->emit_signal("resource_saved", p_resource);
+
+}
+
+void AnimationPlayerEditor::_animation_save(const Ref<Resource>& p_resource) {
+
+ if (p_resource->get_path().is_resource_file()) {
+ _animation_save_in_path(p_resource, p_resource->get_path());
+ }
+ else {
+ _animation_save_as(p_resource);
+ }
+}
+
+void AnimationPlayerEditor::_animation_save_as(const Ref<Resource>& p_resource) {
+
+ file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+
+ List<String> extensions;
+ ResourceSaver::get_recognized_extensions(p_resource, &extensions);
+ file->clear_filters();
+ for (int i = 0; i<extensions.size(); i++) {
+
+ file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
+ }
+
+ //file->set_current_path(current_path);
+ if (p_resource->get_path() != "") {
+ file->set_current_path(p_resource->get_path());
+ if (extensions.size()) {
+ String ext = p_resource->get_path().get_extension().to_lower();
+ if (extensions.find(ext) == NULL) {
+ file->set_current_path(p_resource->get_path().replacen("." + ext, "." + extensions.front()->get()));
+ }
+ }
+ }
+ else {
+
+ String existing;
+ if (extensions.size()) {
+ if( p_resource->get_name() != "" ) {
+ existing = p_resource->get_name() + "." + extensions.front()->get().to_lower();
+ }
+ else {
+ existing = "new_" + p_resource->get_class().to_lower() + "." + extensions.front()->get().to_lower();
+ }
+ }
+ file->set_current_path(existing);
+
+ }
+ file->popup_centered_ratio();
+ file->set_title(TTR("Save Resource As.."));
+ current_option = RESOURCE_SAVE;
+}
+
+void AnimationPlayerEditor::_animation_remove() {
+
+ if (animation->get_item_count() == 0)
+ return;
+
+ delete_dialog->set_text(TTR("Delete Animation?"));
+ delete_dialog->popup_centered_minsize();
+}
+
+void AnimationPlayerEditor::_animation_remove_confirmed() {
+
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+
+ undo_redo->create_action(TTR("Remove Animation"));
+ undo_redo->add_do_method(player, "remove_animation", current);
+ undo_redo->add_undo_method(player, "add_animation", current, anim);
+ undo_redo->add_do_method(this, "_animation_player_changed", player);
+ undo_redo->add_undo_method(this, "_animation_player_changed", player);
+ undo_redo->commit_action();
+}
+
+void AnimationPlayerEditor::_select_anim_by_name(const String& p_anim) {
+
+ int idx=-1;
+ for(int i=0;i<animation->get_item_count();i++) {
+
+ if (animation->get_item_text(i)==p_anim) {
+
+ idx=i;
+ break;
+ }
+ }
+
+ ERR_FAIL_COND(idx==-1);
+
+
+ animation->select(idx);
+
+ _animation_selected(idx);
+
+}
+
+void AnimationPlayerEditor::_animation_name_edited() {
+
+ player->stop();
+
+ String new_name = name->get_text();
+ if (new_name=="" || new_name.find(":")!=-1 || new_name.find("/")!=-1) {
+ error_dialog->set_text(TTR("ERROR: Invalid animation name!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (renaming && animation->get_item_count()>0 && animation->get_item_text(animation->get_selected())==new_name) {
+ name_dialog->hide();
+ return;
+ }
+
+ if (player->has_animation(new_name)) {
+ error_dialog->set_text(TTR("ERROR: Animation name already exists!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (renaming) {
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+
+ undo_redo->create_action(TTR("Rename Animation"));
+ undo_redo->add_do_method(player,"rename_animation",current,new_name);
+ undo_redo->add_do_method(anim.ptr(),"set_name",new_name);
+ undo_redo->add_undo_method(player,"rename_animation",new_name,current);
+ undo_redo->add_undo_method(anim.ptr(),"set_name",current);
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+ _select_anim_by_name(new_name);
+
+ } else {
+
+ Ref<Animation> new_anim = Ref<Animation>(memnew( Animation ));
+ new_anim->set_name(new_name);
+
+ undo_redo->create_action(TTR("Add Animation"));
+ undo_redo->add_do_method(player,"add_animation",new_name,new_anim);
+ undo_redo->add_undo_method(player,"remove_animation",new_name);
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+ _select_anim_by_name(new_name);
+
+ }
+
+ name_dialog->hide();
+}
+
+
+void AnimationPlayerEditor::_blend_editor_next_changed(const int p_idx) {
+
+ if (animation->get_item_count()==0)
+ return;
+
+ String current = animation->get_item_text(animation->get_selected());
+
+ undo_redo->create_action(TTR("Blend Next Changed"));
+ undo_redo->add_do_method(player,"animation_set_next",current,blend_editor.next->get_item_text(p_idx));
+ undo_redo->add_undo_method(player,"animation_set_next",current,player->animation_get_next(current));
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+}
+
+void AnimationPlayerEditor::_animation_blend() {
+
+ if (updating_blends)
+ return;
+
+ blend_editor.tree->clear();
+
+ if (animation->get_item_count()==0)
+ return;
+
+ String current = animation->get_item_text(animation->get_selected());
+
+ blend_editor.dialog->popup_centered(Size2(400,400));
+
+ blend_editor.tree->set_hide_root(true);
+ blend_editor.tree->set_column_min_width(0,10);
+ blend_editor.tree->set_column_min_width(1,3);
+
+ List<StringName> anims;
+ player->get_animation_list(&anims);
+ TreeItem *root = blend_editor.tree->create_item();
+ updating_blends=true;
+
+ int i = 0;
+ bool anim_found = false;
+ blend_editor.next->clear();
+ blend_editor.next->add_item("", i);
+
+ for(List<StringName>::Element *E=anims.front();E;E=E->next()) {
+
+ String to=E->get();
+ TreeItem *blend=blend_editor.tree->create_item(root);
+ blend->set_editable(0,false);
+ blend->set_editable(1,true);
+ blend->set_text(0,to);
+ blend->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ blend->set_range_config(1,0,3600,0.001);
+ blend->set_range(1,player->get_blend_time(current,to));
+
+ i++;
+ blend_editor.next->add_item(to, i);
+ if (to == player->animation_get_next(current)) {
+ blend_editor.next->select(i);
+ anim_found = true;
+ }
+ }
+
+ // make sure we reset it else it becomes out of sync and could contain a deleted animation
+ if (!anim_found) {
+ blend_editor.next->select(0);
+ player->animation_set_next(current, blend_editor.next->get_item_text(0));
+ }
+
+ updating_blends=false;
+}
+
+void AnimationPlayerEditor::_blend_edited() {
+
+ if (updating_blends)
+ return;
+
+ if (animation->get_item_count()==0)
+ return;
+
+ String current = animation->get_item_text(animation->get_selected());
+
+ TreeItem *selected = blend_editor.tree->get_edited();
+ if (!selected)
+ return;
+
+ updating_blends=true;
+ String to=selected->get_text(0);
+ float blend_time = selected->get_range(1);
+ float prev_blend_time = player->get_blend_time(current,to);
+
+ undo_redo->create_action(TTR("Change Blend Time"));
+ undo_redo->add_do_method(player,"set_blend_time",current,to,blend_time);
+ undo_redo->add_undo_method(player,"set_blend_time",current,to,prev_blend_time);
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+ updating_blends=false;
+}
+
+void AnimationPlayerEditor::ensure_visibility() {
+
+ if (player && pin->is_pressed())
+ return; // another player is pinned, don't reset
+
+ _animation_edit();
+}
+
+Dictionary AnimationPlayerEditor::get_state() const {
+
+
+ Dictionary d;
+
+ d["visible"]=is_visible_in_tree();
+ if (EditorNode::get_singleton()->get_edited_scene() && is_visible_in_tree() && player) {
+ d["player"]=EditorNode::get_singleton()->get_edited_scene()->get_path_to(player);
+ d["animation"]=player->get_current_animation();
+
+ }
+
+ return d;
+
+}
+void AnimationPlayerEditor::set_state(const Dictionary& p_state) {
+
+ if (p_state.has("visible") && p_state["visible"]) {
+
+ if (!EditorNode::get_singleton()->get_edited_scene())
+ return;
+
+ Node *n = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["player"]);
+ if (n && n->cast_to<AnimationPlayer>() && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) {
+ player=n->cast_to<AnimationPlayer>();
+ _update_player();
+ show();
+ set_process(true);
+ ensure_visibility();
+ //EditorNode::get_singleton()->animation_panel_make_visible(true);
+
+ if (p_state.has("animation")) {
+ String anim = p_state["animation"];
+ _select_anim_by_name(anim);
+ _animation_edit();
+ }
+
+ }
+ }
+
+}
+
+
+void AnimationPlayerEditor::_animation_resource_edit() {
+
+ if (animation->get_item_count()) {
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ editor->edit_resource(anim);
+ }
+
+}
+
+void AnimationPlayerEditor::_animation_edit() {
+
+ if (animation->get_item_count()) {
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ key_editor->set_animation(anim);
+ Node *root = player->get_node(player->get_root());
+ if (root) {
+ key_editor->set_root(root);
+ }
+
+ } else {
+
+ key_editor->set_animation(Ref<Animation>());
+ key_editor->set_root(NULL);
+
+ }
+
+}
+void AnimationPlayerEditor::_dialog_action(String p_file) {
+
+ switch (current_option) {
+ case RESOURCE_LOAD: {
+ ERR_FAIL_COND(!player);
+
+ Ref<Resource> res = ResourceLoader::load(p_file, "Animation");
+ ERR_FAIL_COND(res.is_null());
+ ERR_FAIL_COND(!res->is_class("Animation"));
+ if (p_file.find_last("/") != -1) {
+
+ p_file = p_file.substr(p_file.find_last("/") + 1, p_file.length());
+
+ }
+ if (p_file.find_last("\\") != -1) {
+
+ p_file = p_file.substr(p_file.find_last("\\") + 1, p_file.length());
+
+ }
+
+ if (p_file.find(".") != -1)
+ p_file = p_file.substr(0, p_file.find("."));
+
+ undo_redo->create_action(TTR("Load Animation"));
+ undo_redo->add_do_method(player, "add_animation", p_file, res);
+ undo_redo->add_undo_method(player, "remove_animation", p_file);
+ if (player->has_animation(p_file)) {
+ undo_redo->add_undo_method(player, "add_animation", p_file, player->get_animation(p_file));
+
+ }
+ undo_redo->add_do_method(this, "_animation_player_changed", player);
+ undo_redo->add_undo_method(this, "_animation_player_changed", player);
+ undo_redo->commit_action();
+ break;
+ }
+ case RESOURCE_SAVE: {
+
+ String current = animation->get_item_text(animation->get_selected());
+ if (current != "") {
+ Ref<Animation> anim = player->get_animation(current);
+
+ ERR_FAIL_COND(!anim->cast_to<Resource>())
+
+ RES current_res = RES(anim->cast_to<Resource>());
+
+ _animation_save_in_path(current_res, p_file);
+ }
+ }
+ }
+}
+
+void AnimationPlayerEditor::_scale_changed(const String& p_scale) {
+
+ player->set_speed_scale(p_scale.to_double());
+}
+
+void AnimationPlayerEditor::_update_animation() {
+
+ // the purpose of _update_animation is to reflect the current state
+ // of the animation player in the current editor..
+
+ updating=true;
+
+
+ if (player->is_playing()) {
+
+ play->set_pressed(true);
+ stop->set_pressed(false);
+
+ } else {
+
+ play->set_pressed(false);
+ stop->set_pressed(true);
+ }
+
+ scale->set_text( String::num(player->get_speed_scale(),2) );
+ String current=player->get_current_animation();
+
+ for (int i=0;i<animation->get_item_count();i++) {
+
+ if (animation->get_item_text(i)==current) {
+ animation->select(i);
+ break;
+ }
+ }
+
+ updating=false;
+}
+
+void AnimationPlayerEditor::_update_player() {
+
+
+ updating=true;
+ List<StringName> animlist;
+ if (player)
+ player->get_animation_list(&animlist);
+
+ animation->clear();
+ if (player)
+ nodename->set_text(player->get_name());
+ else
+ nodename->set_text("<empty>");
+
+
+ add_anim->set_disabled(player==NULL);
+ load_anim->set_disabled(player==NULL);
+ stop->set_disabled(animlist.size()==0);
+ play->set_disabled(animlist.size()==0);
+ play_bw->set_disabled(animlist.size()==0);
+ play_bw_from->set_disabled(animlist.size()==0);
+ play_from->set_disabled(animlist.size()==0);
+ autoplay->set_disabled(animlist.size()==0);
+ duplicate_anim->set_disabled(animlist.size()==0);
+ rename_anim->set_disabled(animlist.size()==0);
+ blend_anim->set_disabled(animlist.size()==0);
+ remove_anim->set_disabled(animlist.size()==0);
+ resource_edit_anim->set_disabled(animlist.size()==0);
+ save_anim->set_disabled(animlist.size() == 0);
+ tool_anim->set_disabled(player==NULL);
+
+
+ int active_idx=-1;
+ for (List<StringName>::Element *E=animlist.front();E;E=E->next()) {
+
+ if (player->get_autoplay()==E->get())
+ animation->add_icon_item(autoplay_icon,E->get());
+ else
+ animation->add_item(E->get());
+
+ if (player->get_current_animation()==E->get())
+ active_idx=animation->get_item_count()-1;
+
+ }
+
+ if (!player)
+ return;
+
+ updating=false;
+ if (active_idx!=-1) {
+ animation->select(active_idx);
+ autoplay->set_pressed(animation->get_item_text(active_idx)==player->get_autoplay());
+ _animation_selected(active_idx);
+
+ } else if (animation->get_item_count()>0){
+
+ animation->select(0);
+ autoplay->set_pressed(animation->get_item_text(0)==player->get_autoplay());
+ _animation_selected(0);
+ }
+
+ //pause->set_pressed(player->is_paused());
+
+
+ if (animation->get_item_count()) {
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ key_editor->set_animation(anim);
+ Node *root = player->get_node(player->get_root());
+ if (root) {
+ key_editor->set_root(root);
+ }
+
+ }
+
+ _update_animation();
+}
+
+
+
+void AnimationPlayerEditor::edit(AnimationPlayer *p_player) {
+
+
+ if (player && pin->is_pressed())
+ return; //ignore, pinned
+ player=p_player;
+
+ if (player) {
+ _update_player();
+ key_editor->show_select_node_warning(false);
+ } else {
+ key_editor->show_select_node_warning(true);
+
+ //hide();
+
+ }
+
+}
+
+
+void AnimationPlayerEditor::_animation_duplicate() {
+
+
+ if (!animation->get_item_count())
+ return;
+
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ if (!anim.is_valid())
+ return;
+
+ Ref<Animation> new_anim = memnew( Animation );
+ List<PropertyInfo> plist;
+ anim->get_property_list(&plist);
+ for (List<PropertyInfo>::Element *E=plist.front();E;E=E->next()) {
+
+ if (E->get().usage&PROPERTY_USAGE_STORAGE) {
+
+ new_anim->set(E->get().name, anim->get(E->get().name));
+ }
+ }
+ new_anim->set_path("");
+
+ String new_name = current;
+ while(player->has_animation(new_name)) {
+
+ new_name=new_name+" (copy)";
+ }
+
+
+ undo_redo->create_action(TTR("Duplicate Animation"));
+ undo_redo->add_do_method(player,"add_animation",new_name,new_anim);
+ undo_redo->add_undo_method(player,"remove_animation",new_name);
+ undo_redo->add_do_method(player,"animation_set_next",new_name,player->animation_get_next(current));
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+
+ for(int i=0;i<animation->get_item_count();i++) {
+
+ if (animation->get_item_text(i)==new_name) {
+
+ animation->select(i);
+ _animation_selected(i);
+ return;
+ }
+ }
+
+}
+
+void AnimationPlayerEditor::_seek_value_changed(float p_value,bool p_set) {
+
+ if (updating || !player || player->is_playing()) {
+ return;
+ };
+
+
+ updating=true;
+ String current=player->get_current_animation(); //animation->get_item_text( animation->get_selected() );
+ if (current == "" || !player->has_animation(current)) {
+ updating=false;
+ current="";
+ return;
+ };
+
+ Ref<Animation> anim;
+ anim=player->get_animation(current);
+
+ float pos = anim->get_length() * (p_value / frame->get_max());
+ float step = anim->get_step();
+ if (step) {
+ pos=Math::stepify(pos, step);
+ if (pos<0)
+ pos=0;
+ if (pos>=anim->get_length())
+ pos=anim->get_length();
+ }
+
+ if (player->is_valid() && !p_set) {
+ float cpos = player->get_current_animation_pos();
+
+ player->seek_delta(pos,pos-cpos);
+ } else {
+ player->seek(pos,true);
+ }
+
+
+ key_editor->set_anim_pos(pos);
+
+ updating=true;
+};
+
+void AnimationPlayerEditor::_animation_player_changed(Object *p_pl) {
+
+ if (player==p_pl && is_visible_in_tree()) {
+
+ _update_player();
+ if (blend_editor.dialog->is_visible_in_tree())
+ _animation_blend(); //update
+ }
+}
+
+
+
+void AnimationPlayerEditor::_list_changed() {
+
+ if(is_visible_in_tree())
+ _update_player();
+}
+#if 0
+void AnimationPlayerEditor::_editor_store() {
+
+ if (animation->get_item_count()==0)
+ return;
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+
+ if (key_editor->get_current_animation()==anim)
+ return; //already there
+
+
+ undo_redo->create_action("Store anim in editor");
+ undo_redo->add_do_method(key_editor,"set_animation",anim);
+ undo_redo->add_undo_method(key_editor,"remove_animation",anim);
+ undo_redo->commit_action();
+}
+
+void AnimationPlayerEditor::_editor_load(){
+
+ Ref<Animation> anim = key_editor->get_current_animation();
+ if (anim.is_null())
+ return;
+
+ String existing = player->find_animation(anim);
+ if (existing!="") {
+ _select_anim_by_name(existing);
+ return; //already has
+ }
+
+ int count=1;
+ String base=anim->get_name();
+ bool noname=false;
+ if (base=="") {
+ base="New Anim";
+ noname=true;
+ }
+
+ while(true) {
+ String attempt = base;
+ if (count>1)
+ attempt+=" ("+itos(count)+")";
+ if (player->has_animation(attempt)) {
+ count++;
+ continue;
+ }
+ base=attempt;
+ break;
+ }
+
+ if (noname)
+ anim->set_name(base);
+
+ undo_redo->create_action("Add Animation From Editor");
+ undo_redo->add_do_method(player,"add_animation",base,anim);
+ undo_redo->add_undo_method(player,"remove_animation",base);
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+ _select_anim_by_name(base);
+
+
+}
+#endif
+
+void AnimationPlayerEditor::_animation_key_editor_anim_len_changed(float p_len) {
+
+
+ frame->set_max(p_len);
+
+}
+
+void AnimationPlayerEditor::_animation_key_editor_anim_step_changed(float p_len) {
+
+ if (p_len)
+ frame->set_step(p_len);
+ else
+ frame->set_step(0.00001);
+
+}
+
+
+void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos,bool p_drag) {
+
+ if (!is_visible_in_tree())
+ return;
+ if (!player)
+ return;
+
+ if (player->is_playing() )
+ return;
+
+ updating=true;
+ frame->set_value(p_pos);
+ updating=false;
+ _seek_value_changed(p_pos,!p_drag);
+
+ EditorNode::get_singleton()->get_property_editor()->refresh();
+
+
+
+ //seekit
+}
+
+void AnimationPlayerEditor::_hide_anim_editors() {
+
+ player=NULL;
+ hide();
+ set_process(false);
+
+ key_editor->set_animation(Ref<Animation>());
+ key_editor->set_root(NULL);
+ key_editor->show_select_node_warning(true);
+ //editor->animation_editor_make_visible(false);
+
+}
+
+
+void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
+
+ switch(p_option) {
+
+ case TOOL_COPY_ANIM: {
+
+ if (!animation->get_item_count()) {
+ error_dialog->set_text(TTR("ERROR: No animation to copy!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ //editor->edit_resource(anim);
+ EditorSettings::get_singleton()->set_resource_clipboard(anim);
+
+ } break;
+ case TOOL_PASTE_ANIM: {
+
+ Ref<Animation> anim = EditorSettings::get_singleton()->get_resource_clipboard();
+ if (!anim.is_valid()) {
+ error_dialog->set_text(TTR("ERROR: No animation resource on clipboard!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ String name = anim->get_name();
+ if (name=="") {
+ name=TTR("Pasted Animation");
+ }
+
+ int idx=1;
+ String base = name;
+ while (player->has_animation(name)) {
+
+ idx++;
+ name=base+" "+itos(idx);
+ }
+
+ undo_redo->create_action(TTR("Paste Animation"));
+ undo_redo->add_do_method(player,"add_animation",name,anim);
+ undo_redo->add_undo_method(player,"remove_animation",name);
+ undo_redo->add_do_method(this,"_animation_player_changed",player);
+ undo_redo->add_undo_method(this,"_animation_player_changed",player);
+ undo_redo->commit_action();
+
+ _select_anim_by_name(name);
+
+
+ } break;
+ case TOOL_EDIT_RESOURCE: {
+
+ if (!animation->get_item_count()) {
+ error_dialog->set_text(TTR("ERROR: No animation to edit!"));
+ error_dialog->popup_centered_minsize();
+ return;
+ }
+
+ String current = animation->get_item_text(animation->get_selected());
+ Ref<Animation> anim = player->get_animation(current);
+ editor->edit_resource(anim);
+
+ } break;
+
+ }
+}
+
+void AnimationPlayerEditor::_animation_save_menu(int p_option) {
+
+ String current = animation->get_item_text(animation->get_selected());
+ if (current != "") {
+ Ref<Animation> anim = player->get_animation(current);
+
+ switch (p_option) {
+ case ANIM_SAVE:
+ _animation_save(anim);
+ break;
+ case ANIM_SAVE_AS:
+ _animation_save_as(anim);
+ break;
+ }
+ }
+}
+
+void AnimationPlayerEditor::_unhandled_key_input(const InputEvent& p_ev) {
+
+ if (is_visible_in_tree() && p_ev.type==InputEvent::KEY && p_ev.key.pressed && !p_ev.key.echo && !p_ev.key.mod.alt && !p_ev.key.mod.control && !p_ev.key.mod.meta) {
+
+ switch(p_ev.key.scancode) {
+
+ case KEY_A: {
+ if (!p_ev.key.mod.shift)
+ _play_bw_from_pressed();
+ else
+ _play_bw_pressed();
+ } break;
+ case KEY_S: {
+ _stop_pressed();
+ } break;
+ case KEY_D: {
+ if (!p_ev.key.mod.shift)
+ _play_from_pressed();
+ else
+ _play_pressed();
+ } break;
+ }
+ }
+}
+
+void AnimationPlayerEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&AnimationPlayerEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&AnimationPlayerEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_play_pressed"),&AnimationPlayerEditor::_play_pressed);
+ ClassDB::bind_method(D_METHOD("_play_from_pressed"),&AnimationPlayerEditor::_play_from_pressed);
+ ClassDB::bind_method(D_METHOD("_play_bw_pressed"),&AnimationPlayerEditor::_play_bw_pressed);
+ ClassDB::bind_method(D_METHOD("_play_bw_from_pressed"),&AnimationPlayerEditor::_play_bw_from_pressed);
+ ClassDB::bind_method(D_METHOD("_stop_pressed"),&AnimationPlayerEditor::_stop_pressed);
+ ClassDB::bind_method(D_METHOD("_autoplay_pressed"),&AnimationPlayerEditor::_autoplay_pressed);
+ ClassDB::bind_method(D_METHOD("_pause_pressed"),&AnimationPlayerEditor::_pause_pressed);
+ ClassDB::bind_method(D_METHOD("_animation_selected"),&AnimationPlayerEditor::_animation_selected);
+ ClassDB::bind_method(D_METHOD("_animation_name_edited"),&AnimationPlayerEditor::_animation_name_edited);
+ ClassDB::bind_method(D_METHOD("_animation_new"),&AnimationPlayerEditor::_animation_new);
+ ClassDB::bind_method(D_METHOD("_animation_rename"),&AnimationPlayerEditor::_animation_rename);
+ ClassDB::bind_method(D_METHOD("_animation_load"),&AnimationPlayerEditor::_animation_load);
+ ClassDB::bind_method(D_METHOD("_animation_remove"),&AnimationPlayerEditor::_animation_remove);
+ ClassDB::bind_method(D_METHOD("_animation_remove_confirmed"),&AnimationPlayerEditor::_animation_remove_confirmed);
+ ClassDB::bind_method(D_METHOD("_animation_blend"),&AnimationPlayerEditor::_animation_blend);
+ ClassDB::bind_method(D_METHOD("_animation_edit"),&AnimationPlayerEditor::_animation_edit);
+ ClassDB::bind_method(D_METHOD("_animation_resource_edit"),&AnimationPlayerEditor::_animation_resource_edit);
+ ClassDB::bind_method(D_METHOD("_dialog_action"),&AnimationPlayerEditor::_dialog_action);
+ ClassDB::bind_method(D_METHOD("_seek_value_changed"),&AnimationPlayerEditor::_seek_value_changed,DEFVAL(true));
+ ClassDB::bind_method(D_METHOD("_animation_player_changed"),&AnimationPlayerEditor::_animation_player_changed);
+ ClassDB::bind_method(D_METHOD("_blend_edited"),&AnimationPlayerEditor::_blend_edited);
+ //ClassDB::bind_method(D_METHOD("_seek_frame_changed"),&AnimationPlayerEditor::_seek_frame_changed);
+ ClassDB::bind_method(D_METHOD("_scale_changed"),&AnimationPlayerEditor::_scale_changed);
+ //ClassDB::bind_method(D_METHOD("_editor_store_all"),&AnimationPlayerEditor::_editor_store_all);
+ //ClassDB::bind_method(D_METHOD("_editor_load_all"),&AnimationPlayerEditor::_editor_load_all);
+ ClassDB::bind_method(D_METHOD("_list_changed"),&AnimationPlayerEditor::_list_changed);
+ ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"),&AnimationPlayerEditor::_animation_key_editor_seek);
+ ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"),&AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
+ ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_step_changed"),&AnimationPlayerEditor::_animation_key_editor_anim_step_changed);
+ ClassDB::bind_method(D_METHOD("_hide_anim_editors"),&AnimationPlayerEditor::_hide_anim_editors);
+ ClassDB::bind_method(D_METHOD("_animation_duplicate"),&AnimationPlayerEditor::_animation_duplicate);
+ ClassDB::bind_method(D_METHOD("_blend_editor_next_changed"),&AnimationPlayerEditor::_blend_editor_next_changed);
+ ClassDB::bind_method(D_METHOD("_unhandled_key_input"),&AnimationPlayerEditor::_unhandled_key_input);
+ ClassDB::bind_method(D_METHOD("_animation_tool_menu"),&AnimationPlayerEditor::_animation_tool_menu);
+ ClassDB::bind_method(D_METHOD("_animation_save_menu"), &AnimationPlayerEditor::_animation_save_menu);
+
+
+
+
+}
+
+AnimationPlayerEditor *AnimationPlayerEditor::singleton=NULL;
+
+AnimationPlayer *AnimationPlayerEditor::get_player() const {
+
+ return player;
+}
+AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) {
+ editor=p_editor;
+ singleton=this;
+
+ updating=false;
+
+ set_focus_mode(FOCUS_ALL);
+
+ player=NULL;
+ add_style_override("panel", get_stylebox("panel","Panel"));
+
+
+ Label * l;
+
+ /*l= memnew( Label );
+ l->set_text("Animation Player:");
+ add_child(l);*/
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+
+
+ play_bw_from = memnew( ToolButton );
+ play_bw_from->set_tooltip(TTR("Play selected animation backwards from current pos. (A)"));
+ hb->add_child(play_bw_from);
+
+ play_bw = memnew( ToolButton );
+ play_bw->set_tooltip(TTR("Play selected animation backwards from end. (Shift+A)"));
+ hb->add_child(play_bw);
+
+ stop = memnew( ToolButton );
+ stop->set_toggle_mode(true);
+ hb->add_child(stop);
+ stop->set_tooltip(TTR("Stop animation playback. (S)"));
+
+ play = memnew( ToolButton );
+ play->set_tooltip(TTR("Play selected animation from start. (Shift+D)"));
+ hb->add_child(play);
+
+
+ play_from = memnew( ToolButton );
+ play_from->set_tooltip(TTR("Play selected animation from current pos. (D)"));
+ hb->add_child(play_from);
+
+
+
+ //pause = memnew( Button );
+ //pause->set_toggle_mode(true);
+ //hb->add_child(pause);
+
+ frame = memnew( SpinBox );
+ hb->add_child(frame);
+ frame->set_custom_minimum_size(Size2(60,0));
+ frame->set_stretch_ratio(2);
+ frame->set_tooltip(TTR("Animation position (in seconds)."));
+
+ hb->add_child( memnew( VSeparator));
+
+ scale = memnew( LineEdit );
+ hb->add_child(scale);
+ scale->set_h_size_flags(SIZE_EXPAND_FILL);
+ scale->set_stretch_ratio(1);
+ scale->set_tooltip(TTR("Scale animation playback globally for the node."));
+ scale->hide();
+
+
+ add_anim = memnew( ToolButton );
+ ED_SHORTCUT("animation_player_editor/add_animation", TTR("Create new animation in player."));
+ add_anim->set_shortcut(ED_GET_SHORTCUT("animation_player_editor/add_animation"));
+ add_anim->set_tooltip(TTR("Create new animation in player."));
+
+ hb->add_child(add_anim);
+
+
+ load_anim = memnew( ToolButton );
+ ED_SHORTCUT("animation_player_editor/load_from_disk", TTR("Load animation from disk."));
+ add_anim->set_shortcut(ED_GET_SHORTCUT("animation_player_editor/load_from_disk"));
+ load_anim->set_tooltip(TTR("Load an animation from disk."));
+ hb->add_child(load_anim);
+
+ save_anim = memnew(MenuButton);
+ save_anim->set_tooltip(TTR("Save the current animation"));
+ save_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/save", TTR("Save")), ANIM_SAVE);
+ save_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/save_as", TTR("Save As")), ANIM_SAVE_AS);
+ save_anim->set_focus_mode(Control::FOCUS_NONE);
+ hb->add_child(save_anim);
+
+ accept = memnew(AcceptDialog);
+ add_child(accept);
+ accept->connect("confirmed", this, "_menu_confirm_current");
+
+ delete_dialog = memnew(ConfirmationDialog);
+ add_child(delete_dialog);
+ delete_dialog->connect("confirmed", this, "_animation_remove_confirmed");
+
+ duplicate_anim = memnew( ToolButton );
+ hb->add_child(duplicate_anim);
+ ED_SHORTCUT("animation_player_editor/duplicate_animation", TTR("Duplicate Animation"));
+ duplicate_anim->set_shortcut(ED_GET_SHORTCUT("animation_player_editor/duplicate_animation"));
+ duplicate_anim->set_tooltip(TTR("Duplicate Animation"));
+
+ rename_anim = memnew( ToolButton );
+ hb->add_child(rename_anim);
+ ED_SHORTCUT("animation_player_editor/rename_animation", TTR("Rename Animation"));
+ rename_anim->set_shortcut(ED_GET_SHORTCUT("animation_player_editor/rename_animation"));
+ rename_anim->set_tooltip(TTR("Rename Animation"));
+
+ remove_anim = memnew( ToolButton );
+ hb->add_child(remove_anim);
+ ED_SHORTCUT("animation_player_editor/remove_animation", TTR("Remove Animation"));
+ remove_anim->set_shortcut(ED_GET_SHORTCUT("animation_player_editor/remove_animation"));
+ remove_anim->set_tooltip(TTR("Remove Animation"));
+
+
+ animation = memnew( OptionButton );
+ hb->add_child(animation);
+ animation->set_h_size_flags(SIZE_EXPAND_FILL);
+ animation->set_tooltip(TTR("Display list of animations in player."));
+ animation->set_clip_text(true);
+
+ autoplay = memnew( ToolButton );
+ hb->add_child(autoplay);
+ autoplay->set_tooltip(TTR("Autoplay on Load"));
+
+
+
+ blend_anim = memnew( ToolButton );
+ hb->add_child(blend_anim);
+ blend_anim->set_tooltip(TTR("Edit Target Blend Times"));
+
+ tool_anim = memnew( MenuButton);
+ //tool_anim->set_flat(false);
+ tool_anim->set_tooltip(TTR("Animation Tools"));
+ tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/copy_animation", TTR("Copy Animation")),TOOL_COPY_ANIM);
+ tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/paste_animation", TTR("Paste Animation")),TOOL_PASTE_ANIM);
+ //tool_anim->get_popup()->add_separator();
+ //tool_anim->get_popup()->add_item("Edit Anim Resource",TOOL_PASTE_ANIM);
+ hb->add_child(tool_anim);
+
+ nodename = memnew( Button );
+ hb->add_child(nodename);
+ pin = memnew( ToolButton );
+ pin->set_toggle_mode(true);
+ hb->add_child(pin);
+
+
+
+ resource_edit_anim= memnew( Button );
+ hb->add_child(resource_edit_anim);
+ resource_edit_anim->hide();
+
+
+ file = memnew(EditorFileDialog);
+ add_child(file);
+
+ name_dialog = memnew( ConfirmationDialog );
+ name_dialog->set_title(TTR("Create New Animation"));
+ name_dialog->set_hide_on_ok(false);
+ add_child(name_dialog);
+ name = memnew( LineEdit );
+ name_dialog->add_child(name);
+ name->set_pos(Point2(18,30));
+ name->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,10);
+ name_dialog->register_text_enter(name);
+
+
+ l = memnew( Label );
+ l->set_text(TTR("Animation Name:"));
+ l->set_pos( Point2(10,10) );
+
+ name_dialog->add_child(l);
+ name_title=l;
+
+ error_dialog = memnew( ConfirmationDialog );
+ error_dialog->get_ok()->set_text(TTR("Close"));
+ //error_dialog->get_cancel()->set_text("Close");
+ error_dialog->set_text(TTR("Error!"));
+ add_child(error_dialog);
+
+ name_dialog->connect("confirmed", this,"_animation_name_edited");
+
+ blend_editor.dialog = memnew( AcceptDialog );
+ add_child(blend_editor.dialog);
+ blend_editor.dialog->get_ok()->set_text(TTR("Close"));
+ blend_editor.dialog->set_hide_on_ok(true);
+ VBoxContainer *blend_vb = memnew( VBoxContainer);
+ blend_editor.dialog->add_child(blend_vb);
+ //blend_editor.dialog->set_child_rect(blend_vb);
+ blend_editor.tree = memnew( Tree );
+ blend_editor.tree->set_columns(2);
+ blend_vb->add_margin_child(TTR("Blend Times:"),blend_editor.tree,true);
+ blend_editor.next = memnew( OptionButton );
+ blend_vb->add_margin_child(TTR("Next (Auto Queue):"),blend_editor.next);
+ blend_editor.dialog->set_title(TTR("Cross-Animation Blend Times"));
+ updating_blends=false;
+
+ blend_editor.tree->connect("item_edited",this,"_blend_edited");
+
+
+ autoplay->connect("pressed", this,"_autoplay_pressed");
+ autoplay->set_toggle_mode(true);
+ play->connect("pressed", this,"_play_pressed");
+ play_from->connect("pressed", this,"_play_from_pressed");
+ play_bw->connect("pressed", this,"_play_bw_pressed");
+ play_bw_from->connect("pressed", this,"_play_bw_from_pressed");
+ stop->connect("pressed", this,"_stop_pressed");
+ //pause->connect("pressed", this,"_pause_pressed");
+ add_anim->connect("pressed", this,"_animation_new");
+ rename_anim->connect("pressed", this,"_animation_rename");
+ load_anim->connect("pressed", this,"_animation_load");
+ duplicate_anim->connect("pressed", this,"_animation_duplicate");
+ //frame->connect("text_entered", this,"_seek_frame_changed");
+
+ blend_anim->connect("pressed", this,"_animation_blend");
+ remove_anim->connect("pressed", this,"_animation_remove");
+ animation->connect("item_selected", this,"_animation_selected",Vector<Variant>(),true);
+ resource_edit_anim->connect("pressed", this,"_animation_resource_edit");
+ file->connect("file_selected", this,"_dialog_action");
+ frame->connect("value_changed", this, "_seek_value_changed",Vector<Variant>(),true);
+ scale->connect("text_entered", this, "_scale_changed",Vector<Variant>(),true);
+
+
+
+ renaming=false;
+ last_active=false;
+
+ set_process_unhandled_key_input(true);
+
+ key_editor = memnew( AnimationKeyEditor);
+ add_child(key_editor);
+ add_constant_override("separation",get_constant("separation","VBoxContainer"));
+ key_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+ key_editor->connect("timeline_changed",this,"_animation_key_editor_seek");
+ key_editor->connect("animation_len_changed",this,"_animation_key_editor_anim_len_changed");
+ key_editor->connect("animation_step_changed",this,"_animation_key_editor_anim_step_changed");
+
+ _update_player();
+}
+
+
+void AnimationPlayerEditorPlugin::edit(Object *p_object) {
+
+ anim_editor->set_undo_redo(&get_undo_redo());
+ if (!p_object)
+ return;
+ anim_editor->edit(p_object->cast_to<AnimationPlayer>());
+
+
+}
+
+bool AnimationPlayerEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("AnimationPlayer");
+}
+
+void AnimationPlayerEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ editor->make_bottom_panel_item_visible(anim_editor);
+ anim_editor->set_process(true);
+ anim_editor->ensure_visibility();
+ //editor->animation_panel_make_visible(true);
+ } else {
+
+ //anim_editor->hide();
+ //anim_editor->set_idle_process(false);
+ }
+
+}
+
+AnimationPlayerEditorPlugin::AnimationPlayerEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ anim_editor = memnew( AnimationPlayerEditor(editor) );
+ anim_editor->set_undo_redo(editor->get_undo_redo());
+
+ editor->add_bottom_panel_item(TTR("Animation"),anim_editor);
+ /*
+ editor->get_viewport()->add_child(anim_editor);
+ anim_editor->set_area_as_parent_rect();
+ anim_editor->set_anchor( MARGIN_TOP, Control::ANCHOR_END);
+ anim_editor->set_margin( MARGIN_TOP, 75 );
+ anim_editor->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END);
+ anim_editor->set_margin( MARGIN_RIGHT, 0 );*/
+ anim_editor->hide();
+
+
+
+}
+
+
+AnimationPlayerEditorPlugin::~AnimationPlayerEditorPlugin()
+{
+}
diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h
new file mode 100644
index 0000000000..d9b6ad52ff
--- /dev/null
+++ b/editor/plugins/animation_player_editor_plugin.h
@@ -0,0 +1,219 @@
+/*************************************************************************/
+/* animation_player_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ANIMATION_PLAYER_EDITOR_PLUGIN_H
+#define ANIMATION_PLAYER_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/animation/animation_player.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/texture_button.h"
+#include "scene/gui/slider.h"
+#include "scene/gui/spin_box.h"
+
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class AnimationKeyEditor;
+class AnimationPlayerEditor : public VBoxContainer {
+
+ GDCLASS(AnimationPlayerEditor, VBoxContainer );
+
+ EditorNode *editor;
+ AnimationPlayer *player;
+
+ enum {
+ TOOL_COPY_ANIM,
+ TOOL_PASTE_ANIM,
+ TOOL_EDIT_RESOURCE
+ };
+
+ enum {
+ ANIM_SAVE,
+ ANIM_SAVE_AS
+ };
+
+ enum {
+ RESOURCE_LOAD,
+ RESOURCE_SAVE
+ };
+
+
+ OptionButton *animation;
+ Button *stop;
+ Button *play;
+ Button *play_from;
+ Button *play_bw;
+ Button *play_bw_from;
+
+ //Button *pause;
+ Button *add_anim;
+ Button *autoplay;
+ Button *rename_anim;
+ Button *duplicate_anim;
+
+ Button *resource_edit_anim;
+ Button *load_anim;
+ MenuButton *save_anim;
+ Button *blend_anim;
+ Button *remove_anim;
+ MenuButton *tool_anim;
+ ToolButton *pin;
+ Button *nodename;
+ SpinBox *frame;
+ LineEdit *scale;
+ LineEdit *name;
+ Label *name_title;
+ UndoRedo *undo_redo;
+ Ref<Texture> autoplay_icon;
+ bool last_active;
+
+ EditorFileDialog *file;
+ AcceptDialog *accept;
+ ConfirmationDialog* delete_dialog;
+ int current_option;
+
+ struct BlendEditor {
+
+ AcceptDialog * dialog;
+ Tree *tree;
+ OptionButton *next;
+
+ } blend_editor;
+
+
+ ConfirmationDialog *name_dialog;
+ ConfirmationDialog *error_dialog;
+ bool renaming;
+
+
+ bool updating;
+ bool updating_blends;
+
+ AnimationKeyEditor *key_editor;
+
+
+ void _select_anim_by_name(const String& p_anim);
+ void _play_pressed();
+ void _play_from_pressed();
+ void _play_bw_pressed();
+ void _play_bw_from_pressed();
+ void _autoplay_pressed();
+ void _stop_pressed();
+ void _pause_pressed();
+ void _animation_selected(int p_which);
+ void _animation_new();
+ void _animation_rename();
+ void _animation_name_edited();
+ void _animation_load();
+
+ void _animation_save_in_path(const Ref<Resource>& p_resource, const String& p_path);
+ void _animation_save(const Ref<Resource>& p_resource);
+ void _animation_save_as(const Ref<Resource>& p_resource);
+
+ void _animation_remove();
+ void _animation_remove_confirmed();
+ void _animation_blend();
+ void _animation_edit();
+ void _animation_duplicate();
+ void _animation_resource_edit();
+ void _scale_changed(const String& p_scale);
+ void _dialog_action(String p_file);
+ void _seek_frame_changed(const String& p_frame);
+ void _seek_value_changed(float p_value, bool p_set=false);
+ void _blend_editor_next_changed(const int p_idx);
+
+ void _list_changed();
+ void _update_animation();
+ void _update_player();
+ void _blend_edited();
+
+
+ void _hide_anim_editors();
+
+ void _animation_player_changed(Object *p_pl);
+
+ void _animation_key_editor_seek(float p_pos, bool p_drag);
+ void _animation_key_editor_anim_len_changed(float p_new);
+ void _animation_key_editor_anim_step_changed(float p_len);
+
+ void _unhandled_key_input(const InputEvent& p_ev);
+ void _animation_tool_menu(int p_option);
+ void _animation_save_menu(int p_option);
+
+
+ AnimationPlayerEditor();
+protected:
+
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ AnimationPlayer *get_player() const;
+ static AnimationPlayerEditor *singleton;
+
+ AnimationKeyEditor* get_key_editor() { return key_editor; }
+ Dictionary get_state() const;
+ void set_state(const Dictionary& p_state);
+
+
+ void ensure_visibility();
+
+ void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo=p_undo_redo; }
+ void edit(AnimationPlayer *p_player);
+ AnimationPlayerEditor(EditorNode *p_editor);
+};
+
+class AnimationPlayerEditorPlugin : public EditorPlugin {
+
+ GDCLASS( AnimationPlayerEditorPlugin, EditorPlugin );
+
+ AnimationPlayerEditor *anim_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual Dictionary get_state() const { return anim_editor->get_state(); }
+ virtual void set_state(const Dictionary& p_state) { anim_editor->set_state(p_state); }
+
+ virtual String get_name() const { return "Anim"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ AnimationPlayerEditorPlugin(EditorNode *p_node);
+ ~AnimationPlayerEditorPlugin();
+
+};
+
+#endif // ANIMATION_PLAYER_EDITOR_PLUGIN_H
diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp
new file mode 100644
index 0000000000..988136d475
--- /dev/null
+++ b/editor/plugins/animation_tree_editor_plugin.cpp
@@ -0,0 +1,1536 @@
+/*************************************************************************/
+/* animation_tree_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "animation_tree_editor_plugin.h"
+
+#include "scene/gui/menu_button.h"
+#include "scene/gui/panel.h"
+#include "scene/main/viewport.h"
+#include "core/io/resource_loader.h"
+#include "core/global_config.h"
+#include "os/input.h"
+#include "os/keyboard.h"
+
+void AnimationTreeEditor::edit(AnimationTreePlayer* p_anim_tree) {
+
+
+ anim_tree=p_anim_tree;
+
+ if (!anim_tree) {
+ hide();
+ } else {
+ order.clear();
+ p_anim_tree->get_node_list(&order);
+ /*
+ for(List<StringName>::Element* E=order.front();E;E=E->next()) {
+
+ if (E->get() >= (int)last_id)
+ last_id=E->get()+1;
+ }*/
+ play_button->set_pressed(p_anim_tree->is_active());
+ //read the orders
+ }
+
+}
+
+Size2 AnimationTreeEditor::_get_maximum_size() {
+
+ Size2 max;
+
+ for(List<StringName>::Element *E=order.front();E;E=E->next()) {
+
+ Point2 pos = anim_tree->node_get_pos(E->get());
+
+ if (click_type==CLICK_NODE && click_node==E->get()) {
+
+ pos+=click_motion-click_pos;
+ }
+ pos+=get_node_size(E->get());
+ if (pos.x>max.x)
+ max.x=pos.x;
+ if (pos.y>max.y)
+ max.y=pos.y;
+
+ }
+
+ return max;
+}
+
+
+const char* AnimationTreeEditor::_node_type_names[]={"Output","Animation","OneShot","Mix","Blend2","Blend3","Blend4","TimeScale","TimeSeek","Transition"};
+
+Size2 AnimationTreeEditor::get_node_size(const StringName& p_node) const {
+
+ AnimationTreePlayer::NodeType type=anim_tree->node_get_type(p_node);
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Ref<Font> font = get_font("font","PopupMenu");
+
+ Size2 size = style->get_minimum_size();
+
+ int count=2; // title and name
+ int inputs = anim_tree->node_get_input_count(p_node);
+ count += inputs?inputs:1;
+ String name = p_node;
+
+
+ float name_w = font->get_string_size( name ).width;
+ float type_w = font->get_string_size( String(_node_type_names[type]) ).width;
+ float max_w=MAX(name_w,type_w);
+
+
+
+ switch(type) {
+ case AnimationTreePlayer::NODE_TIMESEEK:
+ case AnimationTreePlayer::NODE_OUTPUT: {} break;
+ case AnimationTreePlayer::NODE_ANIMATION:
+ case AnimationTreePlayer::NODE_ONESHOT:
+ case AnimationTreePlayer::NODE_MIX:
+ case AnimationTreePlayer::NODE_BLEND2:
+ case AnimationTreePlayer::NODE_BLEND3:
+ case AnimationTreePlayer::NODE_BLEND4:
+ case AnimationTreePlayer::NODE_TIMESCALE:
+ case AnimationTreePlayer::NODE_TRANSITION: {
+
+
+ size.height+=font->get_height();
+ } break;
+ case AnimationTreePlayer::NODE_MAX: {}
+ }
+
+ size.x+=max_w+20;
+ size.y+=count*(font->get_height()+get_constant("vseparation","PopupMenu"));
+
+ return size;
+}
+
+
+void AnimationTreeEditor::_edit_dialog_changede(String) {
+
+ edit_dialog->hide();
+}
+
+void AnimationTreeEditor::_edit_dialog_changeds(String s) {
+
+ _edit_dialog_changed();
+}
+
+void AnimationTreeEditor::_edit_dialog_changedf(float) {
+
+ _edit_dialog_changed();
+}
+
+void AnimationTreeEditor::_edit_dialog_changed() {
+
+ if (updating_edit)
+ return;
+
+ if (renaming_edit) {
+
+ if (anim_tree->node_rename(edited_node,edit_line[0]->get_text())==OK) {
+ for(List<StringName>::Element* E=order.front();E;E=E->next()) {
+
+ if (E->get() == edited_node)
+ E->get()=edit_line[0]->get_text();
+ }
+ edited_node=edit_line[0]->get_text();
+ }
+ update();
+ return;
+ }
+
+ AnimationTreePlayer::NodeType type=anim_tree->node_get_type(edited_node);
+
+ switch(type) {
+
+ case AnimationTreePlayer::NODE_TIMESCALE:
+ anim_tree->timescale_node_set_scale(edited_node,edit_line[0]->get_text().to_double());
+ break;
+ case AnimationTreePlayer::NODE_ONESHOT:
+ anim_tree->oneshot_node_set_fadein_time(edited_node,edit_line[0]->get_text().to_double());
+ anim_tree->oneshot_node_set_fadeout_time(edited_node,edit_line[1]->get_text().to_double());
+ anim_tree->oneshot_node_set_autorestart_delay(edited_node,edit_line[2]->get_text().to_double());
+ anim_tree->oneshot_node_set_autorestart_random_delay(edited_node,edit_line[3]->get_text().to_double());
+ anim_tree->oneshot_node_set_autorestart(edited_node,edit_check->is_pressed());
+ anim_tree->oneshot_node_set_mix_mode(edited_node,edit_option->get_selected());
+
+ break;
+
+ case AnimationTreePlayer::NODE_MIX:
+
+ anim_tree->mix_node_set_amount(edited_node,edit_scroll[0]->get_value());
+ break;
+ case AnimationTreePlayer::NODE_BLEND2:
+ anim_tree->blend2_node_set_amount(edited_node,edit_scroll[0]->get_value());
+
+ break;
+
+ case AnimationTreePlayer::NODE_BLEND3:
+ anim_tree->blend3_node_set_amount(edited_node,edit_scroll[0]->get_value());
+
+ break;
+ case AnimationTreePlayer::NODE_BLEND4:
+
+ anim_tree->blend4_node_set_amount(edited_node,Point2(edit_scroll[0]->get_value(),edit_scroll[1]->get_value()));
+
+ break;
+
+ case AnimationTreePlayer::NODE_TRANSITION: {
+ anim_tree->transition_node_set_xfade_time(edited_node,edit_line[0]->get_text().to_double());
+ if (anim_tree->transition_node_get_current(edited_node)!=edit_option->get_selected())
+ anim_tree->transition_node_set_current(edited_node,edit_option->get_selected());
+ } break;
+ default: {}
+ }
+
+}
+
+void AnimationTreeEditor::_edit_dialog_animation_changed() {
+
+
+ Ref<Animation> anim = property_editor->get_variant().operator RefPtr();
+ anim_tree->animation_node_set_animation(edited_node,anim);
+ update();
+}
+
+void AnimationTreeEditor::_edit_dialog_edit_animation() {
+
+ if (get_tree()->is_editor_hint()) {
+ get_tree()->get_root()->get_child(0)->call("_resource_selected", property_editor->get_variant().operator RefPtr());
+ };
+};
+
+void AnimationTreeEditor::_edit_oneshot_start() {
+
+ anim_tree->oneshot_node_start(edited_node);
+}
+
+void AnimationTreeEditor::_play_toggled() {
+
+ anim_tree->set_active(play_button->is_pressed());
+}
+
+
+void AnimationTreeEditor::_master_anim_menu_item(int p_item) {
+
+ if(p_item == 0) _edit_filters();
+ else {
+
+ String str = master_anim_popup->get_item_text(p_item);
+ anim_tree->animation_node_set_master_animation(edited_node,str);
+ }
+ update();
+}
+
+void AnimationTreeEditor::_popup_edit_dialog() {
+
+ updating_edit=true;
+
+ for(int i=0;i<2;i++)
+ edit_scroll[i]->hide();
+
+ for(int i=0;i<4;i++) {
+
+ edit_line[i]->hide();
+ edit_label[i]->hide();
+ }
+
+ edit_option->hide();
+ edit_button->hide();
+ filter_button->hide();
+ edit_check->hide();
+
+ Point2 pos = anim_tree->node_get_pos(edited_node)-Point2(h_scroll->get_value(),v_scroll->get_value());
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Size2 size = get_node_size(edited_node);
+ Point2 popup_pos( pos.x+style->get_margin(MARGIN_LEFT), pos.y+size.y-style->get_margin(MARGIN_BOTTOM));
+ popup_pos+=get_global_pos();
+
+ if (renaming_edit) {
+
+ edit_label[0]->set_text(TTR("New name:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_line[0]->set_begin(Point2(15,25));
+ edit_line[0]->set_text(edited_node);
+ edit_line[0]->show();
+ edit_dialog->set_size(Size2(150,50));
+
+ } else {
+
+ AnimationTreePlayer::NodeType type=anim_tree->node_get_type(edited_node);
+
+
+ switch(type) {
+
+ case AnimationTreePlayer::NODE_ANIMATION:
+
+ if (anim_tree->get_master_player()!=NodePath() && anim_tree->has_node(anim_tree->get_master_player()) && anim_tree->get_node(anim_tree->get_master_player())->cast_to<AnimationPlayer>()) {
+
+ AnimationPlayer *ap = anim_tree->get_node(anim_tree->get_master_player())->cast_to<AnimationPlayer>();
+ master_anim_popup->clear();
+ master_anim_popup->add_item("Edit Filters");
+ master_anim_popup->add_separator();
+ List<StringName> sn;
+ ap->get_animation_list(&sn);
+ sn.sort_custom<StringName::AlphCompare>();
+ for (List<StringName>::Element *E=sn.front();E;E=E->next()) {
+ master_anim_popup->add_item(E->get());
+ }
+
+ master_anim_popup->set_pos(popup_pos);
+ master_anim_popup->popup();
+ } else {
+ property_editor->edit(this,"",Variant::OBJECT,anim_tree->animation_node_get_animation(edited_node),PROPERTY_HINT_RESOURCE_TYPE,"Animation");
+ property_editor->set_pos(popup_pos);
+ property_editor->popup();
+ updating_edit=false;
+ }
+ return;
+ case AnimationTreePlayer::NODE_TIMESCALE:
+ edit_label[0]->set_text(TTR("Scale:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_line[0]->set_begin(Point2(15,25));
+ edit_line[0]->set_text(rtos(anim_tree->timescale_node_get_scale(edited_node)));
+ edit_line[0]->show();
+ edit_dialog->set_size(Size2(150,50));
+ break;
+ case AnimationTreePlayer::NODE_ONESHOT:
+ edit_label[0]->set_text(TTR("Fade In (s):"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_line[0]->set_begin(Point2(15,25));
+ edit_line[0]->set_text(rtos(anim_tree->oneshot_node_get_fadein_time(edited_node)));
+ edit_line[0]->show();
+ edit_label[1]->set_text(TTR("Fade Out (s):"));
+ edit_label[1]->set_pos(Point2(5,55));
+ edit_label[1]->show();
+ edit_line[1]->set_begin(Point2(15,75));
+ edit_line[1]->set_text(rtos(anim_tree->oneshot_node_get_fadeout_time(edited_node)));
+ edit_line[1]->show();
+
+ edit_option->clear();
+ edit_option->add_item(TTR("Blend"),0);
+ edit_option->add_item(TTR("Mix"),1);
+ edit_option->set_begin(Point2(15,105));
+
+ edit_option->select( anim_tree->oneshot_node_get_mix_mode(edited_node));
+ edit_option->show();
+
+ edit_check->set_text(TTR("Auto Restart:"));
+ edit_check->set_begin(Point2(15,125));
+ edit_check->set_pressed(anim_tree->oneshot_node_has_autorestart(edited_node));
+ edit_check->show();
+
+ edit_label[2]->set_text(TTR("Restart (s):"));
+ edit_label[2]->set_pos(Point2(5,145));
+ edit_label[2]->show();
+ edit_line[2]->set_begin(Point2(15,165));
+ edit_line[2]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_delay(edited_node)));
+ edit_line[2]->show();
+ edit_label[3]->set_text(TTR("Random Restart (s):"));
+ edit_label[3]->set_pos(Point2(5,195));
+ edit_label[3]->show();
+ edit_line[3]->set_begin(Point2(15,215));
+ edit_line[3]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_random_delay(edited_node)));
+ edit_line[3]->show();
+
+ filter_button->set_begin(Point2(10,245));
+ filter_button->show();
+
+ edit_button->set_begin(Point2(10,268));
+ edit_button->set_text(TTR("Start!"));
+
+ edit_button->show();
+
+ edit_dialog->set_size(Size2(180,293));
+
+ break;
+
+ case AnimationTreePlayer::NODE_MIX:
+
+ edit_label[0]->set_text(TTR("Amount:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_scroll[0]->set_min(0);
+ edit_scroll[0]->set_max(1);
+ edit_scroll[0]->set_value(anim_tree->mix_node_get_amount(edited_node));
+ edit_scroll[0]->set_begin(Point2(15,25));
+ edit_scroll[0]->show();
+ edit_dialog->set_size(Size2(150,50));
+
+ break;
+ case AnimationTreePlayer::NODE_BLEND2:
+ edit_label[0]->set_text(TTR("Blend:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_scroll[0]->set_min(0);
+ edit_scroll[0]->set_max(1);
+ edit_scroll[0]->set_value(anim_tree->blend2_node_get_amount(edited_node));
+ edit_scroll[0]->set_begin(Point2(15,25));
+ edit_scroll[0]->show();
+ filter_button->set_begin(Point2(10,47));
+ filter_button->show();
+ edit_dialog->set_size(Size2(150,74));
+
+ break;
+
+ case AnimationTreePlayer::NODE_BLEND3:
+ edit_label[0]->set_text(TTR("Blend:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_scroll[0]->set_min(-1);
+ edit_scroll[0]->set_max(1);
+ edit_scroll[0]->set_value(anim_tree->blend3_node_get_amount(edited_node));
+ edit_scroll[0]->set_begin(Point2(15,25));
+ edit_scroll[0]->show();
+ edit_dialog->set_size(Size2(150,50));
+
+ break;
+ case AnimationTreePlayer::NODE_BLEND4:
+
+ edit_label[0]->set_text(TTR("Blend 0:"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_scroll[0]->set_min(0);
+ edit_scroll[0]->set_max(1);
+ edit_scroll[0]->set_value(anim_tree->blend4_node_get_amount(edited_node).x);
+ edit_scroll[0]->set_begin(Point2(15,25));
+ edit_scroll[0]->show();
+ edit_label[1]->set_text(TTR("Blend 1:"));
+ edit_label[1]->set_pos(Point2(5,55));
+ edit_label[1]->show();
+ edit_scroll[1]->set_min(0);
+ edit_scroll[1]->set_max(1);
+ edit_scroll[1]->set_value(anim_tree->blend4_node_get_amount(edited_node).y);
+ edit_scroll[1]->set_begin(Point2(15,75));
+ edit_scroll[1]->show();
+ edit_dialog->set_size(Size2(150,100));
+
+ break;
+
+ case AnimationTreePlayer::NODE_TRANSITION: {
+
+
+ edit_label[0]->set_text(TTR("X-Fade Time (s):"));
+ edit_label[0]->set_pos(Point2(5,5));
+ edit_label[0]->show();
+ edit_line[0]->set_begin(Point2(15,25));
+ edit_line[0]->set_text(rtos(anim_tree->transition_node_get_xfade_time(edited_node)));
+ edit_line[0]->show();
+
+ edit_label[1]->set_text(TTR("Current:"));
+ edit_label[1]->set_pos(Point2(5,55));
+ edit_label[1]->show();
+ edit_option->set_begin(Point2(15,75));
+
+ edit_option->clear();
+
+ for(int i=0;i<anim_tree->transition_node_get_input_count(edited_node);i++) {
+ edit_option->add_item(itos(i),i);
+ }
+
+ edit_option->select(anim_tree->transition_node_get_current(edited_node));
+ edit_option->show();
+ edit_dialog->set_size(Size2(150,100));
+
+ } break;
+ default: {}
+
+ }
+
+ }
+
+
+
+ edit_dialog->set_pos(popup_pos);
+ edit_dialog->popup();
+
+ updating_edit=false;
+}
+
+void AnimationTreeEditor::_draw_node(const StringName& p_node) {
+
+ RID ci = get_canvas_item();
+ AnimationTreePlayer::NodeType type=anim_tree->node_get_type(p_node);
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Ref<Font> font = get_font("font","PopupMenu");
+ Color font_color = get_color("font_color","PopupMenu");
+ Color font_color_title = get_color("font_color_hover","PopupMenu");
+ font_color_title.a*=0.8;
+ Ref<Texture> slot_icon = get_icon("NodeRealSlot","EditorIcons");
+
+
+ Size2 size=get_node_size(p_node);
+ Point2 pos = anim_tree->node_get_pos(p_node);
+ if (click_type==CLICK_NODE && click_node==p_node) {
+
+ pos+=click_motion-click_pos;
+ if (pos.x<5)
+ pos.x=5;
+ if (pos.y<5)
+ pos.y=5;
+
+ }
+
+ pos-=Point2(h_scroll->get_value(),v_scroll->get_value());
+
+ style->draw(ci,Rect2(pos,size));
+
+ float w = size.width-style->get_minimum_size().width;
+ float h = font->get_height()+get_constant("vseparation","PopupMenu");
+
+ Point2 ofs=style->get_offset()+pos;
+ Point2 ascofs(0,font->get_ascent());
+
+ Color bx = font_color_title;
+ bx.a*=0.1;
+ draw_rect(Rect2(ofs,Size2(size.width-style->get_minimum_size().width,font->get_height())),bx);
+ font->draw_halign(ci,ofs+ascofs,HALIGN_CENTER,w,String(_node_type_names[type]),font_color_title);
+
+ ofs.y+=h;
+ font->draw_halign(ci,ofs+ascofs,HALIGN_CENTER,w,p_node,font_color);
+ ofs.y+=h;
+
+ int count=2; // title and name
+ int inputs = anim_tree->node_get_input_count(p_node);
+ count += inputs?inputs:1;
+
+ float icon_h_ofs = Math::floor(( font->get_height()-slot_icon->get_height())/2.0 )+1;
+
+ if (type!=AnimationTreePlayer::NODE_OUTPUT)
+ slot_icon->draw(ci,ofs+Point2(w,icon_h_ofs)); //output
+
+ if (inputs) {
+ for(int i=0;i<inputs;i++) {
+
+ slot_icon->draw(ci,ofs+Point2(-slot_icon->get_width(),icon_h_ofs));
+ String text;
+ switch(type) {
+
+ case AnimationTreePlayer::NODE_TIMESCALE:
+ case AnimationTreePlayer::NODE_TIMESEEK: text="in"; break;
+ case AnimationTreePlayer::NODE_OUTPUT: text="out"; break;
+ case AnimationTreePlayer::NODE_ANIMATION: break;
+ case AnimationTreePlayer::NODE_ONESHOT: text=(i==0?"in":"add"); break;
+ case AnimationTreePlayer::NODE_BLEND2:
+ case AnimationTreePlayer::NODE_MIX: text=(i==0?"a":"b"); break;
+ case AnimationTreePlayer::NODE_BLEND3:
+ switch(i) {
+ case 0: text="b-"; break;
+ case 1: text="a"; break;
+ case 2: text="b+"; break;
+
+ }
+ break;
+
+
+ case AnimationTreePlayer::NODE_BLEND4:
+ switch(i) {
+ case 0: text="a0"; break;
+ case 1: text="b0"; break;
+ case 2: text="a1"; break;
+ case 3: text="b1"; break;
+ }
+ break;
+
+ case AnimationTreePlayer::NODE_TRANSITION:
+ text=itos(i);
+ if (anim_tree->transition_node_has_input_auto_advance(p_node,i))
+ text+="->";
+
+ break;
+ default: {}
+ }
+ font->draw(ci,ofs+ascofs+Point2(3,0),text,font_color);
+
+ ofs.y+=h;
+ }
+ } else {
+ ofs.y+=h;
+ }
+
+ Ref<StyleBox> pg_bg=get_stylebox("bg","ProgressBar");
+ Ref<StyleBox> pg_fill=get_stylebox("fill","ProgressBar");
+ Rect2 pg_rect(ofs,Size2(w,h));
+
+ bool editable=true;
+ switch(type) {
+ case AnimationTreePlayer::NODE_ANIMATION: {
+
+ Ref<Animation> anim = anim_tree->animation_node_get_animation(p_node);
+ String text;
+ if (anim_tree->animation_node_get_master_animation(p_node)!="")
+ text=anim_tree->animation_node_get_master_animation(p_node);
+ else if (anim.is_null())
+ text="load..";
+ else
+ text=anim->get_name();
+
+ font->draw_halign(ci,ofs+ascofs,HALIGN_CENTER,w,text,font_color_title);
+
+ } break;
+ case AnimationTreePlayer::NODE_ONESHOT:
+ case AnimationTreePlayer::NODE_MIX:
+ case AnimationTreePlayer::NODE_BLEND2:
+ case AnimationTreePlayer::NODE_BLEND3:
+ case AnimationTreePlayer::NODE_BLEND4:
+ case AnimationTreePlayer::NODE_TIMESCALE:
+ case AnimationTreePlayer::NODE_TRANSITION: {
+
+ font->draw_halign(ci,ofs+ascofs,HALIGN_CENTER,w,"edit..",font_color_title);
+ } break;
+ default: editable=false;
+ }
+
+ if (editable) {
+
+ Ref<Texture> arrow = get_icon("arrow","Tree");
+ Point2 arrow_ofs( w-arrow->get_width(),Math::floor( (h-arrow->get_height())/2) );
+ arrow->draw(ci,ofs+arrow_ofs);
+ }
+}
+
+#if 0
+void AnimationTreeEditor::_node_param_changed() {
+
+ //anim_tree->node_set_param( click_node,property_editor->get_variant() );
+ //update();
+ //_write_anim_tree_graph();
+}
+#endif
+
+AnimationTreeEditor::ClickType AnimationTreeEditor::_locate_click(const Point2& p_click,StringName *p_node_id,int *p_slot_index) const {
+
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Ref<Font> font = get_font("font","PopupMenu");
+
+ float h = (font->get_height()+get_constant("vseparation","PopupMenu"));
+
+ for(const List<StringName>::Element *E=order.back();E;E=E->prev()) {
+
+ StringName node = E->get();
+
+ AnimationTreePlayer::NodeType type=anim_tree->node_get_type(node);
+
+ Point2 pos = anim_tree->node_get_pos(node);
+ Size2 size = get_node_size(node);
+
+ pos-=Point2(h_scroll->get_value(),v_scroll->get_value());
+
+ if (!Rect2(pos,size).has_point(p_click))
+ continue;
+
+ if (p_node_id)
+ *p_node_id=node;
+
+ pos=p_click-pos;
+
+ float y = pos.y-style->get_offset().height;
+
+ if (y<2*h)
+ return CLICK_NODE;
+ y-=2*h;
+
+ int inputs = anim_tree->node_get_input_count(node);
+ int count = MAX(inputs,1);
+
+ if (inputs==0 || (pos.x > size.width/2 && type != AnimationTreePlayer::NODE_OUTPUT)) {
+
+ if (y<count*h) {
+
+ if (p_slot_index)
+ *p_slot_index=0;
+ return CLICK_OUTPUT_SLOT;
+ }
+ }
+
+ for(int i=0;i<count;i++) {
+
+ if (y<h) {
+ if (p_slot_index)
+ *p_slot_index=i;
+ return CLICK_INPUT_SLOT;
+ }
+ y-=h;
+ }
+
+ bool has_parameters = type!=AnimationTreePlayer::NODE_OUTPUT && type!=AnimationTreePlayer::NODE_TIMESEEK;
+ return has_parameters ? CLICK_PARAMETER : CLICK_NODE;
+ }
+
+ return CLICK_NONE;
+}
+
+Point2 AnimationTreeEditor::_get_slot_pos(const StringName& p_node,bool p_input,int p_slot) {
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Ref<Font> font = get_font("font","PopupMenu");
+ Ref<Texture> slot_icon = get_icon("NodeRealSlot","EditorIcons");
+
+ Size2 size=get_node_size(p_node);
+ Point2 pos = anim_tree->node_get_pos(p_node);
+
+ if (click_type==CLICK_NODE && click_node==p_node) {
+
+ pos+=click_motion-click_pos;
+ if (pos.x<5)
+ pos.x=5;
+ if (pos.y<5)
+ pos.y=5;
+
+ }
+
+ pos-=Point2(h_scroll->get_value(),v_scroll->get_value());
+
+
+ float w = size.width-style->get_minimum_size().width;
+ float h = font->get_height()+get_constant("vseparation","PopupMenu");
+
+
+ pos+=style->get_offset();
+
+ pos.y+=h*2;
+
+ pos.y+=h*p_slot;
+
+ pos+=Point2( -slot_icon->get_width()/2.0, h/2.0).floor();
+
+ if(!p_input) {
+ pos.x+=w+slot_icon->get_width();
+
+ }
+
+ return pos;
+
+}
+
+#if 0
+void AnimationTreeEditor::_node_edit_property(const StringName& p_node) {
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ Size2 size = get_node_size(p_node);
+ Point2 pos = Point2( anim_tree->node_get_pos_x(p_node), anim_tree->node_get_pos_y(p_node) )-offset;
+
+ VisualServer::AnimationTreeNodeType type=anim_tree->node_get_type(p_node);
+
+ PropertyInfo ph = VisualServer::get_singleton()->anim_tree_node_get_type_info(type);
+ if (ph.type==Variant::NIL)
+ return;
+ if (ph.type==Variant::_RID)
+ ph.type=Variant::RESOURCE;
+
+ property_editor->edit(NULL,ph.name,ph.type,anim_tree->node_get_param(p_node),ph.hint,ph.hint_string);
+
+ Point2 popup_pos=Point2( pos.x+(size.width-property_editor->get_size().width)/2.0,pos.y+(size.y-style->get_margin(MARGIN_BOTTOM))).floor();
+ popup_pos+=get_global_pos();
+ property_editor->set_pos(popup_pos);
+
+ property_editor->popup();
+
+}
+#endif
+
+void AnimationTreeEditor::_gui_input(InputEvent p_event) {
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ if (p_event.mouse_button.pressed) {
+
+
+ if (p_event.mouse_button.button_index==1) {
+ click_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
+ click_motion=click_pos;
+ click_type = _locate_click(click_pos,&click_node,&click_slot);
+ if( click_type!=CLICK_NONE) {
+
+ order.erase(click_node);
+ order.push_back(click_node);
+ update();
+ }
+
+ switch(click_type) {
+ case CLICK_INPUT_SLOT: {
+ click_pos=_get_slot_pos(click_node,true,click_slot);
+ } break;
+ case CLICK_OUTPUT_SLOT: {
+ click_pos=_get_slot_pos(click_node,false,click_slot);
+ } break;
+ case CLICK_PARAMETER: {
+
+ edited_node=click_node;
+ renaming_edit=false;
+ _popup_edit_dialog();
+ //open editor
+ //_node_edit_property(click_node);
+ } break;
+ default:{}
+ }
+ }
+ if (p_event.mouse_button.button_index==2) {
+
+ if (click_type!=CLICK_NONE) {
+ click_type=CLICK_NONE;
+ update();
+ } else {
+ // try to disconnect/remove
+
+ Point2 rclick_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
+ rclick_type = _locate_click(rclick_pos,&rclick_node,&rclick_slot);
+ if (rclick_type==CLICK_INPUT_SLOT || rclick_type==CLICK_OUTPUT_SLOT) {
+
+ node_popup->clear();
+ node_popup->add_item(TTR("Disconnect"),NODE_DISCONNECT);
+ if (anim_tree->node_get_type(rclick_node)==AnimationTreePlayer::NODE_TRANSITION) {
+ node_popup->add_item(TTR("Add Input"),NODE_ADD_INPUT);
+ if (rclick_type==CLICK_INPUT_SLOT) {
+ if (anim_tree->transition_node_has_input_auto_advance(rclick_node,rclick_slot))
+ node_popup->add_item(TTR("Clear Auto-Advance"),NODE_CLEAR_AUTOADVANCE);
+ else
+ node_popup->add_item(TTR("Set Auto-Advance"),NODE_SET_AUTOADVANCE);
+ node_popup->add_item(TTR("Delete Input"),NODE_DELETE_INPUT);
+
+ }
+ }
+
+ node_popup->set_pos(rclick_pos+get_global_pos());
+ node_popup->popup();
+
+ }
+
+ if (rclick_type==CLICK_NODE) {
+ node_popup->clear();
+ node_popup->add_item(TTR("Rename"),NODE_RENAME);
+ node_popup->add_item(TTR("Remove"),NODE_ERASE);
+ if (anim_tree->node_get_type(rclick_node)==AnimationTreePlayer::NODE_TRANSITION)
+ node_popup->add_item(TTR("Add Input"),NODE_ADD_INPUT);
+ node_popup->set_pos(rclick_pos+get_global_pos());
+ node_popup->popup();
+ }
+
+
+ }
+ }
+ } else {
+
+ if (p_event.mouse_button.button_index==1 && click_type!=CLICK_NONE) {
+
+ switch(click_type) {
+ case CLICK_INPUT_SLOT:
+ case CLICK_OUTPUT_SLOT: {
+
+ Point2 dst_click_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
+ StringName id;
+ int slot;
+ ClickType dst_click_type = _locate_click(dst_click_pos,&id,&slot);
+
+ if (dst_click_type==CLICK_INPUT_SLOT && click_type==CLICK_OUTPUT_SLOT) {
+
+ anim_tree->connect_nodes(click_node,id,slot);
+
+ }
+ if (click_type==CLICK_INPUT_SLOT && dst_click_type==CLICK_OUTPUT_SLOT) {
+
+ anim_tree->connect_nodes(id,click_node,click_slot);
+ }
+
+ } break;
+ case CLICK_NODE: {
+ Point2 new_pos = anim_tree->node_get_pos(click_node)+(click_motion-click_pos);
+ if (new_pos.x<5)
+ new_pos.x=5;
+ if (new_pos.y<5)
+ new_pos.y=5;
+ anim_tree->node_set_pos(click_node,new_pos);
+
+ } break;
+ default: {}
+ }
+
+ click_type=CLICK_NONE;
+ update();
+ }
+ }
+ }
+
+ case InputEvent::MOUSE_MOTION: {
+
+ if (p_event.mouse_motion.button_mask&1 && click_type!=CLICK_NONE) {
+
+ click_motion=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
+ update();
+ }
+ if ((p_event.mouse_motion.button_mask&4 || Input::get_singleton()->is_key_pressed(KEY_SPACE))) {
+
+ h_scroll->set_value( h_scroll->get_value() - p_event.mouse_motion.relative_x );
+ v_scroll->set_value( v_scroll->get_value() - p_event.mouse_motion.relative_y );
+ update();
+ }
+
+ } break;
+ }
+
+}
+
+
+void AnimationTreeEditor::_draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color) {
+
+ static const int steps = 20;
+
+ Rect2 r;
+ r.pos=p_from;
+ r.expand_to(p_to);
+ Vector2 sign=Vector2((p_from.x < p_to.x) ? 1 : -1,(p_from.y < p_to.y) ? 1 : -1);
+ bool flip = sign.x * sign.y < 0;
+
+ Vector2 prev;
+ for(int i=0;i<=steps;i++) {
+
+ float d = i/float(steps);
+ float c=-Math::cos(d*Math_PI) * 0.5+0.5;
+ if (flip)
+ c=1.0-c;
+ Vector2 p = r.pos+Vector2(d*r.size.width,c*r.size.height);
+
+ if (i>0) {
+
+ draw_line(prev,p,p_color,2);
+ }
+
+ prev=p;
+ }
+}
+
+void AnimationTreeEditor::_notification(int p_what) {
+
+
+ switch(p_what) {
+
+ case NOTIFICATION_ENTER_TREE: {
+
+ play_button->set_icon( get_icon("Play","EditorIcons") );
+ add_menu->set_icon( get_icon("Add","EditorIcons") );
+ } break;
+ case NOTIFICATION_DRAW: {
+
+
+ _update_scrollbars();
+ //VisualServer::get_singleton()->canvas_item_add_rect(get_canvas_item(),Rect2(Point2(),get_size()),Color(0,0,0,1));
+ get_stylebox("bg","Tree")->draw(get_canvas_item(),Rect2(Point2(),get_size()));
+
+ for(List<StringName>::Element *E=order.front();E;E=E->next()) {
+
+ _draw_node(E->get());
+ }
+
+ if (click_type==CLICK_INPUT_SLOT || click_type==CLICK_OUTPUT_SLOT) {
+
+ _draw_cos_line(click_pos,click_motion,Color(0.5,1,0.5,0.8));
+ }
+
+ List<AnimationTreePlayer::Connection> connections;
+ anim_tree->get_connection_list(&connections);
+
+ for(List<AnimationTreePlayer::Connection>::Element *E=connections.front();E;E=E->next()) {
+
+ const AnimationTreePlayer::Connection &c=E->get();
+ Point2 source = _get_slot_pos(c.src_node,false,0);
+ Point2 dest = _get_slot_pos(c.dst_node,true,c.dst_input);
+ Color col = Color(1,1,0.5,0.8);
+/*
+ if (click_type==CLICK_NODE && click_node==c.src_node) {
+
+ source+=click_motion-click_pos;
+ }
+
+ if (click_type==CLICK_NODE && click_node==c.dst_node) {
+
+ dest+=click_motion-click_pos;
+ }*/
+
+ _draw_cos_line(source,dest,col);
+
+ }
+
+ switch(anim_tree->get_last_error()) {
+
+ case AnimationTreePlayer::CONNECT_OK: {
+
+ Ref<Font> f = get_font("font","Label");
+ f->draw(get_canvas_item(),Point2(5,25+f->get_ascent()),TTR("Animation tree is valid."),Color(0,1,0.6,0.8));
+ } break;
+ default: {
+
+ Ref<Font> f = get_font("font","Label");
+ f->draw(get_canvas_item(),Point2(5,25+f->get_ascent()),TTR("Animation tree is invalid."),Color(1,0.6,0.0,0.8));
+ } break;
+ }
+
+ } break;
+ }
+
+}
+
+void AnimationTreeEditor::_update_scrollbars() {
+
+ Size2 size = get_size();
+ Size2 hmin = h_scroll->get_combined_minimum_size();
+ Size2 vmin = v_scroll->get_combined_minimum_size();
+
+ v_scroll->set_begin( Point2(size.width - vmin.width, 0) );
+ v_scroll->set_end( Point2(size.width, size.height) );
+
+ h_scroll->set_begin( Point2( 0, size.height - hmin.height) );
+ h_scroll->set_end( Point2(size.width-vmin.width, size.height) );
+
+
+ Size2 min = _get_maximum_size();
+
+ if (min.height < size.height - hmin.height) {
+
+ v_scroll->hide();
+ offset.y=0;
+ } else {
+
+ v_scroll->show();
+ v_scroll->set_max(min.height);
+ v_scroll->set_page(size.height - hmin.height);
+ offset.y=v_scroll->get_value();
+ }
+
+ if (min.width < size.width - vmin.width) {
+
+ h_scroll->hide();
+ offset.x=0;
+ } else {
+
+ h_scroll->show();
+ h_scroll->set_max(min.width);
+ h_scroll->set_page(size.width - vmin.width);
+ offset.x=h_scroll->get_value();
+ }
+}
+
+void AnimationTreeEditor::_scroll_moved(float) {
+
+ offset.x=h_scroll->get_value();
+ offset.y=v_scroll->get_value();
+ update();
+}
+
+
+void AnimationTreeEditor::_node_menu_item(int p_item) {
+
+ switch(p_item) {
+
+ case NODE_DISCONNECT: {
+
+ if (rclick_type==CLICK_INPUT_SLOT) {
+
+ anim_tree->disconnect_nodes(rclick_node,rclick_slot);
+ update();
+ }
+
+ if (rclick_type==CLICK_OUTPUT_SLOT) {
+
+
+ List<AnimationTreePlayer::Connection> connections;
+ anim_tree->get_connection_list(&connections);
+
+ for(List<AnimationTreePlayer::Connection>::Element *E=connections.front();E;E=E->next()) {
+
+ const AnimationTreePlayer::Connection &c=E->get();
+ if( c.dst_node==rclick_node) {
+
+ anim_tree->disconnect_nodes(c.dst_node,c.dst_input);
+ }
+ }
+ update();
+ }
+
+ } break;
+ case NODE_RENAME: {
+
+ renaming_edit=true;
+ edited_node=rclick_node;
+ _popup_edit_dialog();
+
+ } break;
+ case NODE_ADD_INPUT: {
+
+ anim_tree->transition_node_set_input_count(rclick_node, anim_tree->transition_node_get_input_count(rclick_node)+1);
+ update();
+ } break;
+ case NODE_DELETE_INPUT: {
+
+ anim_tree->transition_node_delete_input(rclick_node, rclick_slot);
+ update();
+ } break;
+ case NODE_SET_AUTOADVANCE: {
+
+ anim_tree->transition_node_set_input_auto_advance(rclick_node,rclick_slot,true);
+ update();
+
+ } break;
+ case NODE_CLEAR_AUTOADVANCE: {
+
+ anim_tree->transition_node_set_input_auto_advance(rclick_node,rclick_slot,false);
+ update();
+
+ } break;
+
+ case NODE_ERASE: {
+
+ if (rclick_node=="out")
+ break;
+ order.erase(rclick_node);
+ anim_tree->remove_node(rclick_node);
+ update();
+ } break;
+ }
+}
+
+StringName AnimationTreeEditor::_add_node(int p_item) {
+
+ static const char* bname[] = {
+ "out",
+ "anim",
+ "oneshot",
+ "mix",
+ "blend2",
+ "blend3",
+ "blend4",
+ "scale",
+ "seek",
+ "transition"
+ };
+
+ String name;
+ int idx=1;
+
+ while(true) {
+
+ name = bname[p_item];
+ if (idx>1)
+ name+=" "+itos(idx);
+ if (anim_tree->node_exists(name))
+ idx++;
+ else
+ break;
+ }
+
+
+ anim_tree->add_node((AnimationTreePlayer::NodeType)p_item,name);
+ anim_tree->node_set_pos(name,Point2(last_x,last_y));
+ order.push_back(name);
+ last_x+=10;
+ last_y+=10;
+ last_x=last_x % (int)get_size().width;
+ last_y=last_y % (int)get_size().height;
+ update();
+
+ return name;
+};
+
+void AnimationTreeEditor::_file_dialog_selected(String p_path) {
+
+ switch (file_op) {
+
+ case MENU_IMPORT_ANIMATIONS: {
+ Vector<String> files = file_dialog->get_selected_files();
+
+ for (int i=0; i<files.size(); i++) {
+
+ StringName node = _add_node(AnimationTreePlayer::NODE_ANIMATION);
+
+ RES anim = ResourceLoader::load(files[i]);
+ anim_tree->animation_node_set_animation(node,anim);
+ //anim_tree->node_set_name(node, files[i].get_file());
+ };
+ } break;
+
+ default:
+ break;
+ };
+};
+
+void AnimationTreeEditor::_add_menu_item(int p_item) {
+
+ if (p_item==MENU_GRAPH_CLEAR) {
+
+ //clear
+ } else if (p_item == MENU_IMPORT_ANIMATIONS) {
+
+ file_op = MENU_IMPORT_ANIMATIONS;
+ file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->popup_centered_ratio();
+
+ } else {
+
+ _add_node(p_item);
+ }
+}
+
+Size2 AnimationTreeEditor::get_minimum_size() const {
+
+ return Size2(10,200);
+}
+
+void AnimationTreeEditor::_find_paths_for_filter(const StringName& p_node,Set<String>& paths) {
+
+ ERR_FAIL_COND( !anim_tree->node_exists(p_node) );
+
+ for(int i=0;i<anim_tree->node_get_input_count(p_node);i++) {
+
+ StringName port = anim_tree->node_get_input_source(p_node,i);
+ if (port==StringName())
+ continue;
+ _find_paths_for_filter(port,paths);
+ }
+
+ if (anim_tree->node_get_type(p_node)==AnimationTreePlayer::NODE_ANIMATION) {
+
+ Ref<Animation> anim = anim_tree->animation_node_get_animation(p_node);
+ if (anim.is_valid()) {
+
+ for(int i=0;i<anim->get_track_count();i++) {
+ paths.insert(anim->track_get_path(i));
+ }
+ }
+ }
+}
+
+
+void AnimationTreeEditor::_filter_edited() {
+
+
+ TreeItem *ed = filter->get_edited();
+ if (!ed)
+ return;
+
+ if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_ONESHOT) {
+ anim_tree->oneshot_node_set_filter_path(edited_node,ed->get_metadata(0),ed->is_checked(0));
+ } else if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_BLEND2) {
+ anim_tree->blend2_node_set_filter_path(edited_node,ed->get_metadata(0),ed->is_checked(0));
+ } else if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_ANIMATION) {
+ anim_tree->animation_node_set_filter_path(edited_node,ed->get_metadata(0),ed->is_checked(0));
+ }
+
+}
+
+void AnimationTreeEditor::_edit_filters() {
+
+ filter_dialog->popup_centered_ratio();
+ filter->clear();
+
+ Set<String> npb;
+ _find_paths_for_filter(edited_node,npb);
+
+ TreeItem *root = filter->create_item();
+ filter->set_hide_root(true);
+ Map<String,TreeItem*> pm;
+
+ Node *base = anim_tree->get_node( anim_tree->get_base_path() );
+
+ for(Set<String>::Element *E=npb.front();E;E=E->next()) {
+
+ TreeItem *parent=root;
+ String descr=E->get();
+ if (base) {
+ NodePath np = E->get();
+
+ if (np.get_property()!=StringName()) {
+ Node *n = base->get_node(np);
+ Skeleton *s = n->cast_to<Skeleton>();
+ if (s) {
+
+ String skelbase = E->get().substr(0,E->get().find(":"));
+
+
+ int bidx = s->find_bone(np.get_property());
+
+ if (bidx!=-1) {
+ int bparent = s->get_bone_parent(bidx);
+ //
+ if (bparent!=-1) {
+
+
+ String bpn = skelbase+":"+s->get_bone_name(bparent);
+ if (pm.has(bpn)) {
+ parent=pm[bpn];
+ descr=np.get_property();
+ }
+ } else {
+
+ if (pm.has(skelbase)) {
+ parent=pm[skelbase];
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ TreeItem *it = filter->create_item(parent);
+ it->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ it->set_text(0,descr);
+ it->set_metadata(0,NodePath(E->get()));
+ it->set_editable(0,true);
+ if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_ONESHOT) {
+ it->set_checked(0, anim_tree->oneshot_node_is_path_filtered(edited_node,E->get()));
+ } else if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_BLEND2) {
+ it->set_checked(0, anim_tree->blend2_node_is_path_filtered(edited_node,E->get()));
+ } else if (anim_tree->node_get_type(edited_node)==AnimationTreePlayer::NODE_ANIMATION) {
+ it->set_checked(0, anim_tree->animation_node_is_path_filtered(edited_node,E->get()));
+ }
+ pm[E->get()]=it;
+ }
+
+
+}
+
+void AnimationTreeEditor::_bind_methods() {
+
+ ClassDB::bind_method( "_add_menu_item", &AnimationTreeEditor::_add_menu_item );
+ ClassDB::bind_method( "_node_menu_item", &AnimationTreeEditor::_node_menu_item );
+ ClassDB::bind_method( "_gui_input", &AnimationTreeEditor::_gui_input );
+ //ClassDB::bind_method( "_node_param_changed", &AnimationTreeEditor::_node_param_changed );
+ ClassDB::bind_method( "_scroll_moved", &AnimationTreeEditor::_scroll_moved );
+ ClassDB::bind_method( "_edit_dialog_changeds", &AnimationTreeEditor::_edit_dialog_changeds );
+ ClassDB::bind_method( "_edit_dialog_changede", &AnimationTreeEditor::_edit_dialog_changede );
+ ClassDB::bind_method( "_edit_dialog_changedf", &AnimationTreeEditor::_edit_dialog_changedf );
+ ClassDB::bind_method( "_edit_dialog_changed", &AnimationTreeEditor::_edit_dialog_changed );
+ ClassDB::bind_method( "_edit_dialog_animation_changed", &AnimationTreeEditor::_edit_dialog_animation_changed );
+ ClassDB::bind_method( "_edit_dialog_edit_animation", &AnimationTreeEditor::_edit_dialog_edit_animation );
+ ClassDB::bind_method( "_play_toggled", &AnimationTreeEditor::_play_toggled );
+ ClassDB::bind_method( "_edit_oneshot_start", &AnimationTreeEditor::_edit_oneshot_start );
+ ClassDB::bind_method( "_file_dialog_selected", &AnimationTreeEditor::_file_dialog_selected);
+ ClassDB::bind_method( "_master_anim_menu_item", &AnimationTreeEditor::_master_anim_menu_item);
+ ClassDB::bind_method( "_edit_filters", &AnimationTreeEditor::_edit_filters);
+ ClassDB::bind_method( "_filter_edited", &AnimationTreeEditor::_filter_edited);
+
+}
+
+AnimationTreeEditor::AnimationTreeEditor() {
+
+ set_focus_mode(FOCUS_ALL);
+
+ PopupMenu *p;
+ List<PropertyInfo> defaults;
+
+ add_menu = memnew( MenuButton );
+ //add_menu->set_
+ add_menu->set_pos( Point2( 0,0) );
+ add_menu->set_size( Point2( 25,15) );
+ add_child( add_menu );
+
+ p=add_menu->get_popup();
+ p->add_item(TTR("Animation Node"),AnimationTreePlayer::NODE_ANIMATION);
+ p->add_item(TTR("OneShot Node"),AnimationTreePlayer::NODE_ONESHOT);
+ p->add_item(TTR("Mix Node"),AnimationTreePlayer::NODE_MIX);
+ p->add_item(TTR("Blend2 Node"),AnimationTreePlayer::NODE_BLEND2);
+ p->add_item(TTR("Blend3 Node"),AnimationTreePlayer::NODE_BLEND3);
+ p->add_item(TTR("Blend4 Node"),AnimationTreePlayer::NODE_BLEND4);
+ p->add_item(TTR("TimeScale Node"),AnimationTreePlayer::NODE_TIMESCALE);
+ p->add_item(TTR("TimeSeek Node"),AnimationTreePlayer::NODE_TIMESEEK);
+ p->add_item(TTR("Transition Node"),AnimationTreePlayer::NODE_TRANSITION);
+ p->add_separator();
+ p->add_item(TTR("Import Animations.."), MENU_IMPORT_ANIMATIONS); // wtf
+ p->add_separator();
+ p->add_item(TTR("Clear"),MENU_GRAPH_CLEAR);
+
+ p->connect("id_pressed", this,"_add_menu_item");
+
+ play_button = memnew(Button);
+ play_button->set_pos(Point2(25,0));
+ play_button->set_size(Point2(25,15));
+ add_child(play_button);
+ play_button->set_toggle_mode(true);
+ play_button->connect("pressed", this,"_play_toggled");
+
+
+
+
+
+ last_x=50;
+ last_y=50;
+
+ property_editor = memnew( CustomPropertyEditor );
+ add_child(property_editor);
+ property_editor->connect("variant_changed", this,"_edit_dialog_animation_changed");
+ property_editor->connect("resource_edit_request", this, "_edit_dialog_edit_animation");
+
+ h_scroll = memnew( HScrollBar );
+ v_scroll = memnew( VScrollBar );
+
+ add_child(h_scroll);
+ add_child(v_scroll);
+
+ h_scroll->connect("value_changed", this,"_scroll_moved");
+ v_scroll->connect("value_changed", this,"_scroll_moved");
+
+ node_popup= memnew(PopupMenu );
+ add_child(node_popup);
+ node_popup->set_as_toplevel(true);
+
+ master_anim_popup = memnew( PopupMenu );
+ add_child(master_anim_popup);
+ master_anim_popup->connect("id_pressed",this,"_master_anim_menu_item");
+
+
+ node_popup->connect("id_pressed", this,"_node_menu_item");
+
+ updating_edit=false;
+
+ edit_dialog = memnew( PopupPanel );
+ //edit_dialog->get_ok()->hide();
+ //edit_dialog->get_cancel()->hide();
+ add_child(edit_dialog);
+
+ edit_option = memnew( OptionButton );
+ edit_option->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ edit_option->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(edit_option);
+ edit_option->connect("item_selected", this,"_edit_dialog_changedf");
+ edit_option->hide();
+
+
+ for(int i=0;i<2;i++) {
+ edit_scroll[i] = memnew ( HSlider );
+ edit_scroll[i]->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ edit_scroll[i]->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(edit_scroll[i]);
+ edit_scroll[i]->hide();
+ edit_scroll[i]->connect("value_changed", this,"_edit_dialog_changedf");
+ }
+ for(int i=0;i<4;i++) {
+ edit_line[i] = memnew ( LineEdit );
+ edit_line[i]->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ edit_line[i]->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(edit_line[i]);
+ edit_line[i]->hide();
+ edit_line[i]->connect("text_changed", this,"_edit_dialog_changeds");
+ edit_line[i]->connect("text_entered", this,"_edit_dialog_changede");
+ edit_label[i] = memnew ( Label );
+ edit_dialog->add_child(edit_label[i]);
+ edit_label[i]->hide();
+ }
+
+ edit_button = memnew( Button );
+ edit_button->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ edit_button->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(edit_button);
+ edit_button->hide();
+ edit_button->connect("pressed", this,"_edit_oneshot_start");
+
+ edit_check = memnew( CheckButton );
+ edit_check->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ edit_check->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(edit_check);
+ edit_check->hide();
+ edit_check->connect("pressed", this,"_edit_dialog_changed");
+
+ file_dialog = memnew( EditorFileDialog );
+ file_dialog->set_enable_multiple_selection(true);
+ file_dialog->set_current_dir(GlobalConfig::get_singleton()->get_resource_path());
+ add_child(file_dialog);
+ file_dialog->connect("file_selected", this, "_file_dialog_selected");
+
+ filter_dialog = memnew( AcceptDialog );
+ filter_dialog->set_title(TTR("Edit Node Filters"));
+ add_child(filter_dialog);
+
+ filter = memnew( Tree );
+ filter_dialog->add_child(filter);
+ //filter_dialog->set_child_rect(filter);
+ filter->connect("item_edited",this,"_filter_edited");
+
+ filter_button = memnew( Button );
+ filter_button->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ filter_button->set_margin(MARGIN_RIGHT, 10);
+ edit_dialog->add_child(filter_button);
+ filter_button->hide();
+ filter_button->set_text(TTR("Filters.."));
+ filter_button->connect("pressed", this,"_edit_filters");
+
+ set_clip_contents(true);
+}
+
+
+void AnimationTreeEditorPlugin::edit(Object *p_object) {
+
+ anim_tree_editor->edit(p_object->cast_to<AnimationTreePlayer>());
+
+}
+
+bool AnimationTreeEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("AnimationTreePlayer");
+}
+
+void AnimationTreeEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ //editor->hide_animation_player_editors();
+ //editor->animation_panel_make_visible(true);
+ button->show();
+ editor->make_bottom_panel_item_visible(anim_tree_editor);
+ anim_tree_editor->set_fixed_process(true);
+ } else {
+
+ if (anim_tree_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+ button->hide();
+ anim_tree_editor->set_fixed_process(false);
+ }
+}
+
+AnimationTreeEditorPlugin::AnimationTreeEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ anim_tree_editor = memnew( AnimationTreeEditor );
+ anim_tree_editor->set_custom_minimum_size(Size2(0,300));
+
+ button=editor->add_bottom_panel_item("AnimationTree",anim_tree_editor);
+ button->hide();
+
+
+
+}
+
+
+AnimationTreeEditorPlugin::~AnimationTreeEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h
new file mode 100644
index 0000000000..4e5fb871f1
--- /dev/null
+++ b/editor/plugins/animation_tree_editor_plugin.h
@@ -0,0 +1,194 @@
+/*************************************************************************/
+/* animation_tree_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ANIMATION_TREE_EDITOR_PLUGIN_H
+#define ANIMATION_TREE_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/animation/animation_tree_player.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/button.h"
+#include "scene/gui/popup.h"
+#include "editor/property_editor.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class AnimationTreeEditor : public Control {
+
+ GDCLASS(AnimationTreeEditor, Control );
+
+ static const char* _node_type_names[];
+
+ enum ClickType {
+ CLICK_NONE,
+ CLICK_NAME,
+ CLICK_NODE,
+ CLICK_INPUT_SLOT,
+ CLICK_OUTPUT_SLOT,
+ CLICK_PARAMETER
+ };
+
+ enum {
+
+ MENU_GRAPH_CLEAR=100,
+ MENU_IMPORT_ANIMATIONS=101,
+ NODE_DISCONNECT,
+ NODE_RENAME,
+ NODE_ERASE,
+ NODE_ADD_INPUT,
+ NODE_DELETE_INPUT,
+ NODE_SET_AUTOADVANCE,
+ NODE_CLEAR_AUTOADVANCE
+ };
+
+ bool renaming_edit;
+ StringName edited_node;
+ bool updating_edit;
+ Popup *edit_dialog;
+ HSlider *edit_scroll[2];
+ LineEdit *edit_line[4];
+ OptionButton *edit_option;
+ Label *edit_label[4];
+ Button *edit_button;
+ Button *filter_button;
+ CheckButton *edit_check;
+ EditorFileDialog* file_dialog;
+ int file_op;
+
+ void _popup_edit_dialog();
+
+
+ void _setup_edit_dialog(const StringName& p_node);
+ PopupMenu *master_anim_popup;
+ PopupMenu *node_popup;
+ PopupMenu *add_popup;
+ HScrollBar *h_scroll;
+ VScrollBar *v_scroll;
+ MenuButton* add_menu;
+
+ CustomPropertyEditor *property_editor;
+
+ AnimationTreePlayer* anim_tree;
+ List<StringName> order;
+ Set<StringName> active_nodes;
+
+ int last_x,last_y;
+
+ Point2 offset;
+ ClickType click_type;
+ Point2 click_pos;
+ StringName click_node;
+ int click_slot;
+ Point2 click_motion;
+ ClickType rclick_type;
+ StringName rclick_node;
+ int rclick_slot;
+
+ Button *play_button;
+
+ Size2 _get_maximum_size();
+ Size2 get_node_size(const StringName &p_node) const;
+ void _draw_node(const StringName& p_node);
+
+ AcceptDialog *filter_dialog;
+ Tree *filter;
+
+
+
+ void _draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color);
+ void _update_scrollbars();
+ void _scroll_moved(float);
+ void _play_toggled();
+/*
+ void _node_param_changed();
+ void _node_add_callback();
+ void _node_add(VisualServer::AnimationTreeNodeType p_type);
+ void _node_edit_property(const StringName& p_node);
+*/
+
+ void _master_anim_menu_item(int p_item);
+ void _node_menu_item(int p_item);
+ void _add_menu_item(int p_item);
+
+
+ void _filter_edited();
+ void _find_paths_for_filter(const StringName& p_node,Set<String>& paths);
+ void _edit_filters();
+
+
+ void _edit_oneshot_start();
+ void _edit_dialog_animation_changed();
+ void _edit_dialog_edit_animation();
+ void _edit_dialog_changeds(String);
+ void _edit_dialog_changede(String);
+ void _edit_dialog_changedf(float);
+ void _edit_dialog_changed();
+ void _dialog_changed() const;
+ ClickType _locate_click(const Point2& p_click,StringName *p_node_id,int *p_slot_index) const;
+ Point2 _get_slot_pos(const StringName& p_node_id,bool p_input,int p_slot);
+
+ StringName _add_node(int p_item);
+ void _file_dialog_selected(String p_path);
+
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+
+ virtual Size2 get_minimum_size() const;
+ void edit(AnimationTreePlayer *p_player);
+ AnimationTreeEditor();
+};
+
+class AnimationTreeEditorPlugin : public EditorPlugin {
+
+ GDCLASS( AnimationTreeEditorPlugin, EditorPlugin );
+
+ AnimationTreeEditor *anim_tree_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "AnimTree"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ AnimationTreeEditorPlugin(EditorNode *p_node);
+ ~AnimationTreeEditorPlugin();
+
+};
+
+#endif // ANIMATION_TREE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/baked_light_baker.cpp b/editor/plugins/baked_light_baker.cpp
new file mode 100644
index 0000000000..e491fe012e
--- /dev/null
+++ b/editor/plugins/baked_light_baker.cpp
@@ -0,0 +1,2731 @@
+/*************************************************************************/
+/* baked_light_baker.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "baked_light_baker.h"
+
+#include <stdlib.h>
+#include <cmath>
+#include "io/marshalls.h"
+#include "editor/editor_node.h"
+#include "editor/editor_settings.h"
+
+#if 0
+void baked_light_baker_add_64f(double *dst,double value);
+void baked_light_baker_add_64i(int64_t *dst,int64_t value);
+
+//-separar en 2 testuras?
+//*mejorar performance y threads
+//*modos lineales
+//*saturacion
+
+_FORCE_INLINE_ static uint64_t get_uv_normal_bit(const Vector3& p_vector) {
+
+ int lat = Math::fast_ftoi(Math::floor(Math::acos(p_vector.dot(Vector3(0,1,0)))*6.0/Math_PI+0.5));
+
+ if (lat==0) {
+ return 60;
+ } else if (lat==6) {
+ return 61;
+ }
+
+ int lon = Math::fast_ftoi(Math::floor( (Math_PI+Math::atan2(p_vector.x,p_vector.z))*12.0/(Math_PI*2.0) + 0.5))%12;
+
+ return lon+(lat-1)*12;
+}
+
+
+
+_FORCE_INLINE_ static Vector3 get_bit_normal(int p_bit) {
+
+ if (p_bit==61) {
+ return Vector3(0,1,0);
+ } else if (p_bit==62){
+ return Vector3(0,-1,0);
+ }
+
+ float latang = ((p_bit / 12)+1)*Math_PI/6.0;
+
+ Vector2 latv(Math::sin(latang),Math::cos(latang));
+
+ float lonang = ((p_bit%12)*Math_PI*2.0/12.0)-Math_PI;
+
+ Vector2 lonv(Math::sin(lonang),Math::cos(lonang));
+
+ return Vector3(lonv.x*latv.x,latv.y,lonv.y*latv.x).normalized();
+
+}
+
+
+BakedLightBaker::MeshTexture* BakedLightBaker::_get_mat_tex(const Ref<Texture>& p_tex) {
+
+ if (!tex_map.has(p_tex)) {
+
+ Ref<ImageTexture> imgtex=p_tex;
+ if (imgtex.is_null())
+ return NULL;
+ Image image=imgtex->get_data();
+ if (image.empty())
+ return NULL;
+
+ if (image.get_format()!=Image::FORMAT_RGBA8) {
+ if (image.get_format()>Image::FORMAT_INDEXED_ALPHA) {
+ Error err = image.decompress();
+ if (err)
+ return NULL;
+ }
+
+ if (image.get_format()!=Image::FORMAT_RGBA8)
+ image.convert(Image::FORMAT_RGBA8);
+ }
+
+ if (imgtex->get_flags()&Texture::FLAG_CONVERT_TO_LINEAR) {
+ Image copy = image;
+ copy.srgb_to_linear();
+ image=copy;
+ }
+
+ PoolVector<uint8_t> dvt=image.get_data();
+ PoolVector<uint8_t>::Read r=dvt.read();
+ MeshTexture mt;
+ mt.tex_w=image.get_width();
+ mt.tex_h=image.get_height();
+ int len = image.get_width()*image.get_height()*4;
+ mt.tex.resize(len);
+ copymem(mt.tex.ptr(),r.ptr(),len);
+
+ textures.push_back(mt);
+ tex_map[p_tex]=&textures.back()->get();
+ }
+
+ return tex_map[p_tex];
+}
+
+
+void BakedLightBaker::_add_mesh(const Ref<Mesh>& p_mesh,const Ref<Material>& p_mat_override,const Transform& p_xform,int p_baked_texture) {
+
+
+ for(int i=0;i<p_mesh->get_surface_count();i++) {
+
+ if (p_mesh->surface_get_primitive_type(i)!=Mesh::PRIMITIVE_TRIANGLES)
+ continue;
+ Ref<Material> mat = p_mat_override.is_valid()?p_mat_override:p_mesh->surface_get_material(i);
+
+ MeshMaterial *matptr=NULL;
+ int baked_tex=p_baked_texture;
+
+ if (mat.is_valid()) {
+
+ if (!mat_map.has(mat)) {
+
+ MeshMaterial mm;
+
+ Ref<FixedSpatialMaterial> fm = mat;
+ if (fm.is_valid()) {
+ //fixed route
+ mm.diffuse.color=fm->get_parameter(FixedSpatialMaterial::PARAM_DIFFUSE);
+ if (linear_color)
+ mm.diffuse.color=mm.diffuse.color.to_linear();
+ mm.diffuse.tex=_get_mat_tex(fm->get_texture(FixedSpatialMaterial::PARAM_DIFFUSE));
+ mm.specular.color=fm->get_parameter(FixedSpatialMaterial::PARAM_SPECULAR);
+ if (linear_color)
+ mm.specular.color=mm.specular.color.to_linear();
+
+ mm.specular.tex=_get_mat_tex(fm->get_texture(FixedSpatialMaterial::PARAM_SPECULAR));
+ } else {
+
+ mm.diffuse.color=Color(1,1,1,1);
+ mm.diffuse.tex=NULL;
+ mm.specular.color=Color(0,0,0,1);
+ mm.specular.tex=NULL;
+ }
+
+ materials.push_back(mm);
+ mat_map[mat]=&materials.back()->get();
+
+ }
+
+ matptr=mat_map[mat];
+
+ }
+
+
+ int facecount=0;
+
+
+ if (p_mesh->surface_get_format(i)&Mesh::ARRAY_FORMAT_INDEX) {
+
+ facecount=p_mesh->surface_get_array_index_len(i);
+ } else {
+
+ facecount=p_mesh->surface_get_array_len(i);
+ }
+
+ ERR_CONTINUE((facecount==0 || (facecount%3)!=0));
+
+ facecount/=3;
+
+ int tbase=triangles.size();
+ triangles.resize(facecount+tbase);
+
+
+ Array a = p_mesh->surface_get_arrays(i);
+
+ PoolVector<Vector3> vertices = a[Mesh::ARRAY_VERTEX];
+ PoolVector<Vector3>::Read vr=vertices.read();
+ PoolVector<Vector2> uv;
+ PoolVector<Vector2>::Read uvr;
+ PoolVector<Vector2> uv2;
+ PoolVector<Vector2>::Read uv2r;
+ PoolVector<Vector3> normal;
+ PoolVector<Vector3>::Read normalr;
+ bool read_uv=false;
+ bool read_normal=false;
+
+ if (p_mesh->surface_get_format(i)&Mesh::ARRAY_FORMAT_TEX_UV) {
+
+ uv=a[Mesh::ARRAY_TEX_UV];
+ uvr=uv.read();
+ read_uv=true;
+
+ if (mat.is_valid() && mat->get_flag(Material::FLAG_LIGHTMAP_ON_UV2) && p_mesh->surface_get_format(i)&Mesh::ARRAY_FORMAT_TEX_UV2) {
+
+ uv2=a[Mesh::ARRAY_TEX_UV2];
+ uv2r=uv2.read();
+
+ } else {
+ uv2r=uv.read();
+ if (baked_light->get_transfer_lightmaps_only_to_uv2()) {
+ baked_tex=-1;
+ }
+ }
+ }
+
+ if (p_mesh->surface_get_format(i)&Mesh::ARRAY_FORMAT_NORMAL) {
+
+ normal=a[Mesh::ARRAY_NORMAL];
+ normalr=normal.read();
+ read_normal=true;
+ }
+
+ Matrix3 normal_xform = p_xform.basis.inverse().transposed();
+
+
+ if (p_mesh->surface_get_format(i)&Mesh::ARRAY_FORMAT_INDEX) {
+
+ PoolVector<int> indices = a[Mesh::ARRAY_INDEX];
+ PoolVector<int>::Read ir = indices.read();
+
+ for(int i=0;i<facecount;i++) {
+ Triangle &t=triangles[tbase+i];
+ t.vertices[0]=p_xform.xform(vr[ ir[i*3+0] ]);
+ t.vertices[1]=p_xform.xform(vr[ ir[i*3+1] ]);
+ t.vertices[2]=p_xform.xform(vr[ ir[i*3+2] ]);
+ t.material=matptr;
+ t.baked_texture=baked_tex;
+ if (read_uv) {
+
+ t.uvs[0]=uvr[ ir[i*3+0] ];
+ t.uvs[1]=uvr[ ir[i*3+1] ];
+ t.uvs[2]=uvr[ ir[i*3+2] ];
+
+ t.bake_uvs[0]=uv2r[ ir[i*3+0] ];
+ t.bake_uvs[1]=uv2r[ ir[i*3+1] ];
+ t.bake_uvs[2]=uv2r[ ir[i*3+2] ];
+ }
+ if (read_normal) {
+
+ t.normals[0]=normal_xform.xform(normalr[ ir[i*3+0] ]).normalized();
+ t.normals[1]=normal_xform.xform(normalr[ ir[i*3+1] ]).normalized();
+ t.normals[2]=normal_xform.xform(normalr[ ir[i*3+2] ]).normalized();
+ }
+ }
+
+ } else {
+
+ for(int i=0;i<facecount;i++) {
+ Triangle &t=triangles[tbase+i];
+ t.vertices[0]=p_xform.xform(vr[ i*3+0 ]);
+ t.vertices[1]=p_xform.xform(vr[ i*3+1 ]);
+ t.vertices[2]=p_xform.xform(vr[ i*3+2 ]);
+ t.material=matptr;
+ t.baked_texture=baked_tex;
+ if (read_uv) {
+
+ t.uvs[0]=uvr[ i*3+0 ];
+ t.uvs[1]=uvr[ i*3+1 ];
+ t.uvs[2]=uvr[ i*3+2 ];
+
+ t.bake_uvs[0]=uv2r[ i*3+0 ];
+ t.bake_uvs[1]=uv2r[ i*3+1 ];
+ t.bake_uvs[2]=uv2r[ i*3+2 ];
+
+ }
+ if (read_normal) {
+
+ t.normals[0]=normal_xform.xform(normalr[ i*3+0 ]).normalized();
+ t.normals[1]=normal_xform.xform(normalr[ i*3+1 ]).normalized();
+ t.normals[2]=normal_xform.xform(normalr[ i*3+2 ]).normalized();
+ }
+ }
+ }
+ }
+
+}
+
+
+void BakedLightBaker::_parse_geometry(Node* p_node) {
+
+ if (p_node->cast_to<MeshInstance>()) {
+
+ MeshInstance *meshi=p_node->cast_to<MeshInstance>();
+ Ref<Mesh> mesh=meshi->get_mesh();
+ if (mesh.is_valid()) {
+ _add_mesh(mesh,meshi->get_material_override(),base_inv * meshi->get_global_transform(),meshi->get_baked_light_texture_id());
+ }
+ } else if (p_node->cast_to<Light>()) {
+
+ Light *dl=p_node->cast_to<Light>();
+
+ if (dl->get_bake_mode()!=Light::BAKE_MODE_DISABLED) {
+
+
+ LightData dirl;
+ dirl.type=VS::LightType(dl->get_light_type());
+ dirl.diffuse=dl->get_color(DirectionalLight::COLOR_DIFFUSE);
+ dirl.specular=dl->get_color(DirectionalLight::COLOR_SPECULAR);
+ if (linear_color)
+ dirl.diffuse=dirl.diffuse.to_linear();
+ if (linear_color)
+ dirl.specular=dirl.specular.to_linear();
+
+ dirl.energy=dl->get_parameter(DirectionalLight::PARAM_ENERGY);
+ dirl.pos=dl->get_global_transform().origin;
+ dirl.up=dl->get_global_transform().basis.get_axis(1).normalized();
+ dirl.left=dl->get_global_transform().basis.get_axis(0).normalized();
+ dirl.dir=-dl->get_global_transform().basis.get_axis(2).normalized();
+ dirl.spot_angle=dl->get_parameter(DirectionalLight::PARAM_SPOT_ANGLE);
+ dirl.spot_attenuation=dl->get_parameter(DirectionalLight::PARAM_SPOT_ATTENUATION);
+ dirl.attenuation=dl->get_parameter(DirectionalLight::PARAM_ATTENUATION);
+ dirl.darkening=dl->get_parameter(DirectionalLight::PARAM_SHADOW_DARKENING);
+ dirl.radius=dl->get_parameter(DirectionalLight::PARAM_RADIUS);
+ dirl.bake_direct=dl->get_bake_mode()==Light::BAKE_MODE_FULL;
+ dirl.rays_thrown=0;
+ dirl.bake_shadow=dl->get_bake_mode()==Light::BAKE_MODE_INDIRECT_AND_SHADOWS;
+ lights.push_back(dirl);
+ }
+
+ } else if (p_node->cast_to<Spatial>()){
+
+ Spatial *sp = p_node->cast_to<Spatial>();
+
+ Array arr = p_node->call("_get_baked_light_meshes");
+ for(int i=0;i<arr.size();i+=2) {
+
+ Transform xform=arr[i];
+ Ref<Mesh> mesh=arr[i+1];
+ _add_mesh(mesh,Ref<Material>(),base_inv * (sp->get_global_transform() * xform));
+ }
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ _parse_geometry(p_node->get_child(i));
+ }
+}
+
+
+void BakedLightBaker::_fix_lights() {
+
+
+ total_light_area=0;
+ for(int i=0;i<lights.size();i++) {
+
+ LightData &dl=lights[i];
+
+ switch(dl.type) {
+ case VS::LIGHT_DIRECTIONAL: {
+
+ float up_max=-1e10;
+ float dir_max=-1e10;
+ float left_max=-1e10;
+ float up_min=1e10;
+ float dir_min=1e10;
+ float left_min=1e10;
+
+ for(int j=0;j<triangles.size();j++) {
+
+ for(int k=0;k<3;k++) {
+
+ Vector3 v = triangles[j].vertices[k];
+
+ float up_d = dl.up.dot(v);
+ float dir_d = dl.dir.dot(v);
+ float left_d = dl.left.dot(v);
+
+ if (up_d>up_max)
+ up_max=up_d;
+ if (up_d<up_min)
+ up_min=up_d;
+
+ if (left_d>left_max)
+ left_max=left_d;
+ if (left_d<left_min)
+ left_min=left_d;
+
+ if (dir_d>dir_max)
+ dir_max=dir_d;
+ if (dir_d<dir_min)
+ dir_min=dir_d;
+
+ }
+ }
+
+ //make a center point, then the upvector and leftvector
+ dl.pos = dl.left*( left_max+left_min )*0.5 + dl.up*( up_max+up_min )*0.5 + dl.dir*(dir_min-(dir_max-dir_min));
+ dl.left*=(left_max-left_min)*0.5;
+ dl.up*=(up_max-up_min)*0.5;
+ dl.length = (dir_max - dir_min)*10; //arbitrary number to keep it in scale
+ dl.area=dl.left.length()*2*dl.up.length()*2;
+ dl.constant=1.0/dl.area;
+ } break;
+ case VS::LIGHT_OMNI:
+ case VS::LIGHT_SPOT: {
+
+ dl.attenuation_table.resize(ATTENUATION_CURVE_LEN);
+ for(int j=0;j<ATTENUATION_CURVE_LEN;j++) {
+ dl.attenuation_table[j]=1.0-Math::pow(j/float(ATTENUATION_CURVE_LEN),dl.attenuation);
+ float falloff=j*dl.radius/float(ATTENUATION_CURVE_LEN);
+ if (falloff==0)
+ falloff=0.000001;
+ float intensity=4*Math_PI*(falloff*falloff);
+ //dl.attenuation_table[j]*=falloff*falloff;
+ dl.attenuation_table[j]*=1.0/(3.0/intensity);
+
+ }
+ if (dl.type==VS::LIGHT_OMNI) {
+
+ dl.area=4.0*Math_PI*pow(dl.radius,2.0f);
+ dl.constant=1.0/3.5;
+ } else {
+
+
+ float r = Math::tan(Math::deg2rad(dl.spot_angle))*dl.radius;
+ float c = 1.0-(Math::deg2rad(dl.spot_angle)*0.5+0.5);
+ dl.constant=1.0/3.5;
+ dl.constant*=1.0/c;
+
+ dl.area=Math_PI*r*r*c;
+ }
+
+ } break;
+
+
+ }
+
+ total_light_area+=dl.area;
+ }
+}
+
+BakedLightBaker::BVH* BakedLightBaker::_parse_bvh(BVH** p_children, int p_size, int p_depth, int &max_depth) {
+
+ if (p_depth>max_depth) {
+ max_depth=p_depth;
+ }
+
+ if (p_size==1) {
+
+ return p_children[0];
+ } else if (p_size==0) {
+
+ return NULL;
+ }
+
+
+ AABB aabb;
+ aabb=p_children[0]->aabb;
+ for(int i=1;i<p_size;i++) {
+
+ aabb.merge_with(p_children[i]->aabb);
+ }
+
+ int li=aabb.get_longest_axis_index();
+
+ switch(li) {
+
+ case Vector3::AXIS_X: {
+ SortArray<BVH*,BVHCmpX> sort_x;
+ sort_x.nth_element(0,p_size,p_size/2,p_children);
+ //sort_x.sort(&p_bb[p_from],p_size);
+ } break;
+ case Vector3::AXIS_Y: {
+ SortArray<BVH*,BVHCmpY> sort_y;
+ sort_y.nth_element(0,p_size,p_size/2,p_children);
+ //sort_y.sort(&p_bb[p_from],p_size);
+ } break;
+ case Vector3::AXIS_Z: {
+ SortArray<BVH*,BVHCmpZ> sort_z;
+ sort_z.nth_element(0,p_size,p_size/2,p_children);
+ //sort_z.sort(&p_bb[p_from],p_size);
+
+ } break;
+ }
+
+
+ BVH* left = _parse_bvh(p_children,p_size/2,p_depth+1,max_depth);
+ BVH* right = _parse_bvh(&p_children[p_size/2],p_size-p_size/2,p_depth+1,max_depth);
+
+ BVH *_new = memnew(BVH);
+ _new->aabb=aabb;
+ _new->center=aabb.pos+aabb.size*0.5;
+ _new->children[0]=left;
+ _new->children[1]=right;
+ _new->leaf=NULL;
+
+ return _new;
+}
+
+void BakedLightBaker::_make_bvh() {
+
+ Vector<BVH*> bases;
+ bases.resize(triangles.size());
+ int max_depth=0;
+ for(int i=0;i<triangles.size();i++) {
+ bases[i]=memnew( BVH );
+ bases[i]->leaf=&triangles[i];
+ bases[i]->aabb.pos=triangles[i].vertices[0];
+ bases[i]->aabb.expand_to(triangles[i].vertices[1]);
+ bases[i]->aabb.expand_to(triangles[i].vertices[2]);
+ triangles[i].aabb=bases[i]->aabb;
+ bases[i]->center=bases[i]->aabb.pos+bases[i]->aabb.size*0.5;
+ }
+
+ bvh=_parse_bvh(bases.ptr(),bases.size(),1,max_depth);
+
+ ray_stack = memnew_arr(uint32_t,max_depth);
+ bvh_stack = memnew_arr(BVH*,max_depth);
+
+ bvh_depth = max_depth;
+}
+
+void BakedLightBaker::_octree_insert(int p_octant,Triangle* p_triangle, int p_depth) {
+
+
+
+
+ uint32_t *stack=octant_stack;
+ uint32_t *ptr_stack=octantptr_stack;
+ Octant *octants=octant_pool.ptr();
+
+ stack[0]=0;
+ ptr_stack[0]=0;
+
+ int stack_pos=0;
+
+
+ while(true) {
+
+ Octant *octant=&octants[ptr_stack[stack_pos]];
+ if (stack[stack_pos]<8) {
+
+ int i = stack[stack_pos];
+ stack[stack_pos]++;
+
+
+
+ //fit_aabb=fit_aabb.grow(bvh->aabb.size.x*0.0001);
+
+ int child_idx =octant->children[i];
+ bool encloses;
+ if (!child_idx) {
+
+ AABB aabb=octant->aabb;
+ aabb.size*=0.5;
+ if (i&1)
+ aabb.pos.x+=aabb.size.x;
+ if (i&2)
+ aabb.pos.y+=aabb.size.y;
+ if (i&4)
+ aabb.pos.z+=aabb.size.z;
+
+ aabb.grow_by(cell_size*octree_extra_margin);
+ if (!aabb.intersects(p_triangle->aabb))
+ continue;
+ encloses=aabb.grow(cell_size*-octree_extra_margin*2.0).encloses(p_triangle->aabb);
+ if (!encloses && !Face3(p_triangle->vertices[0],p_triangle->vertices[1],p_triangle->vertices[2]).intersects_aabb2(aabb))
+ continue;
+ } else {
+
+ Octant *child=&octants[child_idx];
+ AABB aabb=child->aabb;
+ aabb.grow_by(cell_size*octree_extra_margin);
+ if (!aabb.intersects(p_triangle->aabb))
+ continue;
+ encloses=aabb.grow(cell_size*-octree_extra_margin*2.0).encloses(p_triangle->aabb);
+ if (!encloses && !Face3(p_triangle->vertices[0],p_triangle->vertices[1],p_triangle->vertices[2]).intersects_aabb2(aabb))
+ continue;
+
+ }
+
+ if (encloses)
+ stack[stack_pos]=8; // quick and dirty opt
+
+ if (!child_idx) {
+
+
+ if (octant_pool_size==octant_pool.size()) {
+ octant_pool.resize(octant_pool_size+OCTANT_POOL_CHUNK);
+ octants=octant_pool.ptr();
+ octant=&octants[ptr_stack[stack_pos]];
+ }
+ child_idx=octant_pool_size++;
+ octant->children[i]=child_idx;
+ Octant *child=&octants[child_idx];
+
+ child->aabb=octant->aabb;
+ child->texture_x=0;
+ child->texture_y=0;
+
+ child->aabb.size*=0.5;
+ if (i&1)
+ child->aabb.pos.x+=child->aabb.size.x;
+ if (i&2)
+ child->aabb.pos.y+=child->aabb.size.y;
+ if (i&4)
+ child->aabb.pos.z+=child->aabb.size.z;
+
+
+ child->full_accum[0]=0;
+ child->full_accum[1]=0;
+ child->full_accum[2]=0;
+ child->sampler_ofs=0;
+
+
+
+ if (stack_pos==octree_depth-1) {
+ child->leaf=true;
+ child->offset[0]=child->aabb.pos.x+child->aabb.size.x*0.5;
+ child->offset[1]=child->aabb.pos.y+child->aabb.size.y*0.5;
+ child->offset[2]=child->aabb.pos.z+child->aabb.size.z*0.5;
+ child->next_leaf=leaf_list;
+
+
+ for(int ci=0;ci<8;ci++) {
+ child->normal_accum[ci][0]=0;
+ child->normal_accum[ci][1]=0;
+ child->normal_accum[ci][2]=0;
+
+ }
+
+ child->bake_neighbour=0;
+ child->first_neighbour=true;
+ leaf_list=child_idx;
+ cell_count++;
+
+ for(int ci=0;ci<8;ci++) {
+ child->light_accum[ci][0]=0;
+ child->light_accum[ci][1]=0;
+ child->light_accum[ci][2]=0;
+ }
+
+ child->parent=ptr_stack[stack_pos];
+
+ } else {
+
+ child->leaf=false;
+ for(int j=0;j<8;j++) {
+ child->children[j]=0;
+ }
+ }
+ }
+
+ if (!octants[child_idx].leaf) {
+ stack_pos++;
+ stack[stack_pos]=0;
+ ptr_stack[stack_pos]=child_idx;
+ } else {
+
+ Octant *child=&octants[child_idx];
+
+ Vector3 n = Plane(p_triangle->vertices[0],p_triangle->vertices[1],p_triangle->vertices[2]).normal;
+
+
+ for(int ci=0;ci<8;ci++) {
+
+ Vector3 pos = child->aabb.pos;
+
+ if (ci&1)
+ pos.x+=child->aabb.size.x;
+ if (ci&2)
+ pos.y+=child->aabb.size.y;
+ if (ci&4)
+ pos.z+=child->aabb.size.z;
+
+
+ pos.x=floor((pos.x+cell_size*0.5)/cell_size);
+ pos.y=floor((pos.y+cell_size*0.5)/cell_size);
+ pos.z=floor((pos.z+cell_size*0.5)/cell_size);
+
+ {
+ Map<Vector3,Vector3>::Element *E=endpoint_normal.find(pos);
+ if (!E) {
+ endpoint_normal[pos]=n;
+ } else {
+ E->get()+=n;
+ }
+ }
+
+ {
+
+ uint64_t bit = get_uv_normal_bit(n);
+
+ Map<Vector3,uint64_t>::Element *E=endpoint_normal_bits.find(pos);
+ if (!E) {
+ endpoint_normal_bits[pos]=(1<<bit);
+ } else {
+ E->get()|=(1<<bit);
+ }
+
+ }
+
+ }
+
+ }
+
+
+ } else {
+ stack_pos--;
+ if (stack_pos<0)
+ break;
+ }
+ }
+
+
+}
+
+
+void BakedLightBaker::_make_octree() {
+
+
+ AABB base = bvh->aabb;
+ float lal=base.get_longest_axis_size();
+ //must be square because we want square blocks
+ base.size.x=lal;
+ base.size.y=lal;
+ base.size.z=lal;
+ base.grow_by(lal*0.001); //for precision
+ octree_aabb=base;
+
+ cell_size=base.size.x;
+ for(int i=0;i<octree_depth;i++)
+ cell_size/=2.0;
+ octant_stack = memnew_arr(uint32_t,octree_depth*2 );
+ octantptr_stack = memnew_arr(uint32_t,octree_depth*2 );
+
+ octant_pool.resize(OCTANT_POOL_CHUNK);
+ octant_pool_size=1;
+ Octant *root=octant_pool.ptr();
+ root->leaf=false;
+ root->aabb=octree_aabb;
+ root->parent=-1;
+ for(int i=0;i<8;i++)
+ root->children[i]=0;
+
+ EditorProgress ep("bake_octree",vformat(TTR("Parsing %d Triangles:"), triangles.size()),triangles.size());
+
+ for(int i=0;i<triangles.size();i++) {
+
+ _octree_insert(0,&triangles[i],octree_depth-1);
+ if ((i%1000)==0) {
+
+ ep.step(TTR("Triangle #")+itos(i),i);
+ }
+ }
+
+ {
+ uint32_t oct_idx=leaf_list;
+ Octant *octants=octant_pool.ptr();
+ while(oct_idx) {
+
+ BakedLightBaker::Octant *oct = &octants[oct_idx];
+ for(int ci=0;ci<8;ci++) {
+
+
+ Vector3 pos = oct->aabb.pos;
+
+ if (ci&1)
+ pos.x+=oct->aabb.size.x;
+ if (ci&2)
+ pos.y+=oct->aabb.size.y;
+ if (ci&4)
+ pos.z+=oct->aabb.size.z;
+
+
+ pos.x=floor((pos.x+cell_size*0.5)/cell_size);
+ pos.y=floor((pos.y+cell_size*0.5)/cell_size);
+ pos.z=floor((pos.z+cell_size*0.5)/cell_size);
+
+ {
+ Map<Vector3,Vector3>::Element *E=endpoint_normal.find(pos);
+ if (!E) {
+ //?
+ print_line("lolwut?");
+ } else {
+ Vector3 n = E->get().normalized();
+ oct->normal_accum[ci][0]=n.x;
+ oct->normal_accum[ci][1]=n.y;
+ oct->normal_accum[ci][2]=n.z;
+
+ }
+
+ }
+
+ {
+
+ Map<Vector3,uint64_t>::Element *E=endpoint_normal_bits.find(pos);
+ if (!E) {
+ //?
+ print_line("lolwut?");
+ } else {
+
+ float max_aper=0;
+ for(uint64_t i=0;i<62;i++) {
+
+ if (!(E->get()&(1<<i)))
+ continue;
+ Vector3 ang_i = get_bit_normal(i);
+
+ for(uint64_t j=0;j<62;j++) {
+
+ if (i==j)
+ continue;
+ if (!(E->get()&(1<<j)))
+ continue;
+ Vector3 ang_j = get_bit_normal(j);
+ float ang = Math::acos(ang_i.dot(ang_j));
+ if (ang>max_aper)
+ max_aper=ang;
+ }
+ }
+ if (max_aper>0.75*Math_PI) {
+ //angle too wide prevent problems and forget
+ oct->normal_accum[ci][0]=0;
+ oct->normal_accum[ci][1]=0;
+ oct->normal_accum[ci][2]=0;
+ }
+ }
+ }
+
+
+ }
+
+ oct_idx=oct->next_leaf;
+ }
+ }
+
+
+}
+
+
+
+
+
+void BakedLightBaker::_plot_light(ThreadStack& thread_stack,const Vector3& p_plot_pos, const AABB& p_plot_aabb, const Color& p_light,const Color& p_tint_light,bool p_only_full, const Plane& p_plane) {
+
+ //stackless version
+
+ uint32_t *stack=thread_stack.octant_stack;
+ uint32_t *ptr_stack=thread_stack.octantptr_stack;
+ Octant *octants=octant_pool.ptr();
+
+ stack[0]=0;
+ ptr_stack[0]=0;
+
+ int stack_pos=0;
+
+
+ while(true) {
+
+ Octant &octant=octants[ptr_stack[stack_pos]];
+
+ if (stack[stack_pos]==0) {
+
+
+ Vector3 pos = octant.aabb.pos + octant.aabb.size*0.5;
+ float md = 1<<(octree_depth - stack_pos );
+ float r=cell_size*plot_size*md;
+ float div = 1.0/(md*md*md);
+ //div=1.0;
+
+
+ float d = p_plot_pos.distance_to(pos);
+
+ if ((p_plane.distance_to(pos)>-cell_size*1.75*md) && d<=r) {
+
+
+ float intensity = 1.0 - (d/r)*(d/r); //not gauss but..
+
+ baked_light_baker_add_64f(&octant.full_accum[0],p_tint_light.r*intensity*div);
+ baked_light_baker_add_64f(&octant.full_accum[1],p_tint_light.g*intensity*div);
+ baked_light_baker_add_64f(&octant.full_accum[2],p_tint_light.b*intensity*div);
+ }
+ }
+
+ if (octant.leaf) {
+
+
+
+ //if (p_plane.normal.dot(octant.aabb.get_support(p_plane.normal)) < p_plane.d-CMP_EPSILON) { //octants behind are no go
+
+
+ if (!p_only_full) {
+ float r=cell_size*plot_size;
+ for(int i=0;i<8;i++) {
+ Vector3 pos=octant.aabb.pos;
+ if (i&1)
+ pos.x+=octant.aabb.size.x;
+ if (i&2)
+ pos.y+=octant.aabb.size.y;
+ if (i&4)
+ pos.z+=octant.aabb.size.z;
+
+
+
+ float d = p_plot_pos.distance_to(pos);
+
+ if ((p_plane.distance_to(pos)>-cell_size*1.75) && d<=r) {
+
+
+ float intensity = 1.0 - (d/r)*(d/r); //not gauss but..
+ if (edge_damp>0) {
+ Vector3 normal = Vector3(octant.normal_accum[i][0],octant.normal_accum[i][1],octant.normal_accum[i][2]);
+ if (normal.x>0 || normal.y>0 || normal.z>0) {
+
+ float damp = Math::abs(p_plane.normal.dot(normal));
+ intensity*=pow(damp,edge_damp);
+
+ }
+ }
+
+ //intensity*=1.0-Math::abs(p_plane.distance_to(pos))/(plot_size*cell_size);
+ //intensity = Math::cos(d*Math_PI*0.5/r);
+
+ baked_light_baker_add_64f(&octant.light_accum[i][0],p_light.r*intensity);
+ baked_light_baker_add_64f(&octant.light_accum[i][1],p_light.g*intensity);
+ baked_light_baker_add_64f(&octant.light_accum[i][2],p_light.b*intensity);
+
+
+ }
+ }
+ }
+
+ stack_pos--;
+ } else if (stack[stack_pos]<8) {
+
+ int i = stack[stack_pos];
+ stack[stack_pos]++;
+
+ if (!octant.children[i]) {
+ continue;
+ }
+
+ Octant &child=octants[octant.children[i]];
+
+ if (!child.aabb.intersects(p_plot_aabb))
+ continue;
+
+ if (child.aabb.encloses(p_plot_aabb)) {
+ stack[stack_pos]=8; //don't test the rest
+ }
+
+ stack_pos++;
+ stack[stack_pos]=0;
+ ptr_stack[stack_pos]=octant.children[i];
+ } else {
+ stack_pos--;
+ if (stack_pos<0)
+ break;
+ }
+ }
+
+
+}
+
+
+float BakedLightBaker::_throw_ray(ThreadStack& thread_stack,bool p_bake_direct,const Vector3& p_begin, const Vector3& p_end,float p_rest,const Color& p_light,float *p_att_curve,float p_att_pos,int p_att_curve_len,int p_bounces,bool p_first_bounce,bool p_only_dist) {
+
+
+ uint32_t* stack = thread_stack.ray_stack;
+ BVH **bstack = thread_stack.bvh_stack;
+
+ enum {
+ TEST_AABB_BIT=0,
+ VISIT_LEFT_BIT=1,
+ VISIT_RIGHT_BIT=2,
+ VISIT_DONE_BIT=3,
+
+
+ };
+
+ Vector3 n = (p_end-p_begin);
+ float len=n.length();
+ if (len==0)
+ return 0;
+ n/=len;
+
+
+
+ real_t d=1e10;
+ bool inters=false;
+ Vector3 r_normal;
+ Vector3 r_point;
+ Vector3 end=p_end;
+
+ Triangle *triangle=NULL;
+
+ /*
+ for(int i=0;i<max_depth;i++)
+ stack[i]=0;
+ */
+
+ int level=0;
+ //AABB ray_aabb;
+ //ray_aabb.pos=p_begin;
+ //ray_aabb.expand_to(p_end);
+
+
+ bstack[0]=bvh;
+ stack[0]=TEST_AABB_BIT;
+
+
+ while(true) {
+
+ uint32_t mode = stack[level];
+ const BVH &b = *bstack[level];
+ bool done=false;
+
+ switch(mode) {
+ case TEST_AABB_BIT: {
+
+ if (b.leaf) {
+
+
+ Face3 f3(b.leaf->vertices[0],b.leaf->vertices[1],b.leaf->vertices[2]);
+
+
+ Vector3 res;
+
+ if (f3.intersects_segment(p_begin,end,&res)) {
+
+
+ float nd = n.dot(res);
+ if (nd<d) {
+
+ d=nd;
+ r_point=res;
+ end=res;
+ len=(p_begin-end).length();
+ r_normal=f3.get_plane().get_normal();
+ triangle=b.leaf;
+ inters=true;
+ }
+
+ }
+
+ stack[level]=VISIT_DONE_BIT;
+ } else {
+
+
+ bool valid = b.aabb.smits_intersect_ray(p_begin,n,0,len);
+ //bool valid = b.aabb.intersects_segment(p_begin,p_end);
+ //bool valid = b.aabb.intersects(ray_aabb);
+
+ if (!valid) {
+
+ stack[level]=VISIT_DONE_BIT;
+
+ } else {
+
+ stack[level]=VISIT_LEFT_BIT;
+ }
+ }
+
+ } continue;
+ case VISIT_LEFT_BIT: {
+
+ stack[level]=VISIT_RIGHT_BIT;
+ bstack[level+1]=b.children[0];
+ stack[level+1]=TEST_AABB_BIT;
+ level++;
+
+ } continue;
+ case VISIT_RIGHT_BIT: {
+
+ stack[level]=VISIT_DONE_BIT;
+ bstack[level+1]=b.children[1];
+ stack[level+1]=TEST_AABB_BIT;
+ level++;
+ } continue;
+ case VISIT_DONE_BIT: {
+
+ if (level==0) {
+ done=true;
+ break;
+ } else
+ level--;
+
+ } continue;
+ }
+
+
+ if (done)
+ break;
+ }
+
+
+
+ if (inters) {
+
+ if (p_only_dist) {
+
+ return p_begin.distance_to(r_point);
+ }
+
+
+ //should check if there is normals first
+ Vector2 uv;
+ if (true) {
+
+ triangle->get_uv_and_normal(r_point,uv,r_normal);
+
+ } else {
+
+ }
+
+ if (n.dot(r_normal)>0)
+ return -1;
+
+ if (n.dot(r_normal)>0)
+ r_normal=-r_normal;
+
+
+ //ok...
+ Color diffuse_at_point(0.8,0.8,0.8);
+ Color specular_at_point(0.0,0.0,0.0);
+
+
+ float dist = p_begin.distance_to(r_point);
+
+ AABB aabb;
+ aabb.pos=r_point;
+ aabb.pos-=Vector3(1,1,1)*cell_size*plot_size;
+ aabb.size=Vector3(2,2,2)*cell_size*plot_size;
+
+ Color res_light=p_light;
+ float att=1.0;
+ float dp=(1.0-normal_damp)*n.dot(-r_normal)+normal_damp;
+
+ if (p_att_curve) {
+
+ p_att_pos+=dist;
+ int cpos = Math::fast_ftoi((p_att_pos/p_att_curve_len)*ATTENUATION_CURVE_LEN);
+ cpos=CLAMP(cpos,0,ATTENUATION_CURVE_LEN-1);
+ att=p_att_curve[cpos];
+ }
+
+
+ res_light.r*=dp;
+ res_light.g*=dp;
+ res_light.b*=dp;
+
+ //light is plotted before multiplication with diffuse, this way
+ //the multiplication can happen with more detail in the shader
+
+
+
+ if (triangle->material) {
+
+ //triangle->get_uv(r_point);
+
+ diffuse_at_point=triangle->material->diffuse.get_color(uv);
+ specular_at_point=triangle->material->specular.get_color(uv);
+ }
+
+
+ diffuse_at_point.r=res_light.r*diffuse_at_point.r;
+ diffuse_at_point.g=res_light.g*diffuse_at_point.g;
+ diffuse_at_point.b=res_light.b*diffuse_at_point.b;
+
+ if (p_bounces>0) {
+
+
+ p_rest-=dist;
+ if (p_rest<CMP_EPSILON)
+ return 0;
+
+ if (r_normal==-n)
+ return 0; //todo change a little
+
+ r_point+=r_normal*0.01;
+
+
+
+
+ specular_at_point.r=res_light.r*specular_at_point.r;
+ specular_at_point.g=res_light.g*specular_at_point.g;
+ specular_at_point.b=res_light.b*specular_at_point.b;
+
+
+
+ if (use_diffuse && (diffuse_at_point.r>CMP_EPSILON || diffuse_at_point.g>CMP_EPSILON || diffuse_at_point.b>CMP_EPSILON)) {
+ //diffuse bounce
+
+ Vector3 c1=r_normal.cross(n).normalized();
+ Vector3 c2=r_normal.cross(c1).normalized();
+ double r1 = double(rand())/RAND_MAX;
+ double r2 = double(rand())/RAND_MAX;
+ double r3 = double(rand())/RAND_MAX;
+#if 0
+ Vector3 next = - ((c1*(r1-0.5)) + (c2*(r2-0.5)) + (r_normal*(r3-0.5))).normalized()*0.5 + r_normal*0.5;
+
+ if (next==Vector3())
+ next=r_normal;
+ Vector3 rn=next.normalized();
+
+#else
+ Vector3 rn = ((c1*(r1-0.5)) + (c2*(r2-0.5)) + (r_normal*r3*0.5)).normalized();
+#endif
+
+
+ _throw_ray(thread_stack,p_bake_direct,r_point,r_point+rn*p_rest,p_rest,diffuse_at_point,p_att_curve,p_att_pos,p_att_curve_len,p_bounces-1);
+ }
+
+ if (use_specular && (specular_at_point.r>CMP_EPSILON || specular_at_point.g>CMP_EPSILON || specular_at_point.b>CMP_EPSILON)) {
+ //specular bounce
+
+ //Vector3 c1=r_normal.cross(n).normalized();
+ //Vector3 c2=r_normal.cross(c1).normalized();
+
+ Vector3 rn = n - r_normal *r_normal.dot(n) * 2.0;
+
+ _throw_ray(thread_stack,p_bake_direct,r_point,r_point+rn*p_rest,p_rest,specular_at_point,p_att_curve,p_att_pos,p_att_curve_len,p_bounces-1);
+ }
+ }
+
+ //specular later
+ //_plot_light_point(r_point,octree,octree_aabb,p_light);
+
+
+ Color plot_light=res_light.linear_interpolate(diffuse_at_point,tint);
+ plot_light.r*=att;
+ plot_light.g*=att;
+ plot_light.b*=att;
+ Color tint_light=diffuse_at_point;
+ tint_light.r*=att;
+ tint_light.g*=att;
+ tint_light.b*=att;
+
+ bool skip=false;
+
+ if (!p_first_bounce || p_bake_direct) {
+
+
+ float r = plot_size * cell_size*2;
+ if (dist<r) {
+ //avoid accumulaiton of light on corners
+ //plot_light=plot_light.linear_interpolate(Color(0,0,0,0),1.0-sd/plot_size*plot_size);
+ skip=true;
+
+ } else {
+
+
+ Vector3 c1=r_normal.cross(n).normalized();
+ Vector3 c2=r_normal.cross(c1).normalized();
+ double r1 = double(rand())/RAND_MAX;
+ double r2 = double(rand())/RAND_MAX;
+ double r3 = double(rand())/RAND_MAX;
+ Vector3 rn = ((c1*(r1-0.5)) + (c2*(r2-0.5)) + (r_normal*r3*0.25)).normalized();
+ float d =_throw_ray(thread_stack,p_bake_direct,r_point,r_point+rn*p_rest,p_rest,diffuse_at_point,p_att_curve,p_att_pos,p_att_curve_len,p_bounces-1,false,true);
+ r = plot_size*cell_size*ao_radius;
+ if (d>0 && d<r) {
+ //avoid accumulaiton of light on corners
+ //plot_light=plot_light.linear_interpolate(Color(0,0,0,0),1.0-sd/plot_size*plot_size);
+ skip=true;
+
+ } else {
+ //plot_light=Color(0,0,0,0);
+ }
+ }
+ }
+
+
+ Plane plane(r_point,r_normal);
+ if (!skip)
+ _plot_light(thread_stack,r_point,aabb,plot_light,tint_light,!(!p_first_bounce || p_bake_direct),plane);
+
+
+ return dist;
+ }
+
+ return -1;
+
+}
+
+
+
+
+void BakedLightBaker::_make_octree_texture() {
+
+
+ BakedLightBaker::Octant *octants=octant_pool.ptr();
+
+ //find neighbours first, to have a better idea of what amount of space is needed
+ {
+
+ Vector<OctantHash> octant_hashing;
+ octant_hashing.resize(octant_pool_size);
+ Vector<uint32_t> hash_table;
+ int hash_table_size=Math::larger_prime(16384);
+ hash_table.resize(hash_table_size);
+ uint32_t*hashptr = hash_table.ptr();
+ OctantHash*octhashptr = octant_hashing.ptr();
+
+ for(int i=0;i<hash_table_size;i++)
+ hashptr[i]=0;
+
+
+ //step 1 add to hash table
+
+ uint32_t oct_idx=leaf_list;
+
+
+ while(oct_idx) {
+
+ BakedLightBaker::Octant *oct = &octants[oct_idx];
+ uint64_t base=0;
+ Vector3 pos = oct->aabb.pos - octree_aabb.pos; //make sure is always positive
+ base=int((pos.x+cell_size*0.5)/cell_size);
+ base<<=16;
+ base|=int((pos.y+cell_size*0.5)/cell_size);
+ base<<=16;
+ base|=int((pos.z+cell_size*0.5)/cell_size);
+
+ uint32_t hash = HashMapHasherDefault::hash(base);
+ uint32_t idx = hash % hash_table_size;
+ octhashptr[oct_idx].next=hashptr[idx];
+ octhashptr[oct_idx].hash=hash;
+ octhashptr[oct_idx].value=base;
+ hashptr[idx]=oct_idx;
+
+ oct_idx=oct->next_leaf;
+
+ }
+
+ //step 2 find neighbours
+ oct_idx=leaf_list;
+ int neighbours=0;
+
+
+ while(oct_idx) {
+
+ BakedLightBaker::Octant *oct = &octants[oct_idx];
+ Vector3 pos = oct->aabb.pos - octree_aabb.pos; //make sure is always positive
+ pos.x+=cell_size;
+ uint64_t base=0;
+ base=int((pos.x+cell_size*0.5)/cell_size);
+ base<<=16;
+ base|=int((pos.y+cell_size*0.5)/cell_size);
+ base<<=16;
+ base|=int((pos.z+cell_size*0.5)/cell_size);
+
+ uint32_t hash = HashMapHasherDefault::hash(base);
+ uint32_t idx = hash % hash_table_size;
+
+ uint32_t bucket = hashptr[idx];
+
+ while(bucket) {
+
+ if (octhashptr[bucket].value==base) {
+
+ oct->bake_neighbour=bucket;
+ octants[bucket].first_neighbour=false;
+ neighbours++;
+ break;
+ }
+
+ bucket = octhashptr[bucket].next;
+ }
+
+ oct_idx=oct->next_leaf;
+
+ }
+
+ print_line("octant with neighbour: "+itos(neighbours));
+
+ }
+
+
+ //ok let's try to just create a texture
+
+ int otex_w=256;
+
+ while (true) {
+
+
+
+ uint32_t oct_idx=leaf_list;
+
+ int row=0;
+
+
+ print_line("begin at row "+itos(row));
+ int longest_line_reused=0;
+ int col=0;
+ int processed=0;
+
+ //reset
+ while(oct_idx) {
+
+ BakedLightBaker::Octant *oct = &octants[oct_idx];
+ oct->texture_x=0;
+ oct->texture_y=0;
+ oct_idx=oct->next_leaf;
+
+ }
+
+ oct_idx=leaf_list;
+ //assign
+ while(oct_idx) {
+
+ BakedLightBaker::Octant *oct = &octants[oct_idx];
+ if (oct->first_neighbour && oct->texture_x==0 && oct->texture_y==0) {
+ //was not processed
+ uint32_t current_idx=oct_idx;
+ int reused=0;
+
+ while(current_idx) {
+ BakedLightBaker::Octant *o = &octants[current_idx];
+ if (col+1 >= otex_w) {
+ col=0;
+ row+=4;
+ }
+ o->texture_x=col;
+ o->texture_y=row;
+ processed++;
+
+ if (o->bake_neighbour) {
+ reused++;
+ }
+ col+=o->bake_neighbour ? 1 : 2; //reuse neighbour
+ current_idx=o->bake_neighbour;
+ }
+
+ if (reused>longest_line_reused) {
+ longest_line_reused=reused;
+ }
+ }
+ oct_idx=oct->next_leaf;
+ }
+
+ row+=4;
+
+ if (otex_w < row) {
+
+ otex_w*=2;
+ } else {
+
+ baked_light_texture_w=otex_w;
+ baked_light_texture_h=nearest_power_of_2(row);
+ print_line("w: "+itos(otex_w));
+ print_line("h: "+itos(row));
+ break;
+ }
+
+
+ }
+
+
+ {
+
+ otex_w=(1<<lattice_size)*(1<<lattice_size)*2; //make sure lattice fits horizontally
+ Vector3 lattice_cell_size=octree_aabb.size;
+ for(int i=0;i<lattice_size;i++) {
+
+ lattice_cell_size*=0.5;
+ }
+
+
+
+ while(true) {
+
+ //let's plot the leafs first, given the octree is not so obvious which size it will have
+ int row=4+4*(1<<lattice_size);
+ int col=0;
+
+ col=0;
+ row+=4;
+ print_line("end at row "+itos(row));
+
+ //put octree, no need for recursion, just loop backwards.
+ int regular_octants=0;
+ for(int i=octant_pool_size-1;i>=0;i--) {
+
+ BakedLightBaker::Octant *oct = &octants[i];
+ if (oct->leaf) //ignore leaf
+ continue;
+ if (oct->aabb.size.x>lattice_cell_size.x*1.1) { //bigger than latice, skip
+ oct->texture_x=0;
+ oct->texture_y=0;
+ } else if (oct->aabb.size.x>lattice_cell_size.x*0.8) {
+ //this is the initial lattice
+ Vector3 pos = oct->aabb.pos - octree_aabb.pos; //make sure is always positive
+ int x = int((pos.x+lattice_cell_size.x*0.5)/lattice_cell_size.x);
+ int y = int((pos.y+lattice_cell_size.y*0.5)/lattice_cell_size.y);
+ int z = int((pos.z+lattice_cell_size.z*0.5)/lattice_cell_size.z);
+ //bug net
+ ERR_FAIL_INDEX(x,(1<<lattice_size));
+ ERR_FAIL_INDEX(y,(1<<lattice_size));
+ ERR_FAIL_INDEX(z,(1<<lattice_size));
+
+ /*int ofs = z*(1<<lattice_size)*(1<<lattice_size)+y*(1<<lattice_size)+x;
+ ofs*=4;
+ oct->texture_x=ofs%otex_w;
+ oct->texture_y=(ofs/otex_w)*4+4;
+ */
+
+ oct->texture_x=(x+(1<<lattice_size)*z)*2;
+ oct->texture_y=4+y*4;
+ //print_line("pos: "+itos(x)+","+itos(y)+","+itos(z)+" - ofs"+itos(oct->texture_x)+","+itos(oct->texture_y));
+
+
+ } else {
+ //an everyday regular octant
+
+ if (col+2 > otex_w) {
+ col=0;
+ row+=4;
+ }
+
+ oct->texture_x=col;
+ oct->texture_y=row;
+ col+=2;
+ regular_octants++;
+
+
+ }
+ }
+ print_line("octants end at row "+itos(row)+" totalling"+itos(regular_octants));
+
+ //ok evaluation.
+
+ if (otex_w<=2048 && row>2048) { //too big upwards, try bigger texture
+ otex_w*=2;
+ continue;
+ } else {
+ baked_octree_texture_w=otex_w;
+ baked_octree_texture_h=row+4;
+ break;
+ }
+
+ }
+
+
+ }
+
+
+ baked_octree_texture_h=nearest_power_of_2(baked_octree_texture_h);
+ print_line("RESULT! "+itos(baked_octree_texture_w)+","+itos(baked_octree_texture_h));
+
+}
+
+
+
+
+
+
+
+
+double BakedLightBaker::get_normalization(int p_light_idx) const {
+
+ double nrg=0;
+
+ const LightData &dl=lights[p_light_idx];
+ double cell_area = cell_size*cell_size;
+ //nrg+= /*dl.energy */ (dl.rays_thrown * cell_area / dl.area);
+ nrg=dl.rays_thrown * cell_area;
+ nrg*=(Math_PI*plot_size*plot_size)*0.5; // damping of radial linear gradient kernel
+ nrg*=dl.constant;
+ //nrg*=5;
+
+
+ return nrg;
+}
+
+
+
+double BakedLightBaker::get_modifier(int p_light_idx) const {
+
+ double nrg=0;
+
+ const LightData &dl=lights[p_light_idx];
+ double cell_area = cell_size*cell_size;
+ //nrg+= /*dl.energy */ (dl.rays_thrown * cell_area / dl.area);
+ nrg=cell_area;
+ nrg*=(Math_PI*plot_size*plot_size)*0.5; // damping of radial linear gradient kernel
+ nrg*=dl.constant;
+ //nrg*=5;
+
+
+ return nrg;
+}
+
+void BakedLightBaker::throw_rays(ThreadStack& thread_stack,int p_amount) {
+
+
+
+ for(int i=0;i<lights.size();i++) {
+
+ LightData &dl=lights[i];
+
+
+ int amount = p_amount * total_light_area / dl.area;
+ double mod = 1.0/double(get_modifier(i));
+ mod*=p_amount/float(amount);
+
+ switch(dl.type) {
+
+ case VS::LIGHT_DIRECTIONAL: {
+
+
+ for(int j=0;j<amount;j++) {
+ Vector3 from = dl.pos;
+ double r1 = double(rand())/RAND_MAX;
+ double r2 = double(rand())/RAND_MAX;
+ from+=dl.up*(r1*2.0-1.0);
+ from+=dl.left*(r2*2.0-1.0);
+ Vector3 to = from+dl.dir*dl.length;
+ Color col=dl.diffuse;
+ float m = mod*dl.energy;
+ col.r*=m;
+ col.g*=m;
+ col.b*=m;
+
+ dl.rays_thrown++;
+ baked_light_baker_add_64i(&total_rays,1);
+
+ _throw_ray(thread_stack,dl.bake_direct,from,to,dl.length,col,NULL,0,0,max_bounces,true);
+ }
+ } break;
+ case VS::LIGHT_OMNI: {
+
+
+ for(int j=0;j<amount;j++) {
+ Vector3 from = dl.pos;
+
+ double r1 = double(rand())/RAND_MAX;
+ double r2 = double(rand())/RAND_MAX;
+ double r3 = double(rand())/RAND_MAX;
+
+#if 0
+ //crap is not uniform..
+ Vector3 dir = Vector3(r1*2.0-1.0,r2*2.0-1.0,r3*2.0-1.0).normalized();
+
+#else
+
+ double phi = r1*Math_PI*2.0;
+ double costheta = r2*2.0-1.0;
+ double u = r3;
+
+ double theta = acos( costheta );
+ double r = 1.0 * pow( u,1/3.0 );
+
+ Vector3 dir(
+ r * sin( theta) * cos( phi ),
+ r * sin( theta) * sin( phi ),
+ r * cos( theta )
+ );
+ dir.normalize();
+
+#endif
+ Vector3 to = dl.pos+dir*dl.radius;
+ Color col=dl.diffuse;
+ float m = mod*dl.energy;
+ col.r*=m;
+ col.g*=m;
+ col.b*=m;
+
+ dl.rays_thrown++;
+ baked_light_baker_add_64i(&total_rays,1);
+ _throw_ray(thread_stack,dl.bake_direct,from,to,dl.radius,col,dl.attenuation_table.ptr(),0,dl.radius,max_bounces,true);
+ //_throw_ray(i,from,to,dl.radius,col,NULL,0,dl.radius,max_bounces,true);
+ }
+
+ } break;
+ case VS::LIGHT_SPOT: {
+
+ for(int j=0;j<amount;j++) {
+ Vector3 from = dl.pos;
+
+ double r1 = double(rand())/RAND_MAX;
+ //double r2 = double(rand())/RAND_MAX;
+ double r3 = double(rand())/RAND_MAX;
+
+ float d=Math::tan(Math::deg2rad(dl.spot_angle));
+
+ float x = sin(r1*Math_PI*2.0)*d;
+ float y = cos(r1*Math_PI*2.0)*d;
+
+ Vector3 dir = r3*(dl.dir + dl.up*y + dl.left*x) + (1.0-r3)*dl.dir;
+ dir.normalize();
+
+
+ Vector3 to = dl.pos+dir*dl.radius;
+ Color col=dl.diffuse;
+ float m = mod*dl.energy;
+ col.r*=m;
+ col.g*=m;
+ col.b*=m;
+
+ dl.rays_thrown++;
+ baked_light_baker_add_64i(&total_rays,1);
+ _throw_ray(thread_stack,dl.bake_direct,from,to,dl.radius,col,dl.attenuation_table.ptr(),0,dl.radius,max_bounces,true);
+ //_throw_ray(i,from,to,dl.radius,col,NULL,0,dl.radius,max_bounces,true);
+ }
+
+ } break;
+
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+void BakedLightBaker::bake(const Ref<BakedLight> &p_light, Node* p_node) {
+
+ if (baking)
+ return;
+ cell_count=0;
+
+ base_inv=p_node->cast_to<Spatial>()->get_global_transform().affine_inverse();
+ EditorProgress ep("bake",TTR("Light Baker Setup:"),5);
+ baked_light=p_light;
+ lattice_size=baked_light->get_initial_lattice_subdiv();
+ octree_depth=baked_light->get_cell_subdivision();
+ plot_size=baked_light->get_plot_size();
+ max_bounces=baked_light->get_bounces();
+ use_diffuse=baked_light->get_bake_flag(BakedLight::BAKE_DIFFUSE);
+ use_specular=baked_light->get_bake_flag(BakedLight::BAKE_SPECULAR);
+ use_translucency=baked_light->get_bake_flag(BakedLight::BAKE_TRANSLUCENT);
+
+ edge_damp=baked_light->get_edge_damp();
+ normal_damp=baked_light->get_normal_damp();
+ octree_extra_margin=baked_light->get_cell_extra_margin();
+ tint=baked_light->get_tint();
+ ao_radius=baked_light->get_ao_radius();
+ ao_strength=baked_light->get_ao_strength();
+ linear_color=baked_light->get_bake_flag(BakedLight::BAKE_LINEAR_COLOR);
+
+ baked_textures.clear();
+ for(int i=0;i<baked_light->get_lightmaps_count();i++) {
+ BakeTexture bt;
+ bt.width=baked_light->get_lightmap_gen_size(i).x;
+ bt.height=baked_light->get_lightmap_gen_size(i).y;
+ baked_textures.push_back(bt);
+ }
+
+
+ ep.step(TTR("Parsing Geometry"),0);
+ _parse_geometry(p_node);
+ mat_map.clear();
+ tex_map.clear();
+ print_line("\ttotal triangles: "+itos(triangles.size()));
+ // no geometry
+ if (triangles.size() == 0) {
+ return;
+ }
+ ep.step(TTR("Fixing Lights"),1);
+ _fix_lights();
+ ep.step(TTR("Making BVH"),2);
+ _make_bvh();
+ ep.step(TTR("Creating Light Octree"),3);
+ _make_octree();
+ ep.step(TTR("Creating Octree Texture"),4);
+ _make_octree_texture();
+ baking=true;
+ _start_thread();
+
+}
+
+
+void BakedLightBaker::update_octree_sampler(PoolVector<int> &p_sampler) {
+
+ BakedLightBaker::Octant *octants=octant_pool.ptr();
+ double norm = 1.0/double(total_rays);
+
+
+
+ if (p_sampler.size()==0 || first_bake_to_map) {
+
+ Vector<int> tmp_smp;
+ tmp_smp.resize(32); //32 for header
+
+ for(int i=0;i<32;i++) {
+ tmp_smp[i]=0;
+ }
+
+ for(int i=octant_pool_size-1;i>=0;i--) {
+
+ if (i==0)
+ tmp_smp[1]=tmp_smp.size();
+
+ Octant &octant=octants[i];
+ octant.sampler_ofs = tmp_smp.size();
+ int idxcol[2]={0,0};
+
+ int r = CLAMP((octant.full_accum[0]*norm)*2048,0,32767);
+ int g = CLAMP((octant.full_accum[1]*norm)*2048,0,32767);
+ int b = CLAMP((octant.full_accum[2]*norm)*2048,0,32767);
+
+ idxcol[0]|=r;
+ idxcol[1]|=(g<<16)|b;
+
+ if (octant.leaf) {
+ tmp_smp.push_back(idxcol[0]);
+ tmp_smp.push_back(idxcol[1]);
+ } else {
+
+ for(int j=0;j<8;j++) {
+ if (octant.children[j]) {
+ idxcol[0]|=(1<<(j+16));
+ }
+ }
+ tmp_smp.push_back(idxcol[0]);
+ tmp_smp.push_back(idxcol[1]);
+ for(int j=0;j<8;j++) {
+ if (octant.children[j]) {
+ tmp_smp.push_back(octants[octant.children[j]].sampler_ofs);
+ if (octants[octant.children[j]].sampler_ofs==0) {
+ print_line("FUUUUUUUUCK");
+ }
+ }
+ }
+ }
+
+ }
+
+ p_sampler.resize(tmp_smp.size());
+ PoolVector<int>::Write w = p_sampler.write();
+ int ss = tmp_smp.size();
+ for(int i=0;i<ss;i++) {
+ w[i]=tmp_smp[i];
+ }
+
+ first_bake_to_map=false;
+
+ }
+
+ double gamma = baked_light->get_gamma_adjust();
+ double mult = baked_light->get_energy_multiplier();
+ float saturation = baked_light->get_saturation();
+
+ PoolVector<int>::Write w = p_sampler.write();
+
+ encode_uint32(octree_depth,(uint8_t*)&w[2]);
+ encode_uint32(linear_color,(uint8_t*)&w[3]);
+
+ encode_float(octree_aabb.pos.x,(uint8_t*)&w[4]);
+ encode_float(octree_aabb.pos.y,(uint8_t*)&w[5]);
+ encode_float(octree_aabb.pos.z,(uint8_t*)&w[6]);
+ encode_float(octree_aabb.size.x,(uint8_t*)&w[7]);
+ encode_float(octree_aabb.size.y,(uint8_t*)&w[8]);
+ encode_float(octree_aabb.size.z,(uint8_t*)&w[9]);
+
+ //norm*=multiplier;
+
+ for(int i=octant_pool_size-1;i>=0;i--) {
+
+ Octant &octant=octants[i];
+ int idxcol[2]={w[octant.sampler_ofs],w[octant.sampler_ofs+1]};
+
+ double rf=pow(octant.full_accum[0]*norm*mult,gamma);
+ double gf=pow(octant.full_accum[1]*norm*mult,gamma);
+ double bf=pow(octant.full_accum[2]*norm*mult,gamma);
+
+ double gray = (rf+gf+bf)/3.0;
+ rf = gray + (rf-gray)*saturation;
+ gf = gray + (gf-gray)*saturation;
+ bf = gray + (bf-gray)*saturation;
+
+
+ int r = CLAMP((rf)*2048,0,32767);
+ int g = CLAMP((gf)*2048,0,32767);
+ int b = CLAMP((bf)*2048,0,32767);
+
+ idxcol[0]=((idxcol[0]>>16)<<16)|r;
+ idxcol[1]=(g<<16)|b;
+ w[octant.sampler_ofs]=idxcol[0];
+ w[octant.sampler_ofs+1]=idxcol[1];
+ }
+
+}
+
+void BakedLightBaker::update_octree_images(PoolVector<uint8_t> &p_octree,PoolVector<uint8_t> &p_light) {
+
+
+ int len = baked_octree_texture_w*baked_octree_texture_h*4;
+ p_octree.resize(len);
+
+ int ilen = baked_light_texture_w*baked_light_texture_h*4;
+ p_light.resize(ilen);
+
+
+ PoolVector<uint8_t>::Write w = p_octree.write();
+ zeromem(w.ptr(),len);
+
+ PoolVector<uint8_t>::Write iw = p_light.write();
+ zeromem(iw.ptr(),ilen);
+
+ float gamma = baked_light->get_gamma_adjust();
+ float mult = baked_light->get_energy_multiplier();
+
+ for(int i=0;i<len;i+=4) {
+ w[i+0]=0xFF;
+ w[i+1]=0;
+ w[i+2]=0xFF;
+ w[i+3]=0xFF;
+ }
+
+ for(int i=0;i<ilen;i+=4) {
+ iw[i+0]=0xFF;
+ iw[i+1]=0;
+ iw[i+2]=0xFF;
+ iw[i+3]=0xFF;
+ }
+
+ float multiplier=1.0;
+
+ if (baked_light->get_format()==BakedLight::FORMAT_HDR8)
+ multiplier=8;
+ encode_uint32(baked_octree_texture_w,&w[0]);
+ encode_uint32(baked_octree_texture_h,&w[4]);
+ encode_uint32(0,&w[8]);
+ encode_float(1<<lattice_size,&w[12]);
+ encode_uint32(octree_depth-lattice_size,&w[16]);
+ encode_uint32(multiplier,&w[20]);
+ encode_uint16(baked_light_texture_w,&w[24]); //if present, use the baked light texture
+ encode_uint16(baked_light_texture_h,&w[26]);
+ encode_uint32(0,&w[28]); //baked light texture format
+
+ encode_float(octree_aabb.pos.x,&w[32]);
+ encode_float(octree_aabb.pos.y,&w[36]);
+ encode_float(octree_aabb.pos.z,&w[40]);
+ encode_float(octree_aabb.size.x,&w[44]);
+ encode_float(octree_aabb.size.y,&w[48]);
+ encode_float(octree_aabb.size.z,&w[52]);
+
+
+ BakedLightBaker::Octant *octants=octant_pool.ptr();
+ int octant_count=octant_pool_size;
+ uint8_t *ptr = w.ptr();
+ uint8_t *lptr = iw.ptr();
+
+
+ int child_offsets[8]={
+ 0,
+ 4,
+ baked_octree_texture_w*4,
+ baked_octree_texture_w*4+4,
+ baked_octree_texture_w*8+0,
+ baked_octree_texture_w*8+4,
+ baked_octree_texture_w*8+baked_octree_texture_w*4,
+ baked_octree_texture_w*8+baked_octree_texture_w*4+4,
+ };
+
+ int lchild_offsets[8]={
+ 0,
+ 4,
+ baked_light_texture_w*4,
+ baked_light_texture_w*4+4,
+ baked_light_texture_w*8+0,
+ baked_light_texture_w*8+4,
+ baked_light_texture_w*8+baked_light_texture_w*4,
+ baked_light_texture_w*8+baked_light_texture_w*4+4,
+ };
+
+ /*Vector<double> norm_arr;
+ norm_arr.resize(lights.size());
+
+ for(int i=0;i<lights.size();i++) {
+ norm_arr[i] = 1.0/get_normalization(i);
+ }
+
+ const double *normptr=norm_arr.ptr();
+*/
+ double norm = 1.0/double(total_rays);
+ mult/=multiplier;
+ double saturation = baked_light->get_saturation();
+
+ for(int i=0;i<octant_count;i++) {
+
+ Octant &oct=octants[i];
+ if (oct.texture_x==0 && oct.texture_y==0)
+ continue;
+
+
+ if (oct.leaf) {
+
+ int ofs = (oct.texture_y * baked_light_texture_w + oct.texture_x)<<2;
+ ERR_CONTINUE(ofs<0 || ofs >ilen);
+ //write colors
+ for(int j=0;j<8;j++) {
+
+ /*
+ if (!oct.children[j])
+ continue;
+ */
+ uint8_t *iptr=&lptr[ofs+lchild_offsets[j]];
+
+ float r=oct.light_accum[j][0]*norm;
+ float g=oct.light_accum[j][1]*norm;
+ float b=oct.light_accum[j][2]*norm;
+
+ r=pow(r*mult,gamma);
+ g=pow(g*mult,gamma);
+ b=pow(b*mult,gamma);
+
+ double gray = (r+g+b)/3.0;
+ r = gray + (r-gray)*saturation;
+ g = gray + (g-gray)*saturation;
+ b = gray + (b-gray)*saturation;
+
+ float ic[3]={
+ r,
+ g,
+ b,
+ };
+ iptr[0]=CLAMP(ic[0]*255.0,0,255);
+ iptr[1]=CLAMP(ic[1]*255.0,0,255);
+ iptr[2]=CLAMP(ic[2]*255.0,0,255);
+ iptr[3]=255;
+ }
+
+ } else {
+
+ int ofs = (oct.texture_y * baked_octree_texture_w + oct.texture_x)<<2;
+ ERR_CONTINUE(ofs<0 || ofs >len);
+
+ //write indices
+ for(int j=0;j<8;j++) {
+
+ if (!oct.children[j])
+ continue;
+ Octant&choct=octants[oct.children[j]];
+ uint8_t *iptr=&ptr[ofs+child_offsets[j]];
+
+ iptr[0]=choct.texture_x>>8;
+ iptr[1]=choct.texture_x&0xFF;
+ iptr[2]=choct.texture_y>>8;
+ iptr[3]=choct.texture_y&0xFF;
+
+ }
+ }
+
+ }
+
+
+}
+
+
+void BakedLightBaker::_free_bvh(BVH* p_bvh) {
+
+ if (!p_bvh->leaf) {
+ if (p_bvh->children[0])
+ _free_bvh(p_bvh->children[0]);
+ if (p_bvh->children[1])
+ _free_bvh(p_bvh->children[1]);
+ }
+
+ memdelete(p_bvh);
+
+}
+
+
+bool BakedLightBaker::is_baking() {
+
+ return baking;
+}
+
+void BakedLightBaker::set_pause(bool p_pause){
+
+ if (paused==p_pause)
+ return;
+
+ paused=p_pause;
+
+ if (paused) {
+ _stop_thread();
+ } else {
+ _start_thread();
+ }
+}
+bool BakedLightBaker::is_paused() {
+
+ return paused;
+
+}
+
+void BakedLightBaker::_bake_thread_func(void *arg) {
+
+ BakedLightBaker *ble = (BakedLightBaker*)arg;
+
+
+
+ ThreadStack thread_stack;
+
+ thread_stack.ray_stack = memnew_arr(uint32_t,ble->bvh_depth);
+ thread_stack.bvh_stack = memnew_arr(BVH*,ble->bvh_depth);
+ thread_stack.octant_stack = memnew_arr(uint32_t,ble->octree_depth*2 );
+ thread_stack.octantptr_stack = memnew_arr(uint32_t,ble->octree_depth*2 );
+
+ while(!ble->bake_thread_exit) {
+
+ ble->throw_rays(thread_stack,1000);
+ }
+
+ memdelete_arr(thread_stack.ray_stack );
+ memdelete_arr(thread_stack.bvh_stack );
+ memdelete_arr(thread_stack.octant_stack );
+ memdelete_arr(thread_stack.octantptr_stack );
+
+}
+
+void BakedLightBaker::_start_thread() {
+
+ if (threads.size()!=0)
+ return;
+ bake_thread_exit=false;
+
+ int thread_count = EDITOR_DEF("light_baker/custom_bake_threads",0);
+ if (thread_count<=0 || thread_count>64)
+ thread_count=OS::get_singleton()->get_processor_count();
+
+ //thread_count=1;
+ threads.resize(thread_count);
+ for(int i=0;i<threads.size();i++) {
+ threads[i]=Thread::create(_bake_thread_func,this);
+ }
+}
+
+void BakedLightBaker::_stop_thread() {
+
+ if (threads.size()==0)
+ return;
+ bake_thread_exit=true;
+ for(int i=0;i<threads.size();i++) {
+ Thread::wait_to_finish(threads[i]);
+ memdelete(threads[i]);
+ }
+ threads.clear();
+}
+
+void BakedLightBaker::_plot_pixel_to_lightmap(int x, int y, int width, int height, uint8_t *image, const Vector3& p_pos,const Vector3& p_normal,double *p_norm_ptr,float mult,float gamma) {
+
+
+ uint8_t *ptr = &image[(y*width+x)*4];
+ //int lc = lights.size();
+ double norm = 1.0/double(total_rays);
+
+
+ Color color;
+
+ Octant *octants=octant_pool.ptr();
+
+
+ int octant_idx=0;
+
+
+ while(true) {
+
+ Octant &octant=octants[octant_idx];
+
+ if (octant.leaf) {
+
+ Vector3 lpos = p_pos-octant.aabb.pos;
+ lpos/=octant.aabb.size;
+
+ Vector3 cols[8];
+
+ for(int i=0;i<8;i++) {
+
+ cols[i].x+=octant.light_accum[i][0]*norm;
+ cols[i].y+=octant.light_accum[i][1]*norm;
+ cols[i].z+=octant.light_accum[i][2]*norm;
+ }
+
+
+ /*Vector3 final = (cols[0] + (cols[1] - cols[0]) * lpos.y);
+ final = final + ((cols[2] + (cols[3] - cols[2]) * lpos.y) - final)*lpos.x;
+
+ Vector3 final2 = (cols[4+0] + (cols[4+1] - cols[4+0]) * lpos.y);
+ final2 = final2 + ((cols[4+2] + (cols[4+3] - cols[4+2]) * lpos.y) - final2)*lpos.x;*/
+
+ Vector3 finala = cols[0].linear_interpolate(cols[1],lpos.x);
+ Vector3 finalb = cols[2].linear_interpolate(cols[3],lpos.x);
+ Vector3 final = finala.linear_interpolate(finalb,lpos.y);
+
+ Vector3 final2a = cols[4+0].linear_interpolate(cols[4+1],lpos.x);
+ Vector3 final2b = cols[4+2].linear_interpolate(cols[4+3],lpos.x);
+ Vector3 final2 = final2a.linear_interpolate(final2b,lpos.y);
+
+ final = final.linear_interpolate(final2,lpos.z);
+ if (baked_light->get_format()==BakedLight::FORMAT_HDR8)
+ final*=8.0;
+
+
+ color.r=pow(final.x*mult,gamma);
+ color.g=pow(final.y*mult,gamma);
+ color.b=pow(final.z*mult,gamma);
+ color.a=1.0;
+
+ int lc = lights.size();
+ LightData *lv = lights.ptr();
+ for(int i=0;i<lc;i++) {
+ //shadow baking
+ if (!lv[i].bake_shadow)
+ continue;
+ Vector3 from = p_pos+p_normal*0.01;
+ Vector3 to;
+ float att=0;
+ switch(lv[i].type) {
+ case VS::LIGHT_DIRECTIONAL: {
+ to=from-lv[i].dir*lv[i].length;
+ } break;
+ case VS::LIGHT_OMNI: {
+ to=lv[i].pos;
+ float d = MIN(lv[i].radius,to.distance_to(from))/lv[i].radius;
+ att=d;//1.0-d;
+ } break;
+ default: continue;
+ }
+
+ uint32_t* stack = ray_stack;
+ BVH **bstack = bvh_stack;
+
+ enum {
+ TEST_RAY_BIT=0,
+ VISIT_LEFT_BIT=1,
+ VISIT_RIGHT_BIT=2,
+ VISIT_DONE_BIT=3,
+
+
+ };
+
+ bool intersected=false;
+
+ int level=0;
+
+ Vector3 n = (to-from);
+ float len=n.length();
+ if (len==0)
+ continue;
+ n/=len;
+
+ bstack[0]=bvh;
+ stack[0]=TEST_RAY_BIT;
+
+
+ while(!intersected) {
+
+ uint32_t mode = stack[level];
+ const BVH &b = *bstack[level];
+ bool done=false;
+
+ switch(mode) {
+ case TEST_RAY_BIT: {
+
+ if (b.leaf) {
+
+
+ Face3 f3(b.leaf->vertices[0],b.leaf->vertices[1],b.leaf->vertices[2]);
+
+
+ Vector3 res;
+
+ if (f3.intersects_segment(from,to)) {
+ intersected=true;
+ done=true;
+ }
+
+ stack[level]=VISIT_DONE_BIT;
+ } else {
+
+
+ bool valid = b.aabb.smits_intersect_ray(from,n,0,len);
+ //bool valid = b.aabb.intersects_segment(p_begin,p_end);
+ //bool valid = b.aabb.intersects(ray_aabb);
+
+ if (!valid) {
+
+ stack[level]=VISIT_DONE_BIT;
+
+ } else {
+
+ stack[level]=VISIT_LEFT_BIT;
+ }
+ }
+
+ } continue;
+ case VISIT_LEFT_BIT: {
+
+ stack[level]=VISIT_RIGHT_BIT;
+ bstack[level+1]=b.children[0];
+ stack[level+1]=TEST_RAY_BIT;
+ level++;
+
+ } continue;
+ case VISIT_RIGHT_BIT: {
+
+ stack[level]=VISIT_DONE_BIT;
+ bstack[level+1]=b.children[1];
+ stack[level+1]=TEST_RAY_BIT;
+ level++;
+ } continue;
+ case VISIT_DONE_BIT: {
+
+ if (level==0) {
+ done=true;
+ break;
+ } else
+ level--;
+
+ } continue;
+ }
+
+
+ if (done)
+ break;
+ }
+
+
+
+ if (intersected) {
+
+ color.a=Math::lerp(MAX(0.01,lv[i].darkening),1.0,att);
+ }
+
+ }
+
+ break;
+ } else {
+
+ Vector3 lpos = p_pos - octant.aabb.pos;
+ Vector3 half = octant.aabb.size * 0.5;
+
+ int ofs=0;
+
+ if (lpos.x >= half.x)
+ ofs|=1;
+ if (lpos.y >= half.y)
+ ofs|=2;
+ if (lpos.z >= half.z)
+ ofs|=4;
+
+ octant_idx = octant.children[ofs];
+
+ if (octant_idx==0)
+ return;
+
+ }
+ }
+
+ ptr[0]=CLAMP(color.r*255.0,0,255);
+ ptr[1]=CLAMP(color.g*255.0,0,255);
+ ptr[2]=CLAMP(color.b*255.0,0,255);
+ ptr[3]=CLAMP(color.a*255.0,0,255);
+
+}
+
+
+Error BakedLightBaker::transfer_to_lightmaps() {
+
+ if (!triangles.size() || baked_textures.size()==0)
+ return ERR_UNCONFIGURED;
+
+ EditorProgress ep("transfer_to_lightmaps",TTR("Transfer to Lightmaps:"),baked_textures.size()*2+triangles.size());
+
+ for(int i=0;i<baked_textures.size();i++) {
+
+ ERR_FAIL_COND_V( baked_textures[i].width<=0 || baked_textures[i].height<=0,ERR_UNCONFIGURED );
+
+ baked_textures[i].data.resize( baked_textures[i].width*baked_textures[i].height*4 );
+ zeromem(baked_textures[i].data.ptr(),baked_textures[i].data.size());
+ ep.step(TTR("Allocating Texture #")+itos(i+1),i);
+ }
+
+ Vector<double> norm_arr;
+ norm_arr.resize(lights.size());
+
+ for(int i=0;i<lights.size();i++) {
+ norm_arr[i] = 1.0/get_normalization(i);
+ }
+ float gamma = baked_light->get_gamma_adjust();
+ float mult = baked_light->get_energy_multiplier();
+
+ for(int i=0;i<triangles.size();i++) {
+
+ if (i%200==0) {
+ ep.step(TTR("Baking Triangle #")+itos(i),i+baked_textures.size());
+ }
+ Triangle &t=triangles[i];
+ if (t.baked_texture<0 || t.baked_texture>=baked_textures.size())
+ continue;
+
+ BakeTexture &bt=baked_textures[t.baked_texture];
+ Vector3 normal = Plane(t.vertices[0],t.vertices[1],t.vertices[2]).normal;
+
+
+ int x[3];
+ int y[3];
+
+ Vector3 vertices[3]={
+ t.vertices[0],
+ t.vertices[1],
+ t.vertices[2]
+ };
+
+ for(int j=0;j<3;j++) {
+
+ x[j]=t.bake_uvs[j].x*bt.width;
+ y[j]=t.bake_uvs[j].y*bt.height;
+ x[j]=CLAMP(x[j],0,bt.width-1);
+ y[j]=CLAMP(y[j],0,bt.height-1);
+ }
+
+
+ {
+
+ // sort the points vertically
+ if (y[1] > y[2]) {
+ SWAP(x[1], x[2]);
+ SWAP(y[1], y[2]);
+ SWAP(vertices[1],vertices[2]);
+ }
+ if (y[0] > y[1]) {
+ SWAP(x[0], x[1]);
+ SWAP(y[0], y[1]);
+ SWAP(vertices[0],vertices[1]);
+ }
+ if (y[1] > y[2]) {
+ SWAP(x[1], x[2]);
+ SWAP(y[1], y[2]);
+ SWAP(vertices[1],vertices[2]);
+ }
+
+ double dx_far = double(x[2] - x[0]) / (y[2] - y[0] + 1);
+ double dx_upper = double(x[1] - x[0]) / (y[1] - y[0] + 1);
+ double dx_low = double(x[2] - x[1]) / (y[2] - y[1] + 1);
+ double xf = x[0];
+ double xt = x[0] + dx_upper; // if y[0] == y[1], special case
+ for (int yi = y[0]; yi <= (y[2] > bt.height-1 ? bt.height-1 : y[2]); yi++)
+ {
+ if (yi >= 0) {
+ for (int xi = (xf > 0 ? int(xf) : 0); xi <= (xt < bt.width ? xt : bt.width-1) ; xi++) {
+ //pixels[int(x + y * width)] = color;
+
+ Vector2 v0 = Vector2(x[1]-x[0],y[1]-y[0]);
+ Vector2 v1 = Vector2(x[2]-x[0],y[2]-y[0]);
+ //vertices[2] - vertices[0];
+ Vector2 v2 = Vector2(xi-x[0],yi-y[0]);
+ float d00 = v0.dot( v0);
+ float d01 = v0.dot( v1);
+ float d11 = v1.dot( v1);
+ float d20 = v2.dot( v0);
+ float d21 = v2.dot( v1);
+ float denom = (d00 * d11 - d01 * d01);
+ Vector3 pos;
+ if (denom==0) {
+ pos=t.vertices[0];
+ } else {
+ float v = (d11 * d20 - d01 * d21) / denom;
+ float w = (d00 * d21 - d01 * d20) / denom;
+ float u = 1.0f - v - w;
+ pos = vertices[0]*u + vertices[1]*v + vertices[2]*w;
+ }
+ _plot_pixel_to_lightmap(xi,yi,bt.width,bt.height,bt.data.ptr(),pos,normal,norm_arr.ptr(),mult,gamma);
+
+ }
+
+ for (int xi = (xf < bt.width ? int(xf) : bt.width-1); xi >= (xt > 0 ? xt : 0); xi--) {
+ //pixels[int(x + y * width)] = color;
+ Vector2 v0 = Vector2(x[1]-x[0],y[1]-y[0]);
+ Vector2 v1 = Vector2(x[2]-x[0],y[2]-y[0]);
+ //vertices[2] - vertices[0];
+ Vector2 v2 = Vector2(xi-x[0],yi-y[0]);
+ float d00 = v0.dot( v0);
+ float d01 = v0.dot( v1);
+ float d11 = v1.dot( v1);
+ float d20 = v2.dot( v0);
+ float d21 = v2.dot( v1);
+ float denom = (d00 * d11 - d01 * d01);
+ Vector3 pos;
+ if (denom==0) {
+ pos=t.vertices[0];
+ } else {
+ float v = (d11 * d20 - d01 * d21) / denom;
+ float w = (d00 * d21 - d01 * d20) / denom;
+ float u = 1.0f - v - w;
+ pos = vertices[0]*u + vertices[1]*v + vertices[2]*w;
+ }
+
+ _plot_pixel_to_lightmap(xi,yi,bt.width,bt.height,bt.data.ptr(),pos,normal,norm_arr.ptr(),mult,gamma);
+
+ }
+ }
+ xf += dx_far;
+ if (yi < y[1])
+ xt += dx_upper;
+ else
+ xt += dx_low;
+ }
+ }
+
+ }
+
+
+ for(int i=0;i<baked_textures.size();i++) {
+
+
+ {
+
+ ep.step(TTR("Post-Processing Texture #")+itos(i),i+baked_textures.size()+triangles.size());
+
+ BakeTexture &bt=baked_textures[i];
+
+ Vector<uint8_t> copy_data=bt.data;
+ uint8_t *data=bt.data.ptr();
+ const int max_radius=8;
+ const int shadow_radius=2;
+ const int max_dist=0x7FFFFFFF;
+
+ for(int x=0;x<bt.width;x++) {
+
+ for(int y=0;y<bt.height;y++) {
+
+
+ uint8_t a = copy_data[(y*bt.width+x)*4+3];
+
+ if (a>0) {
+ //blur shadow
+
+ int from_x = MAX(0,x-shadow_radius);
+ int to_x = MIN(bt.width-1,x+shadow_radius);
+ int from_y = MAX(0,y-shadow_radius);
+ int to_y = MIN(bt.height-1,y+shadow_radius);
+
+ int sum=0;
+ int sumc=0;
+
+ for(int k=from_y;k<=to_y;k++) {
+ for(int l=from_x;l<=to_x;l++) {
+
+ const uint8_t * rp = &copy_data[(k*bt.width+l)<<2];
+
+ sum+=rp[3];
+ sumc++;
+ }
+ }
+
+ sum/=sumc;
+ data[(y*bt.width+x)*4+3]=sum;
+
+ } else {
+
+ int closest_dist=max_dist;
+ uint8_t closest_color[4];
+
+ int from_x = MAX(0,x-max_radius);
+ int to_x = MIN(bt.width-1,x+max_radius);
+ int from_y = MAX(0,y-max_radius);
+ int to_y = MIN(bt.height-1,y+max_radius);
+
+ for(int k=from_y;k<=to_y;k++) {
+ for(int l=from_x;l<=to_x;l++) {
+
+ int dy = y-k;
+ int dx = x-l;
+ int dist = dy*dy+dx*dx;
+ if (dist>=closest_dist)
+ continue;
+
+ const uint8_t * rp = &copy_data[(k*bt.width+l)<<2];
+
+ if (rp[3]==0)
+ continue;
+
+ closest_dist=dist;
+ closest_color[0]=rp[0];
+ closest_color[1]=rp[1];
+ closest_color[2]=rp[2];
+ closest_color[3]=rp[3];
+ }
+ }
+
+
+ if (closest_dist!=max_dist) {
+
+ data[(y*bt.width+x)*4+0]=closest_color[0];
+ data[(y*bt.width+x)*4+1]=closest_color[1];
+ data[(y*bt.width+x)*4+2]=closest_color[2];
+ data[(y*bt.width+x)*4+3]=closest_color[3];
+ }
+ }
+ }
+ }
+ }
+
+ PoolVector<uint8_t> dv;
+ dv.resize(baked_textures[i].data.size());
+ {
+ PoolVector<uint8_t>::Write w = dv.write();
+ copymem(w.ptr(),baked_textures[i].data.ptr(),baked_textures[i].data.size());
+ }
+
+ Image img(baked_textures[i].width,baked_textures[i].height,0,Image::FORMAT_RGBA8,dv);
+ Ref<ImageTexture> tex = memnew( ImageTexture );
+ tex->create_from_image(img);
+ baked_light->set_lightmap_texture(i,tex);
+ }
+
+
+ return OK;
+}
+
+void BakedLightBaker::clear() {
+
+
+
+ _stop_thread();
+
+ if (bvh)
+ _free_bvh(bvh);
+
+ if (ray_stack)
+ memdelete_arr(ray_stack);
+ if (octant_stack)
+ memdelete_arr(octant_stack);
+ if (octantptr_stack)
+ memdelete_arr(octantptr_stack);
+ if (bvh_stack)
+ memdelete_arr(bvh_stack);
+/*
+ * ???
+ for(int i=0;i<octant_pool.size();i++) {
+ /*
+ if (octant_pool[i].leaf) {
+ memdelete_arr( octant_pool[i].light );
+ }
+ Vector<double> norm_arr;
+ norm_arr.resize(lights.size());
+ */
+
+ for(int i=0;i<lights.size();i++) {
+ norm_arr[i] = 1.0/get_normalization(i);
+ }
+
+ const double *normptr=norm_arr.ptr();
+ }
+*/
+ octant_pool.clear();
+ octant_pool_size=0;
+ bvh=NULL;
+ leaf_list=0;
+ cell_count=0;
+ ray_stack=NULL;
+ octant_stack=NULL;
+ octantptr_stack=NULL;
+ bvh_stack=NULL;
+ materials.clear();
+ materials.clear();
+ textures.clear();
+ lights.clear();
+ triangles.clear();
+ endpoint_normal.clear();
+ endpoint_normal_bits.clear();
+ baked_octree_texture_w=0;
+ baked_octree_texture_h=0;
+ paused=false;
+ baking=false;
+
+ bake_thread_exit=false;
+ first_bake_to_map=true;
+ baked_light=Ref<BakedLight>();
+ total_rays=0;
+
+}
+
+BakedLightBaker::BakedLightBaker() {
+ octree_depth=9;
+ lattice_size=4;
+ octant_pool.clear();
+ octant_pool_size=0;
+ bvh=NULL;
+ leaf_list=0;
+ cell_count=0;
+ ray_stack=NULL;
+ bvh_stack=NULL;
+ octant_stack=NULL;
+ octantptr_stack=NULL;
+ plot_size=2.5;
+ max_bounces=2;
+ materials.clear();
+ baked_octree_texture_w=0;
+ baked_octree_texture_h=0;
+ paused=false;
+ baking=false;
+
+ bake_thread_exit=false;
+ total_rays=0;
+ first_bake_to_map=true;
+ linear_color=false;
+
+}
+
+BakedLightBaker::~BakedLightBaker() {
+
+ clear();
+}
+#endif
diff --git a/editor/plugins/baked_light_baker.h b/editor/plugins/baked_light_baker.h
new file mode 100644
index 0000000000..89788338d9
--- /dev/null
+++ b/editor/plugins/baked_light_baker.h
@@ -0,0 +1,381 @@
+/*************************************************************************/
+/* baked_light_baker.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef BAKED_LIGHT_BAKER_H
+#define BAKED_LIGHT_BAKER_H
+
+#include "scene/3d/baked_light_instance.h"
+#include "scene/3d/light.h"
+#include "scene/3d/mesh_instance.h"
+#include "os/thread.h"
+
+#if 0
+
+class BakedLightBaker {
+public:
+
+ enum {
+
+ ATTENUATION_CURVE_LEN=256,
+ OCTANT_POOL_CHUNK=1000000
+ };
+
+ /*
+ struct OctantLight {
+ double accum[8][3];
+ };
+ */
+
+ struct Octant {
+ bool leaf;
+ AABB aabb;
+ uint16_t texture_x;
+ uint16_t texture_y;
+ int sampler_ofs;
+ float normal_accum[8][3];
+ double full_accum[3];
+ int parent;
+ union {
+ struct {
+ int next_leaf;
+ float offset[3];
+ int bake_neighbour;
+ bool first_neighbour;
+ double light_accum[8][3];
+ };
+ int children[8];
+ };
+ };
+
+ struct OctantHash {
+
+ int next;
+ uint32_t hash;
+ uint64_t value;
+
+ };
+
+ struct MeshTexture {
+
+ Vector<uint8_t> tex;
+ int tex_w,tex_h;
+
+ _FORCE_INLINE_ void get_color(const Vector2& p_uv,Color& ret) {
+
+ if (tex_w && tex_h) {
+
+ int x = Math::fast_ftoi(Math::fposmod(p_uv.x,1.0)*tex_w);
+ int y = Math::fast_ftoi(Math::fposmod(p_uv.y,1.0)*tex_w);
+ x=CLAMP(x,0,tex_w-1);
+ y=CLAMP(y,0,tex_h-1);
+ const uint8_t*ptr = &tex[(y*tex_w+x)*4];
+ ret.r*=ptr[0]/255.0;
+ ret.g*=ptr[1]/255.0;
+ ret.b*=ptr[2]/255.0;
+ ret.a*=ptr[3]/255.0;
+ }
+ }
+
+ };
+
+ struct Param {
+
+ Color color;
+ MeshTexture*tex;
+ _FORCE_INLINE_ Color get_color(const Vector2& p_uv) {
+
+ Color ret=color;
+ if (tex)
+ tex->get_color(p_uv,ret);
+ return ret;
+
+ }
+
+ };
+
+ struct MeshMaterial {
+
+ Param diffuse;
+ Param specular;
+ Param emission;
+ };
+
+ struct Triangle {
+
+ AABB aabb;
+ Vector3 vertices[3];
+ Vector2 uvs[3];
+ Vector2 bake_uvs[3];
+ Vector3 normals[3];
+ MeshMaterial *material;
+ int baked_texture;
+
+ _FORCE_INLINE_ Vector2 get_uv(const Vector3& p_pos) {
+
+ Vector3 v0 = vertices[1] - vertices[0];
+ Vector3 v1 = vertices[2] - vertices[0];
+ Vector3 v2 = p_pos - vertices[0];
+
+ float d00 = v0.dot( v0);
+ float d01 = v0.dot( v1);
+ float d11 = v1.dot( v1);
+ float d20 = v2.dot( v0);
+ float d21 = v2.dot( v1);
+ float denom = (d00 * d11 - d01 * d01);
+ if (denom==0)
+ return uvs[0];
+ float v = (d11 * d20 - d01 * d21) / denom;
+ float w = (d00 * d21 - d01 * d20) / denom;
+ float u = 1.0f - v - w;
+
+ return uvs[0]*u + uvs[1]*v + uvs[2]*w;
+ }
+
+ _FORCE_INLINE_ void get_uv_and_normal(const Vector3& p_pos,Vector2& r_uv,Vector3& r_normal) {
+
+ Vector3 v0 = vertices[1] - vertices[0];
+ Vector3 v1 = vertices[2] - vertices[0];
+ Vector3 v2 = p_pos - vertices[0];
+
+ float d00 = v0.dot( v0);
+ float d01 = v0.dot( v1);
+ float d11 = v1.dot( v1);
+ float d20 = v2.dot( v0);
+ float d21 = v2.dot( v1);
+ float denom = (d00 * d11 - d01 * d01);
+ if (denom==0) {
+ r_normal=normals[0];
+ r_uv=uvs[0];
+ return;
+ }
+ float v = (d11 * d20 - d01 * d21) / denom;
+ float w = (d00 * d21 - d01 * d20) / denom;
+ float u = 1.0f - v - w;
+
+ r_uv=uvs[0]*u + uvs[1]*v + uvs[2]*w;
+ r_normal=(normals[0]*u+normals[1]*v+normals[2]*w).normalized();
+ }
+ };
+
+
+ struct BVH {
+
+ AABB aabb;
+ Vector3 center;
+ Triangle *leaf;
+ BVH*children[2];
+ };
+
+
+ struct BVHCmpX {
+
+ bool operator()(const BVH* p_left, const BVH* p_right) const {
+
+ return p_left->center.x < p_right->center.x;
+ }
+ };
+
+ struct BVHCmpY {
+
+ bool operator()(const BVH* p_left, const BVH* p_right) const {
+
+ return p_left->center.y < p_right->center.y;
+ }
+ };
+ struct BVHCmpZ {
+
+ bool operator()(const BVH* p_left, const BVH* p_right) const {
+
+ return p_left->center.z < p_right->center.z;
+ }
+ };
+
+ struct BakeTexture {
+
+ Vector<uint8_t> data;
+ int width,height;
+ };
+
+
+ struct LightData {
+
+ VS::LightType type;
+
+ Vector3 pos;
+ Vector3 up;
+ Vector3 left;
+ Vector3 dir;
+ Color diffuse;
+ Color specular;
+ float energy;
+ float length;
+ int rays_thrown;
+ bool bake_shadow;
+
+ float radius;
+ float attenuation;
+ float spot_angle;
+ float darkening;
+ float spot_attenuation;
+ float area;
+
+ float constant;
+
+ bool bake_direct;
+
+ Vector<float> attenuation_table;
+
+ };
+
+
+ Vector<LightData> lights;
+
+ List<MeshMaterial> materials;
+ List<MeshTexture> textures;
+
+ AABB octree_aabb;
+ Vector<Octant> octant_pool;
+ int octant_pool_size;
+ BVH*bvh;
+ Vector<Triangle> triangles;
+ Vector<BakeTexture> baked_textures;
+ Transform base_inv;
+ int leaf_list;
+ int octree_depth;
+ int bvh_depth;
+ int cell_count;
+ uint32_t *ray_stack;
+ BVH **bvh_stack;
+ uint32_t *octant_stack;
+ uint32_t *octantptr_stack;
+
+ struct ThreadStack {
+ uint32_t *octant_stack;
+ uint32_t *octantptr_stack;
+ uint32_t *ray_stack;
+ BVH **bvh_stack;
+ };
+
+ Map<Vector3,Vector3> endpoint_normal;
+ Map<Vector3,uint64_t> endpoint_normal_bits;
+
+ float cell_size;
+ float plot_size; //multiplied by cell size
+ float octree_extra_margin;
+
+ int max_bounces;
+ int64_t total_rays;
+ bool use_diffuse;
+ bool use_specular;
+ bool use_translucency;
+ bool linear_color;
+
+
+ int baked_octree_texture_w;
+ int baked_octree_texture_h;
+ int baked_light_texture_w;
+ int baked_light_texture_h;
+ int lattice_size;
+ float edge_damp;
+ float normal_damp;
+ float tint;
+ float ao_radius;
+ float ao_strength;
+
+ bool paused;
+ bool baking;
+ bool first_bake_to_map;
+
+ Map<Ref<Material>,MeshMaterial*> mat_map;
+ Map<Ref<Texture>,MeshTexture*> tex_map;
+
+
+
+ MeshTexture* _get_mat_tex(const Ref<Texture>& p_tex);
+ void _add_mesh(const Ref<Mesh>& p_mesh,const Ref<Material>& p_mat_override,const Transform& p_xform,int p_baked_texture=-1);
+ void _parse_geometry(Node* p_node);
+ BVH* _parse_bvh(BVH** p_children,int p_size,int p_depth,int& max_depth);
+ void _make_bvh();
+ void _make_octree();
+ void _make_octree_texture();
+ void _octree_insert(int p_octant, Triangle* p_triangle, int p_depth);
+ _FORCE_INLINE_ void _plot_pixel_to_lightmap(int x, int y, int width, int height, uint8_t *image, const Vector3& p_pos,const Vector3& p_normal,double *p_norm_ptr,float mult,float gamma);
+
+
+ void _free_bvh(BVH* p_bvh);
+
+ void _fix_lights();
+
+ Ref<BakedLight> baked_light;
+
+
+ //void _plot_light(const Vector3& p_plot_pos,const AABB& p_plot_aabb,const Color& p_light,int p_octant=0);
+ void _plot_light(ThreadStack& thread_stack,const Vector3& p_plot_pos,const AABB& p_plot_aabb,const Color& p_light,const Color& p_tint_light,bool p_only_full,const Plane& p_plane);
+ //void _plot_light_point(const Vector3& p_plot_pos, Octant *p_octant, const AABB& p_aabb,const Color& p_light);
+
+ float _throw_ray(ThreadStack& thread_stack,bool p_bake_direct,const Vector3& p_begin, const Vector3& p_end,float p_rest,const Color& p_light,float *p_att_curve,float p_att_pos,int p_att_curve_len,int p_bounces,bool p_first_bounce=false,bool p_only_dist=false);
+
+
+ float total_light_area;
+
+ Vector<Thread*> threads;
+
+ bool bake_thread_exit;
+ static void _bake_thread_func(void *arg);
+
+ void _start_thread();
+ void _stop_thread();
+public:
+
+
+ void throw_rays(ThreadStack &thread_stack, int p_amount);
+ double get_normalization(int p_light_idx) const;
+ double get_modifier(int p_light_idx) const;
+
+ void bake(const Ref<BakedLight>& p_light,Node *p_base);
+ bool is_baking();
+ void set_pause(bool p_pause);
+ bool is_paused();
+ uint64_t get_rays_thrown() { return total_rays; }
+
+ Error transfer_to_lightmaps();
+
+ void update_octree_sampler(PoolVector<int> &p_sampler);
+ void update_octree_images(PoolVector<uint8_t> &p_octree,PoolVector<uint8_t> &p_light);
+
+ Ref<BakedLight> get_baked_light() { return baked_light; }
+
+ void clear();
+
+ BakedLightBaker();
+ ~BakedLightBaker();
+
+};
+
+#endif // BAKED_LIGHT_BAKER_H
+#endif
diff --git a/editor/plugins/baked_light_baker_cmpxchg.cpp b/editor/plugins/baked_light_baker_cmpxchg.cpp
new file mode 100644
index 0000000000..5e9228b7de
--- /dev/null
+++ b/editor/plugins/baked_light_baker_cmpxchg.cpp
@@ -0,0 +1,112 @@
+/*************************************************************************/
+/* baked_light_baker_cmpxchg.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "typedefs.h"
+
+
+#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
+
+void baked_light_baker_add_64f(double *dst,double value) {
+
+
+ union {
+ int64_t i;
+ double f;
+ } swapy;
+
+
+ while(true) {
+ swapy.f=*dst;
+ int64_t from = swapy.i;
+ swapy.f+=value;
+ int64_t to=swapy.i;
+ if (__sync_bool_compare_and_swap((int64_t*)dst,from,to))
+ break;
+ }
+}
+
+void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
+
+ while(!__sync_bool_compare_and_swap(dst,*dst,(*dst)+value)) {}
+
+}
+
+#elif defined(WINDOWS_ENABLED)
+
+#include "windows.h"
+
+void baked_light_baker_add_64f(double *dst,double value) {
+
+ union {
+ int64_t i;
+ double f;
+ } swapy;
+
+
+ while(true) {
+ swapy.f=*dst;
+ int64_t from = swapy.i;
+ swapy.f+=value;
+ int64_t to=swapy.i;
+ int64_t result = InterlockedCompareExchange64((int64_t*)dst,to,from);
+ if (result==from)
+ break;
+ }
+
+}
+
+void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
+
+ while(true) {
+ int64_t from = *dst;
+ int64_t to = from+value;
+ int64_t result = InterlockedCompareExchange64(dst,to,from);
+ if (result==from)
+ break;
+ }
+}
+
+
+#else
+
+//in goder (the god of programmers) we trust
+#warning seems this platform or compiler does not support safe cmpxchg, your baked lighting may be funny
+
+void baked_light_baker_add_64f(double *dst,double value) {
+
+ *dst+=value;
+
+}
+
+void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
+
+ *dst+=value;
+
+}
+
+#endif
diff --git a/editor/plugins/baked_light_editor_plugin.cpp b/editor/plugins/baked_light_editor_plugin.cpp
new file mode 100644
index 0000000000..6a7e708b85
--- /dev/null
+++ b/editor/plugins/baked_light_editor_plugin.cpp
@@ -0,0 +1,379 @@
+/*************************************************************************/
+/* baked_light_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "baked_light_editor_plugin.h"
+
+#include "scene/gui/box_container.h"
+#include "scene/3d/mesh_instance.h"
+#include "io/marshalls.h"
+#include "io/resource_saver.h"
+
+
+#if 0
+
+
+void BakedLightEditor::_end_baking() {
+
+ baker->clear();
+ set_process(false);
+ button_bake->set_pressed(false);
+ bake_info->set_text("");
+}
+
+void BakedLightEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ _end_baking();
+ node=NULL;
+
+ hide();
+ }
+
+}
+
+
+
+
+
+void BakedLightEditor::_notification(int p_option) {
+
+
+ if (p_option==NOTIFICATION_ENTER_TREE) {
+
+ button_bake->set_icon(get_icon("Bake","EditorIcons"));
+ button_reset->set_icon(get_icon("Reload","EditorIcons"));
+ button_make_lightmaps->set_icon(get_icon("LightMap","EditorIcons"));
+ }
+
+ if (p_option==NOTIFICATION_PROCESS) {
+
+ if (baker->is_baking() && !baker->is_paused()) {
+
+ update_timeout-=get_process_delta_time();
+ if (update_timeout<0) {
+
+ if (baker->get_baked_light()!=node->get_baked_light()) {
+ _end_baking();
+ return;
+ }
+
+ uint64_t t = OS::get_singleton()->get_ticks_msec();
+
+#ifdef DEBUG_CUBES
+ double norm = baker->get_normalization();
+ float max_lum=0;
+
+ {
+ PoolVector<Color>::Write cw=colors.write();
+ BakedLightBaker::Octant *octants=baker->octant_pool.ptr();
+ BakedLightBaker::Octant *oct = &octants[baker->leaf_list];
+ int vert_idx=0;
+
+ while(oct) {
+
+
+
+ Color colors[8];
+ for(int i=0;i<8;i++) {
+
+ colors[i].r=oct->light_accum[i][0]/norm;
+ colors[i].g=oct->light_accum[i][1]/norm;
+ colors[i].b=oct->light_accum[i][2]/norm;
+
+ float lum = colors[i].get_v();
+ /*
+ if (lum<0.05)
+ color.a=0;
+ */
+ if (lum>max_lum)
+ max_lum=lum;
+
+ }
+ static const int vert2cub[36]={7,3,1,1,5,7,7,6,2,2,3,7,7,5,4,4,6,7,2,6,4,4,0,2,4,5,1,1,0,4,1,3,2,2,0,1};
+ for (int i=0;i<36;i++) {
+
+
+ cw[vert_idx++]=colors[vert2cub[i]];
+ }
+
+ if (oct->next_leaf)
+ oct=&octants[oct->next_leaf];
+ else
+ oct=NULL;
+
+ }
+ }
+ print_line("MSCOL: "+itos(OS::get_singleton()->get_ticks_msec()-t));
+ t = OS::get_singleton()->get_ticks_msec();
+
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[Mesh::ARRAY_VERTEX]=vertices;
+ a[Mesh::ARRAY_COLOR]=colors;
+ while(mesh->get_surface_count())
+ mesh->surface_remove(0);
+ mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES,a);
+ mesh->surface_set_material(0,material);
+#endif
+ ERR_FAIL_COND(node->get_baked_light().is_null());
+
+ baker->update_octree_images(octree_texture,light_texture);
+ baker->update_octree_sampler(octree_sampler);
+ //print_line("sampler size: "+itos(octree_sampler.size()*4));
+
+#if 1
+//debug
+ Image img(baker->baked_octree_texture_w,baker->baked_octree_texture_h,0,Image::FORMAT_RGBA8,octree_texture);
+ Ref<ImageTexture> it = memnew( ImageTexture );
+ it->create_from_image(img);
+ ResourceSaver::save("baked_octree.png",it);
+
+
+#endif
+
+
+ uint64_t rays_snap = baker->get_rays_thrown();
+ int rays_sec = (rays_snap-last_rays_time)*1.0-(update_timeout);
+ last_rays_time=rays_snap;
+
+ bake_info->set_text("rays/s: "+itos(rays_sec));
+ update_timeout=1;
+ print_line("MSUPDATE: "+itos(OS::get_singleton()->get_ticks_msec()-t));
+ t=OS::get_singleton()->get_ticks_msec();
+ node->get_baked_light()->set_octree(octree_texture);
+ node->get_baked_light()->set_light(light_texture);
+ node->get_baked_light()->set_sampler_octree(octree_sampler);
+ node->get_baked_light()->set_edited(true);
+
+ print_line("MSSET: "+itos(OS::get_singleton()->get_ticks_msec()-t));
+
+
+
+ }
+ }
+ }
+}
+
+
+void BakedLightEditor::_menu_option(int p_option) {
+
+
+ switch(p_option) {
+
+
+ case MENU_OPTION_BAKE: {
+
+ ERR_FAIL_COND(!node);
+ ERR_FAIL_COND(node->get_baked_light().is_null());
+ baker->bake(node->get_baked_light(),node);
+ node->get_baked_light()->set_mode(BakedLight::MODE_OCTREE);
+ update_timeout=0;
+ set_process(true);
+
+
+ } break;
+ case MENU_OPTION_CLEAR: {
+
+
+
+ } break;
+
+ }
+}
+
+void BakedLightEditor::_bake_pressed() {
+
+ ERR_FAIL_COND(!node);
+ const String conf_warning = node->get_configuration_warning();
+ if (!conf_warning.empty()) {
+ err_dialog->set_text(conf_warning);
+ err_dialog->popup_centered_minsize();
+ button_bake->set_pressed(false);
+ return;
+ }
+
+ if (baker->is_baking()) {
+
+ baker->set_pause(!button_bake->is_pressed());
+ if (baker->is_paused()) {
+
+ set_process(false);
+ bake_info->set_text("");
+ button_reset->show();
+ button_make_lightmaps->show();
+
+ } else {
+
+ update_timeout=0;
+ set_process(true);
+ button_make_lightmaps->hide();
+ button_reset->hide();
+ }
+ } else {
+ baker->bake(node->get_baked_light(),node);
+ node->get_baked_light()->set_mode(BakedLight::MODE_OCTREE);
+ update_timeout=0;
+
+ last_rays_time=0;
+ button_bake->set_pressed(false);
+
+ set_process(true);
+ }
+
+}
+
+void BakedLightEditor::_clear_pressed(){
+
+ baker->clear();
+ button_bake->set_pressed(false);
+ bake_info->set_text("");
+
+}
+
+void BakedLightEditor::edit(BakedLightInstance *p_baked_light) {
+
+ if (p_baked_light==NULL || node==p_baked_light) {
+ return;
+ }
+ if (node && node!=p_baked_light)
+ _end_baking();
+
+
+ node=p_baked_light;
+ //_end_baking();
+
+}
+
+void BakedLightEditor::_bake_lightmaps() {
+
+ Error err = baker->transfer_to_lightmaps();
+ if (err) {
+
+ err_dialog->set_text("Error baking to lightmaps!\nMake sure that a bake has just\n happened and that lightmaps are\n configured. ");
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ node->get_baked_light()->set_mode(BakedLight::MODE_LIGHTMAPS);
+
+
+}
+
+void BakedLightEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_option",&BakedLightEditor::_menu_option);
+ ClassDB::bind_method("_bake_pressed",&BakedLightEditor::_bake_pressed);
+ ClassDB::bind_method("_clear_pressed",&BakedLightEditor::_clear_pressed);
+ ClassDB::bind_method("_bake_lightmaps",&BakedLightEditor::_bake_lightmaps);
+}
+
+BakedLightEditor::BakedLightEditor() {
+
+
+ bake_hbox = memnew( HBoxContainer );
+ button_bake = memnew( ToolButton );
+ button_bake->set_text(TTR("Bake!"));
+ button_bake->set_toggle_mode(true);
+ button_reset = memnew( Button );
+ button_make_lightmaps = memnew( Button );
+ button_bake->set_tooltip("Start/Unpause the baking process.\nThis bakes lighting into the lightmap octree.");
+ button_make_lightmaps ->set_tooltip("Convert the lightmap octree to lightmap textures\n(must have set up UV/Lightmaps properly before!).");
+
+
+ bake_info = memnew( Label );
+ bake_hbox->add_child( button_bake );
+ bake_hbox->add_child( button_reset );
+ bake_hbox->add_child( bake_info );
+
+ err_dialog = memnew( AcceptDialog );
+ add_child(err_dialog);
+ node=NULL;
+ baker = memnew( BakedLightBaker );
+
+ bake_hbox->add_child(button_make_lightmaps);
+ button_make_lightmaps->hide();
+
+ button_bake->connect("pressed",this,"_bake_pressed");
+ button_reset->connect("pressed",this,"_clear_pressed");
+ button_make_lightmaps->connect("pressed",this,"_bake_lightmaps");
+ button_reset->hide();
+ button_reset->set_tooltip(TTR("Reset the lightmap octree baking process (start over)."));
+
+
+ update_timeout=0;
+
+
+
+}
+
+BakedLightEditor::~BakedLightEditor() {
+
+ memdelete(baker);
+}
+
+void BakedLightEditorPlugin::edit(Object *p_object) {
+
+ baked_light_editor->edit(p_object->cast_to<BakedLightInstance>());
+}
+
+bool BakedLightEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("BakedLightInstance");
+}
+
+void BakedLightEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ baked_light_editor->show();
+ baked_light_editor->bake_hbox->show();
+ } else {
+
+ baked_light_editor->hide();
+ baked_light_editor->bake_hbox->hide();
+ baked_light_editor->edit(NULL);
+ }
+
+}
+
+BakedLightEditorPlugin::BakedLightEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ baked_light_editor = memnew( BakedLightEditor );
+ editor->get_viewport()->add_child(baked_light_editor);
+ add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU,baked_light_editor->bake_hbox);
+ baked_light_editor->hide();
+ baked_light_editor->bake_hbox->hide();
+}
+
+
+BakedLightEditorPlugin::~BakedLightEditorPlugin()
+{
+}
+
+
+#endif
diff --git a/editor/plugins/baked_light_editor_plugin.h b/editor/plugins/baked_light_editor_plugin.h
new file mode 100644
index 0000000000..a71de12bcc
--- /dev/null
+++ b/editor/plugins/baked_light_editor_plugin.h
@@ -0,0 +1,120 @@
+/*************************************************************************/
+/* baked_light_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef BAKED_LIGHT_EDITOR_PLUGIN_H
+#define BAKED_LIGHT_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "editor/plugins/baked_light_baker.h"
+#include "scene/gui/spin_box.h"
+
+
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+#if 0
+
+class MeshInstance;
+
+class BakedLightEditor : public Control {
+
+ GDCLASS(BakedLightEditor, Control );
+
+
+ float update_timeout;
+ PoolVector<uint8_t> octree_texture;
+ PoolVector<uint8_t> light_texture;
+ PoolVector<int> octree_sampler;
+
+ BakedLightBaker *baker;
+ AcceptDialog *err_dialog;
+
+ HBoxContainer *bake_hbox;
+ Button *button_bake;
+ Button *button_reset;
+ Button *button_make_lightmaps;
+ Label *bake_info;
+
+ uint64_t last_rays_time;
+
+
+
+ BakedLightInstance *node;
+
+ enum Menu {
+
+ MENU_OPTION_BAKE,
+ MENU_OPTION_CLEAR
+ };
+
+ void _bake_lightmaps();
+
+ void _bake_pressed();
+ void _clear_pressed();
+
+ void _end_baking();
+ void _menu_option(int);
+
+friend class BakedLightEditorPlugin;
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+ void _notification(int p_what);
+public:
+
+ void edit(BakedLightInstance *p_baked_light);
+ BakedLightEditor();
+ ~BakedLightEditor();
+};
+
+class BakedLightEditorPlugin : public EditorPlugin {
+
+ GDCLASS( BakedLightEditorPlugin, EditorPlugin );
+
+ BakedLightEditor *baked_light_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "BakedLight"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ BakedLightEditorPlugin(EditorNode *p_node);
+ ~BakedLightEditorPlugin();
+
+};
+
+#endif // MULTIMESH_EDITOR_PLUGIN_H
+#endif
+
diff --git a/editor/plugins/camera_editor_plugin.cpp b/editor/plugins/camera_editor_plugin.cpp
new file mode 100644
index 0000000000..7073acd2c0
--- /dev/null
+++ b/editor/plugins/camera_editor_plugin.cpp
@@ -0,0 +1,150 @@
+/*************************************************************************/
+/* camera_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "camera_editor_plugin.h"
+
+#include "spatial_editor_plugin.h"
+
+
+void CameraEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+/* case NOTIFICATION_PROCESS: {
+
+ if (preview->is_pressed() && node)
+ node->call("make_current");
+
+ } break;*/
+ }
+
+}
+void CameraEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ SpatialEditor::get_singleton()->set_custom_camera(NULL);
+ hide();
+ }
+
+}
+
+void CameraEditor::_pressed() {
+
+ Node *sn = (node && preview->is_pressed())?node:NULL;
+ SpatialEditor::get_singleton()->set_custom_camera(sn);
+}
+
+void CameraEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_pressed"),&CameraEditor::_pressed);
+
+}
+
+void CameraEditor::edit(Node *p_camera) {
+
+ node=p_camera;
+
+ if (!node) {
+ preview->set_pressed(false);
+ SpatialEditor::get_singleton()->set_custom_camera(NULL);
+ } else {
+
+ if (preview->is_pressed())
+ SpatialEditor::get_singleton()->set_custom_camera(p_camera);
+ else
+ SpatialEditor::get_singleton()->set_custom_camera(NULL);
+ }
+}
+
+
+CameraEditor::CameraEditor() {
+
+ preview = memnew( Button );
+ add_child(preview);
+
+ preview->set_text(TTR("Preview"));
+ preview->set_toggle_mode(true);
+ preview->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ preview->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+ preview->set_margin(MARGIN_LEFT,60);
+ preview->set_margin(MARGIN_RIGHT,0);
+ preview->set_margin(MARGIN_TOP,0);
+ preview->set_margin(MARGIN_BOTTOM,10);
+ preview->connect("pressed",this,"_pressed");
+
+}
+
+
+void CameraEditorPlugin::edit(Object *p_object) {
+
+ SpatialEditor::get_singleton()->set_can_preview(p_object->cast_to<Camera>());
+ //camera_editor->edit(p_object->cast_to<Node>());
+}
+
+bool CameraEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Camera");
+}
+
+void CameraEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ //SpatialEditor::get_singleton()->set_can_preview(p_object->cast_to<Camera>());
+ } else {
+ SpatialEditor::get_singleton()->set_can_preview(NULL);
+ }
+
+}
+
+CameraEditorPlugin::CameraEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+/* camera_editor = memnew( CameraEditor );
+ editor->get_viewport()->add_child(camera_editor);
+
+ camera_editor->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ camera_editor->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+ camera_editor->set_margin(MARGIN_LEFT,60);
+ camera_editor->set_margin(MARGIN_RIGHT,0);
+ camera_editor->set_margin(MARGIN_TOP,0);
+ camera_editor->set_margin(MARGIN_BOTTOM,10);
+
+
+ camera_editor->hide();
+*/
+
+
+}
+
+
+CameraEditorPlugin::~CameraEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/camera_editor_plugin.h b/editor/plugins/camera_editor_plugin.h
new file mode 100644
index 0000000000..b5817b9960
--- /dev/null
+++ b/editor/plugins/camera_editor_plugin.h
@@ -0,0 +1,79 @@
+/*************************************************************************/
+/* camera_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CAMERA_EDITOR_PLUGIN_H
+#define CAMERA_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/camera.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class CameraEditor : public Control {
+
+ GDCLASS(CameraEditor, Control );
+
+ Panel *panel;
+ Button * preview;
+ Node *node;
+
+ void _pressed();
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(Node *p_camera);
+ CameraEditor();
+};
+
+class CameraEditorPlugin : public EditorPlugin {
+
+ GDCLASS( CameraEditorPlugin, EditorPlugin );
+
+ //CameraEditor *camera_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Camera"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ CameraEditorPlugin(EditorNode *p_node);
+ ~CameraEditorPlugin();
+
+};
+
+#endif // CAMERA_EDITOR_PLUGIN_H
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
new file mode 100644
index 0000000000..1a0791d864
--- /dev/null
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -0,0 +1,4063 @@
+/*************************************************************************/
+/* canvas_item_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "canvas_item_editor_plugin.h"
+
+#include "print_string.h"
+#include "editor/editor_node.h"
+#include "os/keyboard.h"
+#include "scene/main/viewport.h"
+#include "scene/main/canvas_layer.h"
+#include "scene/2d/sprite.h"
+#include "scene/2d/light_2d.h"
+#include "scene/2d/particles_2d.h"
+#include "scene/2d/polygon_2d.h"
+#include "scene/2d/screen_button.h"
+#include "global_config.h"
+#include "os/input.h"
+#include "editor/editor_settings.h"
+#include "scene/gui/grid_container.h"
+#include "scene/gui/patch_9_rect.h"
+#include "editor/animation_editor.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "editor/script_editor_debugger.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "scene/resources/packed_scene.h"
+
+
+#define MIN_ZOOM 0.01
+#define MAX_ZOOM 100
+
+
+class SnapDialog : public ConfirmationDialog {
+
+ GDCLASS(SnapDialog,ConfirmationDialog);
+
+friend class CanvasItemEditor;
+
+ SpinBox *grid_offset_x;
+ SpinBox *grid_offset_y;
+ SpinBox *grid_step_x;
+ SpinBox *grid_step_y;
+ SpinBox *rotation_offset;
+ SpinBox *rotation_step;
+
+public:
+ SnapDialog() : ConfirmationDialog() {
+ const int SPIN_BOX_GRID_RANGE = 256;
+ const int SPIN_BOX_ROTATION_RANGE = 360;
+ Label *label;
+ VBoxContainer *container;
+ GridContainer *child_container;
+
+ set_title(TTR("Configure Snap"));
+ get_ok()->set_text(TTR("Close"));
+
+ container = memnew( VBoxContainer );
+ add_child(container);
+ //set_child_rect(container);
+
+ child_container = memnew( GridContainer );
+ child_container->set_columns(3);
+ container->add_child(child_container);
+
+ label = memnew( Label );
+ label->set_text(TTR("Grid Offset:"));
+ child_container->add_child(label);
+ label->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ grid_offset_x = memnew( SpinBox );
+ grid_offset_x->set_min(-SPIN_BOX_GRID_RANGE);
+ grid_offset_x->set_max(SPIN_BOX_GRID_RANGE);
+ grid_offset_x->set_suffix("px");
+ child_container->add_child(grid_offset_x);
+
+ grid_offset_y = memnew( SpinBox );
+ grid_offset_y->set_min(-SPIN_BOX_GRID_RANGE);
+ grid_offset_y->set_max(SPIN_BOX_GRID_RANGE);
+ grid_offset_y->set_suffix("px");
+ child_container->add_child(grid_offset_y);
+
+ label = memnew( Label );
+ label->set_text(TTR("Grid Step:"));
+ child_container->add_child(label);
+ label->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ grid_step_x = memnew( SpinBox );
+ grid_step_x->set_min(-SPIN_BOX_GRID_RANGE);
+ grid_step_x->set_max(SPIN_BOX_GRID_RANGE);
+ grid_step_x->set_suffix("px");
+ child_container->add_child(grid_step_x);
+
+ grid_step_y = memnew( SpinBox );
+ grid_step_y->set_min(-SPIN_BOX_GRID_RANGE);
+ grid_step_y->set_max(SPIN_BOX_GRID_RANGE);
+ grid_step_y->set_suffix("px");
+ child_container->add_child(grid_step_y);
+
+ container->add_child( memnew( HSeparator ) );
+
+ child_container = memnew( GridContainer );
+ child_container->set_columns(2);
+ container->add_child(child_container);
+
+ label = memnew( Label );
+ label->set_text(TTR("Rotation Offset:"));
+ child_container->add_child(label);
+ label->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ rotation_offset = memnew( SpinBox );
+ rotation_offset->set_min(-SPIN_BOX_ROTATION_RANGE);
+ rotation_offset->set_max(SPIN_BOX_ROTATION_RANGE);
+ rotation_offset->set_suffix("deg");
+ child_container->add_child(rotation_offset);
+
+ label = memnew( Label );
+ label->set_text(TTR("Rotation Step:"));
+ child_container->add_child(label);
+ label->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ rotation_step = memnew( SpinBox );
+ rotation_step->set_min(-SPIN_BOX_ROTATION_RANGE);
+ rotation_step->set_max(SPIN_BOX_ROTATION_RANGE);
+ rotation_step->set_suffix("deg");
+ child_container->add_child(rotation_step);
+ }
+
+ void set_fields(const Point2 p_grid_offset, const Size2 p_grid_step, const float p_rotation_offset, const float p_rotation_step) {
+ grid_offset_x->set_value(p_grid_offset.x);
+ grid_offset_y->set_value(p_grid_offset.y);
+ grid_step_x->set_value(p_grid_step.x);
+ grid_step_y->set_value(p_grid_step.y);
+ rotation_offset->set_value(p_rotation_offset * (180 / Math_PI));
+ rotation_step->set_value(p_rotation_step * (180 / Math_PI));
+ }
+
+ void get_fields(Point2 &p_grid_offset, Size2 &p_grid_step, float &p_rotation_offset, float &p_rotation_step) {
+ p_grid_offset.x = grid_offset_x->get_value();
+ p_grid_offset.y = grid_offset_y->get_value();
+ p_grid_step.x = grid_step_x->get_value();
+ p_grid_step.y = grid_step_y->get_value();
+ p_rotation_offset = rotation_offset->get_value() / (180 / Math_PI);
+ p_rotation_step = rotation_step->get_value() / (180 / Math_PI);
+ }
+};
+
+void CanvasItemEditor::_edit_set_pivot(const Vector2& mouse_pos) {
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ undo_redo->create_action(TTR("Move Pivot"));
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Node2D *n2d = E->get()->cast_to<Node2D>();
+
+ if (n2d && n2d->edit_has_pivot()) {
+
+ Vector2 offset = n2d->edit_get_pivot();
+ Vector2 gpos = n2d->get_global_position();
+
+ Vector2 local_mouse_pos = n2d->get_canvas_transform().affine_inverse().xform(mouse_pos);
+
+ Vector2 motion_ofs = gpos-local_mouse_pos;
+
+ undo_redo->add_do_method(n2d,"set_global_pos",local_mouse_pos);
+ undo_redo->add_do_method(n2d,"edit_set_pivot",offset+n2d->get_global_transform().affine_inverse().basis_xform(motion_ofs));
+ undo_redo->add_undo_method(n2d,"set_global_pos",gpos);
+ undo_redo->add_undo_method(n2d,"edit_set_pivot",offset);
+ for(int i=0;i<n2d->get_child_count();i++) {
+ Node2D *n2dc = n2d->get_child(i)->cast_to<Node2D>();
+ if (!n2dc)
+ continue;
+
+ undo_redo->add_do_method(n2dc,"set_global_pos",n2dc->get_global_position());
+ undo_redo->add_undo_method(n2dc,"set_global_pos",n2dc->get_global_position());
+
+ }
+
+ }
+
+ }
+
+ undo_redo->commit_action();
+
+}
+
+void CanvasItemEditor::_unhandled_key_input(const InputEvent& p_ev) {
+
+ if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack())
+ return;
+
+ if (p_ev.key.mod.control)
+ return;
+
+ if (p_ev.key.pressed && !p_ev.key.echo && p_ev.key.scancode==KEY_V && drag==DRAG_NONE && can_move_pivot) {
+
+ if (p_ev.key.mod.shift) {
+ //move drag pivot
+ drag=DRAG_PIVOT;
+ } else if (!Input::get_singleton()->is_mouse_button_pressed(0)) {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ Vector2 mouse_pos = viewport->get_local_mouse_pos();
+ if (selection.size() && viewport->get_rect().has_point(mouse_pos)) {
+ //just in case, make it work if over viewport
+ mouse_pos=transform.affine_inverse().xform(mouse_pos);
+ mouse_pos=snap_point(mouse_pos);
+
+ _edit_set_pivot(mouse_pos);
+ }
+
+ }
+ }
+
+}
+
+void CanvasItemEditor::_tool_select(int p_index) {
+
+
+ ToolButton *tb[TOOL_MAX]={select_button,list_select_button,move_button,rotate_button,pivot_button,pan_button};
+ for(int i=0;i<TOOL_MAX;i++) {
+
+ tb[i]->set_pressed(i==p_index);
+ }
+
+
+ viewport->update();
+ tool=(Tool)p_index;
+
+}
+
+Object *CanvasItemEditor::_get_editor_data(Object *p_what) {
+
+ CanvasItem *ci = p_what->cast_to<CanvasItem>();
+ if (!ci)
+ return NULL;
+
+ return memnew( CanvasItemEditorSelectedItem );
+}
+
+inline float _snap_scalar(float p_offset, float p_step, bool p_snap_relative, float p_target, float p_start) {
+ float offset = p_snap_relative ? p_start : p_offset;
+ return p_step != 0 ? Math::stepify(p_target - offset, p_step) + offset : p_target;
+}
+
+Vector2 CanvasItemEditor::snap_point(Vector2 p_target, Vector2 p_start) const {
+ if (snap_grid) {
+ p_target.x = _snap_scalar(snap_offset.x, snap_step.x, snap_relative, p_target.x, p_start.x);
+ p_target.y = _snap_scalar(snap_offset.y, snap_step.y, snap_relative, p_target.y, p_start.y);
+ }
+ if (snap_pixel)
+ p_target = p_target.snapped(Size2(1, 1));
+
+ return p_target;
+}
+
+float CanvasItemEditor::snap_angle(float p_target, float p_start) const {
+ return snap_rotation ? _snap_scalar(snap_rotation_offset, snap_rotation_step, snap_relative, p_target, p_start) : p_target;
+}
+
+Dictionary CanvasItemEditor::get_state() const {
+
+ Dictionary state;
+ state["zoom"]=zoom;
+ state["ofs"]=Point2(h_scroll->get_value(),v_scroll->get_value());
+ //state["ofs"]=-transform.get_origin();
+ state["snap_offset"]=snap_offset;
+ state["snap_step"]=snap_step;
+ state["snap_rotation_offset"]=snap_rotation_offset;
+ state["snap_rotation_step"]=snap_rotation_step;
+ state["snap_grid"]=snap_grid;
+ state["snap_show_grid"]=snap_show_grid;
+ state["snap_rotation"]=snap_rotation;
+ state["snap_relative"]=snap_relative;
+ state["snap_pixel"]=snap_pixel;
+ state["skeleton_show_bones"]=skeleton_show_bones;
+ return state;
+}
+void CanvasItemEditor::set_state(const Dictionary& p_state){
+
+ Dictionary state=p_state;
+ if (state.has("zoom")) {
+ zoom=p_state["zoom"];
+ }
+
+ if (state.has("ofs")) {
+ _update_scrollbars(); // i wonder how safe is calling this here..
+ Point2 ofs=p_state["ofs"];
+ h_scroll->set_value(ofs.x);
+ v_scroll->set_value(ofs.y);
+ }
+
+ if (state.has("snap_step")) {
+ snap_step=state["snap_step"];
+ }
+
+ if (state.has("snap_offset")) {
+ snap_offset=state["snap_offset"];
+ }
+
+ if (state.has("snap_rotation_step")) {
+ snap_rotation_step=state["snap_rotation_step"];
+ }
+
+ if (state.has("snap_rotation_offset")) {
+ snap_rotation_offset=state["snap_rotation_offset"];
+ }
+
+ if (state.has("snap_grid")) {
+ snap_grid=state["snap_grid"];
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE);
+ edit_menu->get_popup()->set_item_checked(idx,snap_grid);
+ }
+
+ if (state.has("snap_show_grid")) {
+ snap_show_grid=state["snap_show_grid"];
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_SHOW_GRID);
+ edit_menu->get_popup()->set_item_checked(idx,snap_show_grid);
+ }
+
+ if (state.has("snap_rotation")) {
+ snap_rotation=state["snap_rotation"];
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE_ROTATION);
+ edit_menu->get_popup()->set_item_checked(idx,snap_rotation);
+ }
+
+ if (state.has("snap_relative")) {
+ snap_relative=state["snap_relative"];
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_RELATIVE);
+ edit_menu->get_popup()->set_item_checked(idx,snap_relative);
+ }
+
+ if (state.has("snap_pixel")) {
+ snap_pixel=state["snap_pixel"];
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE_PIXEL);
+ edit_menu->get_popup()->set_item_checked(idx,snap_pixel);
+ }
+
+ if (state.has("skeleton_show_bones")) {
+ skeleton_show_bones=state["skeleton_show_bones"];
+ int idx = skeleton_menu->get_item_index(SKELETON_SHOW_BONES);
+ skeleton_menu->set_item_checked(idx,skeleton_show_bones);
+ }
+}
+
+
+void CanvasItemEditor::_add_canvas_item(CanvasItem *p_canvas_item) {
+
+ editor_selection->add_node(p_canvas_item);
+#if 0
+ if (canvas_items.has(p_canvas_item))
+ return;
+
+ canvas_items.insert(p_canvas_item,p_info);
+ p_canvas_item->connect("hide",this,"_visibility_changed",varray(p_canvas_item->get_instance_ID()),CONNECT_ONESHOT);
+#endif
+}
+
+void CanvasItemEditor::_remove_canvas_item(CanvasItem *p_canvas_item) {
+
+ editor_selection->remove_node(p_canvas_item);
+#if 0
+ p_canvas_item->disconnect("hide",this,"_visibility_changed");
+ canvas_items.erase(p_canvas_item);
+#endif
+
+}
+void CanvasItemEditor::_clear_canvas_items() {
+
+ editor_selection->clear();
+#if 0
+ while(canvas_items.size())
+ _remove_canvas_item(canvas_items.front()->key());
+#endif
+}
+
+void CanvasItemEditor::_visibility_changed(ObjectID p_canvas_item) {
+#if 0
+ Object *c = ObjectDB::get_instance(p_canvas_item);
+ if (!c)
+ return;
+ CanvasItem *ct = c->cast_to<CanvasItem>();
+ if (!ct)
+ return;
+ canvas_items.erase(ct);
+ //_remove_canvas_item(ct);
+ update();
+#endif
+}
+
+
+void CanvasItemEditor::_node_removed(Node *p_node) {
+#if 0
+ CanvasItem *canvas_item = (CanvasItem*)p_node; //not a good cast, but safe
+ if (canvas_items.has(canvas_item))
+ _remove_canvas_item(canvas_item);
+
+ update();
+#endif
+}
+
+void CanvasItemEditor::_keying_changed() {
+
+ if (AnimationPlayerEditor::singleton->get_key_editor()->is_visible_in_tree())
+ animation_hb->show();
+ else
+ animation_hb->hide();
+}
+
+bool CanvasItemEditor::_is_part_of_subscene(CanvasItem *p_item) {
+
+ Node* scene_node = get_tree()->get_edited_scene_root();
+ Node* item_owner = p_item->get_owner();
+
+ return item_owner && item_owner!=scene_node && p_item!=scene_node && item_owner->get_filename()!="";
+}
+
+// slow but modern computers should have no problem
+CanvasItem* CanvasItemEditor::_select_canvas_item_at_pos(const Point2& p_pos,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform) {
+
+ if (!p_node)
+ return NULL;
+ if (p_node->cast_to<Viewport>())
+ return NULL;
+
+ CanvasItem *c=p_node->cast_to<CanvasItem>();
+
+
+ for (int i=p_node->get_child_count()-1;i>=0;i--) {
+
+ CanvasItem *r=NULL;
+
+ if (c && !c->is_set_as_toplevel())
+ r=_select_canvas_item_at_pos(p_pos,p_node->get_child(i),p_parent_xform * c->get_transform(),p_canvas_xform);
+ else {
+ CanvasLayer *cl = p_node->cast_to<CanvasLayer>();
+ r=_select_canvas_item_at_pos(p_pos,p_node->get_child(i),transform ,cl ? cl->get_transform() : p_canvas_xform); //use base transform
+ }
+
+ if (r)
+ return r;
+ }
+
+ if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !_is_part_of_subscene(c) && !c->cast_to<CanvasLayer>()) {
+
+ Rect2 rect = c->get_item_rect();
+ Point2 local_pos = (p_parent_xform * p_canvas_xform * c->get_transform()).affine_inverse().xform(p_pos);
+
+
+ if (rect.has_point(local_pos))
+ return c;
+
+ }
+
+ return NULL;
+}
+
+void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform, Vector<_SelectResult> &r_items) {
+ if (!p_node)
+ return;
+ if (p_node->cast_to<Viewport>())
+ return;
+
+ CanvasItem *c=p_node->cast_to<CanvasItem>();
+
+ for (int i=p_node->get_child_count()-1;i>=0;i--) {
+
+ if (c && !c->is_set_as_toplevel())
+ _find_canvas_items_at_pos(p_pos,p_node->get_child(i),p_parent_xform * c->get_transform(),p_canvas_xform, r_items);
+ else {
+ CanvasLayer *cl = p_node->cast_to<CanvasLayer>();
+ _find_canvas_items_at_pos(p_pos,p_node->get_child(i),transform ,cl ? cl->get_transform() : p_canvas_xform, r_items); //use base transform
+ }
+ }
+
+
+ if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !c->cast_to<CanvasLayer>()) {
+
+ Rect2 rect = c->get_item_rect();
+ Point2 local_pos = (p_parent_xform * p_canvas_xform * c->get_transform()).affine_inverse().xform(p_pos);
+
+
+ if (rect.has_point(local_pos)) {
+ Node2D *node=c->cast_to<Node2D>();
+
+ _SelectResult res;
+ res.item=c;
+ res.z=node?node->get_z():0;
+ res.has_z=node;
+ r_items.push_back(res);
+ }
+
+ }
+
+ return;
+}
+
+void CanvasItemEditor::_find_canvas_items_at_rect(const Rect2& p_rect,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform,List<CanvasItem*> *r_items) {
+
+ if (!p_node)
+ return;
+ if (p_node->cast_to<Viewport>())
+ return;
+
+ CanvasItem *c=p_node->cast_to<CanvasItem>();
+
+
+ bool inherited=p_node!=get_tree()->get_edited_scene_root() && p_node->get_filename()!="";
+ bool editable=false;
+ if (inherited){
+ editable=EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node);
+ }
+ bool lock_children=p_node->has_meta("_edit_group_") && p_node->get_meta("_edit_group_");
+ if (!lock_children && (!inherited || editable)) {
+ for (int i=p_node->get_child_count()-1;i>=0;i--) {
+
+ if (c && !c->is_set_as_toplevel())
+ _find_canvas_items_at_rect(p_rect,p_node->get_child(i),p_parent_xform * c->get_transform(),p_canvas_xform,r_items);
+ else {
+ CanvasLayer *cl = p_node->cast_to<CanvasLayer>();
+ _find_canvas_items_at_rect(p_rect,p_node->get_child(i),transform,cl?cl->get_transform():p_canvas_xform,r_items);
+ }
+ }
+ }
+
+ if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !c->cast_to<CanvasLayer>()) {
+
+ Rect2 rect = c->get_item_rect();
+ Transform2D xform = p_parent_xform * p_canvas_xform * c->get_transform();
+
+ if ( p_rect.has_point( xform.xform( rect.pos ) ) &&
+ p_rect.has_point( xform.xform( rect.pos+Vector2(rect.size.x,0) ) ) &&
+ p_rect.has_point( xform.xform( rect.pos+Vector2(rect.size.x,rect.size.y) ) ) &&
+ p_rect.has_point( xform.xform( rect.pos+Vector2(0,rect.size.y) ) ) ) {
+
+ r_items->push_back(c);
+
+ }
+ }
+
+
+}
+
+bool CanvasItemEditor::_select(CanvasItem *item, Point2 p_click_pos, bool p_append, bool p_drag) {
+
+ if (p_append) {
+ //additive selection
+
+ if (!item) {
+
+ if (p_drag) {
+ drag_from=transform.affine_inverse().xform(p_click_pos);
+
+ box_selecting=true;
+ box_selecting_to=drag_from;
+ }
+
+ return false; //nothing to add
+ }
+
+ if (editor_selection->is_selected(item)) {
+ //already in here, erase it
+ editor_selection->remove_node(item);
+ //_remove_canvas_item(c);
+
+ viewport->update();
+ return false;
+
+ }
+ _append_canvas_item(item);
+ viewport->update();
+
+ return true;
+
+ } else {
+ //regular selection
+
+ if (!item) {
+ //clear because nothing clicked
+ editor_selection->clear();
+
+ if (p_drag) {
+ drag_from=transform.affine_inverse().xform(p_click_pos);
+
+ box_selecting=true;
+ box_selecting_to=drag_from;
+ }
+
+ viewport->update();
+ return false;
+ }
+
+ if (!editor_selection->is_selected(item)) {
+ //select a new one and clear previous selection
+ editor_selection->clear();
+ editor_selection->add_node(item);
+ //reselect
+ if (get_tree()->is_editor_hint()) {
+ editor->call("edit_node",item);
+ }
+
+ }
+
+ if (p_drag) {
+ //prepare to move!
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ se->undo_state=canvas_item->edit_get_state();
+ if (canvas_item->cast_to<Node2D>())
+ se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot();
+
+ }
+
+ drag=DRAG_ALL;
+ drag_from=transform.affine_inverse().xform(p_click_pos);
+ drag_point_from=_find_topleftmost_point();
+ }
+
+ viewport->update();
+
+ return true;
+
+ }
+}
+
+void CanvasItemEditor::_key_move(const Vector2& p_dir, bool p_snap, KeyMoveMODE p_move_mode) {
+
+
+ if (drag!=DRAG_NONE)
+ return;
+
+ if (editor_selection->get_selected_node_list().empty())
+ return;
+
+ undo_redo->create_action(TTR("Move Action"),UndoRedo::MERGE_ENDS);
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ if (canvas_item->has_meta("_edit_lock_"))
+ continue;
+
+
+ Vector2 drag = p_dir;
+ if (p_snap)
+ drag*=snap_step;
+
+ undo_redo->add_undo_method(canvas_item,"edit_set_state",canvas_item->edit_get_state());
+
+ if (p_move_mode == MOVE_VIEW_BASE) {
+
+ // drag = transform.affine_inverse().basis_xform(p_dir); // zoom sensitive
+ drag = canvas_item->get_global_transform_with_canvas().affine_inverse().basis_xform(drag);
+ Rect2 local_rect = canvas_item->get_item_rect();
+ local_rect.pos+=drag;
+ undo_redo->add_do_method(canvas_item,"edit_set_rect",local_rect);
+
+ } else { // p_move_mode==MOVE_LOCAL_BASE || p_move_mode==MOVE_LOCAL_WITH_ROT
+
+ if (Node2D *node_2d = canvas_item->cast_to<Node2D>()) {
+
+ if (p_move_mode == MOVE_LOCAL_WITH_ROT) {
+ Transform2D m;
+ m.rotate( node_2d->get_rotation() );
+ drag = m.xform(drag);
+ }
+ node_2d->set_position(node_2d->get_position() + drag);
+
+ } else if (Control *control = canvas_item->cast_to<Control>()) {
+
+ control->set_pos(control->get_pos()+drag);
+ }
+ }
+ }
+
+ undo_redo->commit_action();
+}
+
+Point2 CanvasItemEditor::_find_topleftmost_point() {
+
+
+
+ Vector2 tl=Point2(1e10,1e10);
+ Rect2 r2;
+ r2.pos=tl;
+
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+
+
+ Rect2 rect=canvas_item->get_item_rect();
+ Transform2D xform=canvas_item->get_global_transform_with_canvas();
+
+ r2.expand_to(xform.xform(rect.pos));
+ r2.expand_to(xform.xform(rect.pos+Vector2(rect.size.x,0)));
+ r2.expand_to(xform.xform(rect.pos+rect.size));
+ r2.expand_to(xform.xform(rect.pos+Vector2(0,rect.size.y)));
+
+ }
+
+ return r2.pos;
+}
+
+
+
+int CanvasItemEditor::get_item_count() {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ int ic=0;
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ ic++;
+ };
+
+ return ic;
+}
+
+CanvasItem *CanvasItemEditor::get_single_item() {
+
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ CanvasItem *single_item=NULL;
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ if (single_item)
+ return NULL; //morethan one
+
+ single_item=canvas_item;
+ };
+
+ return single_item;
+}
+
+CanvasItemEditor::DragType CanvasItemEditor::_find_drag_type(const Transform2D& p_xform, const Rect2& p_local_rect, const Point2& p_click, Vector2& r_point) {
+
+ CanvasItem *canvas_item = get_single_item();
+
+ ERR_FAIL_COND_V(!canvas_item,DRAG_NONE);
+
+ Rect2 rect=canvas_item->get_item_rect();
+ Transform2D xforml=canvas_item->get_global_transform_with_canvas();
+ Transform2D xform=transform * xforml;
+
+ Vector2 endpoints[4]={
+
+ xform.xform(rect.pos),
+ xform.xform(rect.pos+Vector2(rect.size.x,0)),
+ xform.xform(rect.pos+rect.size),
+ xform.xform(rect.pos+Vector2(0,rect.size.y))
+ };
+
+ Vector2 endpointsl[4]={
+
+ xforml.xform(rect.pos),
+ xforml.xform(rect.pos+Vector2(rect.size.x,0)),
+ xforml.xform(rect.pos+rect.size),
+ xforml.xform(rect.pos+Vector2(0,rect.size.y))
+ };
+
+ DragType dragger[]={
+ DRAG_TOP_LEFT,
+ DRAG_TOP,
+ DRAG_TOP_RIGHT,
+ DRAG_RIGHT,
+ DRAG_BOTTOM_RIGHT,
+ DRAG_BOTTOM,
+ DRAG_BOTTOM_LEFT,
+ DRAG_LEFT
+ };
+
+ float radius = (select_handle->get_size().width/2)*1.5;
+
+ //try draggers
+
+ for(int i=0;i<4;i++) {
+
+ int prev = (i+3)%4;
+ int next = (i+1)%4;
+
+ r_point=endpointsl[i];
+
+ Vector2 ofs = ((endpoints[i] - endpoints[prev]).normalized() + ((endpoints[i] - endpoints[next]).normalized())).normalized();
+ ofs*=1.4144*(select_handle->get_size().width/2);
+
+ ofs+=endpoints[i];
+
+ if (ofs.distance_to(p_click)<radius)
+ return dragger[i*2];
+
+ ofs = (endpoints[i]+endpoints[next])/2;
+ ofs += (endpoints[next]-endpoints[i]).tangent().normalized()*(select_handle->get_size().width/2);
+
+ r_point=(endpointsl[i]+endpointsl[next])/2;
+
+
+ if (ofs.distance_to(p_click)<radius)
+ return dragger[i*2+1];
+
+ }
+
+ /*
+ if (rect.has_point(xform.affine_inverse().xform(p_click))) {
+ r_point=_find_topleftmost_point();
+ return DRAG_ALL;
+ }*/
+
+ //try draggers
+
+ return DRAG_NONE;
+}
+
+void CanvasItemEditor::incbeg(float& beg,float &end, float inc, float minsize,bool p_symmetric) {
+
+ if (minsize<0) {
+
+ beg+=inc;
+ if (p_symmetric)
+ end-=inc;
+ } else {
+
+ if (p_symmetric) {
+ beg+=inc;
+ end-=inc;
+ if (end-beg < minsize) {
+ float center = (beg+end)/2.0;
+ beg=center-minsize/2.0;
+ end=center+minsize/2.0;
+ }
+
+ } else {
+ if (end-(beg+inc) < minsize)
+ beg=end-minsize;
+ else
+ beg+=inc;
+ }
+
+ }
+}
+
+void CanvasItemEditor::incend(float &beg,float& end, float inc, float minsize,bool p_symmetric) {
+
+ if (minsize<0) {
+
+ end+=inc;
+ if (p_symmetric)
+ beg-=inc;
+ } else {
+
+ if (p_symmetric) {
+
+ end+=inc;
+ beg-=inc;
+ if (end-beg < minsize) {
+ float center = (beg+end)/2.0;
+ beg=center-minsize/2.0;
+ end=center+minsize/2.0;
+ }
+
+ } else {
+ if ((end+inc)-beg < minsize)
+ end=beg+minsize;
+ else
+ end+=inc;
+ }
+
+ }
+}
+
+void CanvasItemEditor::_append_canvas_item(CanvasItem *c) {
+
+ editor_selection->add_node(c);
+
+}
+
+
+void CanvasItemEditor::_snap_changed() {
+ ((SnapDialog *)snap_dialog)->get_fields(snap_offset, snap_step, snap_rotation_offset, snap_rotation_step);
+ viewport->update();
+}
+
+void CanvasItemEditor::_dialog_value_changed(double) {
+
+ if (updating_value_dialog)
+ return;
+
+ switch(last_option) {
+
+ case ZOOM_SET: {
+
+ zoom=dialog_val->get_value()/100.0;
+ _update_scroll(0);
+ viewport->update();
+
+ } break;
+ default:{}
+ }
+}
+
+void CanvasItemEditor::_selection_result_pressed(int p_result) {
+
+ if (selection_results.size() <= p_result)
+ return;
+
+ CanvasItem *item=selection_results[p_result].item;
+
+ if (item)
+ _select(item, Point2(), additive_selection, false);
+}
+
+void CanvasItemEditor::_selection_menu_hide() {
+
+ selection_results.clear();
+ selection_menu->clear();
+ selection_menu->set_size(Vector2(0, 0));
+}
+
+bool CanvasItemEditor::get_remove_list(List<Node*> *p_list) {
+
+
+ return false;//!p_list->empty();
+}
+
+
+void CanvasItemEditor::_list_select(const InputEventMouseButton& b) {
+
+ Point2 click=Point2(b.x,b.y);
+
+ Node* scene = editor->get_edited_scene();
+ if (!scene)
+ return;
+
+ _find_canvas_items_at_pos(click, scene,transform,Transform2D(), selection_results);
+
+ for(int i=0;i<selection_results.size();i++) {
+ CanvasItem *item=selection_results[i].item;
+ if (item!=scene && item->get_owner()!=scene && !scene->is_editable_instance(item->get_owner())) {
+ //invalid result
+ selection_results.remove(i);
+ i--;
+ }
+
+ }
+
+ if (selection_results.size() == 1) {
+
+ CanvasItem *item = selection_results[0].item;
+ selection_results.clear();
+
+ additive_selection=b.mod.shift;
+ if (!_select(item, click, additive_selection, false))
+ return;
+
+ } else if (!selection_results.empty()) {
+
+ selection_results.sort();
+
+ NodePath root_path = get_tree()->get_edited_scene_root()->get_path();
+ StringName root_name = root_path.get_name(root_path.get_name_count()-1);
+
+ for (int i = 0; i < selection_results.size(); i++) {
+
+ CanvasItem *item=selection_results[i].item;
+
+
+ Ref<Texture> icon;
+ if (item->has_meta("_editor_icon"))
+ icon=item->get_meta("_editor_icon");
+ else
+ icon=get_icon( has_icon(item->get_class(),"EditorIcons")?item->get_class():String("Object"),"EditorIcons");
+
+ String node_path="/"+root_name+"/"+root_path.rel_path_to(item->get_path());
+
+ selection_menu->add_item(item->get_name());
+ selection_menu->set_item_icon(i, icon );
+ selection_menu->set_item_metadata(i, node_path);
+ selection_menu->set_item_tooltip(i,String(item->get_name())+
+ "\nType: "+item->get_class()+"\nPath: "+node_path);
+ }
+
+ additive_selection=b.mod.shift;
+
+ selection_menu->set_global_pos(Vector2( b.global_x, b.global_y ));
+ selection_menu->popup();
+ selection_menu->call_deferred("grab_click_focus");
+ selection_menu->set_invalidate_click_until_motion();
+
+
+ return;
+ }
+
+}
+
+void CanvasItemEditor::_viewport_gui_input(const InputEvent& p_event) {
+
+ {
+
+ EditorNode *en = editor;
+ EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
+
+ if (!over_plugin_list->empty()) {
+ bool discard = over_plugin_list->forward_gui_input(transform,p_event);
+ if (discard) {
+ accept_event();
+ return;
+ }
+ }
+ }
+
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON) {
+
+ const InputEventMouseButton &b=p_event.mouse_button;
+
+
+ if (b.button_index==BUTTON_WHEEL_DOWN) {
+
+ if (zoom<MIN_ZOOM)
+ return;
+
+ float prev_zoom=zoom;
+ zoom=zoom*0.95;
+ {
+ Point2 ofs(b.x,b.y);
+ ofs = ofs/prev_zoom - ofs/zoom;
+ h_scroll->set_value( h_scroll->get_value() + ofs.x );
+ v_scroll->set_value( v_scroll->get_value() + ofs.y );
+ }
+ _update_scroll(0);
+ viewport->update();
+ return;
+ }
+
+ if (b.button_index==BUTTON_WHEEL_UP) {
+
+ if (zoom>MAX_ZOOM)
+ return;
+
+ float prev_zoom=zoom;
+ zoom=zoom*(1.0/0.95);
+ {
+ Point2 ofs(b.x,b.y);
+ ofs = ofs/prev_zoom - ofs/zoom;
+ h_scroll->set_value( h_scroll->get_value() + ofs.x );
+ v_scroll->set_value( v_scroll->get_value() + ofs.y );
+ }
+
+ _update_scroll(0);
+ viewport->update();
+ return;
+ }
+
+ if (b.button_index==BUTTON_RIGHT) {
+
+
+ if (b.pressed && (tool==TOOL_SELECT && b.mod.alt)) {
+
+ _list_select(b);
+ return;
+ }
+
+ if (get_item_count() > 0 && drag!=DRAG_NONE) {
+ //cancel drag
+
+ if (bone_ik_list.size()) {
+
+ for(List<BoneIK>::Element *E=bone_ik_list.back();E;E=E->prev()) {
+
+ E->get().node->edit_set_state(E->get().orig_state);
+ }
+
+ bone_ik_list.clear();
+
+ } else {
+
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ canvas_item->edit_set_state(se->undo_state);
+ if (canvas_item->cast_to<Node2D>())
+ canvas_item->cast_to<Node2D>()->edit_set_pivot(se->undo_pivot);
+
+ }
+ }
+
+ drag=DRAG_NONE;
+ viewport->update();
+ can_move_pivot=false;
+
+ } else if (box_selecting) {
+ box_selecting=false;
+ viewport->update();
+ } else if (b.pressed) {
+#if 0
+ ref_item = NULL;
+ Node* scene = get_scene()->get_root_node()->cast_to<EditorNode>()->get_edited_scene();
+ if ( scene ) ref_item =_select_canvas_item_at_pos( Point2( b.x, b.y ), scene, transform );
+#endif
+ //popup->set_pos(Point2(b.x,b.y));
+ //popup->popup();
+ }
+ return;
+ }
+ /*
+ if (!canvas_items.size())
+ return;
+ */
+
+ if (b.button_index==BUTTON_LEFT && tool==TOOL_LIST_SELECT) {
+ if (b.pressed)
+ _list_select(b);
+ return;
+ }
+
+
+ if (b.button_index==BUTTON_LEFT && tool==TOOL_EDIT_PIVOT) {
+ if (b.pressed) {
+
+ Point2 mouse_pos(b.x,b.y);
+ mouse_pos=transform.affine_inverse().xform(mouse_pos);
+ mouse_pos=snap_point(mouse_pos);
+ _edit_set_pivot(mouse_pos);
+ }
+ return;
+ }
+
+
+
+ if (tool==TOOL_PAN || b.button_index!=BUTTON_LEFT || Input::get_singleton()->is_key_pressed(KEY_SPACE))
+ return;
+
+ if (!b.pressed) {
+
+ if (drag!=DRAG_NONE) {
+
+ if (undo_redo) {
+
+
+ if (bone_ik_list.size()) {
+
+
+ undo_redo->create_action(TTR("Edit IK Chain"));
+
+ for(List<BoneIK>::Element *E=bone_ik_list.back();E;E=E->prev()) {
+
+ undo_redo->add_do_method(E->get().node,"edit_set_state",E->get().node->edit_get_state());
+ undo_redo->add_undo_method(E->get().node,"edit_set_state",E->get().orig_state);
+ }
+
+ undo_redo->add_do_method(viewport,"update");
+ undo_redo->add_undo_method(viewport,"update");
+
+ bone_ik_list.clear();
+
+ undo_redo->commit_action();
+ } else {
+
+ undo_redo->create_action(TTR("Edit CanvasItem"));
+
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ Variant state=canvas_item->edit_get_state();
+ undo_redo->add_do_method(canvas_item,"edit_set_state",state);
+ undo_redo->add_undo_method(canvas_item,"edit_set_state",se->undo_state);
+ if (canvas_item->cast_to<Node2D>()) {
+ Node2D *pvt = canvas_item->cast_to<Node2D>();
+ if (pvt->edit_has_pivot()) {
+ undo_redo->add_do_method(canvas_item,"edit_set_pivot",pvt->edit_get_pivot());
+ undo_redo->add_undo_method(canvas_item,"edit_set_pivot",se->undo_pivot);
+ }
+ }
+ }
+ undo_redo->commit_action();
+ }
+ }
+
+ drag=DRAG_NONE;
+ viewport->update();
+ can_move_pivot=false;
+
+ }
+
+ if (box_selecting) {
+#if 0
+ if ( ! b.mod.shift ) _clear_canvas_items();
+ if ( box_selection_end() ) return;
+#endif
+
+ Node* scene = editor->get_edited_scene();
+ if (scene) {
+
+ List<CanvasItem*> selitems;
+
+ Point2 bsfrom = transform.xform(drag_from);
+ Point2 bsto= transform.xform(box_selecting_to);
+ if (bsfrom.x>bsto.x)
+ SWAP(bsfrom.x,bsto.x);
+ if (bsfrom.y>bsto.y)
+ SWAP(bsfrom.y,bsto.y);
+
+ _find_canvas_items_at_rect(Rect2(bsfrom,bsto-bsfrom),scene,transform,Transform2D(),&selitems);
+
+ for(List<CanvasItem*>::Element *E=selitems.front();E;E=E->next()) {
+
+ _append_canvas_item(E->get());
+ }
+
+ }
+
+ box_selecting=false;
+ viewport->update();
+
+ }
+ return;
+ }
+
+
+ Map<ObjectID,BoneList>::Element *Cbone=NULL; //closest
+
+ {
+ bone_ik_list.clear();
+ float closest_dist=1e20;
+ int bone_width = EditorSettings::get_singleton()->get("editors/2d/bone_width");
+ for(Map<ObjectID,BoneList>::Element *E=bone_list.front();E;E=E->next()) {
+
+ if (E->get().from == E->get().to)
+ continue;
+ Vector2 s[2]={
+ E->get().from,
+ E->get().to
+ };
+
+ Vector2 p = Geometry::get_closest_point_to_segment_2d(Vector2(b.x,b.y),s);
+ float d = p.distance_to(Vector2(b.x,b.y));
+ if (d<bone_width && d<closest_dist) {
+ Cbone=E;
+ closest_dist=d;
+ }
+ }
+
+ if (Cbone) {
+ Node2D *b=NULL;
+ Object* obj=ObjectDB::get_instance(Cbone->get().bone);
+ if (obj)
+ b=obj->cast_to<Node2D>();
+
+ if (b) {
+
+
+ bool ik_found=false;
+ bool first=true;
+
+
+
+ while(b) {
+
+ CanvasItem *pi=b->get_parent_item();
+ if (!pi)
+ break;
+
+ float len=pi->get_global_transform().get_origin().distance_to(b->get_global_position());
+ b=pi->cast_to<Node2D>();
+ if (!b)
+ break;
+
+ if (first) {
+
+ bone_orig_xform=b->get_global_transform();
+ first=false;
+ }
+
+ BoneIK bik;
+ bik.node=b;
+ bik.len=len;
+ bik.orig_state=b->edit_get_state();
+
+ bone_ik_list.push_back(bik);
+
+ if (b->has_meta("_edit_ik_")) {
+
+ ik_found=bone_ik_list.size()>1;
+ break;
+ }
+
+ if (!pi->has_meta("_edit_bone_"))
+ break;
+
+ }
+
+ if (!ik_found)
+ bone_ik_list.clear();
+
+ }
+ }
+ }
+
+ CanvasItem *single_item = get_single_item();
+
+ if (single_item) {
+ //try single canvas_item edit
+
+ CanvasItem *canvas_item = single_item;
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ ERR_FAIL_COND(!se);
+
+
+ Point2 click(b.x,b.y);
+
+ if ((b.mod.control && tool==TOOL_SELECT) || tool==TOOL_ROTATE) {
+
+ drag=DRAG_ROTATE;
+ drag_from=transform.affine_inverse().xform(click);
+ se->undo_state=canvas_item->edit_get_state();
+ if (canvas_item->cast_to<Node2D>())
+ se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot();
+ if (canvas_item->cast_to<Control>())
+ se->undo_pivot=Vector2();
+ return;
+ }
+
+ Transform2D xform = transform * canvas_item->get_global_transform_with_canvas();
+ Rect2 rect=canvas_item->get_item_rect();
+ //float handle_radius = handle_len * 1.4144; //magic number, guess what it means!
+
+ if (tool==TOOL_SELECT) {
+ drag = _find_drag_type(xform,rect,click,drag_point_from);
+
+ if (b.doubleclick) {
+
+ if (canvas_item->get_filename()!="" && canvas_item!=editor->get_edited_scene()) {
+
+ editor->open_request(canvas_item->get_filename());
+ return;
+ }
+ }
+
+ if (drag!=DRAG_NONE && (!Cbone || drag!=DRAG_ALL)) {
+ drag_from=transform.affine_inverse().xform(click);
+ se->undo_state=canvas_item->edit_get_state();
+ if (canvas_item->cast_to<Node2D>())
+ se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot();
+
+ return;
+ }
+ } else {
+
+ drag=DRAG_NONE;
+ }
+ }
+
+ //multi canvas_item edit
+
+
+ Point2 click=Point2(b.x,b.y);
+
+ if ((b.mod.alt || tool==TOOL_MOVE) && get_item_count()) {
+
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ se->undo_state=canvas_item->edit_get_state();
+ if (canvas_item->cast_to<Node2D>())
+ se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot();
+
+ }
+
+
+ drag=DRAG_ALL;
+ drag_from=transform.affine_inverse().xform(click);
+ drag_point_from=_find_topleftmost_point();
+ viewport->update();
+ return;
+
+ }
+
+ Node* scene = editor->get_edited_scene();
+ if (!scene)
+ return;
+
+ /*
+ if (current_window) {
+ //no window.... ?
+ click-=current_window->get_scroll();
+ }*/
+ CanvasItem *c=NULL;
+
+ if (Cbone) {
+
+ Object* obj=ObjectDB::get_instance(Cbone->get().bone);
+ if (obj)
+ c=obj->cast_to<CanvasItem>();
+ if (c)
+ c=c->get_parent_item();
+
+
+ }
+ if (!c) {
+ c =_select_canvas_item_at_pos(click, scene,transform,Transform2D());
+
+
+ CanvasItem* cn = c;
+
+ while(cn) {
+ if (cn->has_meta("_edit_group_")) {
+ c=cn;
+ }
+ cn=cn->get_parent_item();
+ }
+ }
+
+ Node* n = c;
+
+ while ((n && n != scene && n->get_owner() != scene) || (n && !n->is_class("CanvasItem"))) {
+ n = n->get_parent();
+ };
+ c = n->cast_to<CanvasItem>();
+#if 0
+ if ( b.pressed ) box_selection_start( click );
+#endif
+
+ additive_selection=b.mod.shift;
+ if (!_select(c, click, additive_selection))
+ return;
+
+ }
+
+ if (p_event.type==InputEvent::MOUSE_MOTION) {
+
+ if (!viewport->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
+ viewport->call_deferred("grab_focus");
+
+ const InputEventMouseMotion &m=p_event.mouse_motion;
+
+ if (box_selecting) {
+
+ box_selecting_to=transform.affine_inverse().xform(Point2(m.x,m.y));
+ viewport->update();
+ return;
+
+ }
+
+
+ if (drag==DRAG_NONE) {
+
+
+ if ( (m.button_mask&BUTTON_MASK_LEFT && tool == TOOL_PAN) || m.button_mask&BUTTON_MASK_MIDDLE || (m.button_mask&BUTTON_MASK_LEFT && Input::get_singleton()->is_key_pressed(KEY_SPACE))) {
+ h_scroll->set_value( h_scroll->get_value() - m.relative_x/zoom);
+ v_scroll->set_value( v_scroll->get_value() - m.relative_y/zoom);
+ }
+
+ return;
+
+ }
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ bool dragging_bone = drag==DRAG_ALL && selection.size()==1 && bone_ik_list.size();
+
+
+ if (!dragging_bone) {
+ canvas_item->edit_set_state(se->undo_state); //reset state and reapply
+ if (canvas_item->cast_to<Node2D>())
+ canvas_item->cast_to<Node2D>()->edit_set_pivot(se->undo_pivot);
+ }
+
+
+ Vector2 dfrom = drag_from;
+ Vector2 dto = transform.affine_inverse().xform(Point2(m.x,m.y));
+ if (canvas_item->has_meta("_edit_lock_"))
+ continue;
+
+
+ if (drag==DRAG_ROTATE) {
+
+ Vector2 center = canvas_item->get_global_transform_with_canvas().get_origin();
+ {
+ Node2D *node = canvas_item->cast_to<Node2D>();
+
+
+ if (node) {
+ real_t angle = node->get_rotation();
+ node->set_rotation(snap_angle( angle + (dfrom - center).angle_to(dto-center), angle ));
+ display_rotate_to = dto;
+ display_rotate_from = center;
+ viewport->update();
+ }
+ }
+
+ {
+ Control *node = canvas_item->cast_to<Control>();
+
+
+ if (node) {
+ real_t angle = node->get_rotation();
+ node->set_rotation(snap_angle( angle + (dfrom - center).angle_to(dto-center), angle ));
+ display_rotate_to = dto;
+ display_rotate_from = center;
+ viewport->update();
+ }
+ }
+
+ continue;
+ }
+
+
+ bool uniform = m.mod.shift;
+ bool symmetric=m.mod.alt;
+
+ dto = dto - (drag == DRAG_ALL ? drag_from - drag_point_from : Vector2(0, 0));
+
+ if(uniform && drag == DRAG_ALL) {
+ if(ABS(dto.x - drag_point_from.x) > ABS(dto.y - drag_point_from.y)) {
+ dto.y = drag_point_from.y;
+ } else {
+ dto.x = drag_point_from.x;
+ }
+ }
+
+ dfrom = drag_point_from;
+ dto = snap_point(dto, drag_point_from);
+
+ Vector2 drag_vector =
+ canvas_item->get_global_transform_with_canvas().affine_inverse().xform(dto) -
+ canvas_item->get_global_transform_with_canvas().affine_inverse().xform(dfrom);
+
+ Rect2 local_rect = canvas_item->get_item_rect();
+ Vector2 begin=local_rect.pos;
+ Vector2 end=local_rect.pos+local_rect.size;
+ Vector2 minsize = canvas_item->edit_get_minimum_size();
+
+ if (uniform) {
+ float aspect = local_rect.size.aspect();
+ switch(drag) {
+ case DRAG_BOTTOM_LEFT:
+ case DRAG_TOP_RIGHT: {
+ if (aspect > 1.0) { // width > height, take x as reference
+ drag_vector.y = -drag_vector.x/aspect;
+ } else { // height > width, take y as reference
+ drag_vector.x = -drag_vector.y*aspect;
+ }
+ } break;
+ case DRAG_BOTTOM_RIGHT:
+ case DRAG_TOP_LEFT: {
+ if (aspect > 1.0) { // width > height, take x as reference
+ drag_vector.y = drag_vector.x/aspect;
+ } else { // height > width, take y as reference
+ drag_vector.x = drag_vector.y*aspect;
+ }
+ } break;
+ default: {}
+ }
+ }
+
+ switch(drag) {
+ case DRAG_ALL: {
+ begin+=drag_vector;
+ end+=drag_vector;
+ } break;
+ case DRAG_RIGHT: {
+
+ incend(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+
+ } break;
+ case DRAG_BOTTOM: {
+
+ incend(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+
+ } break;
+ case DRAG_BOTTOM_RIGHT: {
+
+ incend(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+ incend(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+ } break;
+ case DRAG_TOP_LEFT: {
+
+ incbeg(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+ incbeg(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+ } break;
+ case DRAG_TOP: {
+
+ incbeg(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+
+ } break;
+ case DRAG_LEFT: {
+
+ incbeg(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+
+ } break;
+ case DRAG_TOP_RIGHT: {
+
+ incbeg(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+ incend(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+
+ } break;
+ case DRAG_BOTTOM_LEFT: {
+
+ incbeg(begin.x,end.x,drag_vector.x,minsize.x,symmetric);
+ incend(begin.y,end.y,drag_vector.y,minsize.y,symmetric);
+ } break;
+ case DRAG_PIVOT: {
+
+ if (canvas_item->cast_to<Node2D>()) {
+ Node2D *n2d =canvas_item->cast_to<Node2D>();
+ n2d->edit_set_pivot(se->undo_pivot+drag_vector);
+
+ }
+ continue;
+ } break;
+
+ default:{}
+ }
+
+
+
+ if (!dragging_bone) {
+
+ local_rect.pos=begin;
+ local_rect.size=end-begin;
+ canvas_item->edit_set_rect(local_rect);
+
+ } else {
+ //ok, all that had to be done was done, now solve IK
+
+
+
+
+ Node2D *n2d = canvas_item->cast_to<Node2D>();
+ Transform2D final_xform = bone_orig_xform;
+
+
+
+ if (n2d) {
+
+ float total_len = 0;
+ for (List<BoneIK>::Element *E=bone_ik_list.front();E;E=E->next()) {
+ if (E->prev())
+ total_len+=E->get().len;
+ E->get().pos = E->get().node->get_global_transform().get_origin();
+ }
+
+ {
+
+ final_xform.elements[2]+=dto-dfrom;//final_xform.affine_inverse().basis_xform_inv(drag_vector);
+ //n2d->set_global_transform(final_xform);
+
+ }
+
+
+ CanvasItem *last = bone_ik_list.back()->get().node;
+ if (!last)
+ break;
+
+ Vector2 root_pos = last->get_global_transform().get_origin();
+ Vector2 leaf_pos = final_xform.get_origin();
+
+ if ((leaf_pos.distance_to(root_pos)) > total_len) {
+ //oops dude you went too far
+ //print_line("TOO FAR!");
+ Vector2 rel = leaf_pos - root_pos;
+ rel = rel.normalized() * total_len;
+ leaf_pos=root_pos+rel;
+
+ }
+
+ bone_ik_list.front()->get().pos=leaf_pos;
+
+ //print_line("BONE IK LIST "+itos(bone_ik_list.size()));
+
+
+ if (bone_ik_list.size()>2) {
+ int solver_iterations=64;
+ float solver_k=0.3;
+
+ for(int i=0;i<solver_iterations;i++) {
+
+ for (List<BoneIK>::Element *E=bone_ik_list.front();E;E=E->next()) {
+
+
+
+ if (E==bone_ik_list.back()) {
+
+ break;
+ }
+
+ float len = E->next()->get().len;
+
+ if (E->next()==bone_ik_list.back()) {
+
+ //print_line("back");
+
+ Vector2 rel = E->get().pos - E->next()->get().pos;
+ //print_line("PREV "+E->get().pos);
+ Vector2 desired = E->next()->get().pos+rel.normalized()*len;
+ //print_line("DESIRED "+desired);
+ E->get().pos=E->get().pos.linear_interpolate(desired,solver_k);
+ //print_line("POST "+E->get().pos);
+
+
+ } else if (E==bone_ik_list.front()) {
+ //only adjust parent
+ //print_line("front");
+ Vector2 rel = E->next()->get().pos - E->get().pos;
+ //print_line("PREV "+E->next()->get().pos);
+ Vector2 desired = E->get().pos+rel.normalized()*len;
+ //print_line("DESIRED "+desired);
+ E->next()->get().pos=E->next()->get().pos.linear_interpolate(desired,solver_k);
+ //print_line("POST "+E->next()->get().pos);
+ } else {
+
+ Vector2 rel = E->next()->get().pos - E->get().pos;
+ Vector2 cen = (E->next()->get().pos + E->get().pos)*0.5;
+ rel=rel.linear_interpolate(rel.normalized()*len,solver_k);
+ rel*=0.5;
+ E->next()->get().pos=cen+rel;
+ E->get().pos=cen-rel;
+ //print_line("mid");
+
+ }
+ }
+ }
+ }
+ }
+
+ for (List<BoneIK>::Element *E=bone_ik_list.back();E;E=E->prev()) {
+
+ Node2D *n = E->get().node;
+
+ if (!E->prev()) {
+ //last goes to what it was
+ final_xform.set_origin(n->get_global_position());
+ n->set_global_transform(final_xform);
+
+ } else {
+ Vector2 rel = (E->prev()->get().node->get_global_position() - n->get_global_position()).normalized();
+ Vector2 rel2 = (E->prev()->get().pos - E->get().pos).normalized();
+ float rot = rel.angle_to(rel2);
+ if (n->get_global_transform().basis_determinant()<0) {
+ //mirrored, rotate the other way
+ rot=-rot;
+ }
+
+ n->rotate(rot);
+ }
+
+ }
+
+
+
+ break;
+ }
+ }
+ }
+
+ if (p_event.type==InputEvent::KEY) {
+
+ const InputEventKey &k=p_event.key;
+
+ if (k.pressed && drag==DRAG_NONE) {
+
+ KeyMoveMODE move_mode = MOVE_VIEW_BASE;
+ if (k.mod.alt) move_mode = MOVE_LOCAL_BASE;
+ if (k.mod.control || k.mod.meta) move_mode = MOVE_LOCAL_WITH_ROT;
+
+ if (k.scancode==KEY_UP)
+ _key_move( Vector2(0,-1), k.mod.shift, move_mode );
+ else if (k.scancode==KEY_DOWN)
+ _key_move( Vector2(0,1), k.mod.shift, move_mode );
+ else if (k.scancode==KEY_LEFT)
+ _key_move( Vector2(-1,0), k.mod.shift, move_mode );
+ else if (k.scancode==KEY_RIGHT)
+ _key_move( Vector2(1,0), k.mod.shift, move_mode );
+ else if (k.scancode==KEY_ESCAPE) {
+ editor_selection->clear();
+ viewport->update();
+ }
+ else
+ return;
+
+ accept_event();
+ }
+
+ }
+
+
+
+
+}
+
+void CanvasItemEditor::_viewport_draw() {
+
+ // TODO fetch the viewport?
+
+ Ref<Texture> pivot = get_icon("EditorPivot","EditorIcons");
+ _update_scrollbars();
+ RID ci=viewport->get_canvas_item();
+
+ if (snap_show_grid) {
+ Size2 s = viewport->get_size();
+ int last_cell;
+ Transform2D xform = transform.affine_inverse();
+
+ if (snap_step.x!=0) {
+ for(int i=0;i<s.width;i++) {
+ int cell = Math::fast_ftoi(Math::floor((xform.xform(Vector2(i,0)).x-snap_offset.x)/snap_step.x));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ viewport->draw_line(Point2(i,0),Point2(i,s.height),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+
+ if (snap_step.y!=0) {
+ for(int i=0;i<s.height;i++) {
+ int cell = Math::fast_ftoi(Math::floor((xform.xform(Vector2(0,i)).y-snap_offset.y)/snap_step.y));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ viewport->draw_line(Point2(0,i),Point2(s.width,i),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+ }
+
+ if (viewport->has_focus()) {
+ Size2 size = viewport->get_size();
+ if (v_scroll->is_visible_in_tree())
+ size.width-=v_scroll->get_size().width;
+ if (h_scroll->is_visible_in_tree())
+ size.height-=h_scroll->get_size().height;
+
+ get_stylebox("EditorFocus","EditorStyles")->draw(ci,Rect2(Point2(),size));
+ }
+
+ Ref<Texture> lock = get_icon("Lock","EditorIcons");
+ Ref<Texture> group = get_icon("Group","EditorIcons");
+
+
+ bool single = get_single_item()!=NULL;
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ bool pivot_found=false;
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+
+ Rect2 rect=canvas_item->get_item_rect();
+
+ Transform2D xform=transform * canvas_item->get_global_transform_with_canvas();
+ VisualServer::get_singleton()->canvas_item_add_set_transform(ci,xform);
+
+ Vector2 endpoints[4]={
+
+ xform.xform(rect.pos),
+ xform.xform(rect.pos+Vector2(rect.size.x,0)),
+ xform.xform(rect.pos+rect.size),
+ xform.xform(rect.pos+Vector2(0,rect.size.y))
+ };
+
+ Color c = Color(1,0.6,0.4,0.7);
+
+ VisualServer::get_singleton()->canvas_item_add_set_transform(ci,Transform2D());
+
+ for(int i=0;i<4;i++) {
+ viewport->draw_line(endpoints[i],endpoints[(i+1)%4],c,2);
+ }
+
+ if (single && (tool==TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_ROTATE || tool==TOOL_EDIT_PIVOT)) { //kind of sucks
+
+ if (canvas_item->cast_to<Node2D>()) {
+
+
+ if (canvas_item->cast_to<Node2D>()->edit_has_pivot()) {
+ viewport->draw_texture(pivot,xform.get_origin()+(-pivot->get_size()/2).floor());
+ can_move_pivot=true;
+ pivot_found=true;
+ }
+
+ }
+
+
+ if (tool==TOOL_SELECT) {
+
+
+ for(int i=0;i<4;i++) {
+
+ int prev = (i+3)%4;
+ int next = (i+1)%4;
+
+ Vector2 ofs = ((endpoints[i] - endpoints[prev]).normalized() + ((endpoints[i] - endpoints[next]).normalized())).normalized();
+ ofs*=1.4144*(select_handle->get_size().width/2);
+
+ select_handle->draw(ci,(endpoints[i]+ofs-(select_handle->get_size()/2)).floor());
+
+ ofs = (endpoints[i]+endpoints[next])/2;
+ ofs += (endpoints[next]-endpoints[i]).tangent().normalized()*(select_handle->get_size().width/2);
+
+ select_handle->draw(ci,(ofs-(select_handle->get_size()/2)).floor());
+
+ }
+
+ }
+ }
+
+
+
+ //DRAW_EMPTY_RECT( Rect2( current_window->get_scroll()-Point2(1,1), get_size()+Size2(2,2)), Color(0.8,0.8,1.0,0.8) );
+ //E->get().last_rect = rect;
+ }
+
+ pivot_button->set_disabled(!pivot_found);
+ VisualServer::get_singleton()->canvas_item_add_set_transform(ci,Transform2D());
+
+
+
+ Color x_axis_color(1.0,0.4,0.4,0.6);
+ Color y_axis_color(0.4,1.0,0.4,0.6);
+ Color area_axis_color(0.4,0.4,1.0,0.4);
+ Color rotate_color(0.4,0.7,1.0,0.8);
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,Point2(h_scroll->get_min(),0)+transform.get_origin(),Point2(h_scroll->get_max(),0)+transform.get_origin(),x_axis_color);
+ VisualServer::get_singleton()->canvas_item_add_line(ci,Point2(0,v_scroll->get_min())+transform.get_origin(),Point2(0,v_scroll->get_max())+transform.get_origin(),y_axis_color);
+
+
+ if (box_selecting) {
+
+ Point2 bsfrom = transform.xform(drag_from);
+ Point2 bsto= transform.xform(box_selecting_to);
+
+
+ VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(bsfrom,bsto-bsfrom),Color(0.7,0.7,1.0,0.3));
+ }
+
+ if (drag==DRAG_ROTATE) {
+ VisualServer::get_singleton()->canvas_item_add_line(ci,transform.xform(display_rotate_from), transform.xform(display_rotate_to),rotate_color);
+ }
+
+ Size2 screen_size = Size2( GlobalConfig::get_singleton()->get("display/window/width"), GlobalConfig::get_singleton()->get("display/window/height") );
+
+ Vector2 screen_endpoints[4]= {
+ transform.xform(Vector2(0,0)),
+ transform.xform(Vector2(screen_size.width,0)),
+ transform.xform(Vector2(screen_size.width,screen_size.height)),
+ transform.xform(Vector2(0,screen_size.height))
+ };
+
+ for(int i=0;i<4;i++) {
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,screen_endpoints[i], screen_endpoints[(i+1)%4],area_axis_color);
+
+ }
+
+ for(List<LockList>::Element*E=lock_list.front();E;E=E->next()) {
+
+ Vector2 ofs = transform.xform(E->get().pos);
+ if (E->get().lock) {
+
+ lock->draw(ci,ofs);
+ ofs.x+=lock->get_width();
+ }
+ if (E->get().group) {
+
+ group->draw(ci,ofs);
+ }
+
+ }
+
+ {
+
+ EditorNode *en = editor;
+ EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
+
+ if (!over_plugin_list->empty()) {
+
+ over_plugin_list->forward_draw_over_canvas(transform,viewport);
+
+ }
+ }
+
+ if (skeleton_show_bones) {
+ int bone_width = EditorSettings::get_singleton()->get("editors/2d/bone_width");
+ Color bone_color1 = EditorSettings::get_singleton()->get("editors/2d/bone_color1");
+ Color bone_color2 = EditorSettings::get_singleton()->get("editors/2d/bone_color2");
+ Color bone_ik_color = EditorSettings::get_singleton()->get("editors/2d/bone_ik_color");
+ Color bone_selected_color = EditorSettings::get_singleton()->get("editors/2d/bone_selected_color");
+
+ for(Map<ObjectID,BoneList>::Element*E=bone_list.front();E;E=E->next()) {
+
+ E->get().from=Vector2();
+ E->get().to=Vector2();
+
+ Object *obj = ObjectDB::get_instance(E->get().bone);
+ if (!obj)
+ continue;
+
+ Node2D* n2d = obj->cast_to<Node2D>();
+ if (!n2d)
+ continue;
+
+ if (!n2d->get_parent())
+ continue;
+
+ CanvasItem *pi = n2d->get_parent_item();
+
+
+ Node2D* pn2d=n2d->get_parent()->cast_to<Node2D>();
+
+ if (!pn2d)
+ continue;
+
+ Vector2 from = transform.xform(pn2d->get_global_position());
+ Vector2 to = transform.xform(n2d->get_global_position());
+
+ E->get().from=from;
+ E->get().to=to;
+
+ Vector2 rel = to-from;
+ Vector2 relt = rel.tangent().normalized()*bone_width;
+
+
+
+ Vector<Vector2> bone_shape;
+ bone_shape.push_back(from);
+ bone_shape.push_back(from+rel*0.2+relt);
+ bone_shape.push_back(to);
+ bone_shape.push_back(from+rel*0.2-relt);
+ Vector<Color> colors;
+ if (pi->has_meta("_edit_ik_")) {
+
+ colors.push_back(bone_ik_color);
+ colors.push_back(bone_ik_color);
+ colors.push_back(bone_ik_color);
+ colors.push_back(bone_ik_color);
+ } else {
+ colors.push_back(bone_color1);
+ colors.push_back(bone_color2);
+ colors.push_back(bone_color1);
+ colors.push_back(bone_color2);
+ }
+
+
+ VisualServer::get_singleton()->canvas_item_add_primitive(ci,bone_shape,colors,Vector<Vector2>(),RID());
+
+ if (editor_selection->is_selected(pi)) {
+ for(int i=0;i<bone_shape.size();i++) {
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,bone_shape[i],bone_shape[(i+1)%bone_shape.size()],bone_selected_color,2);
+ }
+ }
+
+ }
+ }
+}
+
+void CanvasItemEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ bool all_control=true;
+ bool has_control=false;
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ if (canvas_item->cast_to<Control>())
+ has_control=true;
+ else
+ all_control=false;
+
+ CanvasItemEditorSelectedItem *se=editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ if (!se)
+ continue;
+
+ Rect2 r=canvas_item->get_item_rect();
+
+ Transform2D xform = canvas_item->get_transform();
+
+ if (r != se->prev_rect || xform!=se->prev_xform) {
+ viewport->update();
+ se->prev_rect=r;
+ se->prev_xform=xform;
+ }
+
+ }
+
+ bool show_anchor = all_control && has_control;
+ if (show_anchor != anchor_menu->is_visible()) {
+ if (show_anchor)
+ anchor_menu->show();
+ else
+ anchor_menu->hide();
+ }
+
+ for(Map<ObjectID,BoneList>::Element *E=bone_list.front();E;E=E->next()) {
+
+ Object *b = ObjectDB::get_instance(E->get().bone);
+ if (!b) {
+
+ viewport->update();
+ break;
+ }
+
+ Node2D *b2 = b->cast_to<Node2D>();
+ if (!b2) {
+ continue;
+ }
+
+ if (b2->get_global_transform()!=E->get().xform) {
+
+ E->get().xform=b2->get_global_transform();
+ viewport->update();
+ }
+ }
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ select_sb->set_texture( get_icon("EditorRect2D","EditorIcons") );
+ for(int i=0;i<4;i++) {
+ select_sb->set_margin_size(Margin(i),4);
+ select_sb->set_default_margin(Margin(i),4);
+ }
+
+ select_button->set_icon( get_icon("ToolSelect","EditorIcons"));
+ list_select_button->set_icon( get_icon("ListSelect","EditorIcons"));
+ move_button->set_icon( get_icon("ToolMove","EditorIcons"));
+ rotate_button->set_icon( get_icon("ToolRotate","EditorIcons"));
+ pan_button->set_icon( get_icon("ToolPan", "EditorIcons"));
+ pivot_button->set_icon( get_icon("EditPivot", "EditorIcons"));
+ select_handle=get_icon("EditorHandle","EditorIcons");
+ lock_button->set_icon(get_icon("Lock","EditorIcons"));
+ unlock_button->set_icon(get_icon("Unlock","EditorIcons"));
+ group_button->set_icon(get_icon("Group","EditorIcons"));
+ ungroup_button->set_icon(get_icon("Ungroup","EditorIcons"));
+ key_insert_button->set_icon(get_icon("Key","EditorIcons"));
+
+
+ //anchor_menu->add_icon_override("Align Top Left");
+ anchor_menu->set_icon(get_icon("Anchor","EditorIcons"));
+ PopupMenu *p=anchor_menu->get_popup();
+
+ p->add_icon_item(get_icon("ControlAlignTopLeft","EditorIcons"),"Top Left",ANCHOR_ALIGN_TOP_LEFT);
+ p->add_icon_item(get_icon("ControlAlignTopRight","EditorIcons"),"Top Right",ANCHOR_ALIGN_TOP_RIGHT);
+ p->add_icon_item(get_icon("ControlAlignBottomRight","EditorIcons"),"Bottom Right",ANCHOR_ALIGN_BOTTOM_RIGHT);
+ p->add_icon_item(get_icon("ControlAlignBottomLeft","EditorIcons"),"Bottom Left",ANCHOR_ALIGN_BOTTOM_LEFT);
+ p->add_separator();
+ p->add_icon_item(get_icon("ControlAlignLeftCenter","EditorIcons"),"Center Left",ANCHOR_ALIGN_CENTER_LEFT);
+ p->add_icon_item(get_icon("ControlAlignTopCenter","EditorIcons"),"Center Top",ANCHOR_ALIGN_CENTER_TOP);
+ p->add_icon_item(get_icon("ControlAlignRightCenter","EditorIcons"),"Center Right",ANCHOR_ALIGN_CENTER_RIGHT);
+ p->add_icon_item(get_icon("ControlAlignBottomCenter","EditorIcons"),"Center Bottom",ANCHOR_ALIGN_CENTER_BOTTOM);
+ p->add_icon_item(get_icon("ControlAlignCenter","EditorIcons"),"Center",ANCHOR_ALIGN_CENTER);
+ p->add_separator();
+ p->add_icon_item(get_icon("ControlAlignLeftWide","EditorIcons"),"Left Wide",ANCHOR_ALIGN_LEFT_WIDE);
+ p->add_icon_item(get_icon("ControlAlignTopWide","EditorIcons"),"Top Wide",ANCHOR_ALIGN_TOP_WIDE);
+ p->add_icon_item(get_icon("ControlAlignRightWide","EditorIcons"),"Right Wide",ANCHOR_ALIGN_RIGHT_WIDE);
+ p->add_icon_item(get_icon("ControlAlignBottomWide","EditorIcons"),"Bottom Wide",ANCHOR_ALIGN_BOTTOM_WIDE);
+ p->add_icon_item(get_icon("ControlVcenterWide","EditorIcons"),"VCenter Wide ",ANCHOR_ALIGN_VCENTER_WIDE);
+ p->add_icon_item(get_icon("ControlHcenterWide","EditorIcons"),"HCenter Wide ",ANCHOR_ALIGN_HCENTER_WIDE);
+ p->add_separator();
+ p->add_icon_item(get_icon("ControlAlignWide","EditorIcons"),"Full Rect",ANCHOR_ALIGN_WIDE);
+
+
+ AnimationPlayerEditor::singleton->get_key_editor()->connect("visibility_changed",this,"_keying_changed");
+ _keying_changed();
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ get_tree()->connect("node_removed",this,"_node_removed");
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+
+ }
+}
+
+void CanvasItemEditor::edit(CanvasItem *p_canvas_item) {
+
+ drag=DRAG_NONE;
+
+ editor_selection->clear();//_clear_canvas_items();
+ editor_selection->add_node(p_canvas_item);
+ //_add_canvas_item(p_canvas_item);
+ viewport->update();
+
+}
+
+
+void CanvasItemEditor::_find_canvas_items_span(Node *p_node, Rect2& r_rect, const Transform2D& p_xform) {
+
+
+
+ if (!p_node)
+ return;
+
+ CanvasItem *c=p_node->cast_to<CanvasItem>();
+
+
+ for (int i=p_node->get_child_count()-1;i>=0;i--) {
+
+ //CanvasItem *r=NULL;
+
+ if (c && !c->is_set_as_toplevel())
+ _find_canvas_items_span(p_node->get_child(i),r_rect,p_xform * c->get_transform());
+ else
+ _find_canvas_items_span(p_node->get_child(i),r_rect,Transform2D());
+ }
+
+
+
+ if (c && c->is_visible_in_tree()) {
+
+ Rect2 rect = c->get_item_rect();
+ Transform2D xform = p_xform * c->get_transform();
+
+
+ LockList lock;
+ lock.lock=c->has_meta("_edit_lock_");
+ lock.group=c->has_meta("_edit_group_");
+
+ if (lock.group || lock.lock) {
+ lock.pos=xform.xform(rect.pos);
+ lock_list.push_back(lock);
+ }
+
+ if (c->has_meta("_edit_bone_")) {
+
+ ObjectID id = c->get_instance_ID();
+ if (!bone_list.has(id)) {
+ BoneList bone;
+ bone.bone=id;
+ bone_list[id]=bone;
+ }
+
+ bone_list[id].last_pass=bone_last_frame;
+ }
+
+ r_rect.expand_to( xform.xform(rect.pos) );
+ r_rect.expand_to( xform.xform(rect.pos+Point2(rect.size.x,0)) );
+ r_rect.expand_to( xform.xform(rect.pos+Point2(0,rect.size.y)) );
+ r_rect.expand_to( xform.xform(rect.pos+rect.size) );
+
+ }
+
+}
+
+void CanvasItemEditor::_update_scrollbars() {
+
+
+ updating_scroll=true;
+
+ Size2 size = viewport->get_size();
+ Size2 hmin = h_scroll->get_minimum_size();
+ Size2 vmin = v_scroll->get_minimum_size();
+
+ v_scroll->set_begin( Point2(size.width - vmin.width, 0) );
+ v_scroll->set_end( Point2(size.width, size.height) );
+
+ h_scroll->set_begin( Point2( 0, size.height - hmin.height) );
+ h_scroll->set_end( Point2(size.width-vmin.width, size.height) );
+
+
+ Size2 screen_rect = Size2( GlobalConfig::get_singleton()->get("display/window/width"), GlobalConfig::get_singleton()->get("display/window/height") );
+
+
+ Rect2 local_rect = Rect2(Point2(),viewport->get_size()-Size2(vmin.width,hmin.height));
+
+ Rect2 canvas_item_rect=Rect2(Point2(),screen_rect);
+
+ lock_list.clear();
+ bone_last_frame++;
+
+
+
+ if (editor->get_edited_scene())
+ _find_canvas_items_span(editor->get_edited_scene(),canvas_item_rect,Transform2D());
+
+ List<Map<ObjectID,BoneList>::Element*> bone_to_erase;
+
+ for(Map<ObjectID,BoneList>::Element*E=bone_list.front();E;E=E->next()) {
+
+ if (E->get().last_pass!=bone_last_frame) {
+ bone_to_erase.push_back(E);
+ }
+ }
+
+ while(bone_to_erase.size()) {
+ bone_list.erase(bone_to_erase.front()->get());
+ bone_to_erase.pop_front();
+ }
+
+ //expand area so it's easier to do animations and stuff at 0,0
+ canvas_item_rect.size+=screen_rect*2;
+ canvas_item_rect.pos-=screen_rect;
+
+ Point2 ofs;
+
+
+ if (canvas_item_rect.size.height <= (local_rect.size.y/zoom)) {
+
+ v_scroll->hide();
+ ofs.y=canvas_item_rect.pos.y;
+ } else {
+
+ v_scroll->show();
+ v_scroll->set_min(canvas_item_rect.pos.y);
+ v_scroll->set_max(canvas_item_rect.pos.y+canvas_item_rect.size.y);
+ v_scroll->set_page(local_rect.size.y/zoom);
+ if (first_update) {
+ //so 0,0 is visible
+ v_scroll->set_value(-10);
+ h_scroll->set_value(-10);
+ first_update=false;
+
+ }
+
+ ofs.y=v_scroll->get_value();
+ }
+
+ if (canvas_item_rect.size.width <= (local_rect.size.x/zoom)) {
+
+ h_scroll->hide();
+ ofs.x=canvas_item_rect.pos.x;
+ } else {
+
+ h_scroll->show();
+ h_scroll->set_min(canvas_item_rect.pos.x);
+ h_scroll->set_max(canvas_item_rect.pos.x+canvas_item_rect.size.x);
+ h_scroll->set_page(local_rect.size.x/zoom);
+ ofs.x=h_scroll->get_value();
+ }
+
+ //transform=Matrix32();
+ transform.elements[2]=-ofs*zoom;
+
+ editor->get_scene_root()->set_global_canvas_transform(transform);
+
+
+ updating_scroll=false;
+
+ //transform.scale_basis(Vector2(zoom,zoom));
+
+
+}
+
+void CanvasItemEditor::_update_scroll(float) {
+
+
+ if (updating_scroll)
+ return;
+
+ Point2 ofs;
+ ofs.x=h_scroll->get_value();
+ ofs.y=v_scroll->get_value();
+
+ //current_window->set_scroll(-ofs);
+
+ transform=Transform2D();
+
+ transform.scale_basis(Size2(zoom,zoom));
+ transform.elements[2]=-ofs;
+
+ editor->get_scene_root()->set_global_canvas_transform(transform);
+
+
+ viewport->update();
+
+}
+
+void CanvasItemEditor::_set_anchor(Control::AnchorType p_left,Control::AnchorType p_top,Control::AnchorType p_right,Control::AnchorType p_bottom) {
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ undo_redo->create_action(TTR("Change Anchors"));
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Control *c = E->get()->cast_to<Control>();
+
+ undo_redo->add_do_method(c,"set_anchor",MARGIN_LEFT,p_left);
+ undo_redo->add_do_method(c,"set_anchor",MARGIN_TOP,p_top);
+ undo_redo->add_do_method(c,"set_anchor",MARGIN_RIGHT,p_right);
+ undo_redo->add_do_method(c,"set_anchor",MARGIN_BOTTOM,p_bottom);
+ undo_redo->add_undo_method(c,"set_anchor",MARGIN_LEFT,c->get_anchor(MARGIN_LEFT));
+ undo_redo->add_undo_method(c,"set_anchor",MARGIN_TOP,c->get_anchor(MARGIN_TOP));
+ undo_redo->add_undo_method(c,"set_anchor",MARGIN_RIGHT,c->get_anchor(MARGIN_RIGHT));
+ undo_redo->add_undo_method(c,"set_anchor",MARGIN_BOTTOM,c->get_anchor(MARGIN_BOTTOM));
+ }
+
+ undo_redo->commit_action();
+
+}
+
+void CanvasItemEditor::_popup_callback(int p_op) {
+
+ last_option=MenuOption(p_op);
+ switch(p_op) {
+
+ case SNAP_USE: {
+ snap_grid = !snap_grid;
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE);
+ edit_menu->get_popup()->set_item_checked(idx,snap_grid);
+ } break;
+ case SNAP_SHOW_GRID: {
+ snap_show_grid = !snap_show_grid;
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_SHOW_GRID);
+ edit_menu->get_popup()->set_item_checked(idx,snap_show_grid);
+ viewport->update();
+ } break;
+ case SNAP_USE_ROTATION: {
+ snap_rotation = !snap_rotation;
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE_ROTATION);
+ edit_menu->get_popup()->set_item_checked(idx,snap_rotation);
+ } break;
+ case SNAP_RELATIVE: {
+ snap_relative = !snap_relative;
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_RELATIVE);
+ edit_menu->get_popup()->set_item_checked(idx,snap_relative);
+ } break;
+ case SNAP_USE_PIXEL: {
+ snap_pixel = !snap_pixel;
+ int idx = edit_menu->get_popup()->get_item_index(SNAP_USE_PIXEL);
+ edit_menu->get_popup()->set_item_checked(idx,snap_pixel);
+ } break;
+ case SNAP_CONFIGURE: {
+ ((SnapDialog *)snap_dialog)->set_fields(snap_offset, snap_step, snap_rotation_offset, snap_rotation_step);
+ snap_dialog->popup_centered(Size2(220,160));
+ } break;
+ case SKELETON_SHOW_BONES: {
+ skeleton_show_bones = !skeleton_show_bones;
+ int idx = skeleton_menu->get_item_index(SKELETON_SHOW_BONES);
+ skeleton_menu->set_item_checked(idx,skeleton_show_bones);
+ viewport->update();
+ } break;
+ case ZOOM_IN: {
+ if (zoom>MAX_ZOOM)
+ return;
+ zoom=zoom*(1.0/0.5);
+ _update_scroll(0);
+ viewport->update();
+ return;
+ } break;
+ case ZOOM_OUT: {
+ if (zoom<MIN_ZOOM)
+ return;
+
+ zoom=zoom*0.5;
+ _update_scroll(0);
+ viewport->update();
+ return;
+
+ } break;
+ case ZOOM_RESET: {
+
+ zoom=1;
+ _update_scroll(0);
+ viewport->update();
+ return;
+
+ } break;
+ case ZOOM_SET: {
+
+ updating_value_dialog=true;
+
+ dialog_label->set_text(TTR("Zoom (%):"));
+ dialog_val->set_min(0.1);
+ dialog_val->set_step(0.1);
+ dialog_val->set_max(800);
+ dialog_val->set_value(zoom*100);
+ value_dialog->popup_centered(Size2(200,85));
+ updating_value_dialog=false;
+
+
+ } break;
+ case LOCK_SELECTED: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ canvas_item->set_meta("_edit_lock_",true);
+ emit_signal("item_lock_status_changed");
+ }
+ viewport->update();
+ } break;
+ case UNLOCK_SELECTED: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+ canvas_item->set_meta("_edit_lock_",Variant());
+ emit_signal("item_lock_status_changed");
+ }
+
+ viewport->update();
+
+ } break;
+ case GROUP_SELECTED: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ canvas_item->set_meta("_edit_group_",true);
+ emit_signal("item_group_status_changed");
+ }
+ viewport->update();
+ } break;
+ case UNGROUP_SELECTED: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ canvas_item->set_meta("_edit_group_",Variant());
+ emit_signal("item_group_status_changed");
+ }
+
+ viewport->update();
+
+ } break;
+
+ case EXPAND_TO_PARENT: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+ Control *c = canvas_item->cast_to<Control>();
+ if (!c)
+ continue;
+ c->set_area_as_parent_rect();
+
+ }
+
+ viewport->update();
+
+ } break;
+
+ case ALIGN_VERTICAL: {
+#if 0
+ if ( ref_item && canvas_items.size() > 1 ) {
+ Vector2 ref_pos = ref_item->get_global_transform().elements[2];
+ Rect2 ref_r = ref_item->get_item_rect();
+ for ( CanvasItemMap::Element *E = canvas_items.front(); E; E = E->next() ) {
+ CanvasItem *it_curr = E->key();
+ if ( it_curr == ref_item ) continue;
+ Vector2 v = it_curr->get_global_transform().elements[2];
+ Rect2 r = it_curr->get_item_rect();
+ r.pos.x = ( ref_pos.x + ref_r.size.x / 2 ) - ( v.x + r.size.x / 2 );
+ it_curr->edit_set_rect( r );
+ }
+ viewport->update();
+ }
+#endif
+ } break;
+
+ case ALIGN_HORIZONTAL: {
+#if 0
+ if ( ref_item && canvas_items.size() > 1 ) {
+ Vector2 ref_pos = ref_item->get_global_transform().elements[2];
+ Rect2 ref_r = ref_item->get_item_rect();
+ for ( CanvasItemMap::Element *E = canvas_items.front(); E; E = E->next() ) {
+ CanvasItem *it_curr = E->key();
+ if ( it_curr == ref_item ) continue;
+ Vector2 v = it_curr->get_global_transform().elements[2];
+ Rect2 r = it_curr->get_item_rect();
+ r.pos.y = ( ref_pos.y + ref_r.size.y / 2 ) - ( v.y + r.size.y / 2 );
+ it_curr->edit_set_rect( r );
+ }
+ viewport->update();
+ }
+#endif
+ } break;
+
+ case SPACE_HORIZONTAL: {
+ //space_selected_items< proj_vector2_x, compare_items_x >();
+ } break;
+
+ case SPACE_VERTICAL: {
+ //space_selected_items< proj_vector2_y, compare_items_y >();
+ } break;
+ case ANCHOR_ALIGN_TOP_LEFT: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_BEGIN);
+ } break;
+ case ANCHOR_ALIGN_TOP_RIGHT: {
+ _set_anchor(ANCHOR_END,ANCHOR_BEGIN,ANCHOR_END,ANCHOR_BEGIN);
+ } break;
+ case ANCHOR_ALIGN_BOTTOM_LEFT: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_END,ANCHOR_BEGIN,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_BOTTOM_RIGHT: {
+ _set_anchor(ANCHOR_END,ANCHOR_END,ANCHOR_END,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_CENTER_LEFT: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_CENTER,ANCHOR_BEGIN,ANCHOR_CENTER);
+ } break;
+ case ANCHOR_ALIGN_CENTER_RIGHT: {
+
+ _set_anchor(ANCHOR_END,ANCHOR_CENTER,ANCHOR_END,ANCHOR_CENTER);
+ } break;
+ case ANCHOR_ALIGN_CENTER_TOP: {
+ _set_anchor(ANCHOR_CENTER,ANCHOR_BEGIN,ANCHOR_CENTER,ANCHOR_BEGIN);
+ } break;
+ case ANCHOR_ALIGN_CENTER_BOTTOM: {
+ _set_anchor(ANCHOR_CENTER,ANCHOR_END,ANCHOR_CENTER,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_CENTER: {
+ _set_anchor(ANCHOR_CENTER,ANCHOR_CENTER,ANCHOR_CENTER,ANCHOR_CENTER);
+ } break;
+ case ANCHOR_ALIGN_TOP_WIDE: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_END,ANCHOR_BEGIN);
+ } break;
+ case ANCHOR_ALIGN_LEFT_WIDE: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_RIGHT_WIDE: {
+ _set_anchor(ANCHOR_END,ANCHOR_BEGIN,ANCHOR_END,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_BOTTOM_WIDE: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_END,ANCHOR_END,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_VCENTER_WIDE: {
+ _set_anchor(ANCHOR_CENTER,ANCHOR_BEGIN,ANCHOR_CENTER,ANCHOR_END);
+ } break;
+ case ANCHOR_ALIGN_HCENTER_WIDE: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_CENTER,ANCHOR_END,ANCHOR_CENTER);
+ } break;
+ case ANCHOR_ALIGN_WIDE: {
+ _set_anchor(ANCHOR_BEGIN,ANCHOR_BEGIN,ANCHOR_END,ANCHOR_END);
+ } break;
+
+ case ANIM_INSERT_KEY:
+ case ANIM_INSERT_KEY_EXISTING: {
+
+ bool existing = p_op==ANIM_INSERT_KEY_EXISTING;
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ if (canvas_item->cast_to<Node2D>()) {
+ Node2D *n2d = canvas_item->cast_to<Node2D>();
+
+ if (key_pos)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d,"transform/pos",n2d->get_position(),existing);
+ if (key_rot)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d,"transform/rot",Math::rad2deg(n2d->get_rotation()),existing);
+ if (key_scale)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d,"transform/scale",n2d->get_scale(),existing);
+
+
+ if (n2d->has_meta("_edit_bone_") && n2d->get_parent_item()) {
+ //look for an IK chain
+ List<Node2D*> ik_chain;
+
+ Node2D *n = n2d->get_parent_item()->cast_to<Node2D>();
+ bool has_chain=false;
+
+ while(n) {
+
+ ik_chain.push_back(n);
+ if (n->has_meta("_edit_ik_")) {
+ has_chain=true;
+ break;
+ }
+
+ if (!n->get_parent_item())
+ break;
+ n=n->get_parent_item()->cast_to<Node2D>();
+ }
+
+ if (has_chain && ik_chain.size()) {
+
+ for(List<Node2D*>::Element *F=ik_chain.front();F;F=F->next()) {
+
+ if (key_pos)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(),"transform/pos",F->get()->get_position(),existing);
+ if (key_rot)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(),"transform/rot",Math::rad2deg(F->get()->get_rotation()),existing);
+ if (key_scale)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(),"transform/scale",F->get()->get_scale(),existing);
+
+
+ }
+ }
+ }
+
+ } else if (canvas_item->cast_to<Control>()) {
+
+ Control *ctrl = canvas_item->cast_to<Control>();
+
+ if (key_pos)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl,"rect/pos",ctrl->get_pos(),existing);
+ if (key_scale)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl,"rect/size",ctrl->get_size(),existing);
+ }
+
+ }
+
+ } break;
+ case ANIM_INSERT_POS: {
+
+ key_pos = key_loc_button->is_pressed();
+ } break;
+ case ANIM_INSERT_ROT: {
+
+ key_rot = key_rot_button->is_pressed();
+ } break;
+ case ANIM_INSERT_SCALE: {
+
+ key_scale = key_scale_button->is_pressed();
+ } break;
+ /*
+ case ANIM_INSERT_POS_ROT
+ case ANIM_INSERT_POS_SCALE:
+ case ANIM_INSERT_ROT_SCALE:
+ case ANIM_INSERT_POS_ROT_SCALE: {
+
+ static const bool key_toggles[7][3]={
+ {true,false,false},
+ {false,true,false},
+ {false,false,true},
+ {true,true,false},
+ {true,false,true},
+ {false,true,true},
+ {true,true,true}
+ };
+ key_pos=key_toggles[p_op-ANIM_INSERT_POS][0];
+ key_rot=key_toggles[p_op-ANIM_INSERT_POS][1];
+ key_scale=key_toggles[p_op-ANIM_INSERT_POS][2];
+
+ for(int i=ANIM_INSERT_POS;i<=ANIM_INSERT_POS_ROT_SCALE;i++) {
+ int idx = animation_menu->get_popup()->get_item_index(i);
+ animation_menu->get_popup()->set_item_checked(idx,i==p_op);
+ }
+
+ } break;*/
+ case ANIM_COPY_POSE: {
+
+ pose_clipboard.clear();
+
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+ if (canvas_item->cast_to<Node2D>()) {
+
+ Node2D *n2d = canvas_item->cast_to<Node2D>();
+ PoseClipboard pc;
+ pc.pos=n2d->get_position();
+ pc.rot=n2d->get_rotation();
+ pc.scale=n2d->get_scale();
+ pc.id=n2d->get_instance_ID();
+ pose_clipboard.push_back(pc);
+ }
+ }
+
+
+ } break;
+ case ANIM_PASTE_POSE: {
+
+ if (!pose_clipboard.size())
+ break;
+
+ undo_redo->create_action(TTR("Paste Pose"));
+ for (List<PoseClipboard>::Element *E=pose_clipboard.front();E;E=E->next()) {
+
+ Object *o = ObjectDB::get_instance(E->get().id);
+ if (!o)
+ continue;
+ Node2D *n2d = o->cast_to<Node2D>();
+ if (!n2d)
+ continue;
+ undo_redo->add_do_method(n2d,"set_pos",E->get().pos);
+ undo_redo->add_do_method(n2d,"set_rot",E->get().rot);
+ undo_redo->add_do_method(n2d,"set_scale",E->get().scale);
+ undo_redo->add_undo_method(n2d,"set_pos",n2d->get_position());
+ undo_redo->add_undo_method(n2d,"set_rot",n2d->get_rotation());
+ undo_redo->add_undo_method(n2d,"set_scale",n2d->get_scale());
+ }
+ undo_redo->commit_action();
+
+ } break;
+ case ANIM_CLEAR_POSE: {
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ if (canvas_item->cast_to<Node2D>()) {
+ Node2D *n2d = canvas_item->cast_to<Node2D>();
+
+ if (key_pos)
+ n2d->set_position(Vector2());
+ if (key_rot)
+ n2d->set_rotation(0);
+ if (key_scale)
+ n2d->set_scale(Vector2(1,1));
+ } else if (canvas_item->cast_to<Control>()) {
+
+ Control *ctrl = canvas_item->cast_to<Control>();
+
+ if (key_pos)
+ ctrl->set_pos(Point2());
+ /*
+ if (key_scale)
+ AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl,"rect/size",ctrl->get_size());
+ */
+ }
+
+ }
+
+
+ } break;
+ case VIEW_CENTER_TO_SELECTION:
+ case VIEW_FRAME_TO_SELECTION: {
+
+ _focus_selection(p_op);
+
+ } break;
+ case SKELETON_MAKE_BONES: {
+
+
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ Node2D *n2d = E->key()->cast_to<Node2D>();
+ if (!n2d)
+ continue;
+ if (!n2d->is_visible_in_tree())
+ continue;
+ if (!n2d->get_parent_item())
+ continue;
+
+ n2d->set_meta("_edit_bone_",true);
+ if (!skeleton_show_bones)
+ skeleton_menu->activate_item(skeleton_menu->get_item_index(SKELETON_SHOW_BONES));
+
+ }
+ viewport->update();
+
+ } break;
+ case SKELETON_CLEAR_BONES: {
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ Node2D *n2d = E->key()->cast_to<Node2D>();
+ if (!n2d)
+ continue;
+ if (!n2d->is_visible_in_tree())
+ continue;
+
+ n2d->set_meta("_edit_bone_",Variant());
+ if (!skeleton_show_bones)
+ skeleton_menu->activate_item(skeleton_menu->get_item_index(SKELETON_SHOW_BONES));
+
+ }
+ viewport->update();
+
+ } break;
+ case SKELETON_SET_IK_CHAIN: {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *canvas_item = E->get()->cast_to<CanvasItem>();
+ if (!canvas_item || !canvas_item->is_visible_in_tree())
+ continue;
+
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+ canvas_item->set_meta("_edit_ik_",true);
+ if (!skeleton_show_bones)
+ skeleton_menu->activate_item(skeleton_menu->get_item_index(SKELETON_SHOW_BONES));
+
+ }
+
+ viewport->update();
+
+ } break;
+ case SKELETON_CLEAR_IK_CHAIN: {
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ CanvasItem *n2d = E->key()->cast_to<CanvasItem>();
+ if (!n2d)
+ continue;
+ if (!n2d->is_visible_in_tree())
+ continue;
+
+ n2d->set_meta("_edit_ik_",Variant());
+ if (!skeleton_show_bones)
+ skeleton_menu->activate_item(skeleton_menu->get_item_index(SKELETON_SHOW_BONES));
+
+ }
+ viewport->update();
+
+ } break;
+
+ }
+}
+#if 0
+template< class P, class C > void CanvasItemEditor::space_selected_items() {
+ P p;
+ if ( canvas_items.size() > 2 ) {
+ Vector< CanvasItem * > items;
+ for ( CanvasItemMap::Element *E = canvas_items.front(); E; E = E->next() ) {
+ CanvasItem *it_curr = E->key();
+ items.push_back( it_curr );
+ }
+ items.sort_custom< C >();
+
+ float width_s = p.get( items[0]->get_item_rect().size );
+ float width_e = p.get( items[ items.size() - 1 ]->get_item_rect().size );
+ float start_x = p.get( items[0]->get_global_transform().elements[2] ) + ( width_s / 2 );
+ float end_x = p.get( items[ items.size() - 1 ]->get_global_transform().elements[2] ) + ( width_e / 2 );
+ float sp = ( end_x - start_x ) / ( items.size() - 1 );
+
+ for ( int i = 0; i < items.size(); i++ ) {
+ CanvasItem *it_curr = items[i];
+ Vector2 v = it_curr->get_global_transform().elements[2];
+ Rect2 r = it_curr->get_item_rect();
+ p.set( r.pos, ( start_x + sp * i ) - ( p.get( v ) + p.get( r.size ) / 2 ) );
+ it_curr->edit_set_rect( r );
+ }
+ viewport->update();
+ }
+}
+#endif
+
+
+void CanvasItemEditor::_focus_selection(int p_op) {
+ Vector2 center(0.f, 0.f);
+ Rect2 rect;
+ int count = 0;
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+ CanvasItem *canvas_item = E->key()->cast_to<CanvasItem>();
+ if (!canvas_item) continue;
+ if (canvas_item->get_viewport()!=EditorNode::get_singleton()->get_scene_root())
+ continue;
+
+
+ // counting invisible items, for now
+ //if (!canvas_item->is_visible_in_tree()) continue;
+ ++count;
+
+ Rect2 item_rect = canvas_item->get_item_rect();
+
+ Vector2 pos = canvas_item->get_global_transform().get_origin();
+ Vector2 scale = canvas_item->get_global_transform().get_scale();
+ real_t angle = canvas_item->get_global_transform().get_rotation();
+
+ Transform2D t(angle, Vector2(0.f,0.f));
+ item_rect = t.xform(item_rect);
+ Rect2 canvas_item_rect(pos + scale*item_rect.pos, scale*item_rect.size);
+ if (count == 1) {
+ rect = canvas_item_rect;
+ } else {
+ rect = rect.merge(canvas_item_rect);
+ }
+ };
+ if (count==0) return;
+
+ if (p_op == VIEW_CENTER_TO_SELECTION) {
+
+ center = rect.pos + rect.size/2;
+ Vector2 offset = viewport->get_size()/2 - editor->get_scene_root()->get_global_canvas_transform().xform(center);
+ h_scroll->set_value(h_scroll->get_value() - offset.x/zoom);
+ v_scroll->set_value(v_scroll->get_value() - offset.y/zoom);
+
+ } else { // VIEW_FRAME_TO_SELECTION
+
+ if (rect.size.x > CMP_EPSILON && rect.size.y > CMP_EPSILON) {
+ float scale_x = viewport->get_size().x/rect.size.x;
+ float scale_y = viewport->get_size().y/rect.size.y;
+ zoom = scale_x < scale_y? scale_x:scale_y;
+ zoom *= 0.90;
+ _update_scroll(0);
+ call_deferred("_popup_callback", VIEW_CENTER_TO_SELECTION);
+ }
+ }
+}
+
+
+void CanvasItemEditor::_bind_methods() {
+
+ ClassDB::bind_method("_node_removed",&CanvasItemEditor::_node_removed);
+ ClassDB::bind_method("_update_scroll",&CanvasItemEditor::_update_scroll);
+ ClassDB::bind_method("_popup_callback",&CanvasItemEditor::_popup_callback);
+ ClassDB::bind_method("_visibility_changed",&CanvasItemEditor::_visibility_changed);
+ ClassDB::bind_method("_dialog_value_changed",&CanvasItemEditor::_dialog_value_changed);
+ ClassDB::bind_method("_get_editor_data",&CanvasItemEditor::_get_editor_data);
+ ClassDB::bind_method("_tool_select",&CanvasItemEditor::_tool_select);
+ ClassDB::bind_method("_keying_changed",&CanvasItemEditor::_keying_changed);
+ ClassDB::bind_method("_unhandled_key_input",&CanvasItemEditor::_unhandled_key_input);
+ ClassDB::bind_method("_viewport_draw",&CanvasItemEditor::_viewport_draw);
+ ClassDB::bind_method("_viewport_gui_input",&CanvasItemEditor::_viewport_gui_input);
+ ClassDB::bind_method("_snap_changed",&CanvasItemEditor::_snap_changed);
+ ClassDB::bind_method(D_METHOD("_selection_result_pressed"),&CanvasItemEditor::_selection_result_pressed);
+ ClassDB::bind_method(D_METHOD("_selection_menu_hide"),&CanvasItemEditor::_selection_menu_hide);
+
+ ADD_SIGNAL( MethodInfo("item_lock_status_changed") );
+ ADD_SIGNAL( MethodInfo("item_group_status_changed") );
+
+}
+
+#if 0
+void CanvasItemEditor::end_drag() {
+ print_line( "end drag" );
+
+ if (undo_redo) {
+
+ undo_redo->create_action("Edit CanvasItem");
+ for(CanvasItemMap::Element *E=canvas_items.front();E;E=E->next()) {
+ CanvasItem *canvas_item = E->key();
+ Variant state=canvas_item->edit_get_state();
+ undo_redo->add_do_method(canvas_item,"edit_set_state",state);
+ undo_redo->add_undo_method(canvas_item,"edit_set_state",E->get().undo_state);
+ }
+ undo_redo->commit_action();
+ }
+
+ drag=DRAG_NONE;
+ viewport->update();
+}
+
+void CanvasItemEditor::box_selection_start( Point2 &click ) {
+ print_line( "box selection start" );
+
+ drag_from=transform.affine_inverse().xform(click);
+
+ box_selecting=true;
+ box_selecting_to=drag_from;
+ viewport->update();
+}
+
+bool CanvasItemEditor::box_selection_end() {
+ print_line( "box selection end" );
+
+ Node* scene = get_scene()->get_root_node()->cast_to<EditorNode>()->get_edited_scene();
+ if (scene) {
+
+ List<CanvasItem*> selitems;
+
+ Point2 bsfrom = transform.xform(drag_from);
+ Point2 bsto= transform.xform(box_selecting_to);
+ if (bsfrom.x>bsto.x)
+ SWAP(bsfrom.x,bsto.x);
+ if (bsfrom.y>bsto.y)
+ SWAP(bsfrom.y,bsto.y);
+
+ if ( bsfrom.distance_to( bsto ) < 3 ) {
+ print_line( "box selection too small" );
+ box_selecting=false;
+ viewport->update();
+ return false;
+ }
+
+ _find_canvas_items_at_rect(Rect2(bsfrom,bsto-bsfrom),scene,transform,&selitems);
+
+ for(List<CanvasItem*>::Element *E=selitems.front();E;E=E->next()) {
+
+ _append_canvas_item(E->get());
+ }
+
+ }
+
+ box_selecting=false;
+ viewport->update();
+
+ return true;
+}
+#endif
+
+void CanvasItemEditor::add_control_to_menu_panel(Control *p_control) {
+
+ hb->add_child(p_control);
+}
+
+HSplitContainer *CanvasItemEditor::get_palette_split() {
+
+ return palette_split;
+}
+
+VSplitContainer *CanvasItemEditor::get_bottom_split() {
+
+ return bottom_split;
+}
+
+
+void CanvasItemEditor::focus_selection() {
+ _focus_selection(VIEW_CENTER_TO_SELECTION);
+}
+
+
+CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
+
+ tool = TOOL_SELECT;
+ undo_redo=p_editor->get_undo_redo();
+ editor=p_editor;
+ editor_selection=p_editor->get_editor_selection();
+ editor_selection->add_editor_plugin(this);
+ editor_selection->connect("selection_changed",this,"update");
+
+
+ hb = memnew( HBoxContainer );
+ add_child( hb );
+ hb->set_area_as_parent_rect();
+
+ bottom_split = memnew( VSplitContainer );
+ bottom_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ add_child(bottom_split);
+
+ palette_split = memnew( HSplitContainer);
+ palette_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ bottom_split->add_child(palette_split);
+
+ Control *vp_base = memnew (Control);
+ vp_base->set_v_size_flags(SIZE_EXPAND_FILL);
+ palette_split->add_child(vp_base);
+
+ ViewportContainer *vp = memnew (ViewportContainer);
+ vp->set_stretch(true);
+ vp_base->add_child(vp);
+ vp->set_area_as_parent_rect();
+ vp->add_child(p_editor->get_scene_root());
+
+
+ viewport = memnew( CanvasItemEditorViewport(p_editor, this) );
+ vp_base->add_child(viewport);
+ viewport->set_area_as_parent_rect();
+ viewport->set_clip_contents(true);
+
+ h_scroll = memnew( HScrollBar );
+ v_scroll = memnew( VScrollBar );
+
+ viewport->add_child(h_scroll);
+ viewport->add_child(v_scroll);
+ viewport->connect("draw",this,"_viewport_draw");
+ viewport->connect("gui_input",this,"_viewport_gui_input");
+
+
+ h_scroll->connect("value_changed", this,"_update_scroll",Vector<Variant>(),Object::CONNECT_DEFERRED);
+ v_scroll->connect("value_changed", this,"_update_scroll",Vector<Variant>(),Object::CONNECT_DEFERRED);
+
+ h_scroll->hide();
+ v_scroll->hide();
+ updating_scroll=false;
+ viewport->set_focus_mode(FOCUS_ALL);
+ handle_len=10;
+ first_update=true;
+
+
+ select_button = memnew( ToolButton );
+ select_button->set_toggle_mode(true);
+ hb->add_child(select_button);
+ select_button->connect("pressed",this,"_tool_select",make_binds(TOOL_SELECT));
+ select_button->set_pressed(true);
+ select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode",TTR("Select Mode"),KEY_Q));
+ select_button->set_tooltip(TTR("Select Mode")+" $sc\n"+keycode_get_string(KEY_MASK_CMD)+TTR("Drag: Rotate")+"\n"+TTR("Alt+Drag: Move")+"\n"+TTR("Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving).")+"\n"+TTR("Alt+RMB: Depth list selection"));
+
+
+ move_button = memnew( ToolButton );
+ move_button->set_toggle_mode(true);
+ hb->add_child(move_button);
+ move_button->connect("pressed",this,"_tool_select",make_binds(TOOL_MOVE));
+ move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode",TTR("Move Mode"),KEY_W));
+ move_button->set_tooltip(TTR("Move Mode"));
+
+ rotate_button = memnew( ToolButton );
+ rotate_button->set_toggle_mode(true);
+ hb->add_child(rotate_button);
+ rotate_button->connect("pressed",this,"_tool_select",make_binds(TOOL_ROTATE));
+ rotate_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/rotate_mode",TTR("Rotate Mode"),KEY_E));
+ rotate_button->set_tooltip(TTR("Rotate Mode"));
+
+ hb->add_child(memnew(VSeparator));
+
+ list_select_button = memnew( ToolButton );
+ list_select_button->set_toggle_mode(true);
+ hb->add_child(list_select_button);
+ list_select_button->connect("pressed",this,"_tool_select",make_binds(TOOL_LIST_SELECT));
+ list_select_button->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
+
+ pivot_button = memnew( ToolButton );
+ pivot_button->set_toggle_mode(true);
+ hb->add_child(pivot_button);
+ pivot_button->connect("pressed",this,"_tool_select",make_binds(TOOL_EDIT_PIVOT));
+ pivot_button->set_tooltip(TTR("Click to change object's rotation pivot."));
+
+ pan_button = memnew( ToolButton );
+ pan_button->set_toggle_mode(true);
+ hb->add_child(pan_button);
+ pan_button->connect("pressed",this,"_tool_select",make_binds(TOOL_PAN));
+ pan_button->set_tooltip(TTR("Pan Mode"));
+
+ hb->add_child(memnew(VSeparator));
+
+ lock_button = memnew( ToolButton );
+ hb->add_child(lock_button);
+
+ lock_button->connect("pressed",this,"_popup_callback",varray(LOCK_SELECTED));
+ lock_button->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
+
+ unlock_button = memnew( ToolButton );
+ hb->add_child(unlock_button);
+ unlock_button->connect("pressed",this,"_popup_callback",varray(UNLOCK_SELECTED));
+ unlock_button->set_tooltip(TTR("Unlock the selected object (can be moved)."));
+
+ group_button = memnew( ToolButton );
+ hb->add_child(group_button);
+ group_button->connect("pressed",this,"_popup_callback",varray(GROUP_SELECTED));
+ group_button->set_tooltip(TTR("Makes sure the object's children are not selectable."));
+
+ ungroup_button = memnew( ToolButton );
+ hb->add_child(ungroup_button);
+ ungroup_button->connect("pressed",this,"_popup_callback",varray(UNGROUP_SELECTED));
+ ungroup_button->set_tooltip(TTR("Restores the object's children's ability to be selected."));
+
+ hb->add_child(memnew(VSeparator));
+
+ edit_menu = memnew( MenuButton );
+ edit_menu->set_text(TTR("Edit"));
+ hb->add_child(edit_menu);
+ edit_menu->get_popup()->connect("id_pressed", this,"_popup_callback");
+
+ PopupMenu *p;
+ p = edit_menu->get_popup();
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_snap", TTR("Use Snap")), SNAP_USE);
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Show Grid")), SNAP_SHOW_GRID);
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_rotation_snap", TTR("Use Rotation Snap")), SNAP_USE_ROTATION);
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_relative", TTR("Snap Relative")), SNAP_RELATIVE);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/configure_snap", TTR("Configure Snap..")), SNAP_CONFIGURE);
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_pixel_snap", TTR("Use Pixel Snap")), SNAP_USE_PIXEL);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/expand_to_parent", TTR("Expand to Parent"), KEY_MASK_CMD | KEY_P), EXPAND_TO_PARENT);
+ p->add_separator();
+ p->add_submenu_item(TTR("Skeleton.."),"skeleton");
+ skeleton_menu = memnew(PopupMenu);
+ p->add_child(skeleton_menu);
+ skeleton_menu->set_name("skeleton");
+ skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bones"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B ),SKELETON_MAKE_BONES);
+ skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_clear_bones", TTR("Clear Bones")), SKELETON_CLEAR_BONES);
+ skeleton_menu->add_separator();
+ skeleton_menu->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_show_bones", TTR("Show Bones")), SKELETON_SHOW_BONES);
+ skeleton_menu->add_separator();
+ skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_set_ik_chain", TTR("Make IK Chain")), SKELETON_SET_IK_CHAIN);
+ skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_clear_ik_chain", TTR("Clear IK Chain")), SKELETON_CLEAR_IK_CHAIN);
+ skeleton_menu->connect("id_pressed", this,"_popup_callback");
+
+
+ /*
+ p->add_item("Align Horizontal",ALIGN_HORIZONTAL);
+ p->add_item("Align Vertical",ALIGN_VERTICAL);
+ p->add_item("Space Horizontal",SPACE_HORIZONTAL);
+ p->add_item("Space Vertical",SPACE_VERTICAL);*/
+
+ view_menu = memnew( MenuButton );
+ view_menu->set_text(TTR("View"));
+ hb->add_child(view_menu);
+ view_menu->get_popup()->connect("id_pressed", this,"_popup_callback");
+
+ p = view_menu->get_popup();
+
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_in", TTR("Zoom In")), ZOOM_IN);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_out", TTR("Zoom Out")), ZOOM_OUT);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset")), ZOOM_RESET);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_set", TTR("Zoom Set..")), ZOOM_SET);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/center_selection", TTR("Center Selection"), KEY_F), VIEW_CENTER_TO_SELECTION);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/frame_selection", TTR("Frame Selection"), KEY_MASK_SHIFT | KEY_F), VIEW_FRAME_TO_SELECTION);
+
+ anchor_menu = memnew( MenuButton );
+ anchor_menu->set_text(TTR("Anchor"));
+ hb->add_child(anchor_menu);
+ anchor_menu->get_popup()->connect("id_pressed", this,"_popup_callback");
+ anchor_menu->hide();
+
+ //p = anchor_menu->get_popup();
+
+
+
+ animation_hb = memnew( HBoxContainer );
+ hb->add_child(animation_hb);
+ animation_hb->add_child( memnew( VSeparator ));
+ animation_hb->hide();
+
+ key_loc_button = memnew( Button("loc"));
+ key_loc_button->set_toggle_mode(true);
+ key_loc_button->set_pressed(true);
+ key_loc_button->set_focus_mode(FOCUS_NONE);
+ key_loc_button->add_color_override("font_color",Color(1,0.6,0.6));
+ key_loc_button->add_color_override("font_color_pressed",Color(0.6,1,0.6));
+ key_loc_button->connect("pressed",this,"_popup_callback",varray(ANIM_INSERT_POS));
+ animation_hb->add_child(key_loc_button);
+ key_rot_button = memnew( Button("rot"));
+ key_rot_button->set_toggle_mode(true);
+ key_rot_button->set_pressed(true);
+ key_rot_button->set_focus_mode(FOCUS_NONE);
+ key_rot_button->add_color_override("font_color",Color(1,0.6,0.6));
+ key_rot_button->add_color_override("font_color_pressed",Color(0.6,1,0.6));
+ key_rot_button->connect("pressed",this,"_popup_callback",varray(ANIM_INSERT_ROT));
+ animation_hb->add_child(key_rot_button);
+ key_scale_button = memnew( Button("scl"));
+ key_scale_button->set_toggle_mode(true);
+ key_scale_button->set_focus_mode(FOCUS_NONE);
+ key_scale_button->add_color_override("font_color",Color(1,0.6,0.6));
+ key_scale_button->add_color_override("font_color_pressed",Color(0.6,1,0.6));
+ key_scale_button->connect("pressed",this,"_popup_callback",varray(ANIM_INSERT_SCALE));
+ animation_hb->add_child(key_scale_button);
+ key_insert_button = memnew( Button );
+ key_insert_button->set_focus_mode(FOCUS_NONE);
+ key_insert_button->connect("pressed",this,"_popup_callback",varray(ANIM_INSERT_KEY));
+ key_insert_button->set_tooltip(TTR("Insert Keys"));
+ key_insert_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key", TTR("Insert Key"), KEY_INSERT));
+
+ animation_hb->add_child(key_insert_button);
+
+ animation_menu = memnew( MenuButton );
+ animation_menu->set_text(TTR("Animation"));
+ animation_hb->add_child(animation_menu);
+ animation_menu->get_popup()->connect("id_pressed", this,"_popup_callback");
+
+ p = animation_menu->get_popup();
+
+ p->add_shortcut(ED_GET_SHORTCUT("canvas_item_editor/anim_insert_key"), ANIM_INSERT_KEY);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key_existing_tracks", TTR("Insert Key (Existing Tracks)"), KEY_MASK_CMD+KEY_INSERT), ANIM_INSERT_KEY_EXISTING);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_copy_pose", TTR("Copy Pose")), ANIM_COPY_POSE);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_paste_pose", TTR("Paste Pose")), ANIM_PASTE_POSE);
+ p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_clear_pose", TTR("Clear Pose"), KEY_MASK_SHIFT | KEY_K), ANIM_CLEAR_POSE);
+
+ snap_dialog = memnew( SnapDialog );
+ snap_dialog->connect("confirmed",this,"_snap_changed");
+ add_child(snap_dialog);
+
+ value_dialog = memnew( AcceptDialog );
+ value_dialog->set_title(TTR("Set a Value"));
+ value_dialog->get_ok()->set_text(TTR("Close"));
+ add_child(value_dialog);
+
+ Label *l = memnew(Label);
+ l->set_text(TTR("Snap (Pixels):"));
+ l->set_pos(Point2(5,5));
+ value_dialog->add_child(l);
+ dialog_label=l;
+
+ dialog_val=memnew(SpinBox);
+ dialog_val->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ dialog_val->set_begin(Point2(15,25));
+ dialog_val->set_end(Point2(10,25));
+ value_dialog->add_child(dialog_val);
+ dialog_val->connect("value_changed",this,"_dialog_value_changed");
+ select_sb = Ref<StyleBoxTexture>( memnew( StyleBoxTexture) );
+
+ selection_menu = memnew( PopupMenu );
+ add_child(selection_menu);
+ selection_menu->set_custom_minimum_size(Vector2(100, 0));
+ selection_menu->connect("id_pressed", this, "_selection_result_pressed");
+ selection_menu->connect("popup_hide", this, "_selection_menu_hide");
+
+ key_pos=true;
+ key_rot=true;
+ key_scale=false;
+
+ zoom=1;
+ snap_offset=Vector2(0, 0);
+ snap_step=Vector2(10, 10);
+ snap_rotation_offset=0;
+ snap_rotation_step=15 / (180 / Math_PI);
+ snap_grid=false;
+ snap_show_grid=false;
+ snap_rotation=false;
+ snap_pixel=false;
+ skeleton_show_bones=true;
+ skeleton_menu->set_item_checked(skeleton_menu->get_item_index(SKELETON_SHOW_BONES),true);
+ updating_value_dialog=false;
+ box_selecting=false;
+ //zoom=0.5;
+ singleton=this;
+
+ set_process_unhandled_key_input(true);
+ can_move_pivot=false;
+ drag=DRAG_NONE;
+ bone_last_frame=0;
+ additive_selection=false;
+}
+
+CanvasItemEditor *CanvasItemEditor::singleton=NULL;
+
+void CanvasItemEditorPlugin::edit(Object *p_object) {
+
+ canvas_item_editor->set_undo_redo(&get_undo_redo());
+ canvas_item_editor->edit(p_object->cast_to<CanvasItem>());
+}
+
+bool CanvasItemEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("CanvasItem");
+}
+
+void CanvasItemEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ canvas_item_editor->show();
+ canvas_item_editor->set_fixed_process(true);
+ VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(),false);
+ canvas_item_editor->viewport->grab_focus();
+
+ } else {
+
+ canvas_item_editor->hide();
+ canvas_item_editor->set_fixed_process(false);
+ VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(),true);
+ }
+
+}
+
+Dictionary CanvasItemEditorPlugin::get_state() const {
+
+ return canvas_item_editor->get_state();
+}
+void CanvasItemEditorPlugin::set_state(const Dictionary& p_state) {
+
+ canvas_item_editor->set_state(p_state);
+}
+
+CanvasItemEditorPlugin::CanvasItemEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ canvas_item_editor = memnew( CanvasItemEditor(editor) );
+ canvas_item_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor->get_viewport()->add_child(canvas_item_editor);
+ canvas_item_editor->set_area_as_parent_rect();
+ canvas_item_editor->hide();
+
+}
+
+
+CanvasItemEditorPlugin::~CanvasItemEditorPlugin()
+{
+}
+
+
+void CanvasItemEditorViewport::_on_mouse_exit() {
+ if (!selector->is_visible()){
+ _remove_preview();
+ }
+}
+
+void CanvasItemEditorViewport::_on_select_type(Object* selected) {
+ CheckBox* check = selected->cast_to<CheckBox>();
+ String type = check->get_text();
+ selector_label->set_text(vformat(TTR("Add %s"),type));
+ label->set_text(vformat(TTR("Adding %s..."),type));
+}
+
+void CanvasItemEditorViewport::_on_change_type() {
+ if (!button_group->get_pressed_button())
+ return;
+
+ CheckBox* check=button_group->get_pressed_button()->cast_to<CheckBox>();
+ default_type=check->get_text();
+ _perform_drop_data();
+ selector->hide();
+}
+
+void CanvasItemEditorViewport::_create_preview(const Vector<String>& files) const {
+ label->set_pos(get_global_pos()+Point2(14,14));
+ label_desc->set_pos(label->get_pos()+Point2(0,label->get_size().height));
+ for (int i=0;i<files.size();i++) {
+ String path=files[i];
+ RES res=ResourceLoader::load(path);
+ String type=res->get_class();
+ if (type=="ImageTexture" || type=="PackedScene") {
+ if (type=="ImageTexture") {
+ Ref<ImageTexture> texture=Ref<ImageTexture> ( ResourceCache::get(path)->cast_to<ImageTexture>() );
+ Sprite* sprite=memnew(Sprite);
+ sprite->set_texture(texture);
+ sprite->set_modulate(Color(1,1,1,0.7f));
+ preview->add_child(sprite);
+ label->show();
+ label_desc->show();
+ } else if (type=="PackedScene") {
+ Ref<PackedScene> scn=ResourceLoader::load(path);
+ if (scn.is_valid()){
+ Node* instance=scn->instance();
+ if (instance){
+ preview->add_child(instance);
+ }
+ }
+ }
+ editor->get_scene_root()->add_child(preview);
+ }
+ }
+}
+
+void CanvasItemEditorViewport::_remove_preview() {
+ if (preview->get_parent()){
+ editor->get_scene_root()->remove_child(preview);
+ for (int i=preview->get_child_count()-1;i>=0;i--){
+ Node* node=preview->get_child(i);
+ memdelete(node);
+ }
+ label->hide();
+ label_desc->hide();
+ }
+}
+
+bool CanvasItemEditorViewport::_cyclical_dependency_exists(const String& p_target_scene_path, Node* p_desired_node) {
+ if (p_desired_node->get_filename()==p_target_scene_path) {
+ return true;
+ }
+
+ int childCount=p_desired_node->get_child_count();
+ for (int i=0;i<childCount;i++) {
+ Node* child=p_desired_node->get_child(i);
+ if(_cyclical_dependency_exists(p_target_scene_path,child)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void CanvasItemEditorViewport::_create_nodes(Node* parent, Node* child, String& path, const Point2& p_point) {
+ child->set_name(path.get_file().get_basename());
+ Ref<ImageTexture> texture=Ref<ImageTexture> ( ResourceCache::get(path)->cast_to<ImageTexture>() );
+ Size2 texture_size = texture->get_size();
+
+ editor_data->get_undo_redo().add_do_method(parent,"add_child",child);
+ editor_data->get_undo_redo().add_do_method(child,"set_owner",editor->get_edited_scene());
+ editor_data->get_undo_redo().add_do_reference(child);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",child);
+
+ String new_name=parent->validate_child_name(child);
+ ScriptEditorDebugger *sed=ScriptEditor::get_singleton()->get_debugger();
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_create_node",editor->get_edited_scene()->get_path_to(parent),child->get_class(),new_name);
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(editor->get_edited_scene()->get_path_to(parent))+"/"+new_name));
+
+ // handle with different property for texture
+ String property = "texture";
+ List<PropertyInfo> props;
+ child->get_property_list(&props);
+ for(const List<PropertyInfo>::Element *E=props.front();E;E=E->next() ) {
+ if (E->get().name=="config/texture") { // Particles2D
+ property="config/texture";
+ break;
+ } else if (E->get().name=="texture/texture") { // Polygon2D
+ property="texture/texture";
+ break;
+ } else if (E->get().name=="normal") { // TouchScreenButton
+ property="normal";
+ break;
+ }
+ }
+ editor_data->get_undo_redo().add_do_property(child,property,texture);
+
+ // make visible for certain node type
+ if (default_type=="Patch9Rect") {
+ editor_data->get_undo_redo().add_do_property(child,"rect/size",texture_size);
+ } else if (default_type=="Polygon2D") {
+ PoolVector<Vector2> list;
+ list.push_back(Vector2(0,0));
+ list.push_back(Vector2(texture_size.width,0));
+ list.push_back(Vector2(texture_size.width,texture_size.height));
+ list.push_back(Vector2(0,texture_size.height));
+ editor_data->get_undo_redo().add_do_property(child,"polygon",list);
+ }
+
+ // locate at preview position
+ Point2 pos;
+ if (parent->has_method("get_global_pos")) {
+ pos=parent->call("get_global_pos");
+ }
+ Transform2D trans=canvas->get_canvas_transform();
+ Point2 target_pos = (p_point-trans.get_origin())/trans.get_scale().x-pos;
+ if (default_type=="Polygon2D" || default_type=="TouchScreenButton" || default_type=="TextureRect" || default_type=="Patch9Rect") {
+ target_pos -= texture_size/2;
+ }
+ editor_data->get_undo_redo().add_do_method(child,"set_pos",target_pos);
+}
+
+bool CanvasItemEditorViewport::_create_instance(Node* parent, String& path, const Point2& p_point) {
+ Ref<PackedScene> sdata=ResourceLoader::load(path);
+ if (!sdata.is_valid()) { // invalid scene
+ return false;
+ }
+
+ Node* instanced_scene=sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ if (!instanced_scene) { // error on instancing
+ return false;
+ }
+
+ if (editor->get_edited_scene()->get_filename()!="") { // cyclical instancing
+ if (_cyclical_dependency_exists(editor->get_edited_scene()->get_filename(), instanced_scene)) {
+ memdelete(instanced_scene);
+ return false;
+ }
+ }
+
+ instanced_scene->set_filename( GlobalConfig::get_singleton()->localize_path(path) );
+
+ editor_data->get_undo_redo().add_do_method(parent,"add_child",instanced_scene);
+ editor_data->get_undo_redo().add_do_method(instanced_scene,"set_owner",editor->get_edited_scene());
+ editor_data->get_undo_redo().add_do_reference(instanced_scene);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",instanced_scene);
+
+ String new_name=parent->validate_child_name(instanced_scene);
+ ScriptEditorDebugger *sed=ScriptEditor::get_singleton()->get_debugger();
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_instance_node",editor->get_edited_scene()->get_path_to(parent),path,new_name);
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(editor->get_edited_scene()->get_path_to(parent))+"/"+new_name));
+
+ Point2 pos;
+ Node2D* parent_node2d=parent->cast_to<Node2D>();
+ if (parent_node2d) {
+ pos=parent_node2d->get_global_position();
+ } else {
+ Control* parent_control=parent->cast_to<Control>();
+ if (parent_control) {
+ pos=parent_control->get_global_pos();
+ }
+ }
+ Transform2D trans=canvas->get_canvas_transform();
+ editor_data->get_undo_redo().add_do_method(instanced_scene,"set_pos",(p_point-trans.get_origin())/trans.get_scale().x-pos);
+
+ return true;
+}
+
+void CanvasItemEditorViewport::_perform_drop_data(){
+ _remove_preview();
+
+ Vector<String> error_files;
+
+ editor_data->get_undo_redo().create_action(TTR("Create Node"));
+
+ for (int i=0;i<selected_files.size();i++) {
+ String path=selected_files[i];
+ RES res=ResourceLoader::load(path);
+ if (res.is_null()) {
+ continue;
+ }
+ String type=res->get_class();
+ if (type=="ImageTexture") {
+ Node* child;
+ if (default_type=="Light2D") child=memnew(Light2D);
+ else if (default_type=="Particles2D") child=memnew(Particles2D);
+ else if (default_type=="Polygon2D") child=memnew(Polygon2D);
+ else if (default_type=="TouchScreenButton") child=memnew(TouchScreenButton);
+ else if (default_type=="TextureRect") child=memnew(TextureRect);
+ else if (default_type=="Patch9Rect") child=memnew(NinePatchRect);
+ else child=memnew(Sprite); // default
+
+ _create_nodes(target_node, child, path, drop_pos);
+ } else if (type=="PackedScene") {
+ bool success=_create_instance(target_node, path, drop_pos);
+ if (!success) {
+ error_files.push_back(path);
+ }
+ }
+ }
+
+ editor_data->get_undo_redo().commit_action();
+
+ if (error_files.size()>0) {
+ String files_str;
+ for (int i=0;i<error_files.size();i++) {
+ files_str += error_files[i].get_file().get_basename() + ",";
+ }
+ files_str=files_str.substr(0,files_str.length()-1);
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(vformat(TTR("Error instancing scene from %s"),files_str.c_str()));
+ accept->popup_centered_minsize();
+ }
+}
+
+bool CanvasItemEditorViewport::can_drop_data(const Point2& p_point,const Variant& p_data) const {
+ Dictionary d=p_data;
+ if (d.has("type")) {
+ if (String(d["type"])=="files") {
+ Vector<String> files=d["files"];
+ bool can_instance=false;
+ for (int i=0;i<files.size();i++) { // check if dragged files contain resource or scene can be created at least one
+ RES res=ResourceLoader::load(files[i]);
+ if (res.is_null()) {
+ continue;
+ }
+ String type=res->get_class();
+ if (type=="PackedScene") {
+ Ref<PackedScene> sdata=ResourceLoader::load(files[i]);
+ Node* instanced_scene=sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ if (!instanced_scene) {
+ continue;
+ }
+ memdelete(instanced_scene);
+ }
+ can_instance=true;
+ break;
+ }
+ if (can_instance) {
+ if (!preview->get_parent()){ // create preview only once
+ _create_preview(files);
+ }
+ Transform2D trans=canvas->get_canvas_transform();
+ preview->set_position((p_point-trans.get_origin())/trans.get_scale().x);
+ label->set_text(vformat(TTR("Adding %s..."),default_type));
+ }
+ return can_instance;
+ }
+ }
+ label->hide();
+ return false;
+}
+
+void CanvasItemEditorViewport::drop_data(const Point2& p_point,const Variant& p_data) {
+ bool is_shift=Input::get_singleton()->is_key_pressed(KEY_SHIFT);
+ bool is_alt=Input::get_singleton()->is_key_pressed(KEY_ALT);
+
+ selected_files.clear();
+ Dictionary d=p_data;
+ if (d.has("type") && String(d["type"])=="files"){
+ selected_files=d["files"];
+ }
+
+ List<Node*> list=editor->get_editor_selection()->get_selected_node_list();
+ if (list.size()==0) {
+ accept->get_ok()->set_text(TTR("OK :("));
+ accept->set_text(TTR("No parent to instance a child at."));
+ accept->popup_centered_minsize();
+ _remove_preview();
+ return;
+ }
+ if (list.size()!=1) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation requires a single selected node."));
+ accept->popup_centered_minsize();
+ _remove_preview();
+ return;
+ }
+
+ target_node=list[0];
+ if (is_shift && target_node!=editor->get_edited_scene()) {
+ target_node=target_node->get_parent();
+ }
+ drop_pos=p_point;
+
+ if (is_alt) {
+ List<BaseButton*> btn_list;
+ button_group->get_buttons(&btn_list);
+
+ for (int i=0;i<btn_list.size();i++) {
+ CheckBox* check=btn_list[i]->cast_to<CheckBox>();
+ check->set_pressed(check->get_text()==default_type);
+ }
+ selector_label->set_text(vformat(TTR("Add %s"),default_type));
+ selector->popup_centered_minsize();
+ } else {
+ _perform_drop_data();
+ }
+}
+
+void CanvasItemEditorViewport::_notification(int p_what) {
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ connect("mouse_exited",this,"_on_mouse_exit");
+ } else if (p_what==NOTIFICATION_EXIT_TREE) {
+ disconnect("mouse_exited",this,"_on_mouse_exit");
+ }
+}
+
+void CanvasItemEditorViewport::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_on_select_type"),&CanvasItemEditorViewport::_on_select_type);
+ ClassDB::bind_method(D_METHOD("_on_change_type"),&CanvasItemEditorViewport::_on_change_type);
+ ClassDB::bind_method(D_METHOD("_on_mouse_exit"),&CanvasItemEditorViewport::_on_mouse_exit);
+}
+
+CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor* p_canvas) {
+ default_type="Sprite";
+ // Node2D
+ types.push_back("Sprite");
+ types.push_back("Light2D");
+ types.push_back("Particles2D");
+ types.push_back("Polygon2D");
+ types.push_back("TouchScreenButton");
+ // Control
+ types.push_back("TextureRect");
+ types.push_back("Patch9Rect");
+
+ target_node=NULL;
+ editor=p_node;
+ editor_data=editor->get_scene_tree_dock()->get_editor_data();
+ canvas=p_canvas;
+ preview=memnew( Node2D );
+ accept=memnew( AcceptDialog );
+ editor->get_gui_base()->add_child(accept);
+
+ selector=memnew( WindowDialog );
+ selector->set_title(TTR("Change default type"));
+
+ VBoxContainer* vbc=memnew(VBoxContainer);
+ vbc->add_constant_override("separation",10*EDSCALE);
+ vbc->set_custom_minimum_size(Size2(200,260)*EDSCALE);
+
+ selector_label=memnew(Label);
+ selector_label->set_align(Label::ALIGN_CENTER);
+ selector_label->set_valign(Label::VALIGN_BOTTOM);
+ selector_label->set_custom_minimum_size(Size2(0,30)*EDSCALE);
+ vbc->add_child(selector_label);
+
+ button_group.instance();
+
+ btn_group=memnew( VBoxContainer );
+ btn_group->set_h_size_flags(0);
+ btn_group->connect("button_selected", this, "_on_select_type");
+
+ for (int i=0;i<types.size();i++) {
+ CheckBox* check=memnew(CheckBox);
+ check->set_text(types[i]);
+ btn_group->add_child(check);
+ check->set_button_group(button_group);
+ }
+ vbc->add_child(btn_group);
+
+ Button* ok=memnew(Button);
+ ok->set_text(TTR("OK"));
+ ok->set_h_size_flags(0);
+ vbc->add_child(ok);
+ ok->connect("pressed", this, "_on_change_type");
+
+ selector->add_child(vbc);
+ editor->get_gui_base()->add_child(selector);
+
+ label=memnew(Label);
+ label->add_color_override("font_color", Color(1,1,0,1));
+ label->add_color_override("font_color_shadow", Color(0,0,0,1));
+ label->add_constant_override("shadow_as_outline", 1*EDSCALE);
+ label->hide();
+ editor->get_gui_base()->add_child(label);
+
+ label_desc=memnew(Label);
+ label_desc->set_text(TTR("Drag & drop + Shift : Add node as sibling\nDrag & drop + Alt : Change node type"));
+ label_desc->add_color_override("font_color", Color(0.6,0.6,0.6,1));
+ label_desc->add_color_override("font_color_shadow", Color(0.2,0.2,0.2,1));
+ label_desc->add_constant_override("shadow_as_outline", 1*EDSCALE);
+ label_desc->add_constant_override("line_spacing", 0);
+ label_desc->hide();
+ editor->get_gui_base()->add_child(label_desc);
+}
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
new file mode 100644
index 0000000000..0c2dcdff3d
--- /dev/null
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -0,0 +1,503 @@
+/*************************************************************************/
+/* canvas_item_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CONTROL_EDITOR_PLUGIN_H
+#define CONTROL_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/gui/button_group.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/label.h"
+#include "scene/gui/spin_box.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/box_container.h"
+#include "scene/2d/canvas_item.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class CanvasItemEditorViewport;
+
+class CanvasItemEditorSelectedItem : public Object {
+
+ GDCLASS(CanvasItemEditorSelectedItem,Object);
+public:
+ Variant undo_state;
+ Vector2 undo_pivot;
+
+ Transform2D prev_xform;
+ float prev_rot;
+ Rect2 prev_rect;
+
+ CanvasItemEditorSelectedItem() { prev_rot=0; }
+};
+
+class CanvasItemEditor : public VBoxContainer {
+
+ GDCLASS(CanvasItemEditor, VBoxContainer );
+
+ EditorNode *editor;
+
+
+ enum Tool {
+
+ TOOL_SELECT,
+ TOOL_LIST_SELECT,
+ TOOL_MOVE,
+ TOOL_ROTATE,
+ TOOL_EDIT_PIVOT,
+ TOOL_PAN,
+ TOOL_MAX
+ };
+
+ enum MenuOption {
+ SNAP_USE,
+ SNAP_SHOW_GRID,
+ SNAP_USE_ROTATION,
+ SNAP_RELATIVE,
+ SNAP_CONFIGURE,
+ SNAP_USE_PIXEL,
+ ZOOM_IN,
+ ZOOM_OUT,
+ ZOOM_RESET,
+ ZOOM_SET,
+ LOCK_SELECTED,
+ UNLOCK_SELECTED,
+ GROUP_SELECTED,
+ UNGROUP_SELECTED,
+ ALIGN_HORIZONTAL,
+ ALIGN_VERTICAL,
+ ANCHOR_ALIGN_TOP_LEFT,
+ ANCHOR_ALIGN_TOP_RIGHT,
+ ANCHOR_ALIGN_BOTTOM_LEFT,
+ ANCHOR_ALIGN_BOTTOM_RIGHT,
+ ANCHOR_ALIGN_CENTER_LEFT,
+ ANCHOR_ALIGN_CENTER_RIGHT,
+ ANCHOR_ALIGN_CENTER_TOP,
+ ANCHOR_ALIGN_CENTER_BOTTOM,
+ ANCHOR_ALIGN_CENTER,
+ ANCHOR_ALIGN_TOP_WIDE,
+ ANCHOR_ALIGN_LEFT_WIDE,
+ ANCHOR_ALIGN_RIGHT_WIDE,
+ ANCHOR_ALIGN_BOTTOM_WIDE,
+ ANCHOR_ALIGN_VCENTER_WIDE,
+ ANCHOR_ALIGN_HCENTER_WIDE,
+ ANCHOR_ALIGN_WIDE,
+
+ SPACE_HORIZONTAL,
+ SPACE_VERTICAL,
+ EXPAND_TO_PARENT,
+ ANIM_INSERT_KEY,
+ ANIM_INSERT_KEY_EXISTING,
+ ANIM_INSERT_POS,
+ ANIM_INSERT_ROT,
+ ANIM_INSERT_SCALE,
+ ANIM_COPY_POSE,
+ ANIM_PASTE_POSE,
+ ANIM_CLEAR_POSE,
+ VIEW_CENTER_TO_SELECTION,
+ VIEW_FRAME_TO_SELECTION,
+ SKELETON_MAKE_BONES,
+ SKELETON_CLEAR_BONES,
+ SKELETON_SHOW_BONES,
+ SKELETON_SET_IK_CHAIN,
+ SKELETON_CLEAR_IK_CHAIN
+
+ };
+
+ enum DragType {
+ DRAG_NONE,
+ DRAG_LEFT,
+ DRAG_TOP_LEFT,
+ DRAG_TOP,
+ DRAG_TOP_RIGHT,
+ DRAG_RIGHT,
+ DRAG_BOTTOM_RIGHT,
+ DRAG_BOTTOM,
+ DRAG_BOTTOM_LEFT,
+ DRAG_ALL,
+ DRAG_ROTATE,
+ DRAG_PIVOT,
+
+ };
+
+ enum KeyMoveMODE {
+ MOVE_VIEW_BASE,
+ MOVE_LOCAL_BASE,
+ MOVE_LOCAL_WITH_ROT
+ };
+
+ EditorSelection *editor_selection;
+ bool additive_selection;
+
+ Tool tool;
+ bool first_update;
+ Control *viewport;
+
+ bool can_move_pivot;
+
+ HScrollBar *h_scroll;
+ VScrollBar *v_scroll;
+ HBoxContainer *hb;
+
+ Transform2D transform;
+ float zoom;
+ Vector2 snap_offset;
+ Vector2 snap_step;
+ float snap_rotation_step;
+ float snap_rotation_offset;
+ bool snap_grid;
+ bool snap_show_grid;
+ bool snap_rotation;
+ bool snap_relative;
+ bool snap_pixel;
+ bool skeleton_show_bones;
+ bool box_selecting;
+ Point2 box_selecting_to;
+ bool key_pos;
+ bool key_rot;
+ bool key_scale;
+
+ void _tool_select(int p_index);
+
+
+ MenuOption last_option;
+
+ struct _SelectResult {
+
+ CanvasItem* item;
+ float z;
+ bool has_z;
+ _FORCE_INLINE_ bool operator<(const _SelectResult& p_rr) const {
+ return has_z && p_rr.has_z ? p_rr.z < z : p_rr.has_z;
+ }
+ };
+
+ Vector<_SelectResult> selection_results;
+
+ struct LockList {
+ Point2 pos;
+ bool lock;
+ bool group;
+ LockList() { lock=false; group=false; }
+ };
+
+ List<LockList> lock_list;
+
+ struct BoneList {
+
+ Transform2D xform;
+ Vector2 from;
+ Vector2 to;
+ ObjectID bone;
+ uint64_t last_pass;
+ };
+
+ uint64_t bone_last_frame;
+ Map<ObjectID,BoneList> bone_list;
+
+ Transform2D bone_orig_xform;
+
+ struct BoneIK {
+
+ Variant orig_state;
+ Vector2 pos;
+ float len;
+ Node2D *node;
+ };
+
+ List<BoneIK> bone_ik_list;
+
+ struct PoseClipboard {
+
+ Vector2 pos;
+ Vector2 scale;
+ float rot;
+ ObjectID id;
+ };
+
+ List<PoseClipboard> pose_clipboard;
+
+ ToolButton *select_button;
+ ToolButton *list_select_button;
+ ToolButton *move_button;
+ ToolButton *rotate_button;
+
+ ToolButton *pivot_button;
+ ToolButton *pan_button;
+
+ ToolButton *lock_button;
+ ToolButton *unlock_button;
+
+ ToolButton *group_button;
+ ToolButton *ungroup_button;
+
+ MenuButton *edit_menu;
+ PopupMenu *skeleton_menu;
+ MenuButton *view_menu;
+ HBoxContainer *animation_hb;
+ MenuButton *animation_menu;
+ MenuButton *anchor_menu;
+
+ Button *key_loc_button;
+ Button *key_rot_button;
+ Button *key_scale_button;
+ Button *key_insert_button;
+
+ PopupMenu *selection_menu;
+
+
+ //PopupMenu *popup;
+ DragType drag;
+ Point2 drag_from;
+ Point2 drag_point_from;
+ bool updating_value_dialog;
+ Point2 display_rotate_from;
+ Point2 display_rotate_to;
+#if 0
+ struct EditInfo {
+
+ Variant undo_state;
+
+ Matrix32 prev_xform;
+ float prev_rot;
+ Rect2 prev_rect;
+ EditInfo() { prev_rot=0; }
+ };
+
+ typedef Map<CanvasItem*,EditInfo> CanvasItemMap;
+ CanvasItemMap canvas_items;
+#endif
+ Ref<StyleBoxTexture> select_sb;
+ Ref<Texture> select_handle;
+
+
+ int handle_len;
+ bool _is_part_of_subscene(CanvasItem *p_item);
+ CanvasItem* _select_canvas_item_at_pos(const Point2 &p_pos,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform);
+ void _find_canvas_items_at_pos(const Point2 &p_pos,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform, Vector<_SelectResult> &r_items);
+ void _find_canvas_items_at_rect(const Rect2& p_rect,Node* p_node,const Transform2D& p_parent_xform,const Transform2D& p_canvas_xform,List<CanvasItem*> *r_items);
+
+ bool _select(CanvasItem *item, Point2 p_click_pos, bool p_append, bool p_drag=true);
+
+ ConfirmationDialog *snap_dialog;
+
+ AcceptDialog *value_dialog;
+ Label *dialog_label;
+ SpinBox *dialog_val;
+
+ CanvasItem *ref_item;
+
+ void _edit_set_pivot(const Vector2& mouse_pos);
+ void _add_canvas_item(CanvasItem *p_canvas_item);
+ void _remove_canvas_item(CanvasItem *p_canvas_item);
+ void _clear_canvas_items();
+ void _visibility_changed(ObjectID p_canvas_item);
+ void _key_move(const Vector2& p_dir, bool p_snap, KeyMoveMODE p_move_mode);
+ void _list_select(const InputEventMouseButton& b);
+
+ DragType _find_drag_type(const Transform2D& p_xform, const Rect2& p_local_rect, const Point2& p_click, Vector2& r_point);
+
+ void _popup_callback(int p_op);
+ bool updating_scroll;
+ void _update_scroll(float);
+ void _update_scrollbars();
+ void incbeg(float& beg,float& end, float inc, float minsize,bool p_symmetric);
+ void incend(float& beg,float& end, float inc, float minsize,bool p_symmetric);
+
+ void _append_canvas_item(CanvasItem *p_item);
+ void _dialog_value_changed(double);
+ void _snap_changed();
+ void _selection_result_pressed(int);
+ void _selection_menu_hide();
+
+ UndoRedo *undo_redo;
+
+ Point2 _find_topleftmost_point();
+
+
+ void _find_canvas_items_span(Node *p_node, Rect2& r_rect, const Transform2D& p_xform);
+
+
+ Object *_get_editor_data(Object *p_what);
+
+ CanvasItem *get_single_item();
+ int get_item_count();
+ void _keying_changed();
+
+ void _unhandled_key_input(const InputEvent& p_ev);
+
+ void _viewport_gui_input(const InputEvent& p_event);
+ void _viewport_draw();
+
+ void _focus_selection(int p_op);
+
+ void _set_anchor(Control::AnchorType p_left,Control::AnchorType p_top,Control::AnchorType p_right,Control::AnchorType p_bottom);
+
+ HSplitContainer *palette_split;
+ VSplitContainer *bottom_split;
+
+friend class CanvasItemEditorPlugin;
+protected:
+
+
+ void _notification(int p_what);
+
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+ void end_drag();
+ void box_selection_start( Point2 &click );
+ bool box_selection_end();
+
+ HBoxContainer *get_panel_hb() { return hb; }
+
+ struct compare_items_x {
+ bool operator()( const CanvasItem *a, const CanvasItem *b ) const {
+ return a->get_global_transform().elements[2].x < b->get_global_transform().elements[2].x;
+ }
+ };
+
+ struct compare_items_y {
+ bool operator()( const CanvasItem *a, const CanvasItem *b ) const {
+ return a->get_global_transform().elements[2].y < b->get_global_transform().elements[2].y;
+ }
+ };
+
+ struct proj_vector2_x {
+ float get( const Vector2 &v ) { return v.x; }
+ void set( Vector2 &v, float f ) { v.x = f; }
+ };
+
+ struct proj_vector2_y {
+ float get( const Vector2 &v ) { return v.y; }
+ void set( Vector2 &v, float f ) { v.y = f; }
+ };
+
+ template< class P, class C > void space_selected_items();
+
+ static CanvasItemEditor *singleton;
+public:
+
+ Vector2 snap_point(Vector2 p_target, Vector2 p_start = Vector2(0, 0)) const;
+ float snap_angle(float p_target, float p_start = 0) const;
+
+ Transform2D get_canvas_transform() const { return transform; }
+
+ static CanvasItemEditor *get_singleton() { return singleton; }
+ Dictionary get_state() const;
+ void set_state(const Dictionary& p_state);
+
+ void add_control_to_menu_panel(Control *p_control);
+
+ HSplitContainer *get_palette_split();
+ VSplitContainer *get_bottom_split();
+
+ Control *get_viewport_control() { return viewport; }
+
+ bool get_remove_list(List<Node*> *p_list);
+ void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; }
+ void edit(CanvasItem *p_canvas_item);
+
+ void focus_selection();
+
+ CanvasItemEditor(EditorNode *p_editor);
+};
+
+class CanvasItemEditorPlugin : public EditorPlugin {
+
+ GDCLASS( CanvasItemEditorPlugin, EditorPlugin );
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "2D"; }
+ bool has_main_screen() const { return true; }
+ virtual void edit(Object *p_object);
+ virtual bool handles(Object *p_object) const;
+ virtual void make_visible(bool p_visible);
+ virtual bool get_remove_list(List<Node*> *p_list) { return canvas_item_editor->get_remove_list(p_list); }
+ virtual Dictionary get_state() const;
+ virtual void set_state(const Dictionary& p_state);
+
+ CanvasItemEditor *get_canvas_item_editor() { return canvas_item_editor; }
+
+ CanvasItemEditorPlugin(EditorNode *p_node);
+ ~CanvasItemEditorPlugin();
+
+};
+
+class CanvasItemEditorViewport : public Control {
+ GDCLASS( CanvasItemEditorViewport, Control );
+
+ String default_type;
+ Vector<String> types;
+
+ Vector<String> selected_files;
+ Node* target_node;
+ Point2 drop_pos;
+
+ EditorNode* editor;
+ EditorData* editor_data;
+ CanvasItemEditor* canvas;
+ Node2D* preview;
+ AcceptDialog* accept;
+ WindowDialog* selector;
+ Label* selector_label;
+ Label* label;
+ Label* label_desc;
+ VBoxContainer* btn_group;
+ Ref<ButtonGroup> button_group;
+
+ void _on_mouse_exit();
+ void _on_select_type(Object* selected);
+ void _on_change_type();
+
+ void _create_preview(const Vector<String>& files) const;
+ void _remove_preview();
+
+ bool _cyclical_dependency_exists(const String& p_target_scene_path, Node* p_desired_node);
+ void _create_nodes(Node* parent, Node* child, String& path, const Point2& p_point);
+ bool _create_instance(Node* parent, String& path, const Point2& p_point);
+ void _perform_drop_data();
+
+ static void _bind_methods();
+
+protected:
+ void _notification(int p_what);
+
+public:
+ virtual bool can_drop_data(const Point2& p_point,const Variant& p_data) const;
+ virtual void drop_data(const Point2& p_point,const Variant& p_data);
+
+ CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor* p_canvas);
+};
+
+#endif
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..5a45267c85
--- /dev/null
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
@@ -0,0 +1,482 @@
+/*************************************************************************/
+/* collision_polygon_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "collision_polygon_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+
+
+void CollisionPolygon2DEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ button_create->set_icon( get_icon("Edit","EditorIcons"));
+ button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ button_edit->set_pressed(true);
+ get_tree()->connect("node_removed",this,"_node_removed");
+
+ } break;
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void CollisionPolygon2DEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+}
+
+
+void CollisionPolygon2DEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case MODE_CREATE: {
+
+ mode=MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+
+ mode=MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+
+ }
+}
+
+void CollisionPolygon2DEditor::_wip_close() {
+
+ undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",node->get_polygon());
+ undo_redo->add_do_method(node,"set_polygon",wip);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ wip.clear();
+ wip_active=false;
+ mode=MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ edited_point=-1;
+}
+
+bool CollisionPolygon2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+
+ if (!node)
+ return false;
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ Vector<Vector2> poly = node->get_polygon();
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( cpoint );
+ wip_active=true;
+ edited_point_pos=cpoint;
+ canvas_item_editor->get_viewport_control()->update();
+ edited_point=1;
+ return true;
+ } else {
+
+
+ if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+
+ wip.push_back( cpoint );
+ edited_point=wip.size();
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close();
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ if (poly.size() < 3) {
+
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 points[2] ={ xform.xform(poly[i]),
+ xform.xform(poly[(i+1)%poly.size()]) };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ poly.insert(closest_idx+1,xform.affine_inverse().xform(closest_pos));
+ edited_point=closest_idx+1;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ node->set_polygon(poly);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ edited_point=closest_idx;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly[edited_point]=edited_point_pos;
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_undo_method(node,"set_polygon",pre_move_edit);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ }
+
+
+
+ } break;
+ }
+
+
+
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ }
+
+ } break;
+ }
+
+ return false;
+}
+void CollisionPolygon2DEditor::_canvas_draw() {
+
+ if (!node)
+ return;
+
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
+ Vector<Vector2> poly;
+
+ if (wip_active)
+ poly=wip;
+ else
+ poly=node->get_polygon();
+
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = i==edited_point ? edited_point_pos : poly[i];
+ if ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point))
+ p2=edited_point_pos;
+ else
+ p2 = poly[(i+1)%poly.size()];
+
+ Vector2 point = xform.xform(p);
+ Vector2 next_point = xform.xform(p2);
+
+ Color col=Color(1,0.3,0.1,0.8);
+ vpc->draw_line(point,next_point,col,2);
+ vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+}
+
+
+
+void CollisionPolygon2DEditor::edit(Node *p_collision_polygon) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_collision_polygon) {
+
+ node=p_collision_polygon->cast_to<CollisionPolygon2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+ canvas_item_editor->get_viewport_control()->update();
+
+ } else {
+ node=NULL;
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ }
+
+}
+
+void CollisionPolygon2DEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&CollisionPolygon2DEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&CollisionPolygon2DEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&CollisionPolygon2DEditor::_node_removed);
+
+}
+
+CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) {
+
+ node=NULL;
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ add_child( memnew( VSeparator ));
+ button_create = memnew( ToolButton );
+ add_child(button_create);
+ button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+ button_create->set_tooltip(TTR("Create a new polygon from scratch."));
+
+ button_edit = memnew( ToolButton );
+ add_child(button_edit);
+ button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+ button_edit->set_tooltip("Edit existing polygon:\nLMB: Move Point.\nCtrl+LMB: Split Segment.\nRMB: Erase Point.");
+
+ //add_constant_override("separation",0);
+
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ mode = MODE_EDIT;
+ wip_active=false;
+
+}
+
+
+void CollisionPolygon2DEditorPlugin::edit(Object *p_object) {
+
+ collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool CollisionPolygon2DEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("CollisionPolygon2D");
+}
+
+void CollisionPolygon2DEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(NULL);
+ }
+
+}
+
+CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ collision_polygon_editor = memnew( CollisionPolygon2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+
+
+
+}
+
+
+CollisionPolygon2DEditorPlugin::~CollisionPolygon2DEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h
new file mode 100644
index 0000000000..796328753d
--- /dev/null
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.h
@@ -0,0 +1,111 @@
+/*************************************************************************/
+/* collision_polygon_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef COLLISION_POLYGON_2D_EDITOR_PLUGIN_H
+#define COLLISION_POLYGON_2D_EDITOR_PLUGIN_H
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/collision_polygon_2d.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class CanvasItemEditor;
+
+class CollisionPolygon2DEditor : public HBoxContainer {
+
+ GDCLASS(CollisionPolygon2DEditor, HBoxContainer );
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+
+ };
+
+ Mode mode;
+
+ ToolButton *button_create;
+ ToolButton *button_edit;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ CollisionPolygon2D *node;
+ MenuButton *options;
+
+ int edited_point;
+ Vector2 edited_point_pos;
+ Vector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+
+
+ void _wip_close();
+ void _canvas_draw();
+ void _menu_option(int p_option);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_collision_polygon);
+ CollisionPolygon2DEditor(EditorNode *p_editor);
+};
+
+class CollisionPolygon2DEditorPlugin : public EditorPlugin {
+
+ GDCLASS( CollisionPolygon2DEditorPlugin, EditorPlugin );
+
+ CollisionPolygon2DEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "CollisionPolygon2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ CollisionPolygon2DEditorPlugin(EditorNode *p_node);
+ ~CollisionPolygon2DEditorPlugin();
+
+};
+
+#endif // COLLISION_POLYGON_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/collision_polygon_editor_plugin.cpp b/editor/plugins/collision_polygon_editor_plugin.cpp
new file mode 100644
index 0000000000..3aad53b420
--- /dev/null
+++ b/editor/plugins/collision_polygon_editor_plugin.cpp
@@ -0,0 +1,648 @@
+/*************************************************************************/
+/* collision_polygon_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "collision_polygon_editor_plugin.h"
+
+#include "spatial_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+#include "scene/3d/camera.h"
+#include "canvas_item_editor_plugin.h"
+
+#if 0
+
+void CollisionPolygonEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ button_create->set_icon( get_icon("Edit","EditorIcons"));
+ button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ button_edit->set_pressed(true);
+ get_tree()->connect("node_removed",this,"_node_removed");
+
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+
+ if (node->get_depth() != prev_depth) {
+ _polygon_draw();
+ prev_depth=node->get_depth();
+ }
+
+ } break;
+ }
+
+}
+void CollisionPolygonEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ if (imgeom->get_parent()==p_node)
+ p_node->remove_child(imgeom);
+ hide();
+ set_process(false);
+ }
+
+}
+
+
+void CollisionPolygonEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case MODE_CREATE: {
+
+ mode=MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+
+ mode=MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+
+ }
+}
+
+void CollisionPolygonEditor::_wip_close() {
+
+ undo_redo->create_action(TTR("Create Poly3D"));
+ undo_redo->add_undo_method(node,"set_polygon",node->get_polygon());
+ undo_redo->add_do_method(node,"set_polygon",wip);
+ undo_redo->add_do_method(this,"_polygon_draw");
+ undo_redo->add_undo_method(this,"_polygon_draw");
+ wip.clear();
+ wip_active=false;
+ mode=MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ edited_point=-1;
+ undo_redo->commit_action();
+
+}
+
+bool CollisionPolygonEditor::forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event) {
+
+ if (!node)
+ return false;
+
+ Transform gt = node->get_global_transform();
+ Transform gi = gt.affine_inverse();
+ float depth = node->get_depth()*0.5;
+ Vector3 n = gt.basis.get_axis(2).normalized();
+ Plane p(gt.origin+n*depth,n);
+
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+
+
+ Vector2 gpoint=Point2(mb.x,mb.y);
+ Vector3 ray_from = p_camera->project_ray_origin(gpoint);
+ Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
+
+ Vector3 spoint;
+
+ if (!p.intersects_ray(ray_from,ray_dir,&spoint))
+ break;
+
+ spoint = gi.xform(spoint);
+
+ Vector2 cpoint(spoint.x,spoint.y);
+
+ cpoint=CanvasItemEditor::get_singleton()->snap_point(cpoint);
+
+ Vector<Vector2> poly = node->get_polygon();
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( cpoint );
+ wip_active=true;
+ edited_point_pos=cpoint;
+ _polygon_draw();
+ edited_point=1;
+ return true;
+ } else {
+
+
+ if (wip.size()>1 && p_camera->unproject_position(gt.xform(Vector3(wip[0].x,wip[0].y,depth))).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+
+ wip.push_back( cpoint );
+ edited_point=wip.size();
+ _polygon_draw();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close();
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ if (poly.size() < 3) {
+
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(this,"_polygon_draw");
+ undo_redo->add_undo_method(this,"_polygon_draw");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 points[2] ={
+ p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth))),
+ p_camera->unproject_position(gt.xform(Vector3(poly[(i+1)%poly.size()].x,poly[(i+1)%poly.size()].y,depth)))
+ };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ poly.insert(closest_idx+1,cpoint);
+ edited_point=closest_idx+1;
+ edited_point_pos=cpoint;
+ node->set_polygon(poly);
+ _polygon_draw();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth)));
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ edited_point=closest_idx;
+ edited_point_pos=poly[closest_idx];
+ _polygon_draw();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly[edited_point]=edited_point_pos;
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_undo_method(node,"set_polygon",pre_move_edit);
+ undo_redo->add_do_method(this,"_polygon_draw");
+ undo_redo->add_undo_method(this,"_polygon_draw");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth)));
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(this,"_polygon_draw");
+ undo_redo->add_undo_method(this,"_polygon_draw");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ }
+
+
+
+ } break;
+ }
+
+
+
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+
+ Vector3 ray_from = p_camera->project_ray_origin(gpoint);
+ Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
+
+ Vector3 spoint;
+
+ if (!p.intersects_ray(ray_from,ray_dir,&spoint))
+ break;
+
+ spoint = gi.xform(spoint);
+
+ Vector2 cpoint(spoint.x,spoint.y);
+
+ cpoint=CanvasItemEditor::get_singleton()->snap_point(cpoint);
+ edited_point_pos = cpoint;
+
+ _polygon_draw();
+
+ }
+
+ } break;
+ }
+
+ return false;
+}
+void CollisionPolygonEditor::_polygon_draw() {
+
+ if (!node)
+ return;
+
+ Vector<Vector2> poly;
+
+ if (wip_active)
+ poly=wip;
+ else
+ poly=node->get_polygon();
+
+
+ float depth = node->get_depth()*0.5;
+
+ imgeom->clear();
+ imgeom->set_material_override(line_material);
+ imgeom->begin(Mesh::PRIMITIVE_LINES,Ref<Texture>());
+
+
+ Rect2 rect;
+
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = i==edited_point ? edited_point_pos : poly[i];
+ if ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point))
+ p2=edited_point_pos;
+ else
+ p2 = poly[(i+1)%poly.size()];
+
+ if (i==0)
+ rect.pos=p;
+ else
+ rect.expand_to(p);
+
+ Vector3 point = Vector3(p.x,p.y,depth);
+ Vector3 next_point = Vector3(p2.x,p2.y,depth);
+
+ imgeom->set_color(Color(1,0.3,0.1,0.8));
+ imgeom->add_vertex(point);
+ imgeom->set_color(Color(1,0.3,0.1,0.8));
+ imgeom->add_vertex(next_point);
+
+ //Color col=Color(1,0.3,0.1,0.8);
+ //vpc->draw_line(point,next_point,col,2);
+ //vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+
+ rect=rect.grow(1);
+
+ AABB r;
+ r.pos.x=rect.pos.x;
+ r.pos.y=rect.pos.y;
+ r.pos.z=depth;
+ r.size.x=rect.size.x;
+ r.size.y=rect.size.y;
+ r.size.z=0;
+
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos);
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0.3,0,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos);
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0.0,0.3,0));
+
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0)-Vector3(0.3,0,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0)+Vector3(0,0.3,0));
+
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0)-Vector3(0,0.3,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0)+Vector3(0.3,0,0));
+
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+r.size);
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+r.size-Vector3(0.3,0,0));
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+r.size);
+ imgeom->set_color(Color(0.8,0.8,0.8,0.2));
+ imgeom->add_vertex(r.pos+r.size-Vector3(0.0,0.3,0));
+
+ imgeom->end();
+
+
+ while(m->get_surface_count()) {
+ m->surface_remove(0);
+ }
+
+ if (poly.size()==0)
+ return;
+
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ PoolVector<Vector3> va;
+ {
+
+ va.resize(poly.size());
+ PoolVector<Vector3>::Write w=va.write();
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = i==edited_point ? edited_point_pos : poly[i];
+
+ Vector3 point = Vector3(p.x,p.y,depth);
+ w[i]=point;
+ }
+ }
+ a[Mesh::ARRAY_VERTEX]=va;
+ m->add_surface(Mesh::PRIMITIVE_POINTS,a);
+ m->surface_set_material(0,handle_material);
+
+}
+
+
+
+void CollisionPolygonEditor::edit(Node *p_collision_polygon) {
+
+
+
+ if (p_collision_polygon) {
+
+ node=p_collision_polygon->cast_to<CollisionPolygon>();
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+ p_collision_polygon->add_child(imgeom);
+ _polygon_draw();
+ set_process(true);
+ prev_depth=-1;
+
+ } else {
+ node=NULL;
+
+ if (imgeom->get_parent())
+ imgeom->get_parent()->remove_child(imgeom);
+
+ set_process(false);
+ }
+
+}
+
+void CollisionPolygonEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&CollisionPolygonEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_polygon_draw"),&CollisionPolygonEditor::_polygon_draw);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&CollisionPolygonEditor::_node_removed);
+
+}
+
+CollisionPolygonEditor::CollisionPolygonEditor(EditorNode *p_editor) {
+
+
+ node=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ add_child( memnew( VSeparator ));
+ button_create = memnew( ToolButton );
+ add_child(button_create);
+ button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+
+ button_edit = memnew( ToolButton );
+ add_child(button_edit);
+ button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+
+ //add_constant_override("separation",0);
+
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ mode = MODE_EDIT;
+ wip_active=false;
+ imgeom = memnew( ImmediateGeometry );
+ imgeom->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001)));
+
+
+ line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ line_material->set_flag(Material::FLAG_UNSHADED, true);
+ line_material->set_line_width(3.0);
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, true);
+ line_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,Color(1,1,1));
+
+
+
+
+ handle_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ handle_material->set_flag(Material::FLAG_UNSHADED, true);
+ handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_POINT_SIZE, true);
+ handle_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,Color(1,1,1));
+ handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, false);
+ Ref<Texture> handle=editor->get_gui_base()->get_icon("Editor3DHandle","EditorIcons");
+ handle_material->set_point_size(handle->get_width());
+ handle_material->set_texture(FixedSpatialMaterial::PARAM_DIFFUSE,handle);
+
+ pointsm = memnew( MeshInstance );
+ imgeom->add_child(pointsm);
+ m = Ref<Mesh>( memnew( Mesh ) );
+ pointsm->set_mesh(m);
+ pointsm->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001)));
+
+
+}
+
+CollisionPolygonEditor::~CollisionPolygonEditor() {
+
+ memdelete( imgeom );
+}
+
+
+void CollisionPolygonEditorPlugin::edit(Object *p_object) {
+
+ collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool CollisionPolygonEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("CollisionPolygon");
+}
+
+void CollisionPolygonEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(NULL);
+ }
+
+}
+
+CollisionPolygonEditorPlugin::CollisionPolygonEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ collision_polygon_editor = memnew( CollisionPolygonEditor(p_node) );
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+
+
+
+}
+
+
+CollisionPolygonEditorPlugin::~CollisionPolygonEditorPlugin()
+{
+}
+
+#endif
diff --git a/editor/plugins/collision_polygon_editor_plugin.h b/editor/plugins/collision_polygon_editor_plugin.h
new file mode 100644
index 0000000000..aaad2174fe
--- /dev/null
+++ b/editor/plugins/collision_polygon_editor_plugin.h
@@ -0,0 +1,123 @@
+/*************************************************************************/
+/* collision_polygon_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef COLLISION_POLYGON_EDITOR_PLUGIN_H
+#define COLLISION_POLYGON_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/collision_polygon.h"
+#include "scene/3d/immediate_geometry.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+#if 0
+class CanvasItemEditor;
+
+class CollisionPolygonEditor : public HBoxContainer {
+
+ GDCLASS(CollisionPolygonEditor, HBoxContainer );
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+
+ };
+
+ Mode mode;
+
+ ToolButton *button_create;
+ ToolButton *button_edit;
+
+
+ Ref<FixedSpatialMaterial> line_material;
+ Ref<FixedSpatialMaterial> handle_material;
+
+ EditorNode *editor;
+ Panel *panel;
+ CollisionPolygon *node;
+ ImmediateGeometry *imgeom;
+ MeshInstance *pointsm;
+ Ref<Mesh> m;
+
+ MenuButton *options;
+
+ int edited_point;
+ Vector2 edited_point_pos;
+ Vector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+
+ float prev_depth;
+
+ void _wip_close();
+ void _polygon_draw();
+ void _menu_option(int p_option);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ virtual bool forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event);
+ void edit(Node *p_collision_polygon);
+ CollisionPolygonEditor(EditorNode *p_editor);
+ ~CollisionPolygonEditor();
+};
+
+class CollisionPolygonEditorPlugin : public EditorPlugin {
+
+ GDCLASS( CollisionPolygonEditorPlugin, EditorPlugin );
+
+ CollisionPolygonEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event) { return collision_polygon_editor->forward_spatial_gui_input(p_camera,p_event); }
+
+ virtual String get_name() const { return "CollisionPolygon"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ CollisionPolygonEditorPlugin(EditorNode *p_node);
+ ~CollisionPolygonEditorPlugin();
+
+};
+#endif
+#endif // COLLISION_POLYGON_EDITOR_PLUGIN_H
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..a05eeb7a27
--- /dev/null
+++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -0,0 +1,600 @@
+/*************************************************************************/
+/* collision_shape_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "collision_shape_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "scene/resources/segment_shape_2d.h"
+#include "scene/resources/shape_line_2d.h"
+#include "scene/resources/circle_shape_2d.h"
+#include "scene/resources/rectangle_shape_2d.h"
+#include "scene/resources/capsule_shape_2d.h"
+#include "scene/resources/convex_polygon_shape_2d.h"
+#include "scene/resources/concave_polygon_shape_2d.h"
+
+Variant CollisionShape2DEditor::get_handle_value(int idx) const {
+
+ switch ( shape_type ) {
+ case CAPSULE_SHAPE: {
+ Ref<CapsuleShape2D> capsule = node->get_shape();
+
+ if (idx==0) {
+ return capsule->get_radius();
+ } else if (idx==1) {
+ return capsule->get_height();
+ }
+
+ } break;
+
+ case CIRCLE_SHAPE: {
+ Ref<CircleShape2D> circle = node->get_shape();
+
+ if (idx==0) {
+ return circle->get_radius();
+ }
+
+ } break;
+
+ case CONCAVE_POLYGON_SHAPE: {
+
+ } break;
+
+ case CONVEX_POLYGON_SHAPE: {
+
+ } break;
+
+ case LINE_SHAPE: {
+ Ref<LineShape2D> line = node->get_shape();
+
+ if (idx==0) {
+ return line->get_d();
+ } else {
+ return line->get_normal();
+ }
+
+ } break;
+
+ case RAY_SHAPE: {
+ Ref<RayShape2D> ray = node->get_shape();
+
+ if (idx==0) {
+ return ray->get_length();
+ }
+
+ } break;
+
+ case RECTANGLE_SHAPE: {
+ Ref<RectangleShape2D> rect = node->get_shape();
+
+ if (idx<2) {
+ return rect->get_extents().abs();
+ }
+
+ } break;
+
+ case SEGMENT_SHAPE: {
+ Ref<SegmentShape2D> seg = node->get_shape();
+
+ if (idx==0) {
+ return seg->get_a();
+ } else if (idx==1) {
+ return seg->get_b();
+ }
+
+ } break;
+ }
+
+ return Variant();
+}
+
+void CollisionShape2DEditor::set_handle(int idx, Point2& p_point) {
+
+ switch ( shape_type ) {
+ case CAPSULE_SHAPE: {
+ if (idx < 2) {
+ Ref<CapsuleShape2D> capsule = node->get_shape();
+
+ real_t parameter = Math::abs(p_point[idx]);
+
+ if (idx==0) {
+ capsule->set_radius(parameter);
+ } else if (idx==1){
+ capsule->set_height(parameter*2 - capsule->get_radius()*2);
+ }
+
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+ } break;
+
+ case CIRCLE_SHAPE: {
+ Ref<CircleShape2D> circle = node->get_shape();
+ circle->set_radius(p_point.length());
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ } break;
+
+ case CONCAVE_POLYGON_SHAPE: {
+
+ } break;
+
+ case CONVEX_POLYGON_SHAPE: {
+
+ } break;
+
+ case LINE_SHAPE: {
+ if (idx<2) {
+ Ref<LineShape2D> line = node->get_shape();
+
+ if (idx==0){
+ line->set_d(p_point.length());
+ }else{
+ line->set_normal(p_point.normalized());
+ }
+
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+
+ } break;
+
+ case RAY_SHAPE: {
+ Ref<RayShape2D> ray = node->get_shape();
+
+ ray->set_length(Math::abs(p_point.y));
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ } break;
+
+ case RECTANGLE_SHAPE: {
+ if (idx<2) {
+ Ref<RectangleShape2D> rect = node->get_shape();
+
+ Vector2 extents = rect->get_extents();
+ extents[idx] = p_point[idx];
+
+ rect->set_extents(extents.abs());
+
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+ } break;
+
+ case SEGMENT_SHAPE: {
+ if (edit_handle < 2) {
+ Ref<SegmentShape2D> seg = node->get_shape();
+
+ if (idx==0) {
+ seg->set_a(p_point);
+ } else if (idx==1) {
+ seg->set_b(p_point);
+ }
+
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+ } break;
+ }
+}
+
+void CollisionShape2DEditor::commit_handle(int idx, Variant& p_org) {
+
+ Control* c = canvas_item_editor->get_viewport_control();
+ undo_redo->create_action(TTR("Set Handle"));
+
+ switch ( shape_type ) {
+ case CAPSULE_SHAPE: {
+ Ref<CapsuleShape2D> capsule = node->get_shape();
+
+ if (idx==0) {
+ undo_redo->add_do_method(capsule.ptr(),"set_radius",capsule->get_radius());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(capsule.ptr(),"set_radius",p_org);
+ undo_redo->add_do_method(c,"update");
+ } else if (idx==1) {
+ undo_redo->add_do_method(capsule.ptr(),"set_height",capsule->get_height());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(capsule.ptr(),"set_height",p_org);
+ undo_redo->add_undo_method(c,"update");
+ }
+
+ } break;
+
+ case CIRCLE_SHAPE: {
+ Ref<CircleShape2D> circle = node->get_shape();
+
+ undo_redo->add_do_method(circle.ptr(),"set_radius",circle->get_radius());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(circle.ptr(),"set_radius",p_org);
+ undo_redo->add_undo_method(c,"update");
+
+ } break;
+
+ case CONCAVE_POLYGON_SHAPE: {
+
+ } break;
+
+ case CONVEX_POLYGON_SHAPE: {
+
+ } break;
+
+ case LINE_SHAPE: {
+ Ref<LineShape2D> line = node->get_shape();
+
+ if (idx==0) {
+ undo_redo->add_do_method(line.ptr(),"set_d",line->get_d());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(line.ptr(),"set_d",p_org);
+ undo_redo->add_undo_method(c,"update");
+ } else {
+ undo_redo->add_do_method(line.ptr(),"set_normal",line->get_normal());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(line.ptr(),"set_normal",p_org);
+ undo_redo->add_undo_method(c,"update");
+ }
+
+ } break;
+
+ case RAY_SHAPE: {
+ Ref<RayShape2D> ray = node->get_shape();
+
+ undo_redo->add_do_method(ray.ptr(),"set_length",ray->get_length());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(ray.ptr(),"set_length",p_org);
+ undo_redo->add_undo_method(c,"update");
+
+ } break;
+
+ case RECTANGLE_SHAPE: {
+ Ref<RectangleShape2D> rect = node->get_shape();
+
+ undo_redo->add_do_method(rect.ptr(),"set_extents",rect->get_extents());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(rect.ptr(),"set_extents",p_org);
+ undo_redo->add_undo_method(c,"update");
+
+ } break;
+
+ case SEGMENT_SHAPE: {
+ Ref<SegmentShape2D> seg = node->get_shape();
+ if (idx==0) {
+ undo_redo->add_do_method(seg.ptr(),"set_a",seg->get_a());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(seg.ptr(),"set_a",p_org);
+ undo_redo->add_undo_method(c,"update");
+ } else if (idx==1) {
+ undo_redo->add_do_method(seg.ptr(),"set_b",seg->get_b());
+ undo_redo->add_do_method(c,"update");
+ undo_redo->add_undo_method(seg.ptr(),"set_b",p_org);
+ undo_redo->add_undo_method(c,"update");
+ }
+
+ } break;
+ }
+
+ undo_redo->commit_action();
+}
+
+bool CollisionShape2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+ if (!node) {
+ return false;
+ }
+
+ if (!node->get_shape().is_valid()) {
+ return false;
+ }
+
+ if (shape_type == -1) {
+ return false;
+ }
+
+ switch( p_event.type ) {
+ case InputEvent::MOUSE_BUTTON: {
+ const InputEventMouseButton& mb = p_event.mouse_button;
+
+ Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+ Point2 gpoint(mb.x,mb.y);
+
+ if (mb.button_index == BUTTON_LEFT) {
+ if (mb.pressed) {
+ for (int i = 0; i < handles.size(); i++) {
+ if (gt.xform(handles[i]).distance_to(gpoint) < 8) {
+ edit_handle = i;
+
+ break;
+ }
+ }
+
+ if (edit_handle==-1) {
+ pressed = false;
+
+ return false;
+ }
+
+ original = get_handle_value(edit_handle);
+ pressed = true;
+
+ return true;
+
+ } else {
+ if (pressed) {
+ commit_handle(edit_handle, original);
+
+ edit_handle = -1;
+ pressed = false;
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+
+ } break;
+
+ case InputEvent::MOUSE_MOTION: {
+ const InputEventMouseMotion& mm = p_event.mouse_motion;
+
+ if (edit_handle == -1 || !pressed) {
+ return false;
+ }
+
+ Point2 gpoint = Point2(mm.x,mm.y);
+ Point2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint = canvas_item_editor->snap_point(cpoint);
+ cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ set_handle(edit_handle, cpoint);
+
+ return true;
+
+ } break;
+ }
+
+ return false;
+}
+
+void CollisionShape2DEditor::_get_current_shape_type() {
+
+ if (!node) {
+ return;
+ }
+
+ Ref<Shape2D> s = node->get_shape();
+
+ if (!s.is_valid()) {
+ return;
+ }
+
+ if (s->cast_to<CapsuleShape2D>()) {
+ shape_type = CAPSULE_SHAPE;
+ } else if (s->cast_to<CircleShape2D>()) {
+ shape_type = CIRCLE_SHAPE;
+ } else if (s->cast_to<ConcavePolygonShape2D>()) {
+ shape_type = CONCAVE_POLYGON_SHAPE;
+ } else if (s->cast_to<ConvexPolygonShape2D>()) {
+ shape_type = CONVEX_POLYGON_SHAPE;
+ } else if (s->cast_to<LineShape2D>()) {
+ shape_type = LINE_SHAPE;
+ } else if (s->cast_to<RayShape2D>()) {
+ shape_type = RAY_SHAPE;
+ } else if (s->cast_to<RectangleShape2D>()) {
+ shape_type = RECTANGLE_SHAPE;
+ } else if (s->cast_to<SegmentShape2D>()) {
+ shape_type = SEGMENT_SHAPE;
+ } else {
+ shape_type = -1;
+ }
+
+ canvas_item_editor->get_viewport_control()->update();
+}
+
+void CollisionShape2DEditor::_canvas_draw() {
+
+ if (!node) {
+ return;
+ }
+
+ if (!node->get_shape().is_valid()) {
+ return;
+ }
+
+ _get_current_shape_type();
+
+ if (shape_type == -1) {
+ return;
+ }
+
+ Control *c = canvas_item_editor->get_viewport_control();
+ Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+ Ref<Texture> h = get_icon("EditorHandle","EditorIcons");
+ Vector2 size = h->get_size()*0.5;
+
+ handles.clear();
+
+ switch (shape_type) {
+ case CAPSULE_SHAPE: {
+ Ref<CapsuleShape2D> shape = node->get_shape();
+
+ handles.resize(2);
+ float radius = shape->get_radius();
+ float height = shape->get_height()/2;
+
+ handles[0] = Point2(radius, -height);
+ handles[1] = Point2(0,-(height + radius));
+
+ c->draw_texture(h, gt.xform(handles[0])-size);
+ c->draw_texture(h, gt.xform(handles[1])-size);
+
+ } break;
+
+ case CIRCLE_SHAPE: {
+ Ref<CircleShape2D> shape = node->get_shape();
+
+ handles.resize(1);
+ handles[0] = Point2(shape->get_radius(),0);
+
+ c->draw_texture(h, gt.xform(handles[0])-size);
+
+ } break;
+
+ case CONCAVE_POLYGON_SHAPE: {
+
+ } break;
+
+ case CONVEX_POLYGON_SHAPE: {
+
+ } break;
+
+ case LINE_SHAPE: {
+ Ref<LineShape2D> shape = node->get_shape();
+
+ handles.resize(2);
+ handles[0] = shape->get_normal() * shape->get_d();
+ handles[1] = shape->get_normal() * (shape->get_d() + 30.0);
+
+ c->draw_texture(h,gt.xform(handles[0])-size);
+ c->draw_texture(h,gt.xform(handles[1])-size);
+
+ } break;
+
+ case RAY_SHAPE: {
+ Ref<RayShape2D> shape = node->get_shape();
+
+ handles.resize(1);
+ handles[0] = Point2(0,shape->get_length());
+
+ c->draw_texture(h,gt.xform(handles[0])-size);
+
+ } break;
+
+ case RECTANGLE_SHAPE: {
+ Ref<RectangleShape2D> shape = node->get_shape();
+
+ handles.resize(2);
+ Vector2 ext = shape->get_extents();
+ handles[0] = Point2(ext.x,0);
+ handles[1] = Point2(0,-ext.y);
+
+ c->draw_texture(h,gt.xform(handles[0])-size);
+ c->draw_texture(h,gt.xform(handles[1])-size);
+
+ } break;
+
+ case SEGMENT_SHAPE: {
+ Ref<SegmentShape2D> shape = node->get_shape();
+
+ handles.resize(2);
+ handles[0] = shape->get_a();
+ handles[1] = shape->get_b();
+
+ c->draw_texture(h, gt.xform(handles[0])-size);
+ c->draw_texture(h, gt.xform(handles[1])-size);
+
+ } break;
+ }
+}
+
+void CollisionShape2DEditor::edit(Node* p_node) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_node) {
+ node=p_node->cast_to<CollisionShape2D>();
+
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+
+ _get_current_shape_type();
+
+ } else {
+ edit_handle = -1;
+ shape_type = -1;
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ node=NULL;
+ }
+
+ canvas_item_editor->get_viewport_control()->update();
+}
+
+void CollisionShape2DEditor::_bind_methods() {
+
+ ClassDB::bind_method("_canvas_draw",&CollisionShape2DEditor::_canvas_draw);
+ ClassDB::bind_method("_get_current_shape_type",&CollisionShape2DEditor::_get_current_shape_type);
+}
+
+CollisionShape2DEditor::CollisionShape2DEditor(EditorNode* p_editor) {
+
+ node = NULL;
+ canvas_item_editor = NULL;
+ editor = p_editor;
+
+ undo_redo = p_editor->get_undo_redo();
+
+ edit_handle = -1;
+ pressed = false;
+}
+
+void CollisionShape2DEditorPlugin::edit(Object* p_obj) {
+
+ collision_shape_2d_editor->edit(p_obj->cast_to<Node>());
+}
+
+bool CollisionShape2DEditorPlugin::handles(Object* p_obj) const {
+
+ return p_obj->is_class("CollisionShape2D");
+}
+
+void CollisionShape2DEditorPlugin::make_visible(bool visible) {
+
+ if (!visible) {
+ edit(NULL);
+ }
+}
+
+CollisionShape2DEditorPlugin::CollisionShape2DEditorPlugin(EditorNode* p_node) {
+
+ editor=p_node;
+
+ collision_shape_2d_editor = memnew( CollisionShape2DEditor(p_node) );
+ p_node->get_gui_base()->add_child(collision_shape_2d_editor);
+}
+
+CollisionShape2DEditorPlugin::~CollisionShape2DEditorPlugin() {
+
+}
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h
new file mode 100644
index 0000000000..f7e6da8b4e
--- /dev/null
+++ b/editor/plugins/collision_shape_2d_editor_plugin.h
@@ -0,0 +1,101 @@
+/*************************************************************************/
+/* collision_shape_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef COLLISION_SHAPE_2D_EDITOR_PLUGIN_H
+#define COLLISION_SHAPE_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+
+#include "scene/2d/collision_shape_2d.h"
+
+class CanvasItemEditor;
+
+class CollisionShape2DEditor : public Control {
+ GDCLASS(CollisionShape2DEditor, Control);
+
+ enum ShapeType {
+ CAPSULE_SHAPE,
+ CIRCLE_SHAPE,
+ CONCAVE_POLYGON_SHAPE,
+ CONVEX_POLYGON_SHAPE,
+ LINE_SHAPE,
+ RAY_SHAPE,
+ RECTANGLE_SHAPE,
+ SEGMENT_SHAPE
+ };
+
+ EditorNode* editor;
+ UndoRedo* undo_redo;
+ CanvasItemEditor* canvas_item_editor;
+ CollisionShape2D* node;
+
+ Vector<Point2> handles;
+
+ int shape_type;
+ int edit_handle;
+ bool pressed;
+ Variant original;
+
+ Variant get_handle_value(int idx) const;
+ void set_handle(int idx, Point2& p_point);
+ void commit_handle(int idx, Variant& p_org);
+
+ void _get_current_shape_type();
+ void _canvas_draw();
+
+protected:
+ static void _bind_methods();
+
+public:
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node* p_node);
+
+ CollisionShape2DEditor(EditorNode* p_editor);
+};
+
+class CollisionShape2DEditorPlugin : public EditorPlugin {
+ GDCLASS(CollisionShape2DEditorPlugin, EditorPlugin);
+
+ CollisionShape2DEditor* collision_shape_2d_editor;
+ EditorNode* editor;
+
+public:
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return collision_shape_2d_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "CollisionShape2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object* p_obj);
+ virtual bool handles(Object* p_obj) const;
+ virtual void make_visible(bool visible);
+
+ CollisionShape2DEditorPlugin(EditorNode* p_editor);
+ ~CollisionShape2DEditorPlugin();
+};
+
+#endif //COLLISION_SHAPE_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/color_ramp_editor_plugin.cpp b/editor/plugins/color_ramp_editor_plugin.cpp
new file mode 100644
index 0000000000..82674fabb8
--- /dev/null
+++ b/editor/plugins/color_ramp_editor_plugin.cpp
@@ -0,0 +1,112 @@
+/*************************************************************************/
+/* color_ramp_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "color_ramp_editor_plugin.h"
+
+#include "spatial_editor_plugin.h"
+#include "canvas_item_editor_plugin.h"
+
+ColorRampEditorPlugin::ColorRampEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ ramp_editor = memnew( ColorRampEdit );
+
+
+ add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM,ramp_editor);
+
+ ramp_editor->set_custom_minimum_size(Size2(100, 48));
+ ramp_editor->hide();
+ ramp_editor->connect("ramp_changed", this, "ramp_changed");
+}
+
+void ColorRampEditorPlugin::edit(Object *p_object) {
+
+ ColorRamp* color_ramp = p_object->cast_to<ColorRamp>();
+ if (!color_ramp)
+ return;
+ color_ramp_ref = Ref<ColorRamp>(color_ramp);
+ ramp_editor->set_points(color_ramp_ref->get_points());
+}
+
+bool ColorRampEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("ColorRamp");
+
+}
+
+void ColorRampEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ ramp_editor->show();
+ } else {
+ ramp_editor->hide();
+ }
+
+}
+
+void ColorRampEditorPlugin::_ramp_changed() {
+
+ if(color_ramp_ref.is_valid())
+ {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+ //Not sure if I should convert this data to PoolVector
+ Vector<float> new_offsets=ramp_editor->get_offsets();
+ Vector<Color> new_colors=ramp_editor->get_colors();
+ Vector<float> old_offsets=color_ramp_ref->get_offsets();
+ Vector<Color> old_colors=color_ramp_ref->get_colors();
+
+ if (old_offsets.size()!=new_offsets.size())
+ ur->create_action(TTR("Add/Remove Color Ramp Point"));
+ else
+ ur->create_action(TTR("Modify Color Ramp"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(this,"undo_redo_color_ramp",new_offsets,new_colors);
+ ur->add_undo_method(this,"undo_redo_color_ramp",old_offsets,old_colors);
+ ur->commit_action();
+
+ //color_ramp_ref->set_points(ramp_editor->get_points());
+ }
+}
+
+void ColorRampEditorPlugin::_undo_redo_color_ramp(const Vector<float>& offsets,
+ const Vector<Color>& colors) {
+
+ color_ramp_ref->set_offsets(offsets);
+ color_ramp_ref->set_colors(colors);
+ ramp_editor->set_points(color_ramp_ref->get_points());
+ ramp_editor->update();
+}
+
+ColorRampEditorPlugin::~ColorRampEditorPlugin(){
+}
+
+void ColorRampEditorPlugin::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("ramp_changed"),&ColorRampEditorPlugin::_ramp_changed);
+ ClassDB::bind_method(D_METHOD("undo_redo_color_ramp","offsets","colors"),&ColorRampEditorPlugin::_undo_redo_color_ramp);
+}
diff --git a/editor/plugins/color_ramp_editor_plugin.h b/editor/plugins/color_ramp_editor_plugin.h
new file mode 100644
index 0000000000..0323bd7a46
--- /dev/null
+++ b/editor/plugins/color_ramp_editor_plugin.h
@@ -0,0 +1,62 @@
+/*************************************************************************/
+/* color_ramp_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef TOOLS_EDITOR_PLUGINS_COLOR_RAMP_EDITOR_PLUGIN_H_
+#define TOOLS_EDITOR_PLUGINS_COLOR_RAMP_EDITOR_PLUGIN_H_
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/gui/color_ramp_edit.h"
+
+class ColorRampEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ColorRampEditorPlugin, EditorPlugin );
+
+ bool _2d;
+ Ref<ColorRamp> color_ramp_ref;
+ ColorRampEdit *ramp_editor;
+ EditorNode *editor;
+
+protected:
+ static void _bind_methods();
+ void _ramp_changed();
+ void _undo_redo_color_ramp(const Vector<float>& offsets, const Vector<Color>& colors);
+
+public:
+ virtual String get_name() const { return "ColorRamp"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ColorRampEditorPlugin(EditorNode *p_node);
+ ~ColorRampEditorPlugin();
+
+};
+
+#endif /* TOOLS_EDITOR_PLUGINS_COLOR_RAMP_EDITOR_PLUGIN_H_ */
diff --git a/editor/plugins/cube_grid_theme_editor_plugin.cpp b/editor/plugins/cube_grid_theme_editor_plugin.cpp
new file mode 100644
index 0000000000..b8abd2e9cc
--- /dev/null
+++ b/editor/plugins/cube_grid_theme_editor_plugin.cpp
@@ -0,0 +1,357 @@
+/*************************************************************************/
+/* cube_grid_theme_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "cube_grid_theme_editor_plugin.h"
+
+#if 0
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/physics_body.h"
+#include "scene/main/viewport.h"
+#include "scene/resources/packed_scene.h"
+#include "editor/editor_node.h"
+#include "main/main.h"
+#include "editor/editor_settings.h"
+#include "scene/3d/navigation_mesh.h"
+
+void MeshLibraryEditor::edit(const Ref<MeshLibrary>& p_theme) {
+
+ theme=p_theme;
+ if (theme.is_valid())
+ menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE),!theme->has_meta("_editor_source_scene"));
+
+}
+
+void MeshLibraryEditor::_menu_confirm() {
+
+
+ switch(option) {
+
+ case MENU_OPTION_REMOVE_ITEM: {
+
+ theme->remove_item(to_erase);
+ } break;
+ case MENU_OPTION_UPDATE_FROM_SCENE: {
+ String existing = theme->get_meta("_editor_source_scene");
+ ERR_FAIL_COND(existing=="");
+ _import_scene_cbk(existing);
+
+ } break;
+ default: {};
+ }
+
+}
+
+
+void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge) {
+
+ if (!p_merge)
+ p_library->clear();
+
+
+ for(int i=0;i<p_scene->get_child_count();i++) {
+
+
+ Node *child = p_scene->get_child(i);
+
+ if (!child->cast_to<MeshInstance>()) {
+ if (child->get_child_count()>0) {
+ child=child->get_child(0);
+ if (!child->cast_to<MeshInstance>()) {
+ continue;
+ }
+
+ } else
+ continue;
+
+
+ }
+
+ MeshInstance *mi = child->cast_to<MeshInstance>();
+ Ref<Mesh> mesh=mi->get_mesh();
+ if (mesh.is_null())
+ continue;
+
+ int id = p_library->find_item_name(mi->get_name());
+ if (id<0) {
+
+ id=p_library->get_last_unused_item_id();
+ p_library->create_item(id);
+ p_library->set_item_name(id,mi->get_name());
+ }
+
+
+ p_library->set_item_mesh(id,mesh);
+
+ Ref<Shape> collision;
+
+
+ for(int j=0;j<mi->get_child_count();j++) {
+#if 1
+ Node *child2 = mi->get_child(j);
+ if (!child2->cast_to<StaticBody>())
+ continue;
+ StaticBody *sb = child2->cast_to<StaticBody>();
+ if (sb->get_shape_count()==0)
+ continue;
+ collision=sb->get_shape(0);
+ if (!collision.is_null())
+ break;
+#endif
+ }
+
+ if (!collision.is_null()) {
+
+ p_library->set_item_shape(id,collision);
+ }
+ Ref<NavigationMesh> navmesh;
+ for(int j=0;j<mi->get_child_count();j++) {
+ Node *child2 = mi->get_child(j);
+ if (!child2->cast_to<NavigationMeshInstance>())
+ continue;
+ NavigationMeshInstance *sb = child2->cast_to<NavigationMeshInstance>();
+ navmesh=sb->get_navigation_mesh();
+ if (!navmesh.is_null())
+ break;
+ }
+ if(!navmesh.is_null()){
+ p_library->set_item_navmesh(id, navmesh);
+ }
+ }
+
+ //generate previews!
+
+ if (1) {
+ Vector<int> ids = p_library->get_item_list();
+ RID vp = VS::get_singleton()->viewport_create();
+ VS::ViewportRect vr;
+ vr.x=0;
+ vr.y=0;
+ vr.width=EditorSettings::get_singleton()->get("editors/grid_map/preview_size");
+ vr.height=EditorSettings::get_singleton()->get("editors/grid_map/preview_size");
+ VS::get_singleton()->viewport_set_rect(vp,vr);
+ VS::get_singleton()->viewport_set_as_render_target(vp,true);
+ VS::get_singleton()->viewport_set_render_target_update_mode(vp,VS::RENDER_TARGET_UPDATE_ALWAYS);
+ RID scen = VS::get_singleton()->scenario_create();
+ VS::get_singleton()->viewport_set_scenario(vp,scen);
+ RID cam = VS::get_singleton()->camera_create();
+ VS::get_singleton()->camera_set_transform(cam, Transform() );
+ VS::get_singleton()->viewport_attach_camera(vp,cam);
+ RID light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
+ RID lightinst = VS::get_singleton()->instance_create2(light,scen);
+ VS::get_singleton()->camera_set_orthogonal(cam,1.0,0.01,1000.0);
+
+
+ EditorProgress ep("mlib",TTR("Creating Mesh Library"),ids.size());
+
+ for(int i=0;i<ids.size();i++) {
+
+ int id=ids[i];
+ Ref<Mesh> mesh = p_library->get_item_mesh(id);
+ if (!mesh.is_valid())
+ continue;
+ AABB aabb= mesh->get_aabb();
+ print_line("aabb: "+aabb);
+ Vector3 ofs = aabb.pos + aabb.size*0.5;
+ aabb.pos-=ofs;
+ Transform xform;
+ xform.basis=Matrix3().rotated(Vector3(0,1,0),-Math_PI*0.25);
+ xform.basis = Matrix3().rotated(Vector3(1,0,0),Math_PI*0.25)*xform.basis;
+ AABB rot_aabb = xform.xform(aabb);
+ print_line("rot_aabb: "+rot_aabb);
+ float m = MAX(rot_aabb.size.x,rot_aabb.size.y)*0.5;
+ if (m==0)
+ continue;
+ m=1.0/m;
+ m*=0.5;
+ print_line("scale: "+rtos(m));
+ xform.basis.scale(Vector3(m,m,m));
+ xform.origin=-xform.basis.xform(ofs); //-ofs*m;
+ xform.origin.z-=rot_aabb.size.z*2;
+ RID inst = VS::get_singleton()->instance_create2(mesh->get_rid(),scen);
+ VS::get_singleton()->instance_set_transform(inst,xform);
+ ep.step(TTR("Thumbnail.."),i);
+ VS::get_singleton()->viewport_queue_screen_capture(vp);
+ Main::iteration();
+ Image img = VS::get_singleton()->viewport_get_screen_capture(vp);
+ ERR_CONTINUE(img.empty());
+ Ref<ImageTexture> it( memnew( ImageTexture ));
+ it->create_from_image(img);
+ p_library->set_item_preview(id,it);
+
+ //print_line("loaded image, size: "+rtos(m)+" dist: "+rtos(dist)+" empty?"+itos(img.empty())+" w: "+itos(it->get_width())+" h: "+itos(it->get_height()));
+ VS::get_singleton()->free(inst);
+ }
+
+ VS::get_singleton()->free(lightinst);
+ VS::get_singleton()->free(light);
+ VS::get_singleton()->free(vp);
+ VS::get_singleton()->free(cam);
+ VS::get_singleton()->free(scen);
+ }
+
+
+}
+
+
+void MeshLibraryEditor::_import_scene_cbk(const String& p_str) {
+
+
+ print_line("Impot Callback!");
+
+ Ref<PackedScene> ps = ResourceLoader::load(p_str,"PackedScene");
+ ERR_FAIL_COND(ps.is_null());
+ Node *scene = ps->instance();
+
+ _import_scene(scene,theme,option==MENU_OPTION_UPDATE_FROM_SCENE);
+
+ memdelete(scene);
+ theme->set_meta("_editor_source_scene",p_str);
+ menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE),false);
+
+}
+
+Error MeshLibraryEditor::update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml,bool p_merge) {
+
+ _import_scene(p_base_scene,ml,p_merge);
+ return OK;
+}
+
+
+void MeshLibraryEditor::_menu_cbk(int p_option) {
+
+ option=p_option;
+ switch(p_option) {
+
+ case MENU_OPTION_ADD_ITEM: {
+
+ theme->create_item(theme->get_last_unused_item_id());
+ } break;
+ case MENU_OPTION_REMOVE_ITEM: {
+
+ String p = editor->get_property_editor()->get_selected_path();
+ if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/")>=3) {
+
+ to_erase = p.get_slice("/",3).to_int();
+ cd->set_text(vformat(TTR("Remove item %d?"),to_erase));
+ cd->popup_centered(Size2(300,60));
+ }
+ } break;
+ case MENU_OPTION_IMPORT_FROM_SCENE: {
+
+ file->popup_centered_ratio();
+ } break;
+ case MENU_OPTION_UPDATE_FROM_SCENE: {
+
+ cd->set_text("Update from existing scene?:\n"+String(theme->get_meta("_editor_source_scene")));
+ cd->popup_centered(Size2(500,60));
+ } break;
+ }
+}
+
+
+void MeshLibraryEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_cbk",&MeshLibraryEditor::_menu_cbk);
+ ClassDB::bind_method("_menu_confirm",&MeshLibraryEditor::_menu_confirm);
+ ClassDB::bind_method("_import_scene_cbk",&MeshLibraryEditor::_import_scene_cbk);
+}
+
+MeshLibraryEditor::MeshLibraryEditor(EditorNode *p_editor) {
+
+ file = memnew( EditorFileDialog );
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ //not for now?
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+ file->clear_filters();
+ file->set_title(TTR("Import Scene"));
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+ add_child(file);
+ file->connect("file_selected",this,"_import_scene_cbk");
+
+ Panel *panel = memnew( Panel );
+ panel->set_area_as_parent_rect();
+ add_child(panel);
+ MenuButton * options = memnew( MenuButton );
+ panel->add_child(options);
+ options->set_pos(Point2(1,1));
+ options->set_text("Theme");
+ options->get_popup()->add_item(TTR("Add Item"),MENU_OPTION_ADD_ITEM);
+ options->get_popup()->add_item(TTR("Remove Selected Item"),MENU_OPTION_REMOVE_ITEM);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Import from Scene"),MENU_OPTION_IMPORT_FROM_SCENE);
+ options->get_popup()->add_item(TTR("Update from Scene"),MENU_OPTION_UPDATE_FROM_SCENE);
+ options->get_popup()->set_item_disabled(options->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE),true);
+ options->get_popup()->connect("id_pressed", this,"_menu_cbk");
+ menu=options;
+ editor=p_editor;
+ cd = memnew(ConfirmationDialog);
+ add_child(cd);
+ cd->get_ok()->connect("pressed", this,"_menu_confirm");
+
+}
+
+void MeshLibraryEditorPlugin::edit(Object *p_node) {
+
+ if (p_node && p_node->cast_to<MeshLibrary>()) {
+ theme_editor->edit( p_node->cast_to<MeshLibrary>() );
+ theme_editor->show();
+ } else
+ theme_editor->hide();
+}
+
+bool MeshLibraryEditorPlugin::handles(Object *p_node) const{
+
+ return p_node->is_type("MeshLibrary");
+}
+
+void MeshLibraryEditorPlugin::make_visible(bool p_visible){
+
+ if (p_visible)
+ theme_editor->show();
+ else
+ theme_editor->hide();
+}
+
+MeshLibraryEditorPlugin::MeshLibraryEditorPlugin(EditorNode *p_node) {
+
+ EDITOR_DEF("editors/grid_map/preview_size",64);
+ theme_editor = memnew( MeshLibraryEditor(p_node) );
+
+ p_node->get_viewport()->add_child(theme_editor);
+ theme_editor->set_area_as_parent_rect();
+ theme_editor->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
+ theme_editor->set_anchor( MARGIN_BOTTOM, Control::ANCHOR_BEGIN );
+ theme_editor->set_end( Point2(0,22) );
+ theme_editor->hide();
+
+}
+#endif
diff --git a/editor/plugins/cube_grid_theme_editor_plugin.h b/editor/plugins/cube_grid_theme_editor_plugin.h
new file mode 100644
index 0000000000..07e7c7cadd
--- /dev/null
+++ b/editor/plugins/cube_grid_theme_editor_plugin.h
@@ -0,0 +1,96 @@
+/*************************************************************************/
+/* cube_grid_theme_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef CUBE_GRID_THEME_EDITOR_PLUGIN_H
+#define CUBE_GRID_THEME_EDITOR_PLUGIN_H
+
+#include "scene/resources/mesh_library.h"
+#include "editor/editor_node.h"
+
+#if 0
+class MeshLibraryEditor : public Control {
+
+ GDCLASS( MeshLibraryEditor, Control );
+
+ Ref<MeshLibrary> theme;
+
+ EditorNode *editor;
+ MenuButton *menu;
+ ConfirmationDialog *cd;
+ EditorFileDialog *file;
+ int to_erase;
+
+ enum {
+
+ MENU_OPTION_ADD_ITEM,
+ MENU_OPTION_REMOVE_ITEM,
+ MENU_OPTION_UPDATE_FROM_SCENE,
+ MENU_OPTION_IMPORT_FROM_SCENE
+ };
+
+ int option;
+ void _import_scene_cbk(const String& p_str);
+ void _menu_cbk(int p_option);
+ void _menu_confirm();
+
+ static void _import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge);
+
+protected:
+ static void _bind_methods();
+public:
+
+ void edit(const Ref<MeshLibrary>& p_theme);
+ static Error update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml,bool p_merge=true);
+
+ MeshLibraryEditor(EditorNode *p_editor);
+};
+
+
+
+class MeshLibraryEditorPlugin : public EditorPlugin {
+
+ GDCLASS( MeshLibraryEditorPlugin, EditorPlugin );
+
+ MeshLibraryEditor *theme_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "MeshLibrary"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ MeshLibraryEditorPlugin(EditorNode *p_node);
+
+};
+
+
+#endif // CUBE_GRID_THEME_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
new file mode 100644
index 0000000000..3f31f1e0f1
--- /dev/null
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -0,0 +1,907 @@
+/*************************************************************************/
+/* editor_preview_plugins.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "editor_preview_plugins.h"
+
+#include "io/resource_loader.h"
+#include "editor/editor_settings.h"
+#include "io/file_access_memory.h"
+#include "os/os.h"
+#include "scene/resources/material.h"
+//#include "scene/resources/sample.h"
+#include "scene/resources/mesh.h"
+#include "scene/resources/bit_mask.h"
+#include "editor/editor_scale.h"
+
+#if 0
+bool EditorTexturePreviewPlugin::handles(const String& p_type) const {
+
+ return (ClassDB::is_type(p_type,"ImageTexture") || ClassDB::is_type(p_type, "AtlasTexture"));
+}
+
+Ref<Texture> EditorTexturePreviewPlugin::generate(const RES& p_from) {
+
+ Image img;
+ Ref<AtlasTexture> atex = p_from;
+ if (atex.is_valid()) {
+ Ref<ImageTexture> tex = atex->get_atlas();
+ if (!tex.is_valid()) {
+ return Ref<Texture>();
+ }
+ Image atlas = tex->get_data();
+ img = atlas.get_rect(atex->get_region());
+ }
+ else {
+ Ref<ImageTexture> tex = p_from;
+ img = tex->get_data();
+ }
+
+ if (img.empty())
+ return Ref<Texture>();
+
+ img.clear_mipmaps();
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ if (img.is_compressed()) {
+ if (img.decompress()!=OK)
+ return Ref<Texture>();
+ } else if (img.get_format()!=Image::FORMAT_RGB8 && img.get_format()!=Image::FORMAT_RGBA8) {
+ img.convert(Image::FORMAT_RGBA8);
+ }
+
+ int width,height;
+ if (img.get_width() > thumbnail_size && img.get_width() >= img.get_height()) {
+
+ width=thumbnail_size;
+ height = img.get_height() * thumbnail_size / img.get_width();
+ } else if (img.get_height() > thumbnail_size && img.get_height() >= img.get_width()) {
+
+ height=thumbnail_size;
+ width = img.get_width() * thumbnail_size / img.get_height();
+ } else {
+
+ width=img.get_width();
+ height=img.get_height();
+ }
+
+ img.resize(width,height);
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture ));
+
+ ptex->create_from_image(img,0);
+ return ptex;
+
+}
+
+EditorTexturePreviewPlugin::EditorTexturePreviewPlugin() {
+
+
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+bool EditorBitmapPreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"BitMap");
+}
+
+Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES& p_from) {
+
+ Ref<BitMap> bm =p_from;
+
+ if (bm->get_size()==Size2()) {
+ return Ref<Texture>();
+ }
+
+ PoolVector<uint8_t> data;
+
+ data.resize(bm->get_size().width*bm->get_size().height);
+
+ {
+ PoolVector<uint8_t>::Write w=data.write();
+
+ for(int i=0;i<bm->get_size().width;i++) {
+ for(int j=0;j<bm->get_size().height;j++) {
+ if (bm->get_bit(Point2i(i,j))) {
+ w[j*bm->get_size().width+i]=255;
+ } else {
+ w[j*bm->get_size().width+i]=0;
+
+ }
+ }
+
+ }
+ }
+
+
+ Image img(bm->get_size().width,bm->get_size().height,0,Image::FORMAT_L8,data);
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ if (img.is_compressed()) {
+ if (img.decompress()!=OK)
+ return Ref<Texture>();
+ } else if (img.get_format()!=Image::FORMAT_RGB8 && img.get_format()!=Image::FORMAT_RGBA8) {
+ img.convert(Image::FORMAT_RGBA8);
+ }
+
+ int width,height;
+ if (img.get_width() > thumbnail_size && img.get_width() >= img.get_height()) {
+
+ width=thumbnail_size;
+ height = img.get_height() * thumbnail_size / img.get_width();
+ } else if (img.get_height() > thumbnail_size && img.get_height() >= img.get_width()) {
+
+ height=thumbnail_size;
+ width = img.get_width() * thumbnail_size / img.get_height();
+ } else {
+
+ width=img.get_width();
+ height=img.get_height();
+ }
+
+ img.resize(width,height);
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture ));
+
+ ptex->create_from_image(img,0);
+ return ptex;
+
+}
+
+EditorBitmapPreviewPlugin::EditorBitmapPreviewPlugin() {
+
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+
+Ref<Texture> EditorPackedScenePreviewPlugin::_gen_from_imd(Ref<ResourceImportMetadata> p_imd) {
+
+ if (p_imd.is_null()) {
+ return Ref<Texture>();
+ }
+
+ if (!p_imd->has_option("thumbnail"))
+ return Ref<Texture>();
+
+ Variant tn = p_imd->get_option("thumbnail");
+ //print_line(Variant::get_type_name(tn.get_type()));
+ PoolVector<uint8_t> thumbnail = tn;
+
+ int len = thumbnail.size();
+ if (len==0)
+ return Ref<Texture>();
+
+
+ PoolVector<uint8_t>::Read r = thumbnail.read();
+
+ Image img(r.ptr(),len);
+ if (img.empty())
+ return Ref<Texture>();
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture ));
+ ptex->create_from_image(img,0);
+ return ptex;
+
+}
+
+bool EditorPackedScenePreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"PackedScene");
+}
+Ref<Texture> EditorPackedScenePreviewPlugin::generate(const RES& p_from) {
+
+ Ref<ResourceImportMetadata> imd = p_from->get_import_metadata();
+ return _gen_from_imd(imd);
+}
+
+Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String& p_path) {
+
+ Ref<ResourceImportMetadata> imd = ResourceLoader::load_import_metadata(p_path);
+ return _gen_from_imd(imd);
+}
+
+EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() {
+
+}
+
+//////////////////////////////////////////////////////////////////
+
+bool EditorMaterialPreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"Material"); //any material
+}
+
+Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES& p_from) {
+
+ Ref<Material> material = p_from;
+ ERR_FAIL_COND_V(material.is_null(),Ref<Texture>());
+
+ VS::get_singleton()->mesh_surface_set_material(sphere,0,material->get_rid());
+
+ VS::get_singleton()->viewport_queue_screen_capture(viewport);
+ VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RENDER_TARGET_UPDATE_ONCE); //once used for capture
+ //print_line("queue capture!");
+ Image img;
+
+ int timeout=1000;
+ while(timeout) {
+ //print_line("try capture?");
+ OS::get_singleton()->delay_usec(10);
+ img = VS::get_singleton()->viewport_get_screen_capture(viewport);
+ if (!img.empty())
+ break;
+ timeout--;
+ }
+
+ //print_line("captured!");
+ VS::get_singleton()->mesh_surface_set_material(sphere,0,RID());
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ img.resize(thumbnail_size,thumbnail_size);
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture ));
+ ptex->create_from_image(img,0);
+ return ptex;
+}
+
+EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
+
+ scenario = VS::get_singleton()->scenario_create();
+
+ viewport = VS::get_singleton()->viewport_create();
+ VS::get_singleton()->viewport_set_as_render_target(viewport,true);
+ VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RENDER_TARGET_UPDATE_DISABLED);
+ VS::get_singleton()->viewport_set_scenario(viewport,scenario);
+ VS::ViewportRect vr;
+ vr.x=0;
+ vr.y=0;
+ vr.width=128;
+ vr.height=128;
+ VS::get_singleton()->viewport_set_rect(viewport,vr);
+
+ camera = VS::get_singleton()->camera_create();
+ VS::get_singleton()->viewport_attach_camera(viewport,camera);
+ VS::get_singleton()->camera_set_transform(camera,Transform(Matrix3(),Vector3(0,0,3)));
+ VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
+
+ light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
+ light_instance = VS::get_singleton()->instance_create2(light,scenario);
+ VS::get_singleton()->instance_set_transform(light_instance,Transform().looking_at(Vector3(-1,-1,-1),Vector3(0,1,0)));
+
+ light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
+ VS::get_singleton()->light_set_color(light2,VS::LIGHT_COLOR_DIFFUSE,Color(0.7,0.7,0.7));
+ VS::get_singleton()->light_set_color(light2,VS::LIGHT_COLOR_SPECULAR,Color(0.0,0.0,0.0));
+ light_instance2 = VS::get_singleton()->instance_create2(light2,scenario);
+
+ VS::get_singleton()->instance_set_transform(light_instance2,Transform().looking_at(Vector3(0,1,0),Vector3(0,0,1)));
+
+ sphere = VS::get_singleton()->mesh_create();
+ sphere_instance = VS::get_singleton()->instance_create2(sphere,scenario);
+
+ int lats=32;
+ int lons=32;
+ float radius=1.0;
+
+ PoolVector<Vector3> vertices;
+ PoolVector<Vector3> normals;
+ PoolVector<Vector2> uvs;
+ PoolVector<float> tangents;
+ Matrix3 tt = Matrix3(Vector3(0,1,0),Math_PI*0.5);
+
+ for(int i = 1; i <= lats; i++) {
+ double lat0 = Math_PI * (-0.5 + (double) (i - 1) / lats);
+ double z0 = Math::sin(lat0);
+ double zr0 = Math::cos(lat0);
+
+ double lat1 = Math_PI * (-0.5 + (double) i / lats);
+ double z1 = Math::sin(lat1);
+ double zr1 = Math::cos(lat1);
+
+ for(int j = lons; j >= 1; j--) {
+
+ double lng0 = 2 * Math_PI * (double) (j - 1) / lons;
+ double x0 = Math::cos(lng0);
+ double y0 = Math::sin(lng0);
+
+ double lng1 = 2 * Math_PI * (double) (j) / lons;
+ double x1 = Math::cos(lng1);
+ double y1 = Math::sin(lng1);
+
+
+ Vector3 v[4]={
+ Vector3(x1 * zr0, z0, y1 *zr0),
+ Vector3(x1 * zr1, z1, y1 *zr1),
+ Vector3(x0 * zr1, z1, y0 *zr1),
+ Vector3(x0 * zr0, z0, y0 *zr0)
+ };
+
+#define ADD_POINT(m_idx) \
+ normals.push_back(v[m_idx]);\
+ vertices.push_back(v[m_idx]*radius);\
+ { Vector2 uv(Math::atan2(v[m_idx].x,v[m_idx].z),Math::atan2(-v[m_idx].y,v[m_idx].z));\
+ uv/=Math_PI;\
+ uv*=4.0;\
+ uv=uv*0.5+Vector2(0.5,0.5);\
+ uvs.push_back(uv);\
+ }\
+ { Vector3 t = tt.xform(v[m_idx]);\
+ tangents.push_back(t.x);\
+ tangents.push_back(t.y);\
+ tangents.push_back(t.z);\
+ tangents.push_back(1.0);\
+ }
+
+
+
+ ADD_POINT(0);
+ ADD_POINT(1);
+ ADD_POINT(2);
+
+ ADD_POINT(2);
+ ADD_POINT(3);
+ ADD_POINT(0);
+ }
+ }
+
+ Array arr;
+ arr.resize(VS::ARRAY_MAX);
+ arr[VS::ARRAY_VERTEX]=vertices;
+ arr[VS::ARRAY_NORMAL]=normals;
+ arr[VS::ARRAY_TANGENT]=tangents;
+ arr[VS::ARRAY_TEX_UV]=uvs;
+ VS::get_singleton()->mesh_add_surface(sphere,VS::PRIMITIVE_TRIANGLES,arr);
+
+}
+
+EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() {
+
+ VS::get_singleton()->free(sphere);
+ VS::get_singleton()->free(sphere_instance);
+ VS::get_singleton()->free(viewport);
+ VS::get_singleton()->free(light);
+ VS::get_singleton()->free(light_instance);
+ VS::get_singleton()->free(light2);
+ VS::get_singleton()->free(light_instance2);
+ VS::get_singleton()->free(camera);
+ VS::get_singleton()->free(scenario);
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+static bool _is_text_char(CharType c) {
+
+ return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_';
+}
+
+bool EditorScriptPreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"Script");
+}
+
+Ref<Texture> EditorScriptPreviewPlugin::generate(const RES& p_from) {
+
+
+ Ref<Script> scr = p_from;
+ if (scr.is_null())
+ return Ref<Texture>();
+
+ String code = scr->get_source_code().strip_edges();
+ if (code=="")
+ return Ref<Texture>();
+
+ List<String> kwors;
+ scr->get_language()->get_reserved_words(&kwors);
+
+ Set<String> keywords;
+
+ for(List<String>::Element *E=kwors.front();E;E=E->next()) {
+
+ keywords.insert(E->get());
+
+ }
+
+
+ int line = 0;
+ int col=0;
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ Image img(thumbnail_size,thumbnail_size,0,Image::FORMAT_RGBA8);
+
+
+
+ Color bg_color = EditorSettings::get_singleton()->get("text_editor/highlighting/background_color");
+ bg_color.a=1.0;
+ Color keyword_color = EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color");
+ Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color");
+ Color symbol_color = EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color");
+
+
+ for(int i=0;i<thumbnail_size;i++) {
+ for(int j=0;j<thumbnail_size;j++) {
+ img.put_pixel(i,j,bg_color);
+ }
+
+ }
+
+ bool prev_is_text=false;
+ bool in_keyword=false;
+ for(int i=0;i<code.length();i++) {
+
+ CharType c = code[i];
+ if (c>32) {
+ if (col<thumbnail_size) {
+ Color color = text_color;
+
+ if (c!='_' && ((c>='!' && c<='/') || (c>=':' && c<='@') || (c>='[' && c<='`') || (c>='{' && c<='~') || c=='\t')) {
+ //make symbol a little visible
+ color=symbol_color;
+ in_keyword=false;
+ } else if (!prev_is_text && _is_text_char(c)) {
+ int pos = i;
+
+ while(_is_text_char(code[pos])) {
+ pos++;
+ }
+ ///print_line("from "+itos(i)+" to "+itos(pos));
+ String word = code.substr(i,pos-i);
+ //print_line("found word: "+word);
+ if (keywords.has(word))
+ in_keyword=true;
+
+ } else if (!_is_text_char(c)) {
+ in_keyword=false;
+ }
+
+ if (in_keyword)
+ color=keyword_color;
+
+ Color ul=color;
+ ul.a*=0.5;
+ img.put_pixel(col,line*2,bg_color.blend(ul));
+ img.put_pixel(col,line*2+1,color);
+
+ prev_is_text=_is_text_char(c);
+ }
+ } else {
+
+ prev_is_text=false;
+ in_keyword=false;
+
+ if (c=='\n') {
+ col=0;
+ line++;
+ if (line>=thumbnail_size/2)
+ break;
+ } else if (c=='\t') {
+ col+=3;
+ }
+ }
+ col++;
+ }
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture));
+
+ ptex->create_from_image(img,0);
+ return ptex;
+
+}
+
+EditorScriptPreviewPlugin::EditorScriptPreviewPlugin() {
+
+
+}
+///////////////////////////////////////////////////////////////////
+#if 0
+bool EditorSamplePreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"Sample");
+}
+
+Ref<Texture> EditorSamplePreviewPlugin::generate(const RES& p_from) {
+
+ Ref<Sample> smp =p_from;
+ ERR_FAIL_COND_V(smp.is_null(),Ref<Texture>());
+
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ PoolVector<uint8_t> img;
+ int w = thumbnail_size;
+ int h = thumbnail_size;
+ img.resize(w*h*3);
+
+ PoolVector<uint8_t>::Write imgdata = img.write();
+ uint8_t * imgw = imgdata.ptr();
+ PoolVector<uint8_t> data = smp->get_data();
+ PoolVector<uint8_t>::Read sampledata = data.read();
+ const uint8_t *sdata=sampledata.ptr();
+
+ bool stereo = smp->is_stereo();
+ bool _16=smp->get_format()==Sample::FORMAT_PCM16;
+ int len = smp->get_length();
+
+ if (len<1)
+ return Ref<Texture>();
+
+ if (smp->get_format()==Sample::FORMAT_IMA_ADPCM) {
+
+ struct IMA_ADPCM_State {
+
+ int16_t step_index;
+ int32_t predictor;
+ /* values at loop point */
+ int16_t loop_step_index;
+ int32_t loop_predictor;
+ int32_t last_nibble;
+ int32_t loop_pos;
+ int32_t window_ofs;
+ const uint8_t *ptr;
+ } ima_adpcm;
+
+ ima_adpcm.step_index=0;
+ ima_adpcm.predictor=0;
+ ima_adpcm.loop_step_index=0;
+ ima_adpcm.loop_predictor=0;
+ ima_adpcm.last_nibble=-1;
+ ima_adpcm.loop_pos=0x7FFFFFFF;
+ ima_adpcm.window_ofs=0;
+ ima_adpcm.ptr=NULL;
+
+
+ for(int i=0;i<w;i++) {
+
+ float max[2]={-1e10,-1e10};
+ float min[2]={1e10,1e10};
+ int from = i*len/w;
+ int to = (i+1)*len/w;
+ if (to>=len)
+ to=len-1;
+
+ for(int j=from;j<to;j++) {
+
+ while(j>ima_adpcm.last_nibble) {
+
+ static const int16_t _ima_adpcm_step_table[89] = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+ };
+
+ static const int8_t _ima_adpcm_index_table[16] = {
+ -1, -1, -1, -1, 2, 4, 6, 8,
+ -1, -1, -1, -1, 2, 4, 6, 8
+ };
+
+ int16_t nibble,diff,step;
+
+ ima_adpcm.last_nibble++;
+ const uint8_t *src_ptr=sdata;
+
+ int ofs = ima_adpcm.last_nibble>>1;
+
+ if (stereo)
+ ofs*=2;
+
+
+ nibble = (ima_adpcm.last_nibble&1)?
+ (src_ptr[ofs]>>4):(src_ptr[ofs]&0xF);
+ step=_ima_adpcm_step_table[ima_adpcm.step_index];
+
+ ima_adpcm.step_index += _ima_adpcm_index_table[nibble];
+ if (ima_adpcm.step_index<0)
+ ima_adpcm.step_index=0;
+ if (ima_adpcm.step_index>88)
+ ima_adpcm.step_index=88;
+
+ diff = step >> 3 ;
+ if (nibble & 1)
+ diff += step >> 2 ;
+ if (nibble & 2)
+ diff += step >> 1 ;
+ if (nibble & 4)
+ diff += step ;
+ if (nibble & 8)
+ diff = -diff ;
+
+ ima_adpcm.predictor+=diff;
+ if (ima_adpcm.predictor<-0x8000)
+ ima_adpcm.predictor=-0x8000;
+ else if (ima_adpcm.predictor>0x7FFF)
+ ima_adpcm.predictor=0x7FFF;
+
+
+ /* store loop if there */
+ if (ima_adpcm.last_nibble==ima_adpcm.loop_pos) {
+
+ ima_adpcm.loop_step_index = ima_adpcm.step_index;
+ ima_adpcm.loop_predictor = ima_adpcm.predictor;
+ }
+
+ }
+
+ float v=ima_adpcm.predictor/32767.0;
+ if (v>max[0])
+ max[0]=v;
+ if (v<min[0])
+ min[0]=v;
+ }
+ max[0]*=0.8;
+ min[0]*=0.8;
+
+ for(int j=0;j<h;j++) {
+ float v = (j/(float)h) * 2.0 - 1.0;
+ uint8_t* imgofs = &imgw[(uint64_t(j)*w+i)*3];
+ if (v>min[0] && v<max[0]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+ }
+ } else {
+ for(int i=0;i<w;i++) {
+ // i trust gcc will optimize this loop
+ float max[2]={-1e10,-1e10};
+ float min[2]={1e10,1e10};
+ int c=stereo?2:1;
+ int from = uint64_t(i)*len/w;
+ int to = (uint64_t(i)+1)*len/w;
+ if (to>=len)
+ to=len-1;
+
+ if (_16) {
+ const int16_t*src =(const int16_t*)sdata;
+
+ for(int j=0;j<c;j++) {
+
+ for(int k=from;k<=to;k++) {
+
+ float v = src[uint64_t(k)*c+j]/32768.0;
+ if (v>max[j])
+ max[j]=v;
+ if (v<min[j])
+ min[j]=v;
+ }
+
+ }
+ } else {
+
+ const int8_t*src =(const int8_t*)sdata;
+
+ for(int j=0;j<c;j++) {
+
+ for(int k=from;k<=to;k++) {
+
+ float v = src[uint64_t(k)*c+j]/128.0;
+ if (v>max[j])
+ max[j]=v;
+ if (v<min[j])
+ min[j]=v;
+ }
+
+ }
+ }
+
+ max[0]*=0.8;
+ max[1]*=0.8;
+ min[0]*=0.8;
+ min[1]*=0.8;
+
+ if (!stereo) {
+ for(int j=0;j<h;j++) {
+ float v = (j/(float)h) * 2.0 - 1.0;
+ uint8_t* imgofs = &imgw[(j*w+i)*3];
+ if (v>min[0] && v<max[0]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+ } else {
+
+ for(int j=0;j<h;j++) {
+
+ int half;
+ float v;
+ if (j<(h/2)) {
+ half=0;
+ v = (j/(float)(h/2)) * 2.0 - 1.0;
+ } else {
+ half=1;
+ if( (float)(h/2) != 0 ) {
+ v = ((j-(h/2))/(float)(h/2)) * 2.0 - 1.0;
+ } else {
+ v = ((j-(h/2))/(float)(1/2)) * 2.0 - 1.0;
+ }
+ }
+
+ uint8_t* imgofs = &imgw[(j*w+i)*3];
+ if (v>min[half] && v<max[half]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+
+ }
+
+ }
+ }
+
+ imgdata = PoolVector<uint8_t>::Write();
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture));
+ ptex->create_from_image(Image(w,h,0,Image::FORMAT_RGB8,img),0);
+ return ptex;
+
+}
+
+EditorSamplePreviewPlugin::EditorSamplePreviewPlugin() {
+
+
+}
+#endif
+///////////////////////////////////////////////////////////////////////////
+
+bool EditorMeshPreviewPlugin::handles(const String& p_type) const {
+
+ return ClassDB::is_type(p_type,"Mesh"); //any Mesh
+}
+
+Ref<Texture> EditorMeshPreviewPlugin::generate(const RES& p_from) {
+
+ Ref<Mesh> mesh = p_from;
+ ERR_FAIL_COND_V(mesh.is_null(),Ref<Texture>());
+
+ VS::get_singleton()->instance_set_base(mesh_instance,mesh->get_rid());
+
+ AABB aabb= mesh->get_aabb();
+ Vector3 ofs = aabb.pos + aabb.size*0.5;
+ aabb.pos-=ofs;
+ Transform xform;
+ xform.basis=Matrix3().rotated(Vector3(0,1,0),-Math_PI*0.125);
+ xform.basis = Matrix3().rotated(Vector3(1,0,0),Math_PI*0.125)*xform.basis;
+ AABB rot_aabb = xform.xform(aabb);
+ float m = MAX(rot_aabb.size.x,rot_aabb.size.y)*0.5;
+ if (m==0)
+ return Ref<Texture>();
+ m=1.0/m;
+ m*=0.5;
+ //print_line("scale: "+rtos(m));
+ xform.basis.scale(Vector3(m,m,m));
+ xform.origin=-xform.basis.xform(ofs); //-ofs*m;
+ xform.origin.z-=rot_aabb.size.z*2;
+ VS::get_singleton()->instance_set_transform(mesh_instance,xform);
+
+
+
+ VS::get_singleton()->viewport_queue_screen_capture(viewport);
+ VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RENDER_TARGET_UPDATE_ONCE); //once used for capture
+ //print_line("queue capture!");
+ Image img;
+
+ int timeout=1000;
+ while(timeout) {
+ //print_line("try capture?");
+ OS::get_singleton()->delay_usec(10);
+ img = VS::get_singleton()->viewport_get_screen_capture(viewport);
+ if (!img.empty())
+ break;
+ timeout--;
+ }
+
+ //print_line("captured!");
+ VS::get_singleton()->instance_set_base(mesh_instance,RID());
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size*=EDSCALE;
+ img.resize(thumbnail_size,thumbnail_size);
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>( memnew( ImageTexture ));
+ ptex->create_from_image(img,0);
+ return ptex;
+}
+
+EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
+
+ scenario = VS::get_singleton()->scenario_create();
+ viewport = VS::get_singleton()->viewport_create();
+ VS::get_singleton()->viewport_set_as_render_target(viewport,true);
+ VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RENDER_TARGET_UPDATE_DISABLED);
+ VS::get_singleton()->viewport_set_scenario(viewport,scenario);
+ VS::ViewportRect vr;
+ vr.x=0;
+ vr.y=0;
+ vr.width=128;
+ vr.height=128;
+ VS::get_singleton()->viewport_set_rect(viewport,vr);
+
+ camera = VS::get_singleton()->camera_create();
+ VS::get_singleton()->viewport_attach_camera(viewport,camera);
+ VS::get_singleton()->camera_set_transform(camera,Transform(Matrix3(),Vector3(0,0,3)));
+ //VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
+ VS::get_singleton()->camera_set_orthogonal(camera,1.0,0.01,1000.0);
+
+ light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
+ light_instance = VS::get_singleton()->instance_create2(light,scenario);
+ VS::get_singleton()->instance_set_transform(light_instance,Transform().looking_at(Vector3(-1,-1,-1),Vector3(0,1,0)));
+
+ light2 = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL);
+ VS::get_singleton()->light_set_color(light2,VS::LIGHT_COLOR_DIFFUSE,Color(0.7,0.7,0.7));
+ VS::get_singleton()->light_set_color(light2,VS::LIGHT_COLOR_SPECULAR,Color(0.0,0.0,0.0));
+ light_instance2 = VS::get_singleton()->instance_create2(light2,scenario);
+
+ VS::get_singleton()->instance_set_transform(light_instance2,Transform().looking_at(Vector3(0,1,0),Vector3(0,0,1)));
+
+ //sphere = VS::get_singleton()->mesh_create();
+ mesh_instance = VS::get_singleton()->instance_create();
+ VS::get_singleton()->instance_set_scenario(mesh_instance,scenario);
+
+
+
+}
+
+
+EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() {
+
+ //VS::get_singleton()->free(sphere);
+ VS::get_singleton()->free(mesh_instance);
+ VS::get_singleton()->free(viewport);
+ VS::get_singleton()->free(light);
+ VS::get_singleton()->free(light_instance);
+ VS::get_singleton()->free(light2);
+ VS::get_singleton()->free(light_instance2);
+ VS::get_singleton()->free(camera);
+ VS::get_singleton()->free(scenario);
+
+}
+#endif
diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h
new file mode 100644
index 0000000000..b1d4fa0b38
--- /dev/null
+++ b/editor/plugins/editor_preview_plugins.h
@@ -0,0 +1,128 @@
+/*************************************************************************/
+/* editor_preview_plugins.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITORPREVIEWPLUGINS_H
+#define EDITORPREVIEWPLUGINS_H
+
+#include "editor/editor_resource_preview.h"
+
+#if 0
+class EditorTexturePreviewPlugin : public EditorResourcePreviewGenerator {
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorTexturePreviewPlugin();
+};
+
+
+class EditorBitmapPreviewPlugin : public EditorResourcePreviewGenerator {
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorBitmapPreviewPlugin();
+};
+
+
+
+class EditorPackedScenePreviewPlugin : public EditorResourcePreviewGenerator {
+
+ Ref<Texture> _gen_from_imd(Ref<ResourceImportMetadata> p_imd);
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+ virtual Ref<Texture> generate_from_path(const String& p_path);
+
+ EditorPackedScenePreviewPlugin();
+};
+
+class EditorMaterialPreviewPlugin : public EditorResourcePreviewGenerator {
+
+ RID scenario;
+ RID sphere;
+ RID sphere_instance;
+ RID viewport;
+ RID light;
+ RID light_instance;
+ RID light2;
+ RID light_instance2;
+ RID camera;
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorMaterialPreviewPlugin();
+ ~EditorMaterialPreviewPlugin();
+};
+
+class EditorScriptPreviewPlugin : public EditorResourcePreviewGenerator {
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorScriptPreviewPlugin();
+};
+
+#if 0
+class EditorSamplePreviewPlugin : public EditorResourcePreviewGenerator {
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorSamplePreviewPlugin();
+};
+
+#endif
+class EditorMeshPreviewPlugin : public EditorResourcePreviewGenerator {
+
+ RID scenario;
+ RID mesh_instance;
+ RID viewport;
+ RID light;
+ RID light_instance;
+ RID light2;
+ RID light_instance2;
+ RID camera;
+public:
+
+ virtual bool handles(const String& p_type) const;
+ virtual Ref<Texture> generate(const RES& p_from);
+
+ EditorMeshPreviewPlugin();
+ ~EditorMeshPreviewPlugin();
+};
+
+#endif
+#endif // EDITORPREVIEWPLUGINS_H
diff --git a/editor/plugins/gi_probe_editor_plugin.cpp b/editor/plugins/gi_probe_editor_plugin.cpp
new file mode 100644
index 0000000000..925ac8ef11
--- /dev/null
+++ b/editor/plugins/gi_probe_editor_plugin.cpp
@@ -0,0 +1,83 @@
+/*************************************************************************/
+/* gi_probe_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "gi_probe_editor_plugin.h"
+
+
+void GIProbeEditorPlugin::_bake() {
+
+ if (gi_probe) {
+ gi_probe->bake();
+ }
+}
+
+
+void GIProbeEditorPlugin::edit(Object *p_object) {
+
+ GIProbe * s = p_object->cast_to<GIProbe>();
+ if (!s)
+ return;
+
+ gi_probe=s;
+}
+
+bool GIProbeEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("GIProbe");
+}
+
+void GIProbeEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ bake->show();
+ } else {
+
+ bake->hide();
+ }
+
+}
+
+void GIProbeEditorPlugin::_bind_methods() {
+
+ ClassDB::bind_method("_bake",&GIProbeEditorPlugin::_bake);
+}
+
+GIProbeEditorPlugin::GIProbeEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ bake = memnew( Button );
+ bake->set_icon(editor->get_gui_base()->get_icon("BakedLight","EditorIcons"));
+ bake->hide();
+ bake->connect("pressed",this,"_bake");
+ add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU,bake);
+ gi_probe=NULL;
+}
+
+
+GIProbeEditorPlugin::~GIProbeEditorPlugin() {
+}
diff --git a/editor/plugins/gi_probe_editor_plugin.h b/editor/plugins/gi_probe_editor_plugin.h
new file mode 100644
index 0000000000..982a549368
--- /dev/null
+++ b/editor/plugins/gi_probe_editor_plugin.h
@@ -0,0 +1,65 @@
+/*************************************************************************/
+/* gi_probe_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef GIPROBEEDITORPLUGIN_H
+#define GIPROBEEDITORPLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/resources/material.h"
+#include "scene/3d/gi_probe.h"
+
+
+
+class GIProbeEditorPlugin : public EditorPlugin {
+
+ GDCLASS( GIProbeEditorPlugin, EditorPlugin );
+
+ GIProbe *gi_probe;
+
+ Button *bake;
+ EditorNode *editor;
+
+ void _bake();
+protected:
+
+ static void _bind_methods();
+public:
+
+ virtual String get_name() const { return "GIProbe"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ GIProbeEditorPlugin(EditorNode *p_node);
+ ~GIProbeEditorPlugin();
+
+};
+
+#endif // GIPROBEEDITORPLUGIN_H
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
new file mode 100644
index 0000000000..f31074a9dc
--- /dev/null
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -0,0 +1,381 @@
+/*************************************************************************/
+/* item_list_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "item_list_editor_plugin.h"
+
+#include "io/resource_loader.h"
+
+bool ItemListPlugin::_set(const StringName& p_name, const Variant& p_value) {
+
+ String name = p_name;
+ int idx = name.get_slice("/",0).to_int();
+ String what=name.get_slice("/",1);
+
+ if (what=="text")
+ set_item_text(idx,p_value);
+ else if (what=="icon")
+ set_item_icon(idx,p_value);
+ else if (what=="checkable")
+ set_item_checkable(idx,p_value);
+ else if (what=="checked")
+ set_item_checked(idx,p_value);
+ else if (what=="id")
+ set_item_id(idx,p_value);
+ else if (what=="enabled")
+ set_item_enabled(idx,p_value);
+ else if (what=="separator")
+ set_item_separator(idx,p_value);
+ else
+ return false;
+
+ return true;
+}
+
+bool ItemListPlugin::_get(const StringName& p_name,Variant &r_ret) const {
+
+ String name = p_name;
+ int idx = name.get_slice("/",0).to_int();
+ String what=name.get_slice("/",1);
+
+ if (what=="text")
+ r_ret=get_item_text(idx);
+ else if (what=="icon")
+ r_ret=get_item_icon(idx);
+ else if (what=="checkable")
+ r_ret=is_item_checkable(idx);
+ else if (what=="checked")
+ r_ret=is_item_checked(idx);
+ else if (what=="id")
+ r_ret=get_item_id(idx);
+ else if (what=="enabled")
+ r_ret=is_item_enabled(idx);
+ else if (what=="separator")
+ r_ret=is_item_separator(idx);
+ else
+ return false;
+
+ return true;
+}
+void ItemListPlugin::_get_property_list( List<PropertyInfo> *p_list) const {
+
+ for(int i=0;i<get_item_count();i++) {
+
+ String base=itos(i)+"/";
+
+ p_list->push_back( PropertyInfo(Variant::STRING,base+"text") );
+ p_list->push_back( PropertyInfo(Variant::OBJECT,base+"icon",PROPERTY_HINT_RESOURCE_TYPE,"Texture") );
+
+ int flags = get_flags();
+
+ if (flags&FLAG_CHECKABLE) {
+ p_list->push_back( PropertyInfo(Variant::BOOL,base+"checkable") );
+ p_list->push_back( PropertyInfo(Variant::BOOL,base+"checked") );
+ }
+
+ if (flags&FLAG_ID)
+ p_list->push_back( PropertyInfo(Variant::INT,base+"id",PROPERTY_HINT_RANGE,"-1,4096") );
+
+ if (flags&FLAG_ENABLE)
+ p_list->push_back( PropertyInfo(Variant::BOOL,base+"enabled") );
+
+ if (flags&FLAG_SEPARATOR)
+ p_list->push_back( PropertyInfo(Variant::BOOL,base+"separator") );
+ }
+}
+
+///////////////////////////////////////////////////////////////
+///////////////////////// PLUGINS /////////////////////////////
+///////////////////////////////////////////////////////////////
+
+void ItemListOptionButtonPlugin::set_object(Object *p_object) {
+
+ ob = p_object->cast_to<OptionButton>();
+}
+
+bool ItemListOptionButtonPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("OptionButton");
+}
+
+int ItemListOptionButtonPlugin::get_flags() const {
+
+ return FLAG_ICON|FLAG_ID|FLAG_ENABLE;
+}
+
+void ItemListOptionButtonPlugin::add_item() {
+
+ ob->add_item( vformat(TTR("Item %d"),ob->get_item_count()));
+ _change_notify();
+}
+
+int ItemListOptionButtonPlugin::get_item_count() const {
+
+ return ob->get_item_count();
+}
+
+void ItemListOptionButtonPlugin::erase(int p_idx) {
+
+ ob->remove_item(p_idx);
+ _change_notify();
+}
+
+ItemListOptionButtonPlugin::ItemListOptionButtonPlugin() {
+
+ ob=NULL;
+}
+
+///////////////////////////////////////////////////////////////
+
+void ItemListPopupMenuPlugin::set_object(Object *p_object) {
+
+ if (p_object->is_class("MenuButton"))
+ pp = p_object->cast_to<MenuButton>()->get_popup();
+ else
+ pp = p_object->cast_to<PopupMenu>();
+}
+
+bool ItemListPopupMenuPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("PopupMenu") || p_object->is_class("MenuButton");
+}
+
+int ItemListPopupMenuPlugin::get_flags() const {
+
+ return FLAG_ICON|FLAG_CHECKABLE|FLAG_ID|FLAG_ENABLE|FLAG_SEPARATOR;
+}
+
+void ItemListPopupMenuPlugin::add_item() {
+
+ pp->add_item( vformat(TTR("Item %d"),pp->get_item_count()));
+ _change_notify();
+}
+
+int ItemListPopupMenuPlugin::get_item_count() const {
+
+ return pp->get_item_count();
+}
+
+void ItemListPopupMenuPlugin::erase(int p_idx) {
+
+ pp->remove_item(p_idx);
+ _change_notify();
+}
+
+ItemListPopupMenuPlugin::ItemListPopupMenuPlugin() {
+
+ pp=NULL;
+}
+
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+
+void ItemListEditor::_node_removed(Node *p_node) {
+
+ if(p_node==item_list) {
+ item_list=NULL;
+ hide();
+ dialog->hide();
+ }
+}
+
+void ItemListEditor::_notification(int p_notification) {
+
+ if (p_notification==NOTIFICATION_ENTER_TREE) {
+
+ add_button->set_icon(get_icon("Add","EditorIcons"));
+ del_button->set_icon(get_icon("Remove","EditorIcons"));
+ }
+}
+
+void ItemListEditor::_add_pressed() {
+
+ if (selected_idx==-1)
+ return;
+
+ item_plugins[selected_idx]->add_item();
+}
+
+void ItemListEditor::_delete_pressed() {
+
+ TreeItem *ti = tree->get_selected();
+
+ if (!ti)
+ return;
+
+ if (ti->get_parent()!=tree->get_root())
+ return;
+
+ int idx = ti->get_text(0).to_int();
+
+ if (selected_idx==-1)
+ return;
+
+ item_plugins[selected_idx]->erase(idx);
+}
+
+void ItemListEditor::_edit_items() {
+
+ dialog->popup_centered(Vector2(300, 400));
+}
+
+void ItemListEditor::edit(Node *p_item_list) {
+
+ item_list=p_item_list;
+
+ if (!item_list) {
+ selected_idx=-1;
+ property_editor->edit(NULL);
+ return;
+ }
+
+ for(int i=0;i<item_plugins.size();i++) {
+ if (item_plugins[i]->handles(p_item_list)) {
+
+ item_plugins[i]->set_object(p_item_list);
+ property_editor->edit(item_plugins[i]);
+
+ if (has_icon(item_list->get_class(), "EditorIcons"))
+ toolbar_button->set_icon(get_icon(item_list->get_class(), "EditorIcons"));
+ else
+ toolbar_button->set_icon(Ref<Texture>());
+
+ selected_idx=i;
+ return;
+ }
+ }
+
+ selected_idx=-1;
+ property_editor->edit(NULL);
+}
+
+bool ItemListEditor::handles(Object *p_object) const {
+
+ for(int i=0;i<item_plugins.size();i++) {
+ if (item_plugins[i]->handles(p_object)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ItemListEditor::_bind_methods() {
+
+ ClassDB::bind_method("_edit_items",&ItemListEditor::_edit_items);
+ ClassDB::bind_method("_add_button",&ItemListEditor::_add_pressed);
+ ClassDB::bind_method("_delete_button",&ItemListEditor::_delete_pressed);
+}
+
+ItemListEditor::ItemListEditor() {
+
+ selected_idx=-1;
+
+ add_child( memnew( VSeparator ) );
+
+ toolbar_button = memnew( ToolButton );
+ toolbar_button->set_text(TTR("Items"));
+ add_child(toolbar_button);
+ toolbar_button->connect("pressed",this,"_edit_items");
+
+ dialog = memnew( AcceptDialog );
+ dialog->set_title(TTR("Item List Editor"));
+ add_child( dialog );
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ dialog->add_child(vbc);
+ //dialog->set_child_rect(vbc);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_child(hbc);
+
+ add_button = memnew( Button );
+ add_button->set_text(TTR("Add"));
+ hbc->add_child(add_button);
+ add_button->connect("pressed",this,"_add_button");
+
+ hbc->add_spacer();
+
+ del_button = memnew( Button );
+ del_button->set_text(TTR("Delete"));
+ hbc->add_child(del_button);
+ del_button->connect("pressed",this,"_delete_button");
+
+ property_editor = memnew( PropertyEditor );
+ property_editor->hide_top_label();
+ property_editor->set_subsection_selectable(true);
+ vbc->add_child(property_editor);
+ property_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ tree = property_editor->get_scene_tree();
+}
+
+ItemListEditor::~ItemListEditor() {
+
+ for(int i=0;i<item_plugins.size();i++)
+ memdelete( item_plugins[i] );
+}
+
+void ItemListEditorPlugin::edit(Object *p_object) {
+
+ item_list_editor->edit(p_object->cast_to<Node>());
+}
+
+bool ItemListEditorPlugin::handles(Object *p_object) const {
+
+ return item_list_editor->handles(p_object);
+}
+
+void ItemListEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ item_list_editor->show();
+ } else {
+
+ item_list_editor->hide();
+ item_list_editor->edit(NULL);
+ }
+}
+
+ItemListEditorPlugin::ItemListEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ item_list_editor = memnew( ItemListEditor );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(item_list_editor);
+
+ item_list_editor->hide();
+ item_list_editor->add_plugin( memnew( ItemListOptionButtonPlugin ) );
+ item_list_editor->add_plugin( memnew( ItemListPopupMenuPlugin ) );
+}
+
+ItemListEditorPlugin::~ItemListEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
new file mode 100644
index 0000000000..25d6ed6757
--- /dev/null
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -0,0 +1,230 @@
+/*************************************************************************/
+/* item_list_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef ITEM_LIST_EDITOR_PLUGIN_H
+#define ITEM_LIST_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "canvas_item_editor_plugin.h"
+
+#include "scene/gui/option_button.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/popup_menu.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+
+class ItemListPlugin : public Object {
+
+ GDCLASS(ItemListPlugin,Object);
+
+protected:
+
+ bool _set(const StringName& p_name, const Variant& p_value);
+ bool _get(const StringName& p_name,Variant &r_ret) const;
+ void _get_property_list( List<PropertyInfo> *p_list) const;
+
+public:
+
+ enum Flags {
+
+ FLAG_ICON=1,
+ FLAG_CHECKABLE=2,
+ FLAG_ID=4,
+ FLAG_ENABLE=8,
+ FLAG_SEPARATOR=16
+ };
+
+ virtual void set_object(Object *p_object)=0;
+ virtual bool handles(Object *p_object) const=0;
+
+ virtual int get_flags() const=0;
+
+ virtual void set_item_text(int p_idx, const String& p_text) {}
+ virtual String get_item_text(int p_idx) const{ return ""; };
+
+ virtual void set_item_icon(int p_idx, const Ref<Texture>& p_tex) {}
+ virtual Ref<Texture> get_item_icon(int p_idx) const{ return Ref<Texture>(); };
+
+ virtual void set_item_checkable(int p_idx, bool p_check) {}
+ virtual bool is_item_checkable(int p_idx) const{ return false; };
+
+ virtual void set_item_checked(int p_idx, bool p_checked) {}
+ virtual bool is_item_checked(int p_idx) const{ return false; };
+
+ virtual void set_item_enabled(int p_idx, int p_enabled) {}
+ virtual bool is_item_enabled(int p_idx) const{ return false; };
+
+ virtual void set_item_id(int p_idx, int p_id) {}
+ virtual int get_item_id(int p_idx) const{ return -1; };
+
+ virtual void set_item_separator(int p_idx, bool p_separator) {}
+ virtual bool is_item_separator(int p_idx) const { return false; };
+
+ virtual void add_item()=0;
+ virtual int get_item_count() const=0;
+ virtual void erase(int p_idx)=0;
+
+ ItemListPlugin() {}
+};
+
+///////////////////////////////////////////////////////////////
+
+class ItemListOptionButtonPlugin : public ItemListPlugin {
+
+ GDCLASS(ItemListOptionButtonPlugin,ItemListPlugin);
+
+ OptionButton *ob;
+public:
+
+ virtual void set_object(Object *p_object);
+ virtual bool handles(Object *p_object) const;
+ virtual int get_flags() const;
+
+ virtual void set_item_text(int p_idx, const String& p_text) { ob->set_item_text(p_idx,p_text); }
+ virtual String get_item_text(int p_idx) const { return ob->get_item_text(p_idx); }
+
+ virtual void set_item_icon(int p_idx, const Ref<Texture>& p_tex) { ob->set_item_icon(p_idx, p_tex); }
+ virtual Ref<Texture> get_item_icon(int p_idx) const { return ob->get_item_icon(p_idx); }
+
+ virtual void set_item_enabled(int p_idx, int p_enabled) { ob->set_item_disabled(p_idx, !p_enabled); }
+ virtual bool is_item_enabled(int p_idx) const { return !ob->is_item_disabled(p_idx); }
+
+ virtual void set_item_id(int p_idx, int p_id) { ob->set_item_ID(p_idx,p_id); }
+ virtual int get_item_id(int p_idx) const { return ob->get_item_ID(p_idx); }
+
+ virtual void add_item();
+ virtual int get_item_count() const;
+ virtual void erase(int p_idx);
+
+ ItemListOptionButtonPlugin();
+};
+
+class ItemListPopupMenuPlugin : public ItemListPlugin {
+
+ GDCLASS(ItemListPopupMenuPlugin,ItemListPlugin);
+
+ PopupMenu *pp;
+public:
+
+ virtual void set_object(Object *p_object);
+ virtual bool handles(Object *p_object) const;
+ virtual int get_flags() const;
+
+ virtual void set_item_text(int p_idx, const String& p_text) { pp->set_item_text(p_idx,p_text); }
+ virtual String get_item_text(int p_idx) const { return pp->get_item_text(p_idx); }
+
+ virtual void set_item_icon(int p_idx, const Ref<Texture>& p_tex) { pp->set_item_icon(p_idx,p_tex); }
+ virtual Ref<Texture> get_item_icon(int p_idx) const { return pp->get_item_icon(p_idx); }
+
+ virtual void set_item_checkable(int p_idx, bool p_check) { pp->set_item_as_checkable(p_idx,p_check); }
+ virtual bool is_item_checkable(int p_idx) const { return pp->is_item_checkable(p_idx); }
+
+ virtual void set_item_checked(int p_idx, bool p_checked) { pp->set_item_checked(p_idx,p_checked); }
+ virtual bool is_item_checked(int p_idx) const { return pp->is_item_checked(p_idx); }
+
+ virtual void set_item_enabled(int p_idx, int p_enabled) { pp->set_item_disabled(p_idx,!p_enabled); }
+ virtual bool is_item_enabled(int p_idx) const { return !pp->is_item_disabled(p_idx); }
+
+ virtual void set_item_id(int p_idx, int p_id) { pp->set_item_ID(p_idx,p_idx); }
+ virtual int get_item_id(int p_idx) const { return pp->get_item_ID(p_idx); }
+
+ virtual void set_item_separator(int p_idx, bool p_separator) { pp->set_item_as_separator(p_idx,p_separator); }
+ virtual bool is_item_separator(int p_idx) const { return pp->is_item_separator(p_idx); }
+
+ virtual void add_item();
+ virtual int get_item_count() const;
+ virtual void erase(int p_idx);
+
+ ItemListPopupMenuPlugin();
+};
+
+///////////////////////////////////////////////////////////////
+
+class ItemListEditor : public HBoxContainer {
+
+ GDCLASS(ItemListEditor,HBoxContainer);
+
+ Node *item_list;
+
+ ToolButton *toolbar_button;
+
+ AcceptDialog *dialog;
+ PropertyEditor *property_editor;
+ Tree *tree;
+ Button *add_button;
+ Button *del_button;
+
+ int selected_idx;
+
+ Vector<ItemListPlugin*> item_plugins;
+
+ void _edit_items();
+
+ void _add_pressed();
+ void _delete_pressed();
+
+ void _node_removed(Node *p_node);
+
+protected:
+
+ void _notification(int p_notification);
+ static void _bind_methods();
+public:
+
+ void edit(Node *p_item_list);
+ bool handles(Object *p_object) const;
+ void add_plugin(ItemListPlugin* p_plugin) { item_plugins.push_back(p_plugin); }
+ ItemListEditor();
+ ~ItemListEditor();
+};
+
+class ItemListEditorPlugin : public EditorPlugin {
+
+ GDCLASS(ItemListEditorPlugin,EditorPlugin);
+
+ ItemListEditor *item_list_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "ItemList"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ItemListEditorPlugin(EditorNode *p_node);
+ ~ItemListEditorPlugin();
+
+};
+
+#endif // ITEM_LIST_EDITOR_PLUGIN_H
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..be9e52e241
--- /dev/null
+++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp
@@ -0,0 +1,518 @@
+/*************************************************************************/
+/* light_occluder_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "light_occluder_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+
+void LightOccluder2DEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ button_create->set_icon( get_icon("Edit","EditorIcons"));
+ button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ button_edit->set_pressed(true);
+ get_tree()->connect("node_removed",this,"_node_removed");
+ create_poly->connect("confirmed",this,"_create_poly");
+
+ } break;
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void LightOccluder2DEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+}
+
+
+void LightOccluder2DEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case MODE_CREATE: {
+
+ mode=MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+
+ mode=MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+
+ }
+}
+
+void LightOccluder2DEditor::_wip_close(bool p_closed) {
+
+ undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->add_undo_method(node->get_occluder_polygon().ptr(),"set_polygon",node->get_occluder_polygon()->get_polygon());
+ undo_redo->add_do_method(node->get_occluder_polygon().ptr(),"set_polygon",wip);
+ undo_redo->add_undo_method(node->get_occluder_polygon().ptr(),"set_closed",node->get_occluder_polygon()->is_closed());
+ undo_redo->add_do_method(node->get_occluder_polygon().ptr(),"set_closed",p_closed);
+
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ wip.clear();
+ wip_active=false;
+ mode=MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ edited_point=-1;
+}
+
+bool LightOccluder2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+
+ if (!node)
+ return false;
+
+ if (node->get_occluder_polygon().is_null()) {
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && p_event.mouse_button.pressed) {
+ create_poly->set_text("No OccluderPolygon2D resource on this node.\nCreate and assign one?");
+ create_poly->popup_centered_minsize();
+ }
+ return (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1);
+ }
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon());
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( cpoint );
+ wip_active=true;
+ edited_point_pos=cpoint;
+ canvas_item_editor->get_viewport_control()->update();
+ edited_point=1;
+ return true;
+ } else {
+
+
+ if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close(true);
+
+ return true;
+ } else if (wip.size()>1 && xform.xform(wip[wip.size()-1]).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close(false);
+ return true;
+
+ } else {
+
+ wip.push_back( cpoint );
+ edited_point=wip.size();
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close(true);
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ if (poly.size() < 3) {
+
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node->get_occluder_polygon().ptr(),"set_polygon",poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node->get_occluder_polygon().ptr(),"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 points[2] ={ xform.xform(poly[i]),
+ xform.xform(poly[(i+1)%poly.size()]) };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ poly.insert(closest_idx+1,xform.affine_inverse().xform(closest_pos));
+ edited_point=closest_idx+1;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ node->get_occluder_polygon()->set_polygon(Variant(poly));
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ edited_point=closest_idx;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly[edited_point]=edited_point_pos;
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node->get_occluder_polygon().ptr(),"set_polygon",poly);
+ undo_redo->add_undo_method(node->get_occluder_polygon().ptr(),"set_polygon",pre_move_edit);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node->get_occluder_polygon().ptr(),"set_polygon",poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node->get_occluder_polygon().ptr(),"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ }
+
+
+
+ } break;
+ }
+
+
+
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ }
+
+ } break;
+ }
+
+ return false;
+}
+void LightOccluder2DEditor::_canvas_draw() {
+
+ if (!node || !node->get_occluder_polygon().is_valid())
+ return;
+
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
+ Vector<Vector2> poly;
+
+ if (wip_active)
+ poly=wip;
+ else
+ poly=Variant(node->get_occluder_polygon()->get_polygon());
+
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = i==edited_point ? edited_point_pos : poly[i];
+ if ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point))
+ p2=edited_point_pos;
+ else
+ p2 = poly[(i+1)%poly.size()];
+
+ Vector2 point = xform.xform(p);
+ Vector2 next_point = xform.xform(p2);
+
+ Color col=Color(1,0.3,0.1,0.8);
+
+ if (i==poly.size()-1 && (!node->get_occluder_polygon()->is_closed() || wip_active)) {
+
+ } else {
+ vpc->draw_line(point,next_point,col,2);
+ }
+ vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+}
+
+
+
+void LightOccluder2DEditor::edit(Node *p_collision_polygon) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_collision_polygon) {
+
+ node=p_collision_polygon->cast_to<LightOccluder2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+ canvas_item_editor->get_viewport_control()->update();
+ } else {
+ node=NULL;
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ }
+
+}
+
+void LightOccluder2DEditor::_create_poly() {
+
+ if (!node)
+ return;
+ undo_redo->create_action(TTR("Create Occluder Polygon"));
+ undo_redo->add_do_method(node,"set_occluder_polygon",Ref<OccluderPolygon2D>(memnew( OccluderPolygon2D)));
+ undo_redo->add_undo_method(node,"set_occluder_polygon",Variant(REF()));
+ undo_redo->commit_action();
+}
+
+void LightOccluder2DEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&LightOccluder2DEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&LightOccluder2DEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&LightOccluder2DEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_create_poly"),&LightOccluder2DEditor::_create_poly);
+
+}
+
+
+LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) {
+
+ node=NULL;
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ add_child( memnew( VSeparator ));
+ button_create = memnew( ToolButton );
+ add_child(button_create);
+ button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+ button_create->set_tooltip(TTR("Create a new polygon from scratch."));
+
+ button_edit = memnew( ToolButton );
+ add_child(button_edit);
+ button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+ button_edit->set_tooltip(TTR("Edit existing polygon:")+"\n"+TTR("LMB: Move Point.")+"\n"+TTR("Ctrl+LMB: Split Segment.")+"\n"+TTR("RMB: Erase Point."));
+
+ create_poly = memnew( ConfirmationDialog );
+ add_child(create_poly);
+ create_poly->get_ok()->set_text(TTR("Create"));
+
+
+ //add_constant_override("separation",0);
+
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ mode = MODE_EDIT;
+ wip_active=false;
+
+}
+
+
+void LightOccluder2DEditorPlugin::edit(Object *p_object) {
+
+ collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("LightOccluder2D");
+}
+
+void LightOccluder2DEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(NULL);
+ }
+
+}
+
+LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ collision_polygon_editor = memnew( LightOccluder2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+
+
+
+}
+
+
+LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h
new file mode 100644
index 0000000000..1f1c6e86eb
--- /dev/null
+++ b/editor/plugins/light_occluder_2d_editor_plugin.h
@@ -0,0 +1,115 @@
+/*************************************************************************/
+/* light_occluder_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
+#define LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
+
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/light_occluder_2d.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class CanvasItemEditor;
+
+class LightOccluder2DEditor : public HBoxContainer {
+
+ GDCLASS(LightOccluder2DEditor, HBoxContainer );
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+
+ };
+
+ Mode mode;
+
+ ToolButton *button_create;
+ ToolButton *button_edit;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ LightOccluder2D *node;
+ MenuButton *options;
+
+ int edited_point;
+ Vector2 edited_point_pos;
+ Vector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+
+ ConfirmationDialog *create_poly;
+
+ void _wip_close(bool p_closed);
+ void _canvas_draw();
+ void _menu_option(int p_option);
+ void _create_poly();
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ Vector2 snap_point(const Vector2& p_point) const;
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_collision_polygon);
+ LightOccluder2DEditor(EditorNode *p_editor);
+};
+
+class LightOccluder2DEditorPlugin : public EditorPlugin {
+
+ GDCLASS( LightOccluder2DEditorPlugin, EditorPlugin );
+
+ LightOccluder2DEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "LightOccluder2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ LightOccluder2DEditorPlugin(EditorNode *p_node);
+ ~LightOccluder2DEditorPlugin();
+
+};
+
+#endif // LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..d00165d3ff
--- /dev/null
+++ b/editor/plugins/line_2d_editor_plugin.cpp
@@ -0,0 +1,283 @@
+#include "line_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+#include "os/keyboard.h"
+
+
+//----------------------------------------------------------------------------
+// Line2DEditor
+//----------------------------------------------------------------------------
+
+void Line2DEditor::_node_removed(Node *p_node) {
+ if(p_node == node) {
+ node=NULL;
+ hide();
+ }
+}
+
+void Line2DEditor::_notification(int p_what) {
+ switch(p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED:
+ // This widget is not a child but should have the same visibility state
+ base_hb->set_visible(is_visible());
+ break;
+ }
+}
+
+Vector2 Line2DEditor::mouse_to_local_pos(Vector2 gpoint, bool alt) {
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ return !alt? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint))
+ : node->get_global_transform().affine_inverse().xform(
+ canvas_item_editor->snap_point(
+ canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
+}
+
+int Line2DEditor::get_point_index_at(Vector2 gpos) {
+ ERR_FAIL_COND_V(node == 0, -1);
+
+ real_t grab_treshold = EDITOR_DEF("poly_editor/point_grab_radius", 8);
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+ for(int i = 0; i < node->get_point_count(); ++i) {
+ Point2 p = xform.xform( node->get_point_pos(i) );
+ if(gpos.distance_to(p) < grab_treshold) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+bool Line2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+ if (!node)
+ return false;
+
+ if (!node->is_visible())
+ return false;
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb = p_event.mouse_button;
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = mouse_to_local_pos(gpoint, mb.mod.alt);
+
+ if(mb.pressed && _dragging == false) {
+ int i = get_point_index_at(gpoint);
+ if(i != -1) {
+ if (mb.button_index == BUTTON_LEFT && !mb.mod.shift && mode == MODE_EDIT) {
+ _dragging = true;
+ action_point = i;
+ moving_from = node->get_point_pos(i);
+ moving_screen_from = gpoint;
+ }
+ else if((mb.button_index == BUTTON_RIGHT && mode == MODE_EDIT) || (mb.button_index == BUTTON_LEFT && mode == MODE_DELETE)) {
+ undo_redo->create_action(TTR("Remove Point from Line2D"));
+ undo_redo->add_do_method(node, "remove_point", i);
+ undo_redo->add_undo_method(node, "add_point", node->get_point_pos(i), i);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->commit_action();
+ }
+ return true;
+ }
+ }
+
+ if(mb.pressed && mb.button_index == BUTTON_LEFT && ((mb.mod.command && mode == MODE_EDIT) || mode == MODE_CREATE)) {
+
+ undo_redo->create_action(TTR("Add Point to Line2D"));
+ undo_redo->add_do_method(node, "add_point", cpoint);
+ undo_redo->add_undo_method(node, "remove_point", node->get_point_count());
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->commit_action();
+
+ _dragging = true;
+ action_point = node->get_point_count()-1;
+ moving_from = node->get_point_pos(action_point);
+ moving_screen_from = gpoint;
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ return true;
+ }
+
+ if(!mb.pressed && mb.button_index == BUTTON_LEFT && _dragging) {
+ undo_redo->create_action(TTR("Move Point in Line2D"));
+ undo_redo->add_do_method(node, "set_point_pos", action_point, cpoint);
+ undo_redo->add_undo_method(node, "set_point_pos", action_point, moving_from);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update");
+ undo_redo->commit_action();
+ _dragging = false;
+ return true;
+ }
+ }
+ break;
+
+ case InputEvent::MOUSE_MOTION: {
+ if (_dragging) {
+ const InputEventMouseMotion &mm = p_event.mouse_motion;
+ Vector2 cpoint = mouse_to_local_pos(Vector2(mm.x, mm.y), mm.mod.alt);
+ node->set_point_pos(action_point,cpoint);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ }
+ break;
+ }
+
+ return false;
+}
+
+void Line2DEditor::_canvas_draw() {
+
+ if (!node)
+ return;
+
+ if (!node->is_visible())
+ return;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
+ Size2 handle_size = handle->get_size();
+
+ int len = node->get_point_count();
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
+ for(int i=0; i < len; ++i) {
+ Vector2 point = xform.xform(node->get_point_pos(i));
+ vpc->draw_texture_rect(handle, Rect2(point - handle_size * 0.5, handle_size), false);
+ }
+}
+
+void Line2DEditor::_node_visibility_changed() {
+ if (!node)
+ return;
+ canvas_item_editor->get_viewport_control()->update();
+}
+
+void Line2DEditor::edit(Node *p_line2d) {
+
+ if (!canvas_item_editor)
+ canvas_item_editor = CanvasItemEditor::get_singleton();
+
+ if (p_line2d) {
+ node = p_line2d->cast_to<Line2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw");
+ if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->connect("visibility_changed", this, "_node_visibility_changed");
+ }
+ else {
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw");
+ // node may have been deleted at this point
+ if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->disconnect("visibility_changed", this, "_node_visibility_changed");
+ node = NULL;
+ }
+}
+
+void Line2DEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_canvas_draw"), &Line2DEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Line2DEditor::_node_visibility_changed);
+ ClassDB::bind_method(D_METHOD("_mode_selected"), &Line2DEditor::_mode_selected);
+}
+
+void Line2DEditor::_mode_selected(int p_mode) {
+ for(unsigned int i = 0; i < _MODE_COUNT; ++i) {
+ toolbar_buttons[i]->set_pressed(i == p_mode);
+ }
+ mode = Mode(p_mode);
+}
+
+Line2DEditor::Line2DEditor(EditorNode *p_editor) {
+
+ canvas_item_editor = NULL;
+ editor = p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ _dragging = false;
+
+ base_hb = memnew( HBoxContainer );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(base_hb);
+
+ sep = memnew( VSeparator);
+ base_hb->add_child(sep);
+
+ {
+ ToolButton * b = memnew(ToolButton);
+ b->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit", "EditorIcons"));
+ b->set_toggle_mode(true);
+ b->set_focus_mode(Control::FOCUS_NONE);
+ b->set_tooltip(
+ TTR("Select Points")+"\n"
+ + TTR("Shift+Drag: Select Control Points")+"\n"
+ + keycode_get_string(KEY_MASK_CMD)
+ + TTR("Click: Add Point")+"\n"
+ + TTR("Right Click: Delete Point"));
+ b->connect("pressed", this, "_mode_selected", varray(MODE_EDIT));
+ toolbar_buttons[MODE_EDIT] = b;
+ base_hb->add_child(b);
+ }
+
+ {
+ ToolButton * b = memnew(ToolButton);
+ b->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate", "EditorIcons"));
+ b->set_toggle_mode(true);
+ b->set_focus_mode(Control::FOCUS_NONE);
+ b->set_tooltip(TTR("Add Point (in empty space)")+"\n"+TTR("Split Segment (in line)"));
+ b->connect("pressed", this, "_mode_selected", varray(MODE_CREATE));
+ toolbar_buttons[MODE_CREATE] = b;
+ base_hb->add_child(b);
+ }
+
+ {
+ ToolButton * b = memnew( ToolButton );
+ b->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete", "EditorIcons"));
+ b->set_toggle_mode(true);
+ b->set_focus_mode(Control::FOCUS_NONE);
+ b->set_tooltip(TTR("Delete Point"));
+ b->connect("pressed", this, "_mode_selected", varray(MODE_DELETE));
+ toolbar_buttons[MODE_DELETE] = b;
+ base_hb->add_child(b);
+ }
+
+ base_hb->hide();
+ hide();
+
+ _mode_selected(MODE_CREATE);
+}
+
+//----------------------------------------------------------------------------
+// Line2DEditorPlugin
+//----------------------------------------------------------------------------
+
+void Line2DEditorPlugin::edit(Object *p_object) {
+ line2d_editor->edit(p_object->cast_to<Node>());
+}
+
+bool Line2DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("Line2D");
+}
+
+void Line2DEditorPlugin::make_visible(bool p_visible) {
+ line2d_editor->set_visible(p_visible);
+ if(p_visible == false)
+ line2d_editor->edit(NULL);
+}
+
+Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) {
+ editor=p_node;
+ line2d_editor = memnew( Line2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(line2d_editor);
+ line2d_editor->hide();
+}
+
+
diff --git a/editor/plugins/line_2d_editor_plugin.h b/editor/plugins/line_2d_editor_plugin.h
new file mode 100644
index 0000000000..8c6aed1d2d
--- /dev/null
+++ b/editor/plugins/line_2d_editor_plugin.h
@@ -0,0 +1,90 @@
+#ifndef LINE_2D_EDITOR_PLUGIN_H
+#define LINE_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/path_2d.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+#include "scene/2d/line_2d.h"
+
+
+class CanvasItemEditor;
+
+class Line2DEditor : public HBoxContainer {
+ GDCLASS(Line2DEditor, HBoxContainer)
+
+public:
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_line2d);
+ Line2DEditor(EditorNode *p_editor);
+
+protected:
+ void _node_removed(Node *p_node);
+ void _notification(int p_what);
+
+ Vector2 mouse_to_local_pos(Vector2 mpos);
+
+ static void _bind_methods();
+
+private:
+ void _mode_selected(int p_mode);
+ void _canvas_draw();
+ void _node_visibility_changed();
+
+ int get_point_index_at(Vector2 gpos);
+ Vector2 mouse_to_local_pos(Vector2 gpos, bool alt);
+
+ UndoRedo *undo_redo;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ Line2D *node;
+
+ HBoxContainer *base_hb;
+ Separator *sep;
+
+ enum Mode {
+ MODE_CREATE = 0,
+ MODE_EDIT,
+ MODE_DELETE,
+ _MODE_COUNT
+ };
+
+ Mode mode;
+ ToolButton* toolbar_buttons[_MODE_COUNT];
+
+ bool _dragging;
+ int action_point;
+ Point2 moving_from;
+ Point2 moving_screen_from;
+};
+
+class Line2DEditorPlugin : public EditorPlugin {
+ GDCLASS( Line2DEditorPlugin, EditorPlugin )
+
+public:
+ virtual bool forward_canvas_gui_input(
+ const Transform2D& p_canvas_xform,
+ const InputEvent& p_event)
+ {
+ return line2d_editor->forward_gui_input(p_event);
+ }
+
+ virtual String get_name() const { return "Line2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ Line2DEditorPlugin(EditorNode *p_node);
+
+private:
+ Line2DEditor *line2d_editor;
+ EditorNode *editor;
+
+};
+
+#endif // LINE_2D_EDITOR_PLUGIN_H
+
diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp
new file mode 100644
index 0000000000..cdf7c70d39
--- /dev/null
+++ b/editor/plugins/material_editor_plugin.cpp
@@ -0,0 +1,413 @@
+/*************************************************************************/
+/* material_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "material_editor_plugin.h"
+
+#include "scene/main/viewport.h"
+
+#if 0
+
+void MaterialEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void MaterialEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //get_scene()->connect("node_removed",this,"_node_removed");
+
+ if (first_enter) {
+ //it's in propertyeditor so.. could be moved around
+
+ light_1_switch->set_normal_texture(get_icon("MaterialPreviewLight1","EditorIcons"));
+ light_1_switch->set_pressed_texture(get_icon("MaterialPreviewLight1Off","EditorIcons"));
+ light_2_switch->set_normal_texture(get_icon("MaterialPreviewLight2","EditorIcons"));
+ light_2_switch->set_pressed_texture(get_icon("MaterialPreviewLight2Off","EditorIcons"));
+
+ sphere_switch->set_normal_texture(get_icon("MaterialPreviewSphereOff","EditorIcons"));
+ sphere_switch->set_pressed_texture(get_icon("MaterialPreviewSphere","EditorIcons"));
+ box_switch->set_normal_texture(get_icon("MaterialPreviewCubeOff","EditorIcons"));
+ box_switch->set_pressed_texture(get_icon("MaterialPreviewCube","EditorIcons"));
+
+ first_enter=false;
+ }
+
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+ Ref<Texture> checkerboard = get_icon("Checkerboard","EditorIcons");
+ Size2 size = get_size();
+
+ draw_texture_rect(checkerboard,Rect2(Point2(),size),true);
+
+ }
+}
+
+
+
+void MaterialEditor::edit(Ref<Material> p_material) {
+
+ material=p_material;
+
+ if (!material.is_null()) {
+ sphere_mesh->surface_set_material(0,material);
+ box_mesh->surface_set_material(0,material);
+ } else {
+
+ hide();
+ }
+
+}
+
+
+void MaterialEditor::_button_pressed(Node* p_button) {
+
+ if (p_button==light_1_switch) {
+ light1->set_enabled(!light_1_switch->is_pressed());
+ }
+
+ if (p_button==light_2_switch) {
+ light2->set_enabled(!light_2_switch->is_pressed());
+ }
+
+ if (p_button==box_switch) {
+ box_instance->show();
+ sphere_instance->hide();
+ box_switch->set_pressed(true);
+ sphere_switch->set_pressed(false);
+ }
+
+ if (p_button==sphere_switch) {
+ box_instance->hide();
+ sphere_instance->show();
+ box_switch->set_pressed(false);
+ sphere_switch->set_pressed(true);
+ }
+
+}
+
+void MaterialEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&MaterialEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_button_pressed"),&MaterialEditor::_button_pressed);
+
+}
+
+MaterialEditor::MaterialEditor() {
+
+ viewport = memnew( Viewport );
+ Ref<World> world;
+ world.instance();
+ viewport->set_world(world); //use own world
+ add_child(viewport);
+ viewport->set_disable_input(true);
+
+ camera = memnew( Camera );
+ camera->set_transform(Transform(Matrix3(),Vector3(0,0,3)));
+ camera->set_perspective(45,0.1,10);
+ viewport->add_child(camera);
+
+ light1 = memnew( DirectionalLight );
+ light1->set_transform(Transform().looking_at(Vector3(-1,-1,-1),Vector3(0,1,0)));
+ viewport->add_child(light1);
+
+ light2 = memnew( DirectionalLight );
+ light2->set_transform(Transform().looking_at(Vector3(0,1,0),Vector3(0,0,1)));
+ light2->set_color(Light::COLOR_DIFFUSE,Color(0.7,0.7,0.7));
+ light2->set_color(Light::COLOR_SPECULAR,Color(0.7,0.7,0.7));
+ viewport->add_child(light2);
+
+ sphere_instance = memnew( MeshInstance );
+ viewport->add_child(sphere_instance);
+
+ box_instance = memnew( MeshInstance );
+ viewport->add_child(box_instance);
+
+ Transform box_xform;
+ box_xform.basis.rotate(Vector3(1,0,0),Math::deg2rad(25));
+ box_xform.basis = box_xform.basis * Matrix3().rotated(Vector3(0,1,0),Math::deg2rad(25));
+ box_xform.basis.scale(Vector3(0.8,0.8,0.8));
+ box_instance->set_transform(box_xform);
+
+ {
+
+ sphere_mesh.instance();
+
+
+ int lats=32;
+ int lons=32;
+ float radius=1.0;
+
+ PoolVector<Vector3> vertices;
+ PoolVector<Vector3> normals;
+ PoolVector<Vector2> uvs;
+ PoolVector<float> tangents;
+ Matrix3 tt = Matrix3(Vector3(0,1,0),Math_PI*0.5);
+
+ for(int i = 1; i <= lats; i++) {
+ double lat0 = Math_PI * (-0.5 + (double) (i - 1) / lats);
+ double z0 = Math::sin(lat0);
+ double zr0 = Math::cos(lat0);
+
+ double lat1 = Math_PI * (-0.5 + (double) i / lats);
+ double z1 = Math::sin(lat1);
+ double zr1 = Math::cos(lat1);
+
+ for(int j = lons; j >= 1; j--) {
+
+ double lng0 = 2 * Math_PI * (double) (j - 1) / lons;
+ double x0 = Math::cos(lng0);
+ double y0 = Math::sin(lng0);
+
+ double lng1 = 2 * Math_PI * (double) (j) / lons;
+ double x1 = Math::cos(lng1);
+ double y1 = Math::sin(lng1);
+
+
+ Vector3 v[4]={
+ Vector3(x1 * zr0, z0, y1 *zr0),
+ Vector3(x1 * zr1, z1, y1 *zr1),
+ Vector3(x0 * zr1, z1, y0 *zr1),
+ Vector3(x0 * zr0, z0, y0 *zr0)
+ };
+
+ #define ADD_POINT(m_idx) \
+ normals.push_back(v[m_idx]);\
+ vertices.push_back(v[m_idx]*radius);\
+ { Vector2 uv(Math::atan2(v[m_idx].x,v[m_idx].z),Math::atan2(-v[m_idx].y,v[m_idx].z));\
+ uv/=Math_PI;\
+ uv*=4.0;\
+ uv=uv*0.5+Vector2(0.5,0.5);\
+ uvs.push_back(uv);\
+ }\
+ { Vector3 t = tt.xform(v[m_idx]);\
+ tangents.push_back(t.x);\
+ tangents.push_back(t.y);\
+ tangents.push_back(t.z);\
+ tangents.push_back(1.0);\
+ }
+
+
+
+ ADD_POINT(0);
+ ADD_POINT(1);
+ ADD_POINT(2);
+
+ ADD_POINT(2);
+ ADD_POINT(3);
+ ADD_POINT(0);
+ }
+ }
+
+ Array arr;
+ arr.resize(VS::ARRAY_MAX);
+ arr[VS::ARRAY_VERTEX]=vertices;
+ arr[VS::ARRAY_NORMAL]=normals;
+ arr[VS::ARRAY_TANGENT]=tangents;
+ arr[VS::ARRAY_TEX_UV]=uvs;
+
+ sphere_mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES,arr);
+
+ sphere_instance->set_mesh(sphere_mesh);
+
+ }
+ {
+
+
+ box_mesh.instance();
+
+ PoolVector<Vector3> vertices;
+ PoolVector<Vector3> normals;
+ PoolVector<float> tangents;
+ PoolVector<Vector3> uvs;
+
+ int vtx_idx=0;
+ #define ADD_VTX(m_idx);\
+ vertices.push_back( face_points[m_idx] );\
+ normals.push_back( normal_points[m_idx] );\
+ tangents.push_back( normal_points[m_idx][1] );\
+ tangents.push_back( normal_points[m_idx][2] );\
+ tangents.push_back( normal_points[m_idx][0] );\
+ tangents.push_back( 1.0 );\
+ uvs.push_back( Vector3(uv_points[m_idx*2+0],uv_points[m_idx*2+1],0) );\
+ vtx_idx++;\
+
+ for (int i=0;i<6;i++) {
+
+
+ Vector3 face_points[4];
+ Vector3 normal_points[4];
+ float uv_points[8]={0,0,0,1,1,1,1,0};
+
+ for (int j=0;j<4;j++) {
+
+ float v[3];
+ v[0]=1.0;
+ v[1]=1-2*((j>>1)&1);
+ v[2]=v[1]*(1-2*(j&1));
+
+ for (int k=0;k<3;k++) {
+
+ if (i<3)
+ face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ else
+ face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ }
+ normal_points[j]=Vector3();
+ normal_points[j][i%3]=(i>=3?-1:1);
+ }
+
+ //tri 1
+ ADD_VTX(0);
+ ADD_VTX(1);
+ ADD_VTX(2);
+ //tri 2
+ ADD_VTX(2);
+ ADD_VTX(3);
+ ADD_VTX(0);
+
+ }
+
+
+
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[VisualServer::ARRAY_NORMAL]= normals ;
+ d[VisualServer::ARRAY_TANGENT]= tangents ;
+ d[VisualServer::ARRAY_TEX_UV]= uvs ;
+ d[VisualServer::ARRAY_VERTEX]= vertices ;
+
+ PoolVector<int> indices;
+ indices.resize(vertices.size());
+ for(int i=0;i<vertices.size();i++)
+ indices.set(i,i);
+ d[VisualServer::ARRAY_INDEX]=indices;
+
+ box_mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES,d);
+ box_instance->set_mesh(box_mesh);
+ box_instance->hide();
+
+
+
+ }
+
+ set_custom_minimum_size(Size2(1,150)*EDSCALE);
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+ hb->set_area_as_parent_rect(2);
+
+ VBoxContainer *vb_shape = memnew( VBoxContainer );
+ hb->add_child(vb_shape);
+
+ sphere_switch = memnew( TextureButton );
+ sphere_switch->set_toggle_mode(true);
+ sphere_switch->set_pressed(true);
+ vb_shape->add_child(sphere_switch);
+ sphere_switch->connect("pressed",this,"_button_pressed",varray(sphere_switch));
+
+ box_switch = memnew( TextureButton );
+ box_switch->set_toggle_mode(true);
+ box_switch->set_pressed(false);
+ vb_shape->add_child(box_switch);
+ box_switch->connect("pressed",this,"_button_pressed",varray(box_switch));
+
+ hb->add_spacer();
+
+ VBoxContainer *vb_light = memnew( VBoxContainer );
+ hb->add_child(vb_light);
+
+ light_1_switch = memnew( TextureButton );
+ light_1_switch->set_toggle_mode(true);
+ vb_light->add_child(light_1_switch);
+ light_1_switch->connect("pressed",this,"_button_pressed",varray(light_1_switch));
+
+ light_2_switch = memnew( TextureButton );
+ light_2_switch->set_toggle_mode(true);
+ vb_light->add_child(light_2_switch);
+ light_2_switch->connect("pressed",this,"_button_pressed",varray(light_2_switch));
+
+ first_enter=true;
+
+}
+
+
+void MaterialEditorPlugin::edit(Object *p_object) {
+
+ Material * s = p_object->cast_to<Material>();
+ if (!s)
+ return;
+
+ material_editor->edit(Ref<Material>(s));
+}
+
+bool MaterialEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("Material");
+}
+
+void MaterialEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ material_editor->show();
+ //material_editor->set_process(true);
+ } else {
+
+ material_editor->hide();
+ //material_editor->set_process(false);
+ }
+
+}
+
+MaterialEditorPlugin::MaterialEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ material_editor = memnew( MaterialEditor );
+ add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM,material_editor);
+ material_editor->hide();
+
+
+
+}
+
+
+MaterialEditorPlugin::~MaterialEditorPlugin()
+{
+}
+
+
+#endif
diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h
new file mode 100644
index 0000000000..604e7e61bd
--- /dev/null
+++ b/editor/plugins/material_editor_plugin.h
@@ -0,0 +1,100 @@
+/*************************************************************************/
+/* material_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef MATERIAL_EDITOR_PLUGIN_H
+#define MATERIAL_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/resources/material.h"
+#include "scene/3d/light.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/camera.h"
+
+#if 0
+class MaterialEditor : public Control {
+
+ GDCLASS(MaterialEditor, Control);
+
+
+ Viewport *viewport;
+ MeshInstance *sphere_instance;
+ MeshInstance *box_instance;
+ DirectionalLight *light1;
+ DirectionalLight *light2;
+ Camera *camera;
+
+ Ref<Mesh> sphere_mesh;
+ Ref<Mesh> box_mesh;
+
+ TextureButton *sphere_switch;
+ TextureButton *box_switch;
+
+ TextureButton *light_1_switch;
+ TextureButton *light_2_switch;
+
+
+ Ref<Material> material;
+
+
+ void _button_pressed(Node* p_button);
+ bool first_enter;
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void edit(Ref<Material> p_material);
+ MaterialEditor();
+};
+
+
+class MaterialEditorPlugin : public EditorPlugin {
+
+ GDCLASS( MaterialEditorPlugin, EditorPlugin );
+
+ MaterialEditor *material_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Material"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ MaterialEditorPlugin(EditorNode *p_node);
+ ~MaterialEditorPlugin();
+
+};
+
+#endif // MATERIAL_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp
new file mode 100644
index 0000000000..93f417247e
--- /dev/null
+++ b/editor/plugins/mesh_editor_plugin.cpp
@@ -0,0 +1,245 @@
+/*************************************************************************/
+/* mesh_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "mesh_editor_plugin.h"
+
+#if 0
+void MeshEditor::_gui_input(InputEvent p_event) {
+
+
+ if (p_event.type==InputEvent::MOUSE_MOTION && p_event.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+
+ rot_x-=p_event.mouse_motion.relative_y*0.01;
+ rot_y-=p_event.mouse_motion.relative_x*0.01;
+ if (rot_x<-Math_PI/2)
+ rot_x=-Math_PI/2;
+ else if (rot_x>Math_PI/2) {
+ rot_x=Math_PI/2;
+ }
+ _update_rotation();
+ }
+}
+
+void MeshEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //get_scene()->connect("node_removed",this,"_node_removed");
+
+ if (first_enter) {
+ //it's in propertyeditor so.. could be moved around
+
+ light_1_switch->set_normal_texture(get_icon("MaterialPreviewLight1","EditorIcons"));
+ light_1_switch->set_pressed_texture(get_icon("MaterialPreviewLight1Off","EditorIcons"));
+ light_2_switch->set_normal_texture(get_icon("MaterialPreviewLight2","EditorIcons"));
+ light_2_switch->set_pressed_texture(get_icon("MaterialPreviewLight2Off","EditorIcons"));
+ first_enter=false;
+ }
+
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+ Ref<Texture> checkerboard = get_icon("Checkerboard","EditorIcons");
+ Size2 size = get_size();
+
+ draw_texture_rect(checkerboard,Rect2(Point2(),size),true);
+
+ }
+}
+
+void MeshEditor::_update_rotation() {
+
+ Transform t;
+ t.basis.rotate(Vector3(0, 1, 0), -rot_y);
+ t.basis.rotate(Vector3(1, 0, 0), -rot_x);
+ mesh_instance->set_transform(t);
+
+}
+
+void MeshEditor::edit(Ref<Mesh> p_mesh) {
+
+ mesh=p_mesh;
+ mesh_instance->set_mesh(mesh);
+
+ if (mesh.is_null()) {
+
+ hide();
+ } else {
+ rot_x=0;
+ rot_y=0;
+ _update_rotation();
+
+ AABB aabb= mesh->get_aabb();
+ Vector3 ofs = aabb.pos + aabb.size*0.5;
+ aabb.pos-=ofs;
+ float m = MAX(aabb.size.x,aabb.size.y)*0.5;
+ if (m!=0) {
+ m=1.0/m;
+ m*=0.5;
+ //print_line("scale: "+rtos(m));
+ Transform xform;
+ xform.basis.scale(Vector3(m,m,m));
+ xform.origin=-xform.basis.xform(ofs); //-ofs*m;
+ xform.origin.z-=aabb.size.z*2;
+ mesh_instance->set_transform(xform);
+ }
+
+ }
+
+}
+
+
+void MeshEditor::_button_pressed(Node* p_button) {
+
+ if (p_button==light_1_switch) {
+ light1->set_enabled(!light_1_switch->is_pressed());
+ }
+
+ if (p_button==light_2_switch) {
+ light2->set_enabled(!light_2_switch->is_pressed());
+ }
+
+
+}
+
+void MeshEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&MeshEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_button_pressed"),&MeshEditor::_button_pressed);
+
+}
+
+MeshEditor::MeshEditor() {
+
+ viewport = memnew( Viewport );
+ Ref<World> world;
+ world.instance();
+ viewport->set_world(world); //use own world
+ add_child(viewport);
+ viewport->set_disable_input(true);
+
+ camera = memnew( Camera );
+ camera->set_transform(Transform(Matrix3(),Vector3(0,0,3)));
+ camera->set_perspective(45,0.1,10);
+ viewport->add_child(camera);
+
+ light1 = memnew( DirectionalLight );
+ light1->set_transform(Transform().looking_at(Vector3(-1,-1,-1),Vector3(0,1,0)));
+ viewport->add_child(light1);
+
+ light2 = memnew( DirectionalLight );
+ light2->set_transform(Transform().looking_at(Vector3(0,1,0),Vector3(0,0,1)));
+ light2->set_color(Light::COLOR_DIFFUSE,Color(0.7,0.7,0.7));
+ light2->set_color(Light::COLOR_SPECULAR,Color(0.7,0.7,0.7));
+ viewport->add_child(light2);
+
+ mesh_instance = memnew( MeshInstance );
+ viewport->add_child(mesh_instance);
+
+
+
+ set_custom_minimum_size(Size2(1,150)*EDSCALE);
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+ hb->set_area_as_parent_rect(2);
+
+ hb->add_spacer();
+
+ VBoxContainer *vb_light = memnew( VBoxContainer );
+ hb->add_child(vb_light);
+
+ light_1_switch = memnew( TextureButton );
+ light_1_switch->set_toggle_mode(true);
+ vb_light->add_child(light_1_switch);
+ light_1_switch->connect("pressed",this,"_button_pressed",varray(light_1_switch));
+
+ light_2_switch = memnew( TextureButton );
+ light_2_switch->set_toggle_mode(true);
+ vb_light->add_child(light_2_switch);
+ light_2_switch->connect("pressed",this,"_button_pressed",varray(light_2_switch));
+
+ first_enter=true;
+
+ rot_x=0;
+ rot_y=0;
+
+
+}
+
+
+void MeshEditorPlugin::edit(Object *p_object) {
+
+ Mesh * s = p_object->cast_to<Mesh>();
+ if (!s)
+ return;
+
+ mesh_editor->edit(Ref<Mesh>(s));
+}
+
+bool MeshEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("Mesh");
+}
+
+void MeshEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ mesh_editor->show();
+ //mesh_editor->set_process(true);
+ } else {
+
+ mesh_editor->hide();
+ //mesh_editor->set_process(false);
+ }
+
+}
+
+MeshEditorPlugin::MeshEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ mesh_editor = memnew( MeshEditor );
+ add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM,mesh_editor);
+ mesh_editor->hide();
+
+
+
+}
+
+
+MeshEditorPlugin::~MeshEditorPlugin()
+{
+}
+#endif
diff --git a/editor/plugins/mesh_editor_plugin.h b/editor/plugins/mesh_editor_plugin.h
new file mode 100644
index 0000000000..80504ae445
--- /dev/null
+++ b/editor/plugins/mesh_editor_plugin.h
@@ -0,0 +1,98 @@
+/*************************************************************************/
+/* mesh_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef MESH_EDITOR_PLUGIN_H
+#define MESH_EDITOR_PLUGIN_H
+
+#if 0
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/resources/material.h"
+#include "scene/3d/light.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/camera.h"
+
+class MeshEditor : public Control {
+
+ GDCLASS(MeshEditor, Control);
+
+
+
+ float rot_x;
+ float rot_y;
+
+ Viewport *viewport;
+ MeshInstance *mesh_instance;
+ DirectionalLight *light1;
+ DirectionalLight *light2;
+ Camera *camera;
+
+ Ref<Mesh> mesh;
+
+
+ TextureButton *light_1_switch;
+ TextureButton *light_2_switch;
+
+ void _button_pressed(Node* p_button);
+ bool first_enter;
+
+ void _update_rotation();
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void edit(Ref<Mesh> p_mesh);
+ MeshEditor();
+};
+
+
+class MeshEditorPlugin : public EditorPlugin {
+
+ GDCLASS( MeshEditorPlugin, EditorPlugin );
+
+ MeshEditor *mesh_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Mesh"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ MeshEditorPlugin(EditorNode *p_node);
+ ~MeshEditorPlugin();
+
+};
+
+#endif // MESH_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/mesh_instance_editor_plugin.cpp b/editor/plugins/mesh_instance_editor_plugin.cpp
new file mode 100644
index 0000000000..322e212534
--- /dev/null
+++ b/editor/plugins/mesh_instance_editor_plugin.cpp
@@ -0,0 +1,334 @@
+/*************************************************************************/
+/* mesh_instance_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "mesh_instance_editor_plugin.h"
+
+#include "scene/3d/physics_body.h"
+#include "scene/3d/body_shape.h"
+#include "scene/gui/box_container.h"
+#include "scene/3d/navigation_mesh.h"
+#include "spatial_editor_plugin.h"
+
+void MeshInstanceEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ options->hide();
+ }
+
+}
+
+
+
+void MeshInstanceEditor::edit(MeshInstance *p_mesh) {
+
+ node=p_mesh;
+
+}
+
+void MeshInstanceEditor::_menu_option(int p_option) {
+
+ Ref<Mesh> mesh = node->get_mesh();
+ if (mesh.is_null()) {
+ err_dialog->set_text(TTR("Mesh is empty!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ switch(p_option) {
+ case MENU_OPTION_CREATE_STATIC_TRIMESH_BODY:
+ case MENU_OPTION_CREATE_STATIC_CONVEX_BODY: {
+
+ bool trimesh_shape = (p_option==MENU_OPTION_CREATE_STATIC_TRIMESH_BODY);
+
+ EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection();
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.empty()) {
+ Ref<Shape> shape = trimesh_shape ? mesh->create_trimesh_shape() : mesh->create_convex_shape();
+ if (shape.is_null())
+ return;
+
+ CollisionShape *cshape = memnew( CollisionShape );
+ cshape->set_shape(shape);
+ StaticBody *body = memnew( StaticBody );
+ body->add_child(cshape);
+
+ Node *owner = node==get_tree()->get_edited_scene_root() ? node : node->get_owner();
+
+ if (trimesh_shape)
+ ur->create_action(TTR("Create Static Trimesh Body"));
+ else
+ ur->create_action(TTR("Create Static Convex Body"));
+
+ ur->add_do_method(node,"add_child",body);
+ ur->add_do_method(body,"set_owner",owner);
+ ur->add_do_method(cshape,"set_owner",owner);
+ ur->add_do_reference(body);
+ ur->add_undo_method(node,"remove_child",body);
+ ur->commit_action();
+ return;
+ }
+
+ if (trimesh_shape)
+ ur->create_action(TTR("Create Static Trimesh Body"));
+ else
+ ur->create_action(TTR("Create Static Convex Body"));
+
+ for (List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ MeshInstance *instance = E->get()->cast_to<MeshInstance>();
+ if (!instance)
+ continue;
+
+ Ref<Mesh> m = instance->get_mesh();
+ if (m.is_null())
+ continue;
+
+ Ref<Shape> shape = trimesh_shape ? m->create_trimesh_shape() : m->create_convex_shape();
+ if (shape.is_null())
+ continue;
+
+ CollisionShape *cshape = memnew( CollisionShape );
+ cshape->set_shape(shape);
+ StaticBody *body = memnew( StaticBody );
+ body->add_child(cshape);
+
+ Node *owner = instance==get_tree()->get_edited_scene_root() ? instance : instance->get_owner();
+
+ ur->add_do_method(instance,"add_child",body);
+ ur->add_do_method(body,"set_owner",owner);
+ ur->add_do_method(cshape,"set_owner",owner);
+ ur->add_do_reference(body);
+ ur->add_undo_method(instance,"remove_child",body);
+ }
+
+ ur->commit_action();
+
+ } break;
+
+ case MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE:
+ case MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE: {
+
+ if (node==get_tree()->get_edited_scene_root()) {
+ err_dialog->set_text(TTR("This doesn't work on scene root!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ bool trimesh_shape = (p_option==MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE);
+
+ Ref<Shape> shape = trimesh_shape ? mesh->create_trimesh_shape() : mesh->create_convex_shape();
+ if (shape.is_null())
+ return;
+
+ CollisionShape *cshape = memnew( CollisionShape );
+ cshape->set_shape(shape);
+
+ Node *owner = node->get_owner();
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ if (trimesh_shape)
+ ur->create_action(TTR("Create Trimesh Shape"));
+ else
+ ur->create_action(TTR("Create Convex Shape"));
+
+ ur->add_do_method(node->get_parent(),"add_child",cshape);
+ ur->add_do_method(node->get_parent(),"move_child",cshape,node->get_index()+1);
+ ur->add_do_method(cshape,"set_owner",owner);
+ ur->add_do_reference(cshape);
+ ur->add_undo_method(node->get_parent(),"remove_child",cshape);
+ ur->commit_action();
+
+ } break;
+
+ case MENU_OPTION_CREATE_NAVMESH: {
+
+ Ref<NavigationMesh> nmesh = memnew( NavigationMesh );
+
+ if (nmesh.is_null())
+ return;
+
+ nmesh->create_from_mesh(mesh);
+ NavigationMeshInstance *nmi = memnew( NavigationMeshInstance );
+ nmi->set_navigation_mesh(nmesh);
+
+ Node *owner = node==get_tree()->get_edited_scene_root() ? node : node->get_owner();
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Create Navigation Mesh"));
+
+ ur->add_do_method(node,"add_child",nmi);
+ ur->add_do_method(nmi,"set_owner",owner);
+
+ ur->add_do_reference(nmi);
+ ur->add_undo_method(node,"remove_child",nmi);
+ ur->commit_action();
+ } break;
+
+ case MENU_OPTION_CREATE_OUTLINE_MESH: {
+
+ outline_dialog->popup_centered(Vector2(200, 90));
+ } break;
+ }
+
+}
+
+void MeshInstanceEditor::_create_outline_mesh() {
+
+ Ref<Mesh> mesh = node->get_mesh();
+ if (mesh.is_null()) {
+ err_dialog->set_text(TTR("MeshInstance lacks a Mesh!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ if (mesh->get_surface_count() == 0) {
+ err_dialog->set_text(TTR("Mesh has not surface to create outlines from!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ Ref<Mesh> mesho = mesh->create_outline(outline_size->get_value());
+
+ if (mesho.is_null()) {
+ err_dialog->set_text(TTR("Could not create outline!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ MeshInstance *mi = memnew( MeshInstance );
+ mi->set_mesh(mesho);
+ Node *owner=node->get_owner();
+ if (get_tree()->get_edited_scene_root()==node) {
+ owner=node;
+ }
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Create Outline"));
+
+ ur->add_do_method(node,"add_child",mi);
+ ur->add_do_method(mi,"set_owner",owner);
+
+ ur->add_do_reference(mi);
+ ur->add_undo_method(node,"remove_child",mi);
+ ur->commit_action();
+}
+
+void MeshInstanceEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_option",&MeshInstanceEditor::_menu_option);
+ ClassDB::bind_method("_create_outline_mesh",&MeshInstanceEditor::_create_outline_mesh);
+}
+
+MeshInstanceEditor::MeshInstanceEditor() {
+
+
+ options = memnew( MenuButton );
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(options);
+
+ options->set_text(TTR("Mesh"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("MeshInstance","EditorIcons"));
+
+ options->get_popup()->add_item(TTR("Create Trimesh Static Body"),MENU_OPTION_CREATE_STATIC_TRIMESH_BODY);
+ options->get_popup()->add_item(TTR("Create Convex Static Body"),MENU_OPTION_CREATE_STATIC_CONVEX_BODY);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Trimesh Collision Sibling"),MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE);
+ options->get_popup()->add_item(TTR("Create Convex Collision Sibling"),MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Navigation Mesh"),MENU_OPTION_CREATE_NAVMESH);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Outline Mesh.."),MENU_OPTION_CREATE_OUTLINE_MESH);
+
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+
+ outline_dialog = memnew( ConfirmationDialog );
+ outline_dialog->set_title(TTR("Create Outline Mesh"));
+ outline_dialog->get_ok()->set_text(TTR("Create"));
+
+ VBoxContainer *outline_dialog_vbc = memnew( VBoxContainer );
+ outline_dialog->add_child(outline_dialog_vbc);
+ //outline_dialog->set_child_rect(outline_dialog_vbc);
+
+ outline_size = memnew( SpinBox );
+ outline_size->set_min(0.001);
+ outline_size->set_max(1024);
+ outline_size->set_step(0.001);
+ outline_size->set_value(0.05);
+ outline_dialog_vbc->add_margin_child(TTR("Outline Size:"),outline_size);
+
+ add_child(outline_dialog);
+ outline_dialog->connect("confirmed",this,"_create_outline_mesh");
+
+ err_dialog = memnew( AcceptDialog );
+ add_child(err_dialog);
+
+}
+
+
+void MeshInstanceEditorPlugin::edit(Object *p_object) {
+
+ mesh_editor->edit(p_object->cast_to<MeshInstance>());
+}
+
+bool MeshInstanceEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("MeshInstance");
+}
+
+void MeshInstanceEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ mesh_editor->options->show();
+ } else {
+
+ mesh_editor->options->hide();
+ mesh_editor->edit(NULL);
+ }
+
+}
+
+MeshInstanceEditorPlugin::MeshInstanceEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ mesh_editor = memnew( MeshInstanceEditor );
+ editor->get_viewport()->add_child(mesh_editor);
+
+ mesh_editor->options->hide();
+}
+
+
+MeshInstanceEditorPlugin::~MeshInstanceEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/mesh_instance_editor_plugin.h b/editor/plugins/mesh_instance_editor_plugin.h
new file mode 100644
index 0000000000..de5be2fbbb
--- /dev/null
+++ b/editor/plugins/mesh_instance_editor_plugin.h
@@ -0,0 +1,97 @@
+/*************************************************************************/
+/* mesh_instance_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef MESH_INSTANCE_EDITOR_PLUGIN_H
+#define MESH_INSTANCE_EDITOR_PLUGIN_H
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/gui/spin_box.h"
+
+
+class MeshInstanceEditor : public Node {
+
+ GDCLASS(MeshInstanceEditor, Node );
+
+
+ enum Menu {
+
+ MENU_OPTION_CREATE_STATIC_TRIMESH_BODY,
+ MENU_OPTION_CREATE_STATIC_CONVEX_BODY,
+ MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE,
+ MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE,
+ MENU_OPTION_CREATE_NAVMESH,
+ MENU_OPTION_CREATE_OUTLINE_MESH,
+ };
+
+ MeshInstance *node;
+
+ MenuButton *options;
+
+ ConfirmationDialog *outline_dialog;
+ SpinBox *outline_size;
+
+ AcceptDialog *err_dialog;
+
+ void _menu_option(int p_option);
+ void _create_outline_mesh();
+
+friend class MeshInstanceEditorPlugin;
+
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(MeshInstance *p_mesh);
+ MeshInstanceEditor();
+};
+
+class MeshInstanceEditorPlugin : public EditorPlugin {
+
+ GDCLASS( MeshInstanceEditorPlugin, EditorPlugin );
+
+ MeshInstanceEditor *mesh_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "MeshInstance"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ MeshInstanceEditorPlugin(EditorNode *p_node);
+ ~MeshInstanceEditorPlugin();
+
+};
+
+#endif // MESH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp
new file mode 100644
index 0000000000..6259ddf473
--- /dev/null
+++ b/editor/plugins/multimesh_editor_plugin.cpp
@@ -0,0 +1,465 @@
+/*************************************************************************/
+/* multimesh_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "multimesh_editor_plugin.h"
+
+#include "scene/gui/box_container.h"
+#include "scene/3d/mesh_instance.h"
+#include "spatial_editor_plugin.h"
+
+void MultiMeshEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+
+void MultiMeshEditor::_populate() {
+
+ if(!node)
+ return;
+
+
+ Ref<Mesh> mesh;
+
+ if (mesh_source->get_text()=="") {
+
+ Ref<MultiMesh> multimesh;
+ multimesh = node->get_multimesh();
+ if (multimesh.is_null()) {
+
+ err_dialog->set_text(TTR("No mesh source specified (and no MultiMesh set in node)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+ if (multimesh->get_mesh().is_null()) {
+
+ err_dialog->set_text(TTR("No mesh source specified (and MultiMesh contains no Mesh)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ mesh = multimesh->get_mesh();
+ } else {
+
+ Node *ms_node = node->get_node(mesh_source->get_text());
+
+ if (!ms_node) {
+
+ err_dialog->set_text(TTR("Mesh source is invalid (invalid path)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ MeshInstance *ms_instance = ms_node->cast_to<MeshInstance>();
+
+ if (!ms_instance) {
+
+ err_dialog->set_text(TTR("Mesh source is invalid (not a MeshInstance)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ mesh=ms_instance->get_mesh();
+
+ if (mesh.is_null()) {
+
+ err_dialog->set_text(TTR("Mesh source is invalid (contains no Mesh resource)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ }
+
+ if (surface_source->get_text()=="") {
+
+ err_dialog->set_text(TTR("No surface source specified."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ Node *ss_node = node->get_node(surface_source->get_text());
+
+ if (!ss_node) {
+
+ err_dialog->set_text(TTR("Surface source is invalid (invalid path)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ GeometryInstance *ss_instance = ss_node->cast_to<MeshInstance>();
+
+ if (!ss_instance) {
+
+ err_dialog->set_text(TTR("Surface source is invalid (no geometry)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ Transform geom_xform = node->get_global_transform().affine_inverse() * ss_instance->get_global_transform();
+
+ PoolVector<Face3> geometry = ss_instance->get_faces(VisualInstance::FACES_SOLID);
+
+ if (geometry.size()==0) {
+
+ err_dialog->set_text(TTR("Surface source is invalid (no faces)."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ //make all faces local
+
+ int gc = geometry.size();
+ PoolVector<Face3>::Write w = geometry.write();
+
+ for(int i=0;i<gc;i++) {
+ for(int j=0;j<3;j++) {
+ w[i].vertex[j] = geom_xform.xform( w[i].vertex[j] );
+ }
+ }
+
+
+
+ w = PoolVector<Face3>::Write();
+#if 0
+ node->get_multimesh()->set_instance_count(populate_amount->get_val());
+ node->populate_parent(populate_rotate_random->get_val(),populate_tilt_random->get_val(),populate_scale_random->get_val(),populate_scale->get_val());
+
+
+ ERR_EXPLAIN("Parent is not of type VisualInstance.");
+ ERR_FAIL_COND(!get_parent() || !get_parent()->is_type("VisualInstance"));
+
+ ERR_EXPLAIN("Multimesh not present.");
+ ERR_FAIL_COND(multimesh.is_null());
+
+ VisualInstance *vi = get_parent()->cast_to<VisualInstance>();
+ ERR_EXPLAIN("Parent is not of type VisualInstance, can't be populated.");
+ ERR_FAIL_COND(!vi);
+
+#endif
+ PoolVector<Face3> faces = geometry;
+ ERR_EXPLAIN(TTR("Parent has no solid faces to populate."));
+ int facecount=faces.size();
+ ERR_FAIL_COND(!facecount);
+
+ PoolVector<Face3>::Read r = faces.read();
+
+
+
+ float area_accum=0;
+ Map<float,int> triangle_area_map;
+ for(int i=0;i<facecount;i++) {
+
+ float area = r[i].get_area();
+ if (area<CMP_EPSILON)
+ continue;
+ triangle_area_map[area_accum]=i;
+ area_accum+=area;
+ }
+
+ ERR_EXPLAIN(TTR("Couldn't map area."));
+ ERR_FAIL_COND(triangle_area_map.size()==0);
+ ERR_EXPLAIN(TTR("Couldn't map area."));
+ ERR_FAIL_COND(area_accum==0);
+
+
+ Ref<MultiMesh> multimesh = memnew( MultiMesh );
+ multimesh->set_mesh(mesh);
+
+ int instance_count=populate_amount->get_value();
+
+ multimesh->set_transform_format(MultiMesh::TRANSFORM_3D);
+ multimesh->set_color_format(MultiMesh::COLOR_NONE);
+ multimesh->set_instance_count(instance_count);
+
+ float _tilt_random = populate_tilt_random->get_value();
+ float _rotate_random = populate_rotate_random->get_value();
+ float _scale_random = populate_scale_random->get_value();
+ float _scale = populate_scale->get_value();
+ int axis = populate_axis->get_selected();
+
+ Transform axis_xform;
+ if (axis==Vector3::AXIS_Z) {
+ axis_xform.rotate(Vector3(1,0,0),-Math_PI*0.5);
+ }
+ if (axis==Vector3::AXIS_X) {
+ axis_xform.rotate(Vector3(0,0,1),-Math_PI*0.5);
+ }
+
+ for(int i=0;i<instance_count;i++) {
+
+ float areapos = Math::random(0.0f,area_accum);
+
+ Map<float,int>::Element *E = triangle_area_map.find_closest(areapos);
+ ERR_FAIL_COND(!E)
+ int index = E->get();
+ ERR_FAIL_INDEX(index,facecount);
+
+ // ok FINALLY get face
+ Face3 face = r[index];
+ //now compute some position inside the face...
+
+ Vector3 pos = face.get_random_point_inside();
+ Vector3 normal = face.get_plane().normal;
+ Vector3 op_axis = (face.vertex[0]-face.vertex[1]).normalized();
+
+ Transform xform;
+
+ xform.set_look_at(pos, pos+op_axis,normal);
+ xform = xform * axis_xform;
+
+
+ Basis post_xform;
+
+ post_xform.rotate(xform.basis.get_axis(1),-Math::random(-_rotate_random,_rotate_random)*Math_PI);
+ post_xform.rotate(xform.basis.get_axis(2),-Math::random(-_tilt_random,_tilt_random)*Math_PI);
+ post_xform.rotate(xform.basis.get_axis(0),-Math::random(-_tilt_random,_tilt_random)*Math_PI);
+
+ xform.basis = post_xform * xform.basis;
+ //xform.basis.orthonormalize();
+
+
+ xform.basis.scale(Vector3(1,1,1)*(_scale+Math::random(-_scale_random,_scale_random)));
+
+
+ multimesh->set_instance_transform(i,xform);
+
+ }
+
+
+
+ node->set_multimesh(multimesh);
+
+}
+
+void MultiMeshEditor::_browsed(const NodePath& p_path) {
+
+
+ NodePath path = node->get_path_to( get_node(p_path) );
+
+ if (browsing_source)
+ mesh_source->set_text(path);
+ else
+ surface_source->set_text(path);
+}
+
+void MultiMeshEditor::_menu_option(int p_option) {
+
+
+ switch(p_option) {
+
+
+ case MENU_OPTION_POPULATE: {
+
+ if (_last_pp_node!=node) {
+
+
+ surface_source->set_text("..");
+ mesh_source->set_text("..");
+ populate_axis->select(1);
+ populate_rotate_random->set_value(0);
+ populate_tilt_random->set_value(0);
+ populate_scale_random->set_value(0);
+ populate_scale->set_value(1);
+ populate_amount->set_value(128);
+
+ _last_pp_node=node;
+ }
+ populate_dialog->popup_centered(Size2(250,380));
+
+ } break;
+ }
+}
+
+
+void MultiMeshEditor::edit(MultiMeshInstance *p_multimesh) {
+
+ node=p_multimesh;
+
+}
+
+void MultiMeshEditor::_browse(bool p_source) {
+
+ browsing_source=p_source;
+ std->get_scene_tree()->set_marked(node,false);
+ std->popup_centered_ratio();
+ if (p_source)
+ std->set_title(TTR("Select a Source Mesh:"));
+ else
+ std->set_title(TTR("Select a Target Surface:"));
+}
+
+void MultiMeshEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_option",&MultiMeshEditor::_menu_option);
+ ClassDB::bind_method("_populate",&MultiMeshEditor::_populate);
+ ClassDB::bind_method("_browsed",&MultiMeshEditor::_browsed);
+ ClassDB::bind_method("_browse",&MultiMeshEditor::_browse);
+}
+
+MultiMeshEditor::MultiMeshEditor() {
+
+
+ options = memnew( MenuButton );
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(options);
+
+ options->set_text("MultiMesh");
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("MultiMeshInstance","EditorIcons"));
+
+ options->get_popup()->add_item(TTR("Populate Surface"));
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+
+ populate_dialog = memnew( ConfirmationDialog );
+ populate_dialog->set_title(TTR("Populate MultiMesh"));
+ add_child(populate_dialog);
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ populate_dialog->add_child(vbc);
+ //populate_dialog->set_child_rect(vbc);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+
+ surface_source = memnew( LineEdit );
+ hbc->add_child(surface_source);
+ surface_source->set_h_size_flags(SIZE_EXPAND_FILL);
+ Button *b = memnew( Button );
+ hbc->add_child(b);
+ b->set_text("..");
+ b->connect("pressed",this,"_browse",make_binds(false));
+
+ vbc->add_margin_child(TTR("Target Surface:"),hbc);
+
+ hbc = memnew( HBoxContainer );
+ mesh_source = memnew( LineEdit );
+ hbc->add_child(mesh_source);
+ mesh_source->set_h_size_flags(SIZE_EXPAND_FILL);
+ b = memnew( Button );
+ hbc->add_child(b);
+ b->set_text("..");
+ vbc->add_margin_child(TTR("Source Mesh:"),hbc);
+ b->connect("pressed",this,"_browse",make_binds(true));
+
+
+ populate_axis = memnew( OptionButton );
+ populate_axis->add_item(TTR("X-Axis"));
+ populate_axis->add_item(TTR("Y-Axis"));
+ populate_axis->add_item(TTR("Z-Axis"));
+ populate_axis->select(2);
+ vbc->add_margin_child(TTR("Mesh Up Axis:"),populate_axis);
+
+ populate_rotate_random = memnew( HSlider );
+ populate_rotate_random->set_max(1);
+ populate_rotate_random->set_step(0.01);
+ vbc->add_margin_child(TTR("Random Rotation:"),populate_rotate_random);
+
+ populate_tilt_random = memnew( HSlider );
+ populate_tilt_random->set_max(1);
+ populate_tilt_random->set_step(0.01);
+ vbc->add_margin_child(TTR("Random Tilt:"),populate_tilt_random);
+
+
+ populate_scale_random = memnew( SpinBox );
+ populate_scale_random->set_min(0);
+ populate_scale_random->set_max(1);
+ populate_scale_random->set_value(0);
+ populate_scale_random->set_step(0.01);
+
+ vbc->add_margin_child(TTR("Random Scale:"),populate_scale_random);
+
+ populate_scale = memnew( SpinBox );
+ populate_scale->set_min(0.001);
+ populate_scale->set_max(4096);
+ populate_scale->set_value(1);
+ populate_scale->set_step(0.01);
+
+ vbc->add_margin_child(TTR("Scale:"),populate_scale);
+
+
+ populate_amount = memnew( SpinBox );
+ populate_amount->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ populate_amount->set_begin( Point2(20,232));
+ populate_amount->set_end( Point2(5,237));
+ populate_amount->set_min(1);
+ populate_amount->set_max(65536);
+ populate_amount->set_value(128);
+ vbc->add_margin_child(TTR("Amount:"),populate_amount);
+
+ populate_dialog->get_ok()->set_text(TTR("Populate"));
+
+ populate_dialog->get_ok()->connect("pressed", this,"_populate");
+ std = memnew( SceneTreeDialog );
+ populate_dialog->add_child(std);
+ std->connect("selected",this,"_browsed");
+
+ _last_pp_node=NULL;
+
+ err_dialog = memnew( AcceptDialog );
+ add_child(err_dialog);
+}
+
+
+void MultiMeshEditorPlugin::edit(Object *p_object) {
+
+ multimesh_editor->edit(p_object->cast_to<MultiMeshInstance>());
+}
+
+bool MultiMeshEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("MultiMeshInstance");
+}
+
+void MultiMeshEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ multimesh_editor->options->show();
+ } else {
+
+ multimesh_editor->options->hide();
+ multimesh_editor->edit(NULL);
+ }
+
+}
+
+MultiMeshEditorPlugin::MultiMeshEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ multimesh_editor = memnew( MultiMeshEditor );
+ editor->get_viewport()->add_child(multimesh_editor);
+
+ multimesh_editor->options->hide();
+}
+
+
+MultiMeshEditorPlugin::~MultiMeshEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/multimesh_editor_plugin.h b/editor/plugins/multimesh_editor_plugin.h
new file mode 100644
index 0000000000..a97b3758a1
--- /dev/null
+++ b/editor/plugins/multimesh_editor_plugin.h
@@ -0,0 +1,107 @@
+/*************************************************************************/
+/* multimesh_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef MULTIMESH_EDITOR_PLUGIN_H
+#define MULTIMESH_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/multimesh_instance.h"
+#include "scene/gui/spin_box.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class MultiMeshEditor : public Control {
+
+ GDCLASS(MultiMeshEditor, Control );
+
+friend class MultiMeshEditorPlugin;
+
+ AcceptDialog *err_dialog;
+ MenuButton * options;
+ MultiMeshInstance *_last_pp_node;
+ bool browsing_source;
+
+ Panel *panel;
+ MultiMeshInstance *node;
+
+ LineEdit *surface_source;
+ LineEdit *mesh_source;
+
+ SceneTreeDialog *std;
+
+ ConfirmationDialog *populate_dialog;
+ OptionButton *populate_axis;
+ HSlider *populate_rotate_random;
+ HSlider *populate_tilt_random;
+ SpinBox *populate_scale_random;
+ SpinBox *populate_scale;
+ SpinBox *populate_amount;
+
+ enum Menu {
+
+ MENU_OPTION_POPULATE
+ };
+
+ void _browsed(const NodePath& p_path);
+ void _menu_option(int);
+ void _populate();
+ void _browse(bool p_source);
+
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(MultiMeshInstance *p_multimesh);
+ MultiMeshEditor();
+};
+
+class MultiMeshEditorPlugin : public EditorPlugin {
+
+ GDCLASS( MultiMeshEditorPlugin, EditorPlugin );
+
+ MultiMeshEditor *multimesh_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "MultiMesh"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ MultiMeshEditorPlugin(EditorNode *p_node);
+ ~MultiMeshEditorPlugin();
+
+};
+
+#endif // MULTIMESH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp
new file mode 100644
index 0000000000..654afb754e
--- /dev/null
+++ b/editor/plugins/navigation_polygon_editor_plugin.cpp
@@ -0,0 +1,566 @@
+/*************************************************************************/
+/* navigation_polygon_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "navigation_polygon_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+
+void NavigationPolygonEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ button_create->set_icon( get_icon("Edit","EditorIcons"));
+ button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ button_edit->set_pressed(true);
+ get_tree()->connect("node_removed",this,"_node_removed");
+ create_nav->connect("confirmed",this,"_create_nav");
+
+ } break;
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void NavigationPolygonEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+}
+
+void NavigationPolygonEditor::_create_nav() {
+
+ if (!node)
+ return;
+
+ undo_redo->create_action(TTR("Create Navigation Polygon"));
+ undo_redo->add_do_method(node,"set_navigation_polygon",Ref<NavigationPolygon>(memnew( NavigationPolygon)));
+ undo_redo->add_undo_method(node,"set_navigation_polygon",Variant(REF()));
+ undo_redo->commit_action();
+}
+
+void NavigationPolygonEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case MODE_CREATE: {
+
+ mode=MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+
+ mode=MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+
+ }
+}
+
+void NavigationPolygonEditor::_wip_close() {
+
+
+ if (wip.size()>=3) {
+
+ undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"remove_outline",node->get_navigation_polygon()->get_outline_count());
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"add_outline",wip);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ mode=MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ }
+
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+}
+
+bool NavigationPolygonEditor::forward_gui_input(const InputEvent& p_event) {
+
+
+ if (!node)
+ return false;
+
+ if (node->get_navigation_polygon().is_null()) {
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && p_event.mouse_button.pressed) {
+ create_nav->set_text("No NavigationPolygon resource on this node.\nCreate and assign one?");
+ create_nav->popup_centered_minsize();
+ }
+ return (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1);
+ }
+
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+
+
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( cpoint );
+ wip_active=true;
+ edited_point_pos=cpoint;
+ edited_outline=-1;
+ canvas_item_editor->get_viewport_control()->update();
+ edited_point=1;
+ return true;
+ } else {
+
+
+ if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+
+ wip.push_back( cpoint );
+ edited_point=wip.size();
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close();
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ //search edges
+ int closest_outline=-1;
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+
+ for(int j=0;j<node->get_navigation_polygon()->get_outline_count();j++) {
+
+
+ PoolVector<Vector2> points=node->get_navigation_polygon()->get_outline(j);
+
+ int pc=points.size();
+ PoolVector<Vector2>::Read poly=points.read();
+
+ for(int i=0;i<pc;i++) {
+
+ Vector2 points[2] ={ xform.xform(poly[i]),
+ xform.xform(poly[(i+1)%pc]) };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_outline=j;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=node->get_navigation_polygon()->get_outline(closest_outline);
+ PoolVector<Point2> poly = pre_move_edit;
+ poly.insert(closest_idx+1,xform.affine_inverse().xform(closest_pos));
+ edited_point=closest_idx+1;
+ edited_outline=closest_outline;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ node->get_navigation_polygon()->set_outline(closest_outline,poly);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+ int closest_outline=-1;
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+
+ for(int j=0;j<node->get_navigation_polygon()->get_outline_count();j++) {
+
+
+ PoolVector<Vector2> points=node->get_navigation_polygon()->get_outline(j);
+
+ int pc=points.size();
+ PoolVector<Vector2>::Read poly=points.read();
+
+ for(int i=0;i<pc;i++) {
+
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_outline=j;
+ closest_idx=i;
+ }
+ }
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=node->get_navigation_polygon()->get_outline(closest_outline);
+ edited_point=closest_idx;
+ edited_outline=closest_outline;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ PoolVector<Vector2> poly = node->get_navigation_polygon()->get_outline(edited_outline);
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly.set(edited_point,edited_point_pos);
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"set_outline",edited_outline,poly);
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"set_outline",edited_outline,pre_move_edit);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+ int closest_outline=-1;
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+
+ for(int j=0;j<node->get_navigation_polygon()->get_outline_count();j++) {
+
+
+ PoolVector<Vector2> points=node->get_navigation_polygon()->get_outline(j);
+
+ int pc=points.size();
+ PoolVector<Vector2>::Read poly=points.read();
+
+ for(int i=0;i<pc;i++) {
+
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_outline=j;
+ closest_idx=i;
+ }
+ }
+ }
+
+ if (closest_idx>=0) {
+
+
+ PoolVector<Vector2> poly = node->get_navigation_polygon()->get_outline(closest_outline);
+
+ if (poly.size()>3) {
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"set_outline",closest_outline,poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"set_outline",closest_outline,poly);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ } else {
+
+ undo_redo->create_action(TTR("Remove Poly And Point"));
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"add_outline_at_index",poly,closest_outline);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"remove_outline",closest_outline);
+ undo_redo->add_do_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_undo_method(node->get_navigation_polygon().ptr(),"make_polygons_from_outlines");
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ }
+ return true;
+ }
+ }
+
+
+
+ } break;
+ }
+
+
+
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ }
+
+ } break;
+ }
+
+ return false;
+}
+void NavigationPolygonEditor::_canvas_draw() {
+
+ if (!node)
+ return;
+
+ Control *vpc = canvas_item_editor->get_viewport_control();
+ if (node->get_navigation_polygon().is_null())
+ return;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+
+
+
+ for(int j=-1;j<node->get_navigation_polygon()->get_outline_count();j++) {
+ Vector<Vector2> poly;
+
+ if (wip_active && j==edited_outline) {
+ poly=wip;
+ } else {
+ if (j==-1)
+ continue;
+ poly = Variant(node->get_navigation_polygon()->get_outline(j));
+ }
+
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = (j==edited_outline && i==edited_point) ? edited_point_pos : poly[i];
+ if (j==edited_outline && ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point)))
+ p2=edited_point_pos;
+ else
+ p2 = poly[(i+1)%poly.size()];
+
+ Vector2 point = xform.xform(p);
+ Vector2 next_point = xform.xform(p2);
+
+ Color col=Color(1,0.3,0.1,0.8);
+ vpc->draw_line(point,next_point,col,2);
+ vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+ }
+}
+
+
+
+void NavigationPolygonEditor::edit(Node *p_collision_polygon) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_collision_polygon) {
+
+ node=p_collision_polygon->cast_to<NavigationPolygonInstance>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+ canvas_item_editor->get_viewport_control()->update();
+
+ } else {
+ node=NULL;
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ }
+
+}
+
+void NavigationPolygonEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&NavigationPolygonEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&NavigationPolygonEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&NavigationPolygonEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_create_nav"),&NavigationPolygonEditor::_create_nav);
+
+}
+
+NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) {
+ node=NULL;
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ add_child( memnew( VSeparator ));
+ button_create = memnew( ToolButton );
+ add_child(button_create);
+ button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+ button_create->set_tooltip(TTR("Create a new polygon from scratch."));
+
+ button_edit = memnew( ToolButton );
+ add_child(button_edit);
+ button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+ button_edit->set_tooltip(TTR("Edit existing polygon:")+"\n"+TTR("LMB: Move Point.")+"\n"+TTR("Ctrl+LMB: Split Segment.")+"\n"+TTR("RMB: Erase Point."));
+ create_nav = memnew( ConfirmationDialog );
+ add_child(create_nav);
+ create_nav->get_ok()->set_text(TTR("Create"));
+
+
+ //add_constant_override("separation",0);
+
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ mode = MODE_EDIT;
+ wip_active=false;
+ edited_outline=-1;
+
+}
+
+
+void NavigationPolygonEditorPlugin::edit(Object *p_object) {
+
+ collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool NavigationPolygonEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("NavigationPolygonInstance");
+}
+
+void NavigationPolygonEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(NULL);
+ }
+
+}
+
+NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ collision_polygon_editor = memnew( NavigationPolygonEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+
+
+
+}
+
+
+NavigationPolygonEditorPlugin::~NavigationPolygonEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h
new file mode 100644
index 0000000000..0d5e67e352
--- /dev/null
+++ b/editor/plugins/navigation_polygon_editor_plugin.h
@@ -0,0 +1,118 @@
+/*************************************************************************/
+/* navigation_polygon_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef NAVIGATIONPOLYGONEDITORPLUGIN_H
+#define NAVIGATIONPOLYGONEDITORPLUGIN_H
+
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/navigation_polygon.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class CanvasItemEditor;
+
+class NavigationPolygonEditor : public HBoxContainer {
+
+ GDCLASS(NavigationPolygonEditor, HBoxContainer );
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+
+ };
+
+ Mode mode;
+
+ ToolButton *button_create;
+ ToolButton *button_edit;
+
+ ConfirmationDialog *create_nav;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ NavigationPolygonInstance *node;
+ MenuButton *options;
+
+ int edited_outline;
+ int edited_point;
+ Vector2 edited_point_pos;
+ PoolVector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+
+
+ void _wip_close();
+ void _canvas_draw();
+ void _create_nav();
+
+ void _menu_option(int p_option);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_collision_polygon);
+ NavigationPolygonEditor(EditorNode *p_editor);
+};
+
+class NavigationPolygonEditorPlugin : public EditorPlugin {
+
+ GDCLASS( NavigationPolygonEditorPlugin, EditorPlugin );
+
+ NavigationPolygonEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "NavigationPolygonInstance"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ NavigationPolygonEditorPlugin(EditorNode *p_node);
+ ~NavigationPolygonEditorPlugin();
+
+};
+
+
+#endif // NAVIGATIONPOLYGONEDITORPLUGIN_H
diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..1efdbe9e68
--- /dev/null
+++ b/editor/plugins/particles_2d_editor_plugin.cpp
@@ -0,0 +1,199 @@
+/*************************************************************************/
+/* particles_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "particles_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "io/image_loader.h"
+#include "scene/gui/separator.h"
+
+void Particles2DEditorPlugin::edit(Object *p_object) {
+
+ if (p_object) {
+ particles=p_object->cast_to<Particles2D>();
+ } else {
+ particles=NULL;
+ }
+}
+
+bool Particles2DEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Particles2D");
+}
+
+void Particles2DEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ toolbar->show();
+ } else {
+
+ toolbar->hide();
+ }
+
+}
+
+void Particles2DEditorPlugin::_file_selected(const String& p_file) {
+
+ print_line("file: "+p_file);
+
+ int epc=epoints->get_value();
+
+ Image img;
+ Error err = ImageLoader::load_image(p_file,&img);
+ ERR_EXPLAIN(TTR("Error loading image:")+" "+p_file);
+ ERR_FAIL_COND(err!=OK);
+
+ img.convert(Image::FORMAT_LA8);
+ ERR_FAIL_COND(img.get_format()!=Image::FORMAT_LA8);
+ Size2i s = Size2(img.get_width(),img.get_height());
+ ERR_FAIL_COND(s.width==0 || s.height==0);
+
+ PoolVector<uint8_t> data = img.get_data();
+ PoolVector<uint8_t>::Read r = data.read();
+
+ Vector<Point2i> valid_positions;
+ valid_positions.resize(s.width*s.height);
+ int vpc=0;
+
+
+ for(int i=0;i<s.width*s.height;i++) {
+
+ uint8_t a = r[i*2+1];
+ if (a>128) {
+ valid_positions[vpc++]=Point2i(i%s.width,i/s.width);
+ }
+ }
+
+ valid_positions.resize(vpc);
+
+ ERR_EXPLAIN(TTR("No pixels with transparency > 128 in image.."));
+ ERR_FAIL_COND(valid_positions.size()==0);
+
+ PoolVector<Point2> epoints;
+ epoints.resize(epc);
+ PoolVector<Point2>::Write w = epoints.write();
+
+ Size2 extents = Size2(img.get_width()*0.5,img.get_height()*0.5);
+
+ for(int i=0;i<epc;i++) {
+
+ Point2 p = valid_positions[Math::rand()%vpc];
+ p-=s/2;
+ w[i]=p/extents;
+ }
+
+ w = PoolVector<Point2>::Write();
+
+ undo_redo->create_action(TTR("Set Emission Mask"));
+ undo_redo->add_do_method(particles,"set_emission_points",epoints);
+ undo_redo->add_do_method(particles,"set_emission_half_extents",extents);
+ undo_redo->add_undo_method(particles,"set_emission_points",particles->get_emission_points());
+ undo_redo->add_undo_method(particles,"set_emission_half_extents",particles->get_emission_half_extents());
+ undo_redo->commit_action();
+
+}
+
+void Particles2DEditorPlugin::_menu_callback(int p_idx) {
+
+ switch(p_idx) {
+ case MENU_LOAD_EMISSION_MASK: {
+
+
+ file->popup_centered_ratio();
+
+ } break;
+ case MENU_CLEAR_EMISSION_MASK: {
+
+ undo_redo->create_action(TTR("Clear Emission Mask"));
+ undo_redo->add_do_method(particles,"set_emission_points",PoolVector<Vector2>());
+ undo_redo->add_undo_method(particles,"set_emission_points",particles->get_emission_points());
+ undo_redo->commit_action();
+ } break;
+ }
+
+}
+
+
+void Particles2DEditorPlugin::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ menu->get_popup()->connect("id_pressed",this,"_menu_callback");
+ menu->set_icon(menu->get_popup()->get_icon("Particles2D","EditorIcons"));
+ file->connect("file_selected",this,"_file_selected");
+ }
+}
+
+void Particles2DEditorPlugin::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_callback"),&Particles2DEditorPlugin::_menu_callback);
+ ClassDB::bind_method(D_METHOD("_file_selected"),&Particles2DEditorPlugin::_file_selected);
+}
+
+
+
+Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) {
+
+ particles=NULL;
+ editor=p_node;
+ undo_redo=editor->get_undo_redo();
+
+ toolbar = memnew( HBoxContainer );
+ add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar);
+ toolbar->hide();
+
+ toolbar->add_child( memnew( VSeparator ) );
+
+ menu = memnew( MenuButton );
+ menu->get_popup()->add_item(TTR("Load Emission Mask"),MENU_LOAD_EMISSION_MASK);
+ menu->get_popup()->add_item(TTR("Clear Emission Mask"),MENU_CLEAR_EMISSION_MASK);
+ menu->set_text("Particles");
+ toolbar->add_child(menu);
+
+ file = memnew( EditorFileDialog );
+ List<String> ext;
+ ImageLoader::get_recognized_extensions(&ext);
+ for(List<String>::Element *E=ext.front();E;E=E->next()) {
+ file->add_filter("*."+E->get()+"; "+E->get().to_upper());
+ }
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ toolbar->add_child(file);
+
+ epoints = memnew( SpinBox );
+ epoints->set_min(1);
+ epoints->set_max(8192);
+ epoints->set_step(1);
+ epoints->set_value(512);
+ file->get_vbox()->add_margin_child(TTR("Generated Point Count:"),epoints);
+}
+
+Particles2DEditorPlugin::~Particles2DEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/particles_2d_editor_plugin.h b/editor/plugins/particles_2d_editor_plugin.h
new file mode 100644
index 0000000000..ea71c739f3
--- /dev/null
+++ b/editor/plugins/particles_2d_editor_plugin.h
@@ -0,0 +1,82 @@
+/*************************************************************************/
+/* particles_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PARTICLES_2D_EDITOR_PLUGIN_H
+#define PARTICLES_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/collision_polygon_2d.h"
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/2d/particles_2d.h"
+
+class Particles2DEditorPlugin : public EditorPlugin {
+
+ GDCLASS( Particles2DEditorPlugin, EditorPlugin );
+
+ enum {
+
+ MENU_LOAD_EMISSION_MASK,
+ MENU_CLEAR_EMISSION_MASK
+ };
+
+ Particles2D *particles;
+
+ EditorFileDialog *file;
+ EditorNode *editor;
+
+ HBoxContainer *toolbar;
+ MenuButton *menu;
+
+ SpinBox *epoints;
+
+ UndoRedo *undo_redo;
+ void _file_selected(const String& p_file);
+ void _menu_callback(int p_idx);
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+
+ virtual String get_name() const { return "Particles2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ Particles2DEditorPlugin(EditorNode *p_node);
+ ~Particles2DEditorPlugin();
+
+};
+
+
+#endif // PARTICLES_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp
new file mode 100644
index 0000000000..4ce1f5eb54
--- /dev/null
+++ b/editor/plugins/particles_editor_plugin.cpp
@@ -0,0 +1,461 @@
+/*************************************************************************/
+/* particles_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#if 0
+#include "particles_editor_plugin.h"
+#include "io/resource_loader.h"
+#include "servers/visual/particle_system_sw.h"
+#include "editor/plugins/spatial_editor_plugin.h"
+
+
+void ParticlesEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+
+void ParticlesEditor::_resource_seleted(const String& p_res) {
+
+ //print_line("selected resource path: "+p_res);
+}
+
+void ParticlesEditor::_node_selected(const NodePath& p_path){
+
+
+ Node *sel = get_node(p_path);
+ if (!sel)
+ return;
+
+ VisualInstance *vi = sel->cast_to<VisualInstance>();
+ if (!vi) {
+
+ err_dialog->set_text(TTR("Node does not contain geometry."));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ geometry = vi->get_faces(VisualInstance::FACES_SOLID);
+
+ if (geometry.size()==0) {
+
+ err_dialog->set_text(TTR("Node does not contain geometry (faces)."));
+ err_dialog->popup_centered_minsize();
+ return;
+
+ }
+
+ Transform geom_xform = node->get_global_transform().affine_inverse() * vi->get_global_transform();
+
+ int gc = geometry.size();
+ PoolVector<Face3>::Write w = geometry.write();
+
+
+ for(int i=0;i<gc;i++) {
+ for(int j=0;j<3;j++) {
+ w[i].vertex[j] = geom_xform.xform( w[i].vertex[j] );
+ }
+ }
+
+
+ w = PoolVector<Face3>::Write();
+
+ emission_dialog->popup_centered(Size2(300,130));
+}
+
+
+/*
+
+void ParticlesEditor::_populate() {
+
+ if(!node)
+ return;
+
+
+ if (node->get_particles().is_null())
+ return;
+
+ node->get_particles()->set_instance_count(populate_amount->get_text().to_int());
+ node->populate_parent(populate_rotate_random->get_val(),populate_tilt_random->get_val(),populate_scale_random->get_text().to_double(),populate_scale->get_text().to_double());
+
+}
+*/
+
+void ParticlesEditor::_notification(int p_notification) {
+
+ if (p_notification==NOTIFICATION_ENTER_TREE) {
+ options->set_icon(options->get_popup()->get_icon("Particles","EditorIcons"));
+
+ }
+}
+
+
+void ParticlesEditor::_menu_option(int p_option) {
+
+
+ switch(p_option) {
+
+ case MENU_OPTION_GENERATE_AABB: {
+
+ Transform globalizer = node->get_global_transform();
+ ParticleSystemSW pssw;
+ for(int i=0;i<VS::PARTICLE_VAR_MAX;i++) {
+
+ pssw.particle_vars[i]=node->get_variable((Particles::Variable)i);
+ pssw.particle_randomness[i]=node->get_randomness((Particles::Variable)i);
+ }
+
+ pssw.emission_half_extents=node->get_emission_half_extents();
+ pssw.emission_points=node->get_emission_points();
+ pssw.emission_base_velocity=node->get_emission_base_velocity();
+ pssw.amount=node->get_amount();
+ pssw.gravity_normal=node->get_gravity_normal();
+ pssw.emitting=true;
+ pssw.height_from_velocity=node->has_height_from_velocity();
+ pssw.color_phase_count=1;
+
+
+ ParticleSystemProcessSW pp;
+ float delta=0.01;
+ float lifetime=pssw.particle_vars[VS::PARTICLE_LIFETIME];
+
+
+ Transform localizer = globalizer.affine_inverse();
+ AABB aabb;
+ for(float t=0;t<lifetime;t+=delta) {
+
+ pp.process(&pssw,globalizer,delta);
+ for(int i=0;i<pp.particle_data.size();i++) {
+
+ Vector3 p = localizer.xform(pp.particle_data[i].pos);
+
+ if (t==0 && i==0)
+ aabb.pos=p;
+ else
+ aabb.expand_to(p);
+ }
+ }
+
+ aabb.grow_by( aabb.get_longest_axis_size()*0.2);
+
+ node->set_visibility_aabb(aabb);
+
+
+ } break;
+ case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH: {
+
+
+ emission_file_dialog->popup_centered_ratio();
+
+ } break;
+
+ case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: {
+/*
+ Node *root = get_scene()->get_root_node();
+ ERR_FAIL_COND(!root);
+ EditorNode *en = root->cast_to<EditorNode>();
+ ERR_FAIL_COND(!en);
+ Node * node = en->get_edited_scene();
+*/
+ emission_tree_dialog->popup_centered_ratio();
+
+ } break;
+ }
+}
+
+
+void ParticlesEditor::edit(Particles *p_particles) {
+
+ node=p_particles;
+
+}
+
+void ParticlesEditor::_generate_emission_points() {
+
+ /// hacer codigo aca
+ PoolVector<Vector3> points;
+
+ if (emission_fill->get_selected()==0) {
+
+ float area_accum=0;
+ Map<float,int> triangle_area_map;
+ print_line("geometry size: "+itos(geometry.size()));
+
+ for(int i=0;i<geometry.size();i++) {
+
+ float area = geometry[i].get_area();
+ if (area<CMP_EPSILON)
+ continue;
+ triangle_area_map[area_accum]=i;
+ area_accum+=area;
+ }
+
+ if (!triangle_area_map.size() || area_accum==0) {
+
+ err_dialog->set_text(TTR("Faces contain no area!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ int emissor_count=emission_amount->get_val();
+
+ for(int i=0;i<emissor_count;i++) {
+
+ float areapos = Math::random(0,area_accum);
+
+ Map<float,int>::Element *E = triangle_area_map.find_closest(areapos);
+ ERR_FAIL_COND(!E)
+ int index = E->get();
+ ERR_FAIL_INDEX(index,geometry.size());
+
+ // ok FINALLY get face
+ Face3 face = geometry[index];
+ //now compute some position inside the face...
+
+ Vector3 pos = face.get_random_point_inside();
+
+ points.push_back(pos);
+ }
+ } else {
+
+ int gcount = geometry.size();
+
+ if (gcount==0) {
+
+ err_dialog->set_text(TTR("No faces!"));
+ err_dialog->popup_centered_minsize();
+ return;
+ }
+
+ PoolVector<Face3>::Read r = geometry.read();
+
+ AABB aabb;
+
+ for(int i=0;i<gcount;i++) {
+
+ for(int j=0;j<3;j++) {
+
+ if (i==0 && j==0)
+ aabb.pos=r[i].vertex[j];
+ else
+ aabb.expand_to(r[i].vertex[j]);
+ }
+ }
+
+ int emissor_count=emission_amount->get_val();
+
+ for(int i=0;i<emissor_count;i++) {
+
+ int attempts=5;
+
+ for(int j=0;j<attempts;j++) {
+
+ Vector3 dir;
+ dir[Math::rand()%3]=1.0;
+ Vector3 ofs = Vector3(1,1,1)-dir;
+ ofs=(Vector3(1,1,1)-dir)*Vector3(Math::randf(),Math::randf(),Math::randf())*aabb.size;
+ ofs+=aabb.pos;
+
+ Vector3 ofsv = ofs + aabb.size * dir;
+
+ //space it a little
+ ofs -= dir;
+ ofsv += dir;
+
+ float max=-1e7,min=1e7;
+
+ for(int k=0;k<gcount;k++) {
+
+ const Face3& f3 = r[k];
+
+ Vector3 res;
+ if (f3.intersects_segment(ofs,ofsv,&res)) {
+
+ res-=ofs;
+ float d = dir.dot(res);
+
+ if (d<min)
+ min=d;
+ if (d>max)
+ max=d;
+
+ }
+ }
+
+
+ if (max<min)
+ continue; //lost attempt
+
+ float val = min + (max-min)*Math::randf();
+
+ Vector3 point = ofs + dir * val;
+
+ points.push_back(point);
+ break;
+ }
+ }
+ }
+
+ //print_line("point count: "+itos(points.size()));
+ node->set_emission_points(points);
+
+}
+
+void ParticlesEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_option",&ParticlesEditor::_menu_option);
+ ClassDB::bind_method("_resource_seleted",&ParticlesEditor::_resource_seleted);
+ ClassDB::bind_method("_node_selected",&ParticlesEditor::_node_selected);
+ ClassDB::bind_method("_generate_emission_points",&ParticlesEditor::_generate_emission_points);
+
+ //ClassDB::bind_method("_populate",&ParticlesEditor::_populate);
+
+}
+
+ParticlesEditor::ParticlesEditor() {
+
+ particles_editor_hb = memnew ( HBoxContainer );
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb);
+ options = memnew( MenuButton );
+ particles_editor_hb->add_child(options);
+ particles_editor_hb->hide();
+
+ options->set_text("Particles");
+ options->get_popup()->add_item(TTR("Generate AABB"),MENU_OPTION_GENERATE_AABB);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Emitter From Mesh"),MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH);
+ options->get_popup()->add_item(TTR("Create Emitter From Node"),MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
+ options->get_popup()->add_item(TTR("Clear Emitter"),MENU_OPTION_CLEAR_EMISSION_VOLUME);
+
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+
+ emission_dialog = memnew( ConfirmationDialog );
+ emission_dialog->set_title(TTR("Create Emitter"));
+ add_child(emission_dialog);
+ Label *l = memnew(Label);
+ l->set_pos(Point2(5,5));
+ l->set_text(TTR("Emission Positions:"));
+ emission_dialog->add_child(l);
+
+
+ emission_amount = memnew( SpinBox );
+ emission_amount->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ emission_amount->set_begin( Point2(20,23));
+ emission_amount->set_end( Point2(5,25));
+ emission_amount->set_min(1);
+ emission_amount->set_max(65536);
+ emission_amount->set_val(512);
+ emission_dialog->add_child(emission_amount);
+ emission_dialog->get_ok()->set_text(TTR("Create"));
+ emission_dialog->connect("confirmed",this,"_generate_emission_points");
+
+ l = memnew(Label);
+ l->set_pos(Point2(5,50));
+ l->set_text(TTR("Emission Fill:"));
+ emission_dialog->add_child(l);
+
+ emission_fill = memnew( OptionButton );
+ emission_fill->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ emission_fill->set_begin( Point2(20,70));
+ emission_fill->set_end( Point2(5,75));
+ emission_fill->add_item(TTR("Surface"));
+ emission_fill->add_item(TTR("Volume"));
+ emission_dialog->add_child(emission_fill);
+
+ err_dialog = memnew( ConfirmationDialog );
+ //err_dialog->get_cancel()->hide();
+ add_child(err_dialog);
+
+
+ emission_file_dialog = memnew( EditorFileDialog );
+ add_child(emission_file_dialog);
+ emission_file_dialog->connect("file_selected",this,"_resource_seleted");
+ emission_tree_dialog = memnew( SceneTreeDialog );
+ add_child(emission_tree_dialog);
+ emission_tree_dialog->connect("selected",this,"_node_selected");
+
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("Mesh",&extensions);
+
+ emission_file_dialog->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ emission_file_dialog->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ emission_file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+
+ //options->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ //options->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+
+}
+
+
+void ParticlesEditorPlugin::edit(Object *p_object) {
+
+ particles_editor->edit(p_object->cast_to<Particles>());
+}
+
+bool ParticlesEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("Particles");
+}
+
+void ParticlesEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ particles_editor->show();
+ particles_editor->particles_editor_hb->show();
+ } else {
+ particles_editor->particles_editor_hb->hide();
+ particles_editor->hide();
+ particles_editor->edit(NULL);
+ }
+
+}
+
+ParticlesEditorPlugin::ParticlesEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ particles_editor = memnew( ParticlesEditor );
+ editor->get_viewport()->add_child(particles_editor);
+
+ particles_editor->hide();
+}
+
+
+ParticlesEditorPlugin::~ParticlesEditorPlugin()
+{
+}
+
+
+#endif
diff --git a/editor/plugins/particles_editor_plugin.h b/editor/plugins/particles_editor_plugin.h
new file mode 100644
index 0000000000..06134ddef2
--- /dev/null
+++ b/editor/plugins/particles_editor_plugin.h
@@ -0,0 +1,116 @@
+/*************************************************************************/
+/* particles_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PARTICLES_EDITOR_PLUGIN_H
+#define PARTICLES_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/particles.h"
+#include "scene/gui/spin_box.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+#if 0
+class ParticlesEditor : public Control {
+
+ GDCLASS(ParticlesEditor, Control );
+
+ Panel *panel;
+ MenuButton *options;
+ HBoxContainer *particles_editor_hb;
+ Particles *node;
+
+
+ EditorFileDialog *emission_file_dialog;
+ SceneTreeDialog *emission_tree_dialog;
+
+ ConfirmationDialog *err_dialog;
+
+ ConfirmationDialog *emission_dialog;
+ SpinBox *emission_amount;
+ OptionButton *emission_fill;
+
+
+
+
+ enum Menu {
+
+ MENU_OPTION_GENERATE_AABB,
+ MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE,
+ MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH,
+ MENU_OPTION_CLEAR_EMISSION_VOLUME,
+
+ };
+
+ PoolVector<Face3> geometry;
+
+ void _generate_emission_points();
+ void _resource_seleted(const String& p_res);
+ void _node_selected(const NodePath& p_path);
+
+ void _menu_option(int);
+
+ void _populate();
+
+friend class ParticlesEditorPlugin;
+
+protected:
+
+ void _notification(int p_notification);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(Particles *p_particles);
+ ParticlesEditor();
+};
+
+class ParticlesEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ParticlesEditorPlugin, EditorPlugin );
+
+ ParticlesEditor *particles_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Particles"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ParticlesEditorPlugin(EditorNode *p_node);
+ ~ParticlesEditorPlugin();
+
+};
+
+#endif // PARTICLES_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..00b026e25b
--- /dev/null
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -0,0 +1,718 @@
+/*************************************************************************/
+/* path_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "path_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+#include "os/keyboard.h"
+void Path2DEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ //button_create->set_icon( get_icon("Edit","EditorIcons"));
+ //button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ //set_pressed_button(button_edit);
+ //button_edit->set_pressed(true);
+
+
+ } break;
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void Path2DEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+
+bool Path2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+ if (!node)
+ return false;
+
+ if (!node->is_visible_in_tree())
+ return false;
+
+ if (!node->get_curve().is_valid())
+ return false;
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = !mb.mod.alt? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint))
+ : node->get_global_transform().affine_inverse().xform( canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+
+
+ // Test move point!!
+
+ if ( mb.pressed && action==ACTION_NONE ) {
+
+ Ref<Curve2D> curve = node->get_curve();
+
+ for(int i=0;i<curve->get_point_count();i++) {
+
+ bool pointunder=false;
+
+ {
+ Point2 p = xform.xform( curve->get_point_pos(i) );
+ if (gpoint.distance_to(p) < grab_treshold ) {
+
+ if (mb.button_index==BUTTON_LEFT && !mb.mod.shift && mode==MODE_EDIT) {
+
+ action=ACTION_MOVING_POINT;
+ action_point=i;
+ moving_from=curve->get_point_pos(i);
+ moving_screen_from=gpoint;
+ return true;
+ } else if ((mb.button_index==BUTTON_RIGHT && mode==MODE_EDIT) || (mb.button_index==BUTTON_LEFT && mode==MODE_DELETE)) {
+
+ undo_redo->create_action(TTR("Remove Point from Curve"));
+ undo_redo->add_do_method(curve.ptr(),"remove_point",i);
+ undo_redo->add_undo_method(curve.ptr(),"add_point",curve->get_point_pos(i),curve->get_point_in(i),curve->get_point_out(i),i);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ } else
+ pointunder=true;
+ }
+ }
+
+ if (mb.button_index==BUTTON_LEFT && i<(curve->get_point_count()-1)) {
+ Point2 p = xform.xform( curve->get_point_pos(i)+curve->get_point_out(i) );
+ if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode==MODE_EDIT_CURVE) ) {
+
+ action=ACTION_MOVING_OUT;
+ action_point=i;
+ moving_from=curve->get_point_out(i);
+ moving_screen_from=gpoint;
+ return true;
+ }
+ }
+
+ if (mb.button_index==BUTTON_LEFT && i>0) {
+ Point2 p = xform.xform( curve->get_point_pos(i)+curve->get_point_in(i) );
+ if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode==MODE_EDIT_CURVE)) {
+
+ action=ACTION_MOVING_IN;
+ action_point=i;
+ moving_from=curve->get_point_in(i);
+ moving_screen_from=gpoint;
+ return true;
+ }
+ }
+
+ if (pointunder)
+ return true;
+
+ }
+
+ }
+
+ // Test add point in empty space!
+
+ if ( mb.pressed && mb.button_index==BUTTON_LEFT && ((mb.mod.command && mode == MODE_EDIT) || mode == MODE_CREATE)) {
+
+ Ref<Curve2D> curve = node->get_curve();
+
+ undo_redo->create_action(TTR("Add Point to Curve"));
+ undo_redo->add_do_method(curve.ptr(),"add_point",cpoint);
+ undo_redo->add_undo_method(curve.ptr(),"remove_point",curve->get_point_count());
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ action=ACTION_MOVING_POINT;
+ action_point=curve->get_point_count()-1;
+ moving_from=curve->get_point_pos(action_point);
+ moving_screen_from=gpoint;
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ return true;
+ }
+
+ if ( !mb.pressed && mb.button_index==BUTTON_LEFT && action!=ACTION_NONE) {
+
+
+ Ref<Curve2D> curve = node->get_curve();
+
+ Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from);
+ switch(action) {
+
+ case ACTION_MOVING_POINT: {
+
+
+ undo_redo->create_action(TTR("Move Point in Curve"));
+ undo_redo->add_do_method(curve.ptr(),"set_point_pos",action_point,cpoint);
+ undo_redo->add_undo_method(curve.ptr(),"set_point_pos",action_point,moving_from);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ } break;
+ case ACTION_MOVING_IN: {
+
+ undo_redo->create_action(TTR("Move In-Control in Curve"));
+ undo_redo->add_do_method(curve.ptr(),"set_point_in",action_point,new_pos);
+ undo_redo->add_undo_method(curve.ptr(),"set_point_in",action_point,moving_from);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ } break;
+ case ACTION_MOVING_OUT: {
+
+ undo_redo->create_action(TTR("Move Out-Control in Curve"));
+ undo_redo->add_do_method(curve.ptr(),"set_point_out",action_point,new_pos);
+ undo_redo->add_undo_method(curve.ptr(),"set_point_out",action_point,moving_from);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ } break;
+
+ }
+
+ action=ACTION_NONE;
+
+ return true;
+ }
+
+
+#if 0
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( canvas_item_editor->snap_point(cpoint) );
+ wip_active=true;
+ edited_point_pos=canvas_item_editor->snap_point(cpoint);
+ canvas_item_editor->update();
+ edited_point=1;
+ return true;
+ } else {
+
+ if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+
+ wip.push_back( canvas_item_editor->snap_point(cpoint) );
+ edited_point=wip.size();
+ canvas_item_editor->update();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close();
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ if (poly.size() < 3) {
+
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 points[2] ={ xform.xform(poly[i]),
+ xform.xform(poly[(i+1)%poly.size()]) };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ poly.insert(closest_idx+1,canvas_item_editor->snap_point(xform.affine_inverse().xform(closest_pos)));
+ edited_point=closest_idx+1;
+ edited_point_pos=canvas_item_editor->snap_point(xform.affine_inverse().xform(closest_pos));
+ node->set_polygon(poly);
+ canvas_item_editor->update();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ edited_point=closest_idx;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ canvas_item_editor->update();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly[edited_point]=edited_point_pos;
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_undo_method(node,"set_polygon",pre_move_edit);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]);
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ }
+
+
+
+ } break;
+ }
+
+
+#endif
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+
+ if ( action!=ACTION_NONE) {
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = !mm.mod.alt? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint))
+ : node->get_global_transform().affine_inverse().xform( canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
+
+ Ref<Curve2D> curve = node->get_curve();
+
+ Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from);
+
+ switch(action) {
+
+ case ACTION_MOVING_POINT: {
+
+ curve->set_point_pos(action_point,cpoint);
+ } break;
+ case ACTION_MOVING_IN: {
+
+ curve->set_point_in(action_point,new_pos);
+
+ } break;
+ case ACTION_MOVING_OUT: {
+
+ curve->set_point_out(action_point,new_pos);
+
+ } break;
+ }
+
+
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+
+#if 0
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+
+ Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ edited_point_pos = canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint));
+ canvas_item_editor->update();
+
+ }
+#endif
+ } break;
+ }
+
+ return false;
+}
+void Path2DEditor::_canvas_draw() {
+
+ if (!node)
+ return ;
+
+ if (!node->is_visible_in_tree())
+ return;
+
+ if (!node->get_curve().is_valid())
+ return ;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+ Size2 handle_size = handle->get_size();
+
+ Ref<Curve2D> curve = node->get_curve();
+
+ int len = curve->get_point_count();
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
+
+ for(int i=0;i<len;i++) {
+
+
+ Vector2 point = xform.xform(curve->get_point_pos(i));
+ vpc->draw_texture_rect(handle,Rect2(point-handle_size*0.5,handle_size),false,Color(1,1,1,1));
+
+ if (i<len-1) {
+ Vector2 pointout = xform.xform(curve->get_point_pos(i)+curve->get_point_out(i));
+ vpc->draw_line(point,pointout,Color(0.5,0.5,1.0,0.8),1.0);
+ vpc->draw_texture_rect(handle, Rect2(pointout-handle_size*0.5,handle_size),false,Color(1,0.5,1,0.3));
+ }
+
+ if (i>0) {
+ Vector2 pointin = xform.xform(curve->get_point_pos(i)+curve->get_point_in(i));
+ vpc->draw_line(point,pointin,Color(0.5,0.5,1.0,0.8),1.0);
+ vpc->draw_texture_rect(handle, Rect2(pointin-handle_size*0.5,handle_size),false,Color(1,0.5,1,0.3));
+ }
+
+ }
+
+}
+
+void Path2DEditor::_node_visibility_changed() {
+ if (!node)
+ return;
+
+ canvas_item_editor->get_viewport_control()->update();
+}
+
+void Path2DEditor::edit(Node *p_path2d) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_path2d) {
+
+ node=p_path2d->cast_to<Path2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+ if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->connect("visibility_changed", this, "_node_visibility_changed");
+
+
+ } else {
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ // node may have been deleted at this point
+ if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->disconnect("visibility_changed", this, "_node_visibility_changed");
+ node=NULL;
+ }
+
+}
+
+void Path2DEditor::_bind_methods() {
+
+ //ClassDB::bind_method(D_METHOD("_menu_option"),&Path2DEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&Path2DEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_node_visibility_changed"),&Path2DEditor::_node_visibility_changed);
+ ClassDB::bind_method(D_METHOD("_mode_selected"),&Path2DEditor::_mode_selected);
+}
+
+void Path2DEditor::_mode_selected(int p_mode) {
+
+ if (p_mode==MODE_CREATE) {
+
+ curve_create->set_pressed(true);
+ curve_edit->set_pressed(false);
+ curve_edit_curve->set_pressed(false);
+ curve_del->set_pressed(false);
+ } else if (p_mode==MODE_EDIT) {
+
+ curve_create->set_pressed(false);
+ curve_edit->set_pressed(true);
+ curve_edit_curve->set_pressed(false);
+ curve_del->set_pressed(false);
+ } else if (p_mode==MODE_EDIT_CURVE) {
+
+ curve_create->set_pressed(false);
+ curve_edit->set_pressed(false);
+ curve_edit_curve->set_pressed(true);
+ curve_del->set_pressed(false);
+ } else if (p_mode==MODE_DELETE) {
+
+ curve_create->set_pressed(false);
+ curve_edit->set_pressed(false);
+ curve_edit_curve->set_pressed(false);
+ curve_del->set_pressed(true);
+ } else if (p_mode==ACTION_CLOSE) {
+
+ //?
+
+ if (!node->get_curve().is_valid())
+ return ;
+ if (node->get_curve()->get_point_count()<3)
+ return;
+
+ Vector2 begin = node->get_curve()->get_point_pos(0);
+ Vector2 end = node->get_curve()->get_point_pos( node->get_curve()->get_point_count() -1 );
+ if (begin.distance_to(end)<CMP_EPSILON)
+ return;
+
+ undo_redo->create_action(TTR("Remove Point from Curve"));
+ undo_redo->add_do_method(node->get_curve().ptr(),"add_point",begin);
+ undo_redo->add_undo_method(node->get_curve().ptr(),"remove_point",node->get_curve()->get_point_count());
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return;
+ }
+
+ mode=Mode(p_mode);
+
+}
+
+Path2DEditor::Path2DEditor(EditorNode *p_editor) {
+
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ mode=MODE_EDIT;
+
+ action=ACTION_NONE;
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ base_hb = memnew( HBoxContainer );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(base_hb);
+
+ sep = memnew( VSeparator);
+ base_hb->add_child(sep);
+ curve_edit = memnew( ToolButton );
+ curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit","EditorIcons"));
+ curve_edit->set_toggle_mode(true);
+ curve_edit->set_focus_mode(Control::FOCUS_NONE);
+ curve_edit->set_tooltip(TTR("Select Points")+"\n"+TTR("Shift+Drag: Select Control Points")+"\n"+keycode_get_string(KEY_MASK_CMD)+TTR("Click: Add Point")+"\n"+TTR("Right Click: Delete Point"));
+ curve_edit->connect("pressed",this,"_mode_selected",varray(MODE_EDIT));
+ base_hb->add_child(curve_edit);
+ curve_edit_curve = memnew( ToolButton );
+ curve_edit_curve->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCurve","EditorIcons"));
+ curve_edit_curve->set_toggle_mode(true);
+ curve_edit_curve->set_focus_mode(Control::FOCUS_NONE);
+ curve_edit_curve->set_tooltip(TTR("Select Control Points (Shift+Drag)"));
+ curve_edit_curve->connect("pressed",this,"_mode_selected",varray(MODE_EDIT_CURVE));
+ base_hb->add_child(curve_edit_curve);
+ curve_create = memnew( ToolButton );
+ curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate","EditorIcons"));
+ curve_create->set_toggle_mode(true);
+ curve_create->set_focus_mode(Control::FOCUS_NONE);
+ curve_create->set_tooltip(TTR("Add Point (in empty space)")+"\n"+TTR("Split Segment (in curve)"));
+ curve_create->connect("pressed",this,"_mode_selected",varray(MODE_CREATE));
+ base_hb->add_child(curve_create);
+ curve_del = memnew( ToolButton );
+ curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete","EditorIcons"));
+ curve_del->set_toggle_mode(true);
+ curve_del->set_focus_mode(Control::FOCUS_NONE);
+ curve_del->set_tooltip(TTR("Delete Point"));
+ curve_del->connect("pressed",this,"_mode_selected",varray(MODE_DELETE));
+ base_hb->add_child(curve_del);
+ curve_close = memnew( ToolButton );
+ curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveClose","EditorIcons"));
+ curve_close->set_focus_mode(Control::FOCUS_NONE);
+ curve_close->set_tooltip(TTR("Close Curve"));
+ curve_close->connect("pressed",this,"_mode_selected",varray(ACTION_CLOSE));
+ base_hb->add_child(curve_close);
+ base_hb->hide();
+
+
+
+ curve_edit->set_pressed(true);
+
+
+}
+
+
+void Path2DEditorPlugin::edit(Object *p_object) {
+
+ path2d_editor->edit(p_object->cast_to<Node>());
+}
+
+bool Path2DEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Path2D");
+}
+
+void Path2DEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ path2d_editor->show();
+ path2d_editor->base_hb->show();
+
+ } else {
+
+ path2d_editor->hide();
+ path2d_editor->base_hb->hide();
+ path2d_editor->edit(NULL);
+ }
+
+}
+
+Path2DEditorPlugin::Path2DEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ path2d_editor = memnew( Path2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(path2d_editor);
+ path2d_editor->hide();
+
+
+}
+
+
+Path2DEditorPlugin::~Path2DEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h
new file mode 100644
index 0000000000..89f42d94cc
--- /dev/null
+++ b/editor/plugins/path_2d_editor_plugin.h
@@ -0,0 +1,126 @@
+/*************************************************************************/
+/* path_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PATH_2D_EDITOR_PLUGIN_H
+#define PATH_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/path_2d.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class CanvasItemEditor;
+
+class Path2DEditor : public HBoxContainer {
+
+ GDCLASS(Path2DEditor, HBoxContainer);
+
+ UndoRedo *undo_redo;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ Path2D *node;
+
+ HBoxContainer *base_hb;
+ Separator *sep;
+
+ enum Mode {
+ MODE_CREATE,
+ MODE_EDIT,
+ MODE_EDIT_CURVE,
+ MODE_DELETE,
+ ACTION_CLOSE
+ };
+
+ Mode mode;
+ ToolButton *curve_create;
+ ToolButton *curve_edit;
+ ToolButton *curve_edit_curve;
+ ToolButton *curve_del;
+ ToolButton *curve_close;
+
+ enum Action {
+
+ ACTION_NONE,
+ ACTION_MOVING_POINT,
+ ACTION_MOVING_IN,
+ ACTION_MOVING_OUT,
+ };
+
+
+ Action action;
+ int action_point;
+ Point2 moving_from;
+ Point2 moving_screen_from;
+
+ void _mode_selected(int p_mode);
+
+ void _canvas_draw();
+ void _node_visibility_changed();
+friend class Path2DEditorPlugin;
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_path2d);
+ Path2DEditor(EditorNode *p_editor);
+};
+
+class Path2DEditorPlugin : public EditorPlugin {
+
+ GDCLASS( Path2DEditorPlugin, EditorPlugin );
+
+ Path2DEditor *path2d_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return path2d_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "Path2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ Path2DEditorPlugin(EditorNode *p_node);
+ ~Path2DEditorPlugin();
+
+};
+
+
+
+#endif // PATH_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/path_editor_plugin.cpp b/editor/plugins/path_editor_plugin.cpp
new file mode 100644
index 0000000000..a3df39fdaa
--- /dev/null
+++ b/editor/plugins/path_editor_plugin.cpp
@@ -0,0 +1,604 @@
+/*************************************************************************/
+/* path_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "path_editor_plugin.h"
+
+#include "spatial_editor_plugin.h"
+#include "scene/resources/curve.h"
+#include "os/keyboard.h"
+
+#if 0
+String PathSpatialGizmo::get_handle_name(int p_idx) const {
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return "";
+
+ if (p_idx<c->get_point_count()) {
+
+ return TTR("Curve Point #")+itos(p_idx);
+ }
+
+ p_idx=p_idx-c->get_point_count()+1;
+
+ int idx=p_idx/2;
+ int t=p_idx%2;
+ String n = TTR("Curve Point #")+itos(idx);
+ if (t==0)
+ n+=" In";
+ else
+ n+=" Out";
+
+ return n;
+
+
+}
+Variant PathSpatialGizmo::get_handle_value(int p_idx) const{
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return Variant();
+
+ if (p_idx<c->get_point_count()) {
+
+ original=c->get_point_pos(p_idx);
+ return original;
+ }
+
+ p_idx=p_idx-c->get_point_count()+1;
+
+ int idx=p_idx/2;
+ int t=p_idx%2;
+
+ Vector3 ofs;
+ if (t==0)
+ ofs=c->get_point_in(idx);
+ else
+ ofs= c->get_point_out(idx);
+
+ original=ofs+c->get_point_pos(idx);
+
+ return ofs;
+
+}
+void PathSpatialGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return;
+
+ Transform gt = path->get_global_transform();
+ Transform gi = gt.affine_inverse();
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ if (p_idx<c->get_point_count()) {
+
+ Plane p(gt.xform(original),p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+
+ if (p.intersects_ray(ray_from,ray_dir,&inters)) {
+
+ if(SpatialEditor::get_singleton()->is_snap_enabled())
+ {
+ float snap = SpatialEditor::get_singleton()->get_translate_snap();
+ inters.snap(snap);
+ }
+
+ Vector3 local = gi.xform(inters);
+ c->set_point_pos(p_idx,local);
+ }
+
+ return;
+ }
+
+ p_idx=p_idx-c->get_point_count()+1;
+
+ int idx=p_idx/2;
+ int t=p_idx%2;
+
+ Vector3 base = c->get_point_pos(idx);
+
+ Plane p(gt.xform(original),p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+
+ if (p.intersects_ray(ray_from,ray_dir,&inters)) {
+
+ Vector3 local = gi.xform(inters)-base;
+ if (t==0) {
+ c->set_point_in(idx,local);
+ } else {
+ c->set_point_out(idx,local);
+ }
+ }
+
+}
+
+void PathSpatialGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return;
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+
+ if (p_idx<c->get_point_count()) {
+
+ if (p_cancel) {
+
+ c->set_point_pos(p_idx,p_restore);
+ return;
+ }
+ ur->create_action(TTR("Set Curve Point Pos"));
+ ur->add_do_method(c.ptr(),"set_point_pos",p_idx,c->get_point_pos(p_idx));
+ ur->add_undo_method(c.ptr(),"set_point_pos",p_idx,p_restore);
+ ur->commit_action();
+
+ return;
+ }
+
+ p_idx=p_idx-c->get_point_count()+1;
+
+ int idx=p_idx/2;
+ int t=p_idx%2;
+
+ Vector3 ofs;
+
+ if (p_cancel) {
+
+
+
+ return;
+ }
+
+
+
+ if (t==0) {
+
+ if (p_cancel) {
+
+ c->set_point_in(p_idx,p_restore);
+ return;
+ }
+ ur->create_action(TTR("Set Curve In Pos"));
+ ur->add_do_method(c.ptr(),"set_point_in",idx,c->get_point_in(idx));
+ ur->add_undo_method(c.ptr(),"set_point_in",idx,p_restore);
+ ur->commit_action();
+
+
+ } else {
+ if (p_cancel) {
+
+ c->set_point_out(idx,p_restore);
+ return;
+ }
+ ur->create_action(TTR("Set Curve Out Pos"));
+ ur->add_do_method(c.ptr(),"set_point_out",idx,c->get_point_out(idx));
+ ur->add_undo_method(c.ptr(),"set_point_out",idx,p_restore);
+ ur->commit_action();
+
+ }
+
+}
+
+
+void PathSpatialGizmo::redraw(){
+
+ clear();
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return;
+
+ Vector3Array v3a=c->tesselate();
+ //Vector3Array v3a=c->get_baked_points();
+
+ int v3s = v3a.size();
+ if (v3s==0)
+ return;
+ Vector<Vector3> v3p;
+ Vector3Array::Read r = v3a.read();
+
+ for(int i=0;i<v3s-1;i++) {
+
+ v3p.push_back(r[i]);
+ v3p.push_back(r[i+1]);
+ //v3p.push_back(r[i]);
+ //v3p.push_back(r[i]+Vector3(0,0.2,0));
+ }
+
+ add_lines(v3p,PathEditorPlugin::singleton->path_material);
+ add_collision_segments(v3p);
+
+ if (PathEditorPlugin::singleton->get_edited_path()==path) {
+ v3p.clear();
+ Vector<Vector3> handles;
+ Vector<Vector3> sec_handles;
+
+ for(int i=0;i<c->get_point_count();i++) {
+
+ Vector3 p = c->get_point_pos(i);
+ handles.push_back(p);
+ if (i>0) {
+ v3p.push_back(p);
+ v3p.push_back(p+c->get_point_in(i));
+ sec_handles.push_back(p+c->get_point_in(i));
+ }
+
+ if (i<c->get_point_count()-1) {
+ v3p.push_back(p);
+ v3p.push_back(p+c->get_point_out(i));
+ sec_handles.push_back(p+c->get_point_out(i));
+ }
+ }
+
+ add_lines(v3p,PathEditorPlugin::singleton->path_thin_material);
+ add_handles(handles);
+ add_handles(sec_handles,false,true);
+ }
+
+}
+
+PathSpatialGizmo::PathSpatialGizmo(Path* p_path){
+
+ path=p_path;
+ set_spatial_node(p_path);
+
+
+
+}
+
+Ref<SpatialEditorGizmo> PathEditorPlugin::create_spatial_gizmo(Spatial* p_spatial) {
+
+
+ if (p_spatial->cast_to<Path>()) {
+
+ return memnew( PathSpatialGizmo(p_spatial->cast_to<Path>()));
+ }
+
+ return Ref<SpatialEditorGizmo>();
+}
+
+bool PathEditorPlugin::forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event) {
+
+ if (!path)
+ return false;
+ Ref<Curve3D> c=path->get_curve();
+ if (c.is_null())
+ return false;
+ Transform gt = path->get_global_transform();
+ Transform it = gt.affine_inverse();
+
+ static const int click_dist = 10; //should make global
+
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON) {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+ Point2 mbpos(mb.x,mb.y);
+
+ if (mb.pressed && mb.button_index==BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb.mod.control))) {
+ //click into curve, break it down
+ Vector3Array v3a = c->tesselate();
+ int idx=0;
+ int rc=v3a.size();
+ int closest_seg=-1;
+ Vector3 closest_seg_point;
+ float closest_d=1e20;
+
+ if (rc>=2) {
+ Vector3Array::Read r = v3a.read();
+
+ if (p_camera->unproject_position(gt.xform(c->get_point_pos(0))).distance_to(mbpos)<click_dist)
+ return false; //nope, existing
+
+
+ for(int i=0;i<c->get_point_count()-1;i++) {
+ //find the offset and point index of the place to break up
+ int j=idx;
+ if (p_camera->unproject_position(gt.xform(c->get_point_pos(i+1))).distance_to(mbpos)<click_dist)
+ return false; //nope, existing
+
+
+ while(j<rc && c->get_point_pos(i+1)!=r[j]) {
+
+ Vector3 from =r[j];
+ Vector3 to =r[j+1];
+ real_t cdist = from.distance_to(to);
+ from=gt.xform(from);
+ to=gt.xform(to);
+ if (cdist>0) {
+ Vector2 s[2];
+ s[0] = p_camera->unproject_position(from);
+ s[1] = p_camera->unproject_position(to);
+ Vector2 inters = Geometry::get_closest_point_to_segment_2d(mbpos,s);
+ float d = inters.distance_to(mbpos);
+
+ if (d<10 && d<closest_d) {
+
+
+ closest_d=d;
+ closest_seg=i;
+ Vector3 ray_from=p_camera->project_ray_origin(mbpos);
+ Vector3 ray_dir=p_camera->project_ray_normal(mbpos);
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(ray_from,ray_from+ray_dir*4096,from,to,ra,rb);
+
+ closest_seg_point=it.xform(rb);
+ }
+
+ }
+ j++;
+
+ }
+ if (idx==j)
+ idx++; //force next
+ else
+ idx=j; //swap
+
+
+ if (j==rc)
+ break;
+ }
+ }
+
+ UndoRedo *ur = editor->get_undo_redo();
+ if (closest_seg!=-1) {
+ //subdivide
+
+ ur->create_action(TTR("Split Path"));
+ ur->add_do_method(c.ptr(),"add_point",closest_seg_point,Vector3(),Vector3(),closest_seg+1);
+ ur->add_undo_method(c.ptr(),"remove_point",closest_seg+1);
+ ur->commit_action();
+ return true;
+
+ } else {
+
+ Vector3 org;
+ if (c->get_point_count()==0)
+ org=path->get_transform().get_origin();
+ else
+ org=gt.xform(c->get_point_pos(c->get_point_count()));
+ Plane p(org,p_camera->get_transform().basis.get_axis(2));
+ Vector3 ray_from=p_camera->project_ray_origin(mbpos);
+ Vector3 ray_dir=p_camera->project_ray_normal(mbpos);
+
+ Vector3 inters;
+ if (p.intersects_ray(ray_from,ray_dir,&inters)) {
+
+ ur->create_action(TTR("Add Point to Curve"));
+ ur->add_do_method(c.ptr(),"add_point",it.xform(inters),Vector3(),Vector3(),-1);
+ ur->add_undo_method(c.ptr(),"remove_point",c->get_point_count());
+ ur->commit_action();
+ return true;
+ }
+
+ //add new at pos
+ }
+
+ } else if (mb.pressed && ((mb.button_index==BUTTON_LEFT && curve_del->is_pressed()) || (mb.button_index==BUTTON_RIGHT && curve_edit->is_pressed()))) {
+
+ int erase_idx=-1;
+ for(int i=0;i<c->get_point_count();i++) {
+ //find the offset and point index of the place to break up
+ if (p_camera->unproject_position(gt.xform(c->get_point_pos(i))).distance_to(mbpos)<click_dist) {
+
+ erase_idx=i;
+ break;
+ }
+ }
+
+ if (erase_idx!=-1) {
+
+ UndoRedo *ur = editor->get_undo_redo();
+ ur->create_action(TTR("Remove Path Point"));
+ ur->add_do_method(c.ptr(),"remove_point",erase_idx);
+ ur->add_undo_method(c.ptr(),"add_point",c->get_point_pos(erase_idx),c->get_point_in(erase_idx),c->get_point_out(erase_idx),erase_idx);
+ ur->commit_action();
+ return true;
+ }
+ }
+
+ }
+
+ return false;
+}
+
+
+void PathEditorPlugin::edit(Object *p_object) {
+
+ if (p_object) {
+ path=p_object->cast_to<Path>();
+ if (path) {
+
+ if (path->get_curve().is_valid()) {
+ path->get_curve()->emit_signal("changed");
+ }
+ }
+ } else {
+ Path *pre=path;
+ path=NULL;
+ if (pre) {
+ pre->get_curve()->emit_signal("changed");
+ }
+ }
+ //collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool PathEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_type("Path");
+}
+
+void PathEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ curve_create->show();
+ curve_edit->show();
+ curve_del->show();
+ curve_close->show();
+ sep->show();
+ } else {
+
+ curve_create->hide();
+ curve_edit->hide();
+ curve_del->hide();
+ curve_close->hide();
+ sep->hide();
+
+ {
+ Path *pre=path;
+ path=NULL;
+ if (pre && pre->get_curve().is_valid()) {
+ pre->get_curve()->emit_signal("changed");
+ }
+ }
+ }
+
+}
+
+void PathEditorPlugin::_mode_changed(int p_idx) {
+
+ curve_create->set_pressed(p_idx==0);
+ curve_edit->set_pressed(p_idx==1);
+ curve_del->set_pressed(p_idx==2);
+}
+
+void PathEditorPlugin::_close_curve() {
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null())
+ return ;
+ if (c->get_point_count()<2)
+ return;
+ c->add_point(c->get_point_pos(0),c->get_point_in(0),c->get_point_out(0));
+
+}
+
+void PathEditorPlugin::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ curve_create->connect("pressed",this,"_mode_changed",make_binds(0));
+ curve_edit->connect("pressed",this,"_mode_changed",make_binds(1));
+ curve_del->connect("pressed",this,"_mode_changed",make_binds(2));
+ curve_close->connect("pressed",this,"_close_curve");
+ }
+}
+
+void PathEditorPlugin::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_mode_changed"),&PathEditorPlugin::_mode_changed);
+ ClassDB::bind_method(D_METHOD("_close_curve"),&PathEditorPlugin::_close_curve);
+}
+
+PathEditorPlugin* PathEditorPlugin::singleton=NULL;
+
+
+PathEditorPlugin::PathEditorPlugin(EditorNode *p_node) {
+
+ path=NULL;
+ editor=p_node;
+ singleton=this;
+
+ path_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ path_material->set_parameter( FixedSpatialMaterial::PARAM_DIFFUSE,Color(0.5,0.5,1.0,0.8) );
+ path_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ path_material->set_line_width(3);
+ path_material->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ path_material->set_flag(Material::FLAG_UNSHADED,true);
+
+ path_thin_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ path_thin_material->set_parameter( FixedSpatialMaterial::PARAM_DIFFUSE,Color(0.5,0.5,1.0,0.4) );
+ path_thin_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ path_thin_material->set_line_width(1);
+ path_thin_material->set_flag(Material::FLAG_DOUBLE_SIDED,true);
+ path_thin_material->set_flag(Material::FLAG_UNSHADED,true);
+
+ //SpatialEditor::get_singleton()->add_gizmo_plugin(this);
+
+ sep = memnew( VSeparator);
+ sep->hide();
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(sep);
+ curve_edit = memnew( ToolButton );
+ curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit","EditorIcons"));
+ curve_edit->set_toggle_mode(true);
+ curve_edit->hide();
+ curve_edit->set_focus_mode(Control::FOCUS_NONE);
+ curve_edit->set_tooltip(TTR("Select Points")+"\n"+TTR("Shift+Drag: Select Control Points")+"\n"+keycode_get_string(KEY_MASK_CMD)+TTR("Click: Add Point")+"\n"+TTR("Right Click: Delete Point"));
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_edit);
+ curve_create = memnew( ToolButton );
+ curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate","EditorIcons"));
+ curve_create->set_toggle_mode(true);
+ curve_create->hide();
+ curve_create->set_focus_mode(Control::FOCUS_NONE);
+ curve_create->set_tooltip(TTR("Add Point (in empty space)")+"\n"+TTR("Split Segment (in curve)"));
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_create);
+ curve_del = memnew( ToolButton );
+ curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete","EditorIcons"));
+ curve_del->set_toggle_mode(true);
+ curve_del->hide();
+ curve_del->set_focus_mode(Control::FOCUS_NONE);
+ curve_del->set_tooltip(TTR("Delete Point"));
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_del);
+ curve_close = memnew( ToolButton );
+ curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveClose","EditorIcons"));
+ curve_close->hide();
+ curve_close->set_focus_mode(Control::FOCUS_NONE);
+ curve_close->set_tooltip(TTR("Close Curve"));
+ SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_close);
+
+
+
+ curve_edit->set_pressed(true);
+ /*
+ collision_polygon_editor = memnew( PathEditor(p_node) );
+ editor->get_viewport()->add_child(collision_polygon_editor);
+
+ collision_polygon_editor->set_margin(MARGIN_LEFT,200);
+ collision_polygon_editor->set_margin(MARGIN_RIGHT,230);
+ collision_polygon_editor->set_margin(MARGIN_TOP,0);
+ collision_polygon_editor->set_margin(MARGIN_BOTTOM,10);
+
+
+ collision_polygon_editor->hide();
+ */
+
+
+}
+
+
+PathEditorPlugin::~PathEditorPlugin()
+{
+}
+
+#endif
diff --git a/editor/plugins/path_editor_plugin.h b/editor/plugins/path_editor_plugin.h
new file mode 100644
index 0000000000..fe1c5ad159
--- /dev/null
+++ b/editor/plugins/path_editor_plugin.h
@@ -0,0 +1,100 @@
+/*************************************************************************/
+/* path_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PATH_EDITOR_PLUGIN_H
+#define PATH_EDITOR_PLUGIN_H
+
+
+#include "editor/spatial_editor_gizmos.h"
+#include "scene/3d/path.h"
+# if 0
+class PathSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(PathSpatialGizmo,EditorSpatialGizmo);
+
+ Path* path;
+ mutable Vector3 original;
+
+public:
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ PathSpatialGizmo(Path* p_path=NULL);
+
+};
+
+class PathEditorPlugin : public EditorPlugin {
+
+ GDCLASS( PathEditorPlugin, EditorPlugin );
+
+
+ Separator *sep;
+ ToolButton *curve_create;
+ ToolButton *curve_edit;
+ ToolButton *curve_del;
+ ToolButton *curve_close;
+
+ EditorNode *editor;
+
+
+ Path *path;
+
+ void _mode_changed(int p_idx);
+ void _close_curve();
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ Path *get_edited_path() { return path; }
+
+ static PathEditorPlugin* singleton;
+ Ref<FixedSpatialMaterial> path_material;
+ Ref<FixedSpatialMaterial> path_thin_material;
+ virtual bool forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event);
+
+ //virtual bool forward_gui_input(const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+ virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial* p_spatial);
+ virtual String get_name() const { return "Path"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ PathEditorPlugin(EditorNode *p_node);
+ ~PathEditorPlugin();
+
+};
+
+#endif
+#endif // PATH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..3a41b2cb6b
--- /dev/null
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -0,0 +1,1028 @@
+/*************************************************************************/
+/* polygon_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "polygon_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "os/file_access.h"
+#include "editor/editor_settings.h"
+#include "os/keyboard.h"
+#include "os/input.h"
+
+void Polygon2DEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ button_create->set_icon( get_icon("Edit","EditorIcons"));
+ button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
+ button_edit->set_pressed(true);
+ button_uv->set_icon( get_icon("Uv","EditorIcons"));
+
+ uv_button[UV_MODE_EDIT_POINT]->set_icon(get_icon("ToolSelect","EditorIcons"));
+ uv_button[UV_MODE_MOVE]->set_icon(get_icon("ToolMove","EditorIcons"));
+ uv_button[UV_MODE_ROTATE]->set_icon(get_icon("ToolRotate","EditorIcons"));
+ uv_button[UV_MODE_SCALE]->set_icon(get_icon("ToolScale","EditorIcons"));
+
+ b_snap_grid->set_icon( get_icon("Grid", "EditorIcons"));
+ b_snap_enable->set_icon( get_icon("Snap", "EditorIcons"));
+ uv_icon_zoom->set_texture( get_icon("Zoom", "EditorIcons"));
+
+ get_tree()->connect("node_removed", this, "_node_removed");
+
+ } break;
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void Polygon2DEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ edit(NULL);
+ hide();
+
+ canvas_item_editor->get_viewport_control()->update();
+ }
+
+}
+
+
+void Polygon2DEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case MODE_CREATE: {
+
+ mode=MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+
+ mode=MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+ case MODE_EDIT_UV: {
+
+ if (node->get_texture().is_null()) {
+
+ error->set_text("No texture in this polygon.\nSet a texture to be able to edit UV.");
+ error->popup_centered_minsize();
+ return;
+ }
+
+
+ PoolVector<Vector2> points = node->get_polygon();
+ PoolVector<Vector2> uvs = node->get_uv();
+ if (uvs.size()!=points.size()) {
+ undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->add_do_method(node,"set_uv",points);
+ undo_redo->add_undo_method(node,"set_uv",uvs);
+ undo_redo->add_do_method(uv_edit_draw,"update");
+ undo_redo->add_undo_method(uv_edit_draw,"update");
+ undo_redo->commit_action();
+
+ }
+
+
+ uv_edit->popup_centered_ratio(0.85);
+ } break;
+ case UVEDIT_POLYGON_TO_UV: {
+
+ PoolVector<Vector2> points = node->get_polygon();
+ if (points.size()==0)
+ break;
+ PoolVector<Vector2> uvs = node->get_uv();
+ undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->add_do_method(node,"set_uv",points);
+ undo_redo->add_undo_method(node,"set_uv",uvs);
+ undo_redo->add_do_method(uv_edit_draw,"update");
+ undo_redo->add_undo_method(uv_edit_draw,"update");
+ undo_redo->commit_action();
+
+
+ } break;
+ case UVEDIT_UV_TO_POLYGON: {
+
+ PoolVector<Vector2> points = node->get_polygon();
+ PoolVector<Vector2> uvs = node->get_uv();
+ if (uvs.size()==0)
+ break;
+
+ undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->add_do_method(node,"set_polygon",uvs);
+ undo_redo->add_undo_method(node,"set_polygon",points);
+ undo_redo->add_do_method(uv_edit_draw,"update");
+ undo_redo->add_undo_method(uv_edit_draw,"update");
+ undo_redo->commit_action();
+
+ } break;
+ case UVEDIT_UV_CLEAR: {
+
+ PoolVector<Vector2> uvs = node->get_uv();
+ if (uvs.size()==0)
+ break;
+ undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->add_do_method(node,"set_uv",PoolVector<Vector2>());
+ undo_redo->add_undo_method(node,"set_uv",uvs);
+ undo_redo->add_do_method(uv_edit_draw,"update");
+ undo_redo->add_undo_method(uv_edit_draw,"update");
+ undo_redo->commit_action();
+
+ } break;
+
+
+ }
+}
+
+void Polygon2DEditor::_set_use_snap(bool p_use)
+{
+ use_snap=p_use;
+}
+
+void Polygon2DEditor::_set_show_grid(bool p_show)
+{
+ snap_show_grid=p_show;
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_set_snap_off_x(float p_val)
+{
+ snap_offset.x=p_val;
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_set_snap_off_y(float p_val)
+{
+ snap_offset.y=p_val;
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_set_snap_step_x(float p_val)
+{
+ snap_step.x=p_val;
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_set_snap_step_y(float p_val)
+{
+ snap_step.y=p_val;
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_wip_close() {
+
+ undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",node->get_polygon());
+ undo_redo->add_do_method(node,"set_polygon",wip);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ wip.clear();
+ wip_active=false;
+ mode=MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ edited_point=-1;
+}
+
+bool Polygon2DEditor::forward_gui_input(const InputEvent& p_event) {
+
+ if (node==NULL)
+ return false;
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+
+
+ Vector2 gpoint = Point2(mb.x,mb.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ cpoint = node->get_global_transform().affine_inverse().xform(cpoint);
+
+
+ Vector<Vector2> poly = Variant(node->get_polygon());
+
+ //first check if a point is to be added (segment split)
+ real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
+
+ switch(mode) {
+
+
+ case MODE_CREATE: {
+
+ if (mb.button_index==BUTTON_LEFT && mb.pressed) {
+
+
+ if (!wip_active) {
+
+ wip.clear();
+ wip.push_back( cpoint-node->get_offset() );
+ wip_active=true;
+ edited_point_pos=cpoint;
+ canvas_item_editor->get_viewport_control()->update();
+ edited_point=1;
+ return true;
+ } else {
+
+
+ if (wip.size()>1 && xform.xform(wip[0]+node->get_offset()).distance_to(gpoint)<grab_treshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+
+ wip.push_back( cpoint-node->get_offset() );
+ edited_point=wip.size();
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+
+ //add wip point
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
+ _wip_close();
+ }
+
+
+
+ } break;
+
+ case MODE_EDIT: {
+
+ if (mb.button_index==BUTTON_LEFT) {
+ if (mb.pressed) {
+
+ if (mb.mod.control) {
+
+
+ if (poly.size() < 3) {
+
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 points[2] ={ xform.xform(poly[i]+node->get_offset()),
+ xform.xform(poly[(i+1)%poly.size()]+node->get_offset()) };
+
+ Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
+ if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
+ continue; //not valid to reuse point
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ poly.insert(closest_idx+1,xform.affine_inverse().xform(closest_pos)-node->get_offset());
+ edited_point=closest_idx+1;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ node->set_polygon(Variant(poly));
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ } else {
+
+ //look for points to move
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]+node->get_offset());
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+ pre_move_edit=poly;
+ edited_point=closest_idx;
+ edited_point_pos=xform.affine_inverse().xform(closest_pos);
+ canvas_item_editor->get_viewport_control()->update();
+ return true;
+ }
+ }
+ } else {
+
+ if (edited_point!=-1) {
+
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
+ poly[edited_point]=edited_point_pos-node->get_offset();
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_undo_method(node,"set_polygon",pre_move_edit);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+
+ edited_point=-1;
+ return true;
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
+
+
+
+ int closest_idx=-1;
+ Vector2 closest_pos;
+ real_t closest_dist=1e10;
+ for(int i=0;i<poly.size();i++) {
+
+ Vector2 cp =xform.xform(poly[i]+node->get_offset());
+
+ real_t d = cp.distance_to(gpoint);
+ if (d<closest_dist && d<grab_treshold) {
+ closest_dist=d;
+ closest_pos=cp;
+ closest_idx=i;
+ }
+
+ }
+
+ if (closest_idx>=0) {
+
+
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node,"set_polygon",poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node,"set_polygon",poly);
+ undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ }
+
+
+
+ } break;
+ }
+
+
+
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
+
+ Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
+ cpoint=canvas_item_editor->snap_point(cpoint);
+ edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
+
+ canvas_item_editor->get_viewport_control()->update();
+
+ }
+
+ } break;
+ }
+
+ return false;
+}
+void Polygon2DEditor::_canvas_draw() {
+
+ if (!node)
+ return;
+
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
+ Vector<Vector2> poly;
+
+ if (wip_active)
+ poly=wip;
+ else
+ poly=Variant(node->get_polygon());
+
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+
+ for(int i=0;i<poly.size();i++) {
+
+
+ Vector2 p,p2;
+ p = i==edited_point ? edited_point_pos : (poly[i]+node->get_offset());
+ if ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point))
+ p2=edited_point_pos;
+ else
+ p2 = poly[(i+1)%poly.size()]+node->get_offset();
+
+ Vector2 point = xform.xform(p);
+ Vector2 next_point = xform.xform(p2);
+
+ Color col=Color(1,0.3,0.1,0.8);
+ vpc->draw_line(point,next_point,col,2);
+ vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+}
+
+
+void Polygon2DEditor::_uv_mode(int p_mode) {
+
+
+ uv_mode=UVMode(p_mode);
+ for(int i=0;i<UV_MODE_MAX;i++) {
+ uv_button[i]->set_pressed(p_mode==i);
+ }
+}
+
+
+void Polygon2DEditor::_uv_input(const InputEvent& p_input) {
+
+
+ Transform2D mtx;
+ mtx.elements[2]=-uv_draw_ofs;
+ mtx.scale_basis(Vector2(uv_draw_zoom,uv_draw_zoom));
+
+ if (p_input.type==InputEvent::MOUSE_BUTTON) {
+
+
+ const InputEventMouseButton &mb=p_input.mouse_button;
+
+ if (mb.button_index==BUTTON_LEFT) {
+
+
+ if (mb.pressed) {
+
+ uv_drag_from=Vector2(mb.x,mb.y);
+ uv_drag=true;
+ uv_prev=node->get_uv();
+ uv_move_current=uv_mode;
+ if (uv_move_current==UV_MODE_EDIT_POINT) {
+
+ if (mb.mod.shift && mb.mod.command)
+ uv_move_current=UV_MODE_SCALE;
+ else if (mb.mod.shift)
+ uv_move_current=UV_MODE_MOVE;
+ else if (mb.mod.command)
+ uv_move_current=UV_MODE_ROTATE;
+ }
+
+ if (uv_move_current==UV_MODE_EDIT_POINT) {
+
+ uv_drag_index=-1;
+ for(int i=0;i<uv_prev.size();i++) {
+
+ Vector2 tuv=mtx.xform(uv_prev[i]);
+ if (tuv.distance_to(Vector2(mb.x,mb.y))<8) {
+ uv_drag_from=tuv;
+ uv_drag_index=i;
+ }
+ }
+
+ if (uv_drag_index==-1) {
+ uv_drag=false;
+ }
+
+ }
+ } else if (uv_drag) {
+
+ undo_redo->create_action(TTR("Transform UV Map"));
+ undo_redo->add_do_method(node,"set_uv",node->get_uv());
+ undo_redo->add_undo_method(node,"set_uv",uv_prev);
+ undo_redo->add_do_method(uv_edit_draw,"update");
+ undo_redo->add_undo_method(uv_edit_draw,"update");
+ undo_redo->commit_action();
+
+ uv_drag=false;
+ }
+
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed) {
+
+ if (uv_drag) {
+
+ uv_drag=false;
+ node->set_uv(uv_prev);
+ uv_edit_draw->update();
+ }
+
+ } else if (mb.button_index==BUTTON_WHEEL_UP && mb.pressed) {
+
+ uv_zoom->set_value( uv_zoom->get_value()/0.9 );
+ } else if (mb.button_index==BUTTON_WHEEL_DOWN && mb.pressed) {
+
+ uv_zoom->set_value( uv_zoom->get_value()*0.9);
+ }
+
+ } else if (p_input.type==InputEvent::MOUSE_MOTION) {
+
+ const InputEventMouseMotion &mm=p_input.mouse_motion;
+
+ if (mm.button_mask&BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
+
+ Vector2 drag(mm.relative_x,mm.relative_y);
+ uv_hscroll->set_value( uv_hscroll->get_value()-drag.x );
+ uv_vscroll->set_value( uv_vscroll->get_value()-drag.y );
+
+ } else if (uv_drag) {
+
+ Vector2 uv_drag_to=snap_point(Vector2(mm.x,mm.y));
+ Vector2 drag = mtx.affine_inverse().xform(uv_drag_to) - mtx.affine_inverse().xform(uv_drag_from);
+
+
+ switch(uv_move_current) {
+
+ case UV_MODE_EDIT_POINT: {
+
+ PoolVector<Vector2> uv_new=uv_prev;
+ uv_new.set( uv_drag_index, uv_new[uv_drag_index]+drag );
+ node->set_uv(uv_new);
+ } break;
+ case UV_MODE_MOVE: {
+
+ PoolVector<Vector2> uv_new=uv_prev;
+ for(int i=0;i<uv_new.size();i++)
+ uv_new.set( i, uv_new[i]+drag );
+
+ node->set_uv(uv_new);
+
+
+ } break;
+ case UV_MODE_ROTATE: {
+
+ Vector2 center;
+ PoolVector<Vector2> uv_new=uv_prev;
+
+ for(int i=0;i<uv_new.size();i++)
+ center+=uv_prev[i];
+ center/=uv_new.size();
+
+ float angle = (uv_drag_from - mtx.xform(center)).normalized().angle_to( (uv_drag_to - mtx.xform(center)).normalized() );
+
+ for(int i=0;i<uv_new.size();i++) {
+ Vector2 rel = uv_prev[i] - center;
+ rel=rel.rotated(angle);
+ uv_new.set(i,center+rel);
+ }
+
+ node->set_uv(uv_new);
+
+ } break;
+ case UV_MODE_SCALE: {
+
+ Vector2 center;
+ PoolVector<Vector2> uv_new=uv_prev;
+
+ for(int i=0;i<uv_new.size();i++)
+ center+=uv_prev[i];
+ center/=uv_new.size();
+
+ float from_dist = uv_drag_from.distance_to(mtx.xform(center));
+ float to_dist = uv_drag_to.distance_to(mtx.xform(center));
+ if (from_dist<2)
+ break;
+
+ float scale = to_dist/from_dist;
+
+
+ for(int i=0;i<uv_new.size();i++) {
+ Vector2 rel = uv_prev[i] - center;
+ rel=rel*scale;
+ uv_new.set(i,center+rel);
+ }
+
+ node->set_uv(uv_new);
+ } break;
+
+
+ }
+ uv_edit_draw->update();
+ }
+
+ }
+
+}
+
+
+void Polygon2DEditor::_uv_scroll_changed(float) {
+
+ if (updating_uv_scroll)
+ return;
+
+ uv_draw_ofs.x=uv_hscroll->get_value();
+ uv_draw_ofs.y=uv_vscroll->get_value();
+ uv_draw_zoom=uv_zoom->get_value();
+ uv_edit_draw->update();
+}
+
+void Polygon2DEditor::_uv_draw() {
+
+ Ref<Texture> base_tex = node->get_texture();
+ if (base_tex.is_null())
+ return;
+
+ Transform2D mtx;
+ mtx.elements[2]=-uv_draw_ofs;
+ mtx.scale_basis(Vector2(uv_draw_zoom,uv_draw_zoom));
+
+ VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(),mtx);
+ uv_edit_draw->draw_texture(base_tex,Point2());
+ VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(),Transform2D());
+
+ if (snap_show_grid) {
+ Size2 s = uv_edit_draw->get_size();
+ int last_cell;
+
+ if (snap_step.x!=0) {
+ for(int i=0;i<s.width;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i,0)).x-snap_offset.x)/snap_step.x));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ uv_edit_draw->draw_line(Point2(i,0),Point2(i,s.height),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+
+ if (snap_step.y!=0) {
+ for(int i=0;i<s.height;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0,i)).y-snap_offset.y)/snap_step.y));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ uv_edit_draw->draw_line(Point2(0,i),Point2(s.width,i),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+ }
+
+ PoolVector<Vector2> uvs = node->get_uv();
+ Ref<Texture> handle = get_icon("EditorHandle","EditorIcons");
+
+ Rect2 rect(Point2(),mtx.basis_xform(base_tex->get_size()));
+ rect.expand_to(mtx.basis_xform(uv_edit_draw->get_size()));
+
+ for(int i=0;i<uvs.size();i++) {
+
+ int next = (i+1)%uvs.size();
+ uv_edit_draw->draw_line(mtx.xform(uvs[i]),mtx.xform(uvs[next]),Color(0.9,0.5,0.5),2);
+ uv_edit_draw->draw_texture(handle,mtx.xform(uvs[i])-handle->get_size()*0.5);
+ rect.expand_to(mtx.basis_xform(uvs[i]));
+ }
+
+ rect=rect.grow(200);
+ updating_uv_scroll=true;
+ uv_hscroll->set_min(rect.pos.x);
+ uv_hscroll->set_max(rect.pos.x+rect.size.x);
+ uv_hscroll->set_page(uv_edit_draw->get_size().x);
+ uv_hscroll->set_value(uv_draw_ofs.x);
+ uv_hscroll->set_step(0.001);
+
+ uv_vscroll->set_min(rect.pos.y);
+ uv_vscroll->set_max(rect.pos.y+rect.size.y);
+ uv_vscroll->set_page(uv_edit_draw->get_size().y);
+ uv_vscroll->set_value(uv_draw_ofs.y);
+ uv_vscroll->set_step(0.001);
+ updating_uv_scroll=false;
+
+}
+
+void Polygon2DEditor::edit(Node *p_collision_polygon) {
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton();
+ }
+
+ if (p_collision_polygon) {
+
+ node=p_collision_polygon->cast_to<Polygon2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+
+ wip.clear();
+ wip_active=false;
+ edited_point=-1;
+
+ } else {
+
+ node=NULL;
+
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ }
+
+}
+
+void Polygon2DEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&Polygon2DEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&Polygon2DEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_uv_mode"),&Polygon2DEditor::_uv_mode);
+ ClassDB::bind_method(D_METHOD("_uv_draw"),&Polygon2DEditor::_uv_draw);
+ ClassDB::bind_method(D_METHOD("_uv_input"),&Polygon2DEditor::_uv_input);
+ ClassDB::bind_method(D_METHOD("_uv_scroll_changed"),&Polygon2DEditor::_uv_scroll_changed);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&Polygon2DEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_set_use_snap"),&Polygon2DEditor::_set_use_snap);
+ ClassDB::bind_method(D_METHOD("_set_show_grid"),&Polygon2DEditor::_set_show_grid);
+ ClassDB::bind_method(D_METHOD("_set_snap_off_x"),&Polygon2DEditor::_set_snap_off_x);
+ ClassDB::bind_method(D_METHOD("_set_snap_off_y"),&Polygon2DEditor::_set_snap_off_y);
+ ClassDB::bind_method(D_METHOD("_set_snap_step_x"),&Polygon2DEditor::_set_snap_step_x);
+ ClassDB::bind_method(D_METHOD("_set_snap_step_y"),&Polygon2DEditor::_set_snap_step_y);
+
+
+}
+
+inline float _snap_scalar(float p_offset, float p_step, float p_target) {
+ return p_step != 0 ? Math::stepify(p_target - p_offset, p_step) + p_offset : p_target;
+}
+
+Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const {
+ if (use_snap) {
+ p_target.x = _snap_scalar(snap_offset.x*uv_draw_zoom-uv_draw_ofs.x, snap_step.x*uv_draw_zoom, p_target.x);
+ p_target.y = _snap_scalar(snap_offset.y*uv_draw_zoom-uv_draw_ofs.y, snap_step.y*uv_draw_zoom, p_target.y);
+ }
+
+ return p_target;
+}
+
+Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) {
+
+ node=NULL;
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ snap_step=Vector2(10,10);
+ use_snap=false;
+ snap_show_grid=false;
+
+ add_child( memnew( VSeparator ));
+ button_create = memnew( ToolButton );
+ add_child(button_create);
+ button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+
+ button_edit = memnew( ToolButton );
+ add_child(button_edit);
+ button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+
+ button_uv = memnew( ToolButton );
+ add_child(button_uv);
+ button_uv->connect("pressed",this,"_menu_option",varray(MODE_EDIT_UV));
+
+ //add_constant_override("separation",0);
+
+#if 0
+ options = memnew( MenuButton );
+ add_child(options);
+ options->set_area_as_parent_rect();
+ options->set_text("Polygon");
+ //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+#endif
+
+ mode = MODE_EDIT;
+ wip_active=false;
+
+ uv_mode=UV_MODE_EDIT_POINT;
+ uv_edit = memnew( AcceptDialog );
+ add_child(uv_edit);
+ uv_edit->set_title(TTR("Polygon 2D UV Editor"));
+ uv_edit->set_self_modulate(Color(1,1,1,0.9));
+
+ VBoxContainer *uv_main_vb = memnew( VBoxContainer );
+ uv_edit->add_child(uv_main_vb);
+ //uv_edit->set_child_rect(uv_main_vb);
+ HBoxContainer *uv_mode_hb = memnew( HBoxContainer );
+ uv_main_vb->add_child(uv_mode_hb);
+ for(int i=0;i<UV_MODE_MAX;i++) {
+
+ uv_button[i]=memnew( ToolButton );
+ uv_button[i]->set_toggle_mode(true);
+ uv_mode_hb->add_child(uv_button[i]);
+ uv_button[i]->connect("pressed",this,"_uv_mode",varray(i));
+ uv_button[i]->set_focus_mode(FOCUS_NONE);
+ }
+
+ uv_button[0]->set_tooltip(TTR("Move Point")+"\n"+TTR("Ctrl: Rotate")+"\n"+TTR("Shift: Move All")+"\n"+TTR("Shift+Ctrl: Scale"));
+ uv_button[1]->set_tooltip(TTR("Move Polygon"));
+ uv_button[2]->set_tooltip(TTR("Rotate Polygon"));
+ uv_button[3]->set_tooltip(TTR("Scale Polygon"));
+
+ uv_button[0]->set_pressed(true);
+ HBoxContainer *uv_main_hb = memnew( HBoxContainer );
+ uv_main_vb->add_child(uv_main_hb);
+ uv_edit_draw = memnew( Control );
+ uv_main_hb->add_child(uv_edit_draw);
+ uv_main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ uv_edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+ uv_menu = memnew( MenuButton );
+ uv_mode_hb->add_child(uv_menu);
+ uv_menu->set_text(TTR("Edit"));
+ uv_menu->get_popup()->add_item(TTR("Polygon->UV"),UVEDIT_POLYGON_TO_UV);
+ uv_menu->get_popup()->add_item(TTR("UV->Polygon"),UVEDIT_UV_TO_POLYGON);
+ uv_menu->get_popup()->add_separator();
+ uv_menu->get_popup()->add_item(TTR("Clear UV"),UVEDIT_UV_CLEAR);
+ uv_menu->get_popup()->connect("id_pressed",this,"_menu_option");
+
+ uv_mode_hb->add_child( memnew( VSeparator ));
+
+ b_snap_enable = memnew( ToolButton );
+ uv_mode_hb->add_child(b_snap_enable);
+ b_snap_enable->set_text(TTR("Snap"));
+ b_snap_enable->set_focus_mode(FOCUS_NONE);
+ b_snap_enable->set_toggle_mode(true);
+ b_snap_enable->set_pressed(use_snap);
+ b_snap_enable->set_tooltip(TTR("Enable Snap"));
+ b_snap_enable->connect("toggled",this,"_set_use_snap");
+
+ b_snap_grid = memnew( ToolButton );
+ uv_mode_hb->add_child(b_snap_grid);
+ b_snap_grid->set_text(TTR("Grid"));
+ b_snap_grid->set_focus_mode(FOCUS_NONE);
+ b_snap_grid->set_toggle_mode(true);
+ b_snap_grid->set_pressed(snap_show_grid);
+ b_snap_grid->set_tooltip(TTR("Show Grid"));
+ b_snap_grid->connect("toggled",this,"_set_show_grid");
+
+ uv_mode_hb->add_child( memnew( VSeparator ));
+ uv_mode_hb->add_child( memnew( Label(TTR("Grid Offset:")) ) );
+
+ SpinBox *sb_off_x = memnew( SpinBox );
+ sb_off_x->set_min(-256);
+ sb_off_x->set_max(256);
+ sb_off_x->set_step(1);
+ sb_off_x->set_value(snap_offset.x);
+ sb_off_x->set_suffix("px");
+ sb_off_x->connect("value_changed", this, "_set_snap_off_x");
+ uv_mode_hb->add_child(sb_off_x);
+
+ SpinBox *sb_off_y = memnew( SpinBox );
+ sb_off_y->set_min(-256);
+ sb_off_y->set_max(256);
+ sb_off_y->set_step(1);
+ sb_off_y->set_value(snap_offset.y);
+ sb_off_y->set_suffix("px");
+ sb_off_y->connect("value_changed", this, "_set_snap_off_y");
+ uv_mode_hb->add_child(sb_off_y);
+
+ uv_mode_hb->add_child( memnew( VSeparator ));
+ uv_mode_hb->add_child( memnew( Label(TTR("Grid Step:")) ) );
+
+ SpinBox *sb_step_x = memnew( SpinBox );
+ sb_step_x->set_min(-256);
+ sb_step_x->set_max(256);
+ sb_step_x->set_step(1);
+ sb_step_x->set_value(snap_step.x);
+ sb_step_x->set_suffix("px");
+ sb_step_x->connect("value_changed", this, "_set_snap_step_x");
+ uv_mode_hb->add_child(sb_step_x);
+
+ SpinBox *sb_step_y = memnew( SpinBox );
+ sb_step_y->set_min(-256);
+ sb_step_y->set_max(256);
+ sb_step_y->set_step(1);
+ sb_step_y->set_value(snap_step.y);
+ sb_step_y->set_suffix("px");
+ sb_step_y->connect("value_changed", this, "_set_snap_step_y");
+ uv_mode_hb->add_child(sb_step_y);
+
+ uv_mode_hb->add_child( memnew( VSeparator ));
+ uv_icon_zoom = memnew( TextureRect );
+ uv_mode_hb->add_child( uv_icon_zoom );
+ uv_zoom = memnew( HSlider );
+ uv_zoom->set_min(0.01);
+ uv_zoom->set_max(4);
+ uv_zoom->set_value(1);
+ uv_zoom->set_step(0.01);
+ uv_mode_hb->add_child(uv_zoom);
+ uv_zoom->set_custom_minimum_size(Size2(200,0));
+ uv_zoom_value = memnew( SpinBox );
+ uv_zoom->share(uv_zoom_value);
+ uv_zoom_value->set_custom_minimum_size(Size2(50,0));
+ uv_mode_hb->add_child(uv_zoom_value);
+ uv_zoom->connect("value_changed",this,"_uv_scroll_changed");
+
+
+
+ uv_vscroll = memnew( VScrollBar);
+ uv_main_hb->add_child(uv_vscroll);
+ uv_vscroll->connect("value_changed",this,"_uv_scroll_changed");
+ uv_hscroll = memnew( HScrollBar );
+ uv_main_vb->add_child(uv_hscroll);
+ uv_hscroll->connect("value_changed",this,"_uv_scroll_changed");
+
+ uv_edit_draw->connect("draw",this,"_uv_draw");
+ uv_edit_draw->connect("gui_input",this,"_uv_input");
+ uv_draw_zoom=1.0;
+ uv_drag_index=-1;
+ uv_drag=false;
+ updating_uv_scroll=false;
+
+ error = memnew( AcceptDialog);
+ add_child(error);
+
+ uv_edit_draw->set_clip_contents(true);
+
+}
+
+
+void Polygon2DEditorPlugin::edit(Object *p_object) {
+
+
+ collision_polygon_editor->edit(p_object->cast_to<Node>());
+}
+
+bool Polygon2DEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Polygon2D");
+}
+
+void Polygon2DEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(NULL);
+ }
+
+}
+
+Polygon2DEditorPlugin::Polygon2DEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ collision_polygon_editor = memnew( Polygon2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+
+}
+
+
+Polygon2DEditorPlugin::~Polygon2DEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
new file mode 100644
index 0000000000..c994867705
--- /dev/null
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -0,0 +1,167 @@
+/*************************************************************************/
+/* polygon_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef POLYGON_2D_EDITOR_PLUGIN_H
+#define POLYGON_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/polygon_2d.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/button_group.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class CanvasItemEditor;
+
+class Polygon2DEditor : public HBoxContainer {
+
+ GDCLASS(Polygon2DEditor, HBoxContainer );
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+ MODE_EDIT_UV,
+ UVEDIT_POLYGON_TO_UV,
+ UVEDIT_UV_TO_POLYGON,
+ UVEDIT_UV_CLEAR
+
+ };
+
+ enum UVMode {
+ UV_MODE_EDIT_POINT,
+ UV_MODE_MOVE,
+ UV_MODE_ROTATE,
+ UV_MODE_SCALE,
+ UV_MODE_MAX
+ };
+
+ Mode mode;
+
+ UVMode uv_mode;
+ AcceptDialog *uv_edit;
+ ToolButton *uv_button[4];
+ ToolButton *b_snap_enable;
+ ToolButton *b_snap_grid;
+ Control *uv_edit_draw;
+ HSlider *uv_zoom;
+ SpinBox *uv_zoom_value;
+ HScrollBar *uv_hscroll;
+ VScrollBar *uv_vscroll;
+ MenuButton *uv_menu;
+ TextureRect *uv_icon_zoom;
+
+ Vector2 uv_draw_ofs;
+ float uv_draw_zoom;
+ PoolVector<Vector2> uv_prev;
+ int uv_drag_index;
+ bool uv_drag;
+ UVMode uv_move_current;
+ Vector2 uv_drag_from;
+ bool updating_uv_scroll;
+
+
+
+ AcceptDialog *error;
+
+ ToolButton *button_create;
+ ToolButton *button_edit;
+ ToolButton *button_uv;
+
+ CanvasItemEditor *canvas_item_editor;
+ EditorNode *editor;
+ Panel *panel;
+ Polygon2D *node;
+ MenuButton *options;
+
+ int edited_point;
+ Vector2 edited_point_pos;
+ Vector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+
+ bool use_snap;
+ bool snap_show_grid;
+ Vector2 snap_offset;
+ Vector2 snap_step;
+
+ void _uv_scroll_changed(float);
+ void _uv_input(const InputEvent& p_input);
+ void _uv_draw();
+ void _uv_mode(int p_mode);
+ void _wip_close();
+ void _canvas_draw();
+ void _menu_option(int p_option);
+
+ void _set_use_snap(bool p_use);
+ void _set_show_grid(bool p_show);
+ void _set_snap_off_x(float p_val);
+ void _set_snap_off_y(float p_val);
+ void _set_snap_step_x(float p_val);
+ void _set_snap_step_y(float p_val);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+ Vector2 snap_point(Vector2 p_target) const;
+
+public:
+
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_collision_polygon);
+ Polygon2DEditor(EditorNode *p_editor);
+};
+
+class Polygon2DEditorPlugin : public EditorPlugin {
+
+ GDCLASS( Polygon2DEditorPlugin, EditorPlugin );
+
+ Polygon2DEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "Polygon2D"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ Polygon2DEditorPlugin(EditorNode *p_node);
+ ~Polygon2DEditorPlugin();
+
+};
+
+#endif // POLYGON_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp
new file mode 100644
index 0000000000..e876fa55c6
--- /dev/null
+++ b/editor/plugins/resource_preloader_editor_plugin.cpp
@@ -0,0 +1,507 @@
+/*************************************************************************/
+/* resource_preloader_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "resource_preloader_editor_plugin.h"
+
+#include "io/resource_loader.h"
+#include "global_config.h"
+#include "editor/editor_settings.h"
+
+
+void ResourcePreloaderEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void ResourcePreloaderEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ load->set_icon( get_icon("Folder","EditorIcons") );
+ _delete->set_icon( get_icon("Del","EditorIcons") );
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //NodePath("/root")->connect("node_removed", this,"_node_removed",Vector<Variant>(),true);
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ }
+}
+
+void ResourcePreloaderEditor::_files_load_request(const Vector<String>& p_paths) {
+
+ for(int i=0;i<p_paths.size();i++) {
+
+ String path = p_paths[i];
+
+ RES resource;
+ resource = ResourceLoader::load(path);
+
+ if (resource.is_null()) {
+ dialog->set_text(TTR("ERROR: Couldn't load resource!"));
+ dialog->set_title(TTR("Error!"));
+ //dialog->get_cancel()->set_text("Close");
+ dialog->get_ok()->set_text(TTR("Close"));
+ dialog->popup_centered_minsize();
+ return; ///beh should show an error i guess
+ }
+
+
+ String basename = path.get_file().get_basename();
+ String name=basename;
+ int counter=1;
+ while(preloader->has_resource(name)) {
+ counter++;
+ name=basename+" "+itos(counter);
+ }
+
+ undo_redo->create_action(TTR("Add Resource"));
+ undo_redo->add_do_method(preloader,"add_resource",name,resource);
+ undo_redo->add_undo_method(preloader,"remove_resource",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+ }
+}
+
+void ResourcePreloaderEditor::_load_pressed() {
+
+ loading_scene=false;
+
+ file->clear_filters();
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("",&extensions);
+ for(int i=0;i<extensions.size();i++)
+ file->add_filter("*."+extensions[i]);
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+
+ file->popup_centered_ratio();
+
+}
+
+
+void ResourcePreloaderEditor::_item_edited() {
+
+ if (!tree->get_selected())
+ return;
+
+ TreeItem *s = tree->get_selected();
+
+ if (tree->get_selected_column()==0) {
+ // renamed
+ String old_name=s->get_metadata(0);
+ String new_name=s->get_text(0);
+ if (old_name==new_name)
+ return;
+
+ if (new_name=="" || new_name.find("\\")!=-1 || new_name.find("/")!=-1 || preloader->has_resource(new_name)) {
+
+ s->set_text(0,old_name);
+ return;
+ }
+
+ RES samp = preloader->get_resource(old_name);
+ undo_redo->create_action(TTR("Rename Resource"));
+ undo_redo->add_do_method(preloader,"remove_resource",old_name);
+ undo_redo->add_do_method(preloader,"add_resource",new_name,samp);
+ undo_redo->add_undo_method(preloader,"remove_resource",new_name);
+ undo_redo->add_undo_method(preloader,"add_resource",old_name,samp);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+ }
+
+
+}
+
+void ResourcePreloaderEditor::_delete_confirm_pressed() {
+
+ if (!tree->get_selected())
+ return;
+
+ String to_remove = tree->get_selected()->get_text(0);
+ undo_redo->create_action(TTR("Delete Resource"));
+ undo_redo->add_do_method(preloader,"remove_resource",to_remove);
+ undo_redo->add_undo_method(preloader,"add_resource",to_remove,preloader->get_resource(to_remove));
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+}
+
+
+void ResourcePreloaderEditor::_paste_pressed() {
+
+ RES r=EditorSettings::get_singleton()->get_resource_clipboard();
+ if (!r.is_valid()) {
+ dialog->set_text(TTR("Resource clipboard is empty!"));
+ dialog->set_title(TTR("Error!"));
+ //dialog->get_cancel()->set_text("Close");
+ dialog->get_ok()->set_text(TTR("Close"));
+ dialog->popup_centered_minsize();
+ return; ///beh should show an error i guess
+ }
+
+ String name = r->get_name();
+ if (name=="")
+ name=r->get_path().get_file();
+ if (name=="")
+ name=r->get_class();
+
+ String basename = name;
+ int counter=1;
+ while(preloader->has_resource(name)) {
+ counter++;
+ name=basename+" "+itos(counter);
+ }
+
+ undo_redo->create_action(TTR("Paste Resource"));
+ undo_redo->add_do_method(preloader,"add_resource",name,r);
+ undo_redo->add_undo_method(preloader,"remove_resource",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+
+void ResourcePreloaderEditor::_delete_pressed() {
+
+
+ if (!tree->get_selected())
+ return;
+
+ _delete_confirm_pressed(); //it has undo.. why bother with a dialog..
+ /*
+ dialog->set_title("Confirm...");
+ dialog->set_text("Remove Resource '"+tree->get_selected()->get_text(0)+"' ?");
+ //dialog->get_cancel()->set_text("Cancel");
+ //dialog->get_ok()->show();
+ dialog->get_ok()->set_text("Remove");
+ dialog->popup_centered(Size2(300,60));*/
+
+}
+
+
+void ResourcePreloaderEditor::_update_library() {
+
+ tree->clear();
+ tree->set_hide_root(true);
+ TreeItem *root = tree->create_item(NULL);
+
+ List<StringName> rnames;
+ preloader->get_resource_list(&rnames);
+
+ List<String> names;
+ for(List<StringName>::Element *E=rnames.front();E;E=E->next()) {
+ names.push_back(E->get());
+ }
+
+ names.sort();
+
+ for(List<String>::Element *E=names.front();E;E=E->next()) {
+
+ TreeItem *ti = tree->create_item(root);
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_STRING);
+ ti->set_editable(0,true);
+ ti->set_selectable(0,true);
+ ti->set_text(0,E->get());
+ ti->set_metadata(0,E->get());
+
+
+
+ RES r = preloader->get_resource(E->get());
+
+ ERR_CONTINUE(r.is_null());
+
+ ti->set_tooltip(0,r->get_path());
+ String type = r->get_class();
+ ti->set_text(1,type);
+ ti->set_selectable(1,false);
+
+ if (has_icon(type,"EditorIcons"))
+ ti->set_icon( 1, get_icon(type,"EditorIcons") );
+
+ }
+
+ //player->add_resource("default",resource);
+}
+
+
+
+void ResourcePreloaderEditor::edit(ResourcePreloader* p_preloader) {
+
+ preloader=p_preloader;
+
+
+ if (p_preloader) {
+ _update_library();
+ } else {
+
+ hide();
+ set_fixed_process(false);
+ }
+
+}
+
+
+
+Variant ResourcePreloaderEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ TreeItem*ti =tree->get_item_at_pos(p_point);
+ if (!ti)
+ return Variant();
+
+ String name = ti->get_metadata(0);
+
+ RES res = preloader->get_resource(name);
+ if (!res.is_valid())
+ return Variant();
+
+ return EditorNode::get_singleton()->drag_resource(res,p_from);
+
+}
+
+bool ResourcePreloaderEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const {
+
+
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return false;
+
+ if (d.has("from") && (Object*)(d["from"])==tree)
+ return false;
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ return r.is_valid();
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+ if (files.size()==0)
+ return false;
+
+ return true;
+
+ }
+ return false;
+}
+
+void ResourcePreloaderEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) {
+
+ if (!can_drop_data_fw(p_point,p_data,p_from))
+ return;
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return;
+
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ if (r.is_valid()) {
+
+ String basename;
+ if (r->get_name()!="") {
+ basename=r->get_name();
+ } else if (r->get_path().is_resource_file()) {
+ basename = r->get_path().get_basename();
+ } else {
+ basename="Resource";
+ }
+
+ String name=basename;
+ int counter=0;
+ while(preloader->has_resource(name)) {
+ counter++;
+ name=basename+"_"+itos(counter);
+ }
+
+ undo_redo->create_action(TTR("Add Resource"));
+ undo_redo->add_do_method(preloader,"add_resource",name,r);
+ undo_redo->add_undo_method(preloader,"remove_resource",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+ }
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+ _files_load_request(files);
+ }
+}
+
+
+
+void ResourcePreloaderEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&ResourcePreloaderEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_load_pressed"),&ResourcePreloaderEditor::_load_pressed);
+ ClassDB::bind_method(D_METHOD("_item_edited"),&ResourcePreloaderEditor::_item_edited);
+ ClassDB::bind_method(D_METHOD("_delete_pressed"),&ResourcePreloaderEditor::_delete_pressed);
+ ClassDB::bind_method(D_METHOD("_paste_pressed"),&ResourcePreloaderEditor::_paste_pressed);
+ ClassDB::bind_method(D_METHOD("_delete_confirm_pressed"),&ResourcePreloaderEditor::_delete_confirm_pressed);
+ ClassDB::bind_method(D_METHOD("_files_load_request"),&ResourcePreloaderEditor::_files_load_request);
+ ClassDB::bind_method(D_METHOD("_update_library"),&ResourcePreloaderEditor::_update_library);
+
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ResourcePreloaderEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &ResourcePreloaderEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &ResourcePreloaderEditor::drop_data_fw);
+
+
+}
+
+ResourcePreloaderEditor::ResourcePreloaderEditor() {
+
+ //add_style_override("panel", get_stylebox("panel","Panel"));
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+ load = memnew( Button );
+ load->set_tooltip(TTR("Load Resource"));
+ hbc->add_child(load);
+
+
+
+ _delete = memnew( Button );
+ hbc->add_child(_delete);
+
+ paste = memnew( Button );
+ paste->set_text(TTR("Paste"));
+ hbc->add_child(paste);
+
+ file = memnew( EditorFileDialog );
+ add_child(file);
+
+
+ tree = memnew( Tree );
+ tree->set_columns(2);
+ tree->set_column_min_width(0,3);
+ tree->set_column_min_width(1,1);
+ tree->set_column_expand(0,true);
+ tree->set_column_expand(1,true);
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ tree->set_drag_forwarding(this);
+ vbc->add_child(tree);
+
+ dialog = memnew( AcceptDialog );
+ add_child( dialog );
+
+ load->connect("pressed", this,"_load_pressed");
+ _delete->connect("pressed", this,"_delete_pressed");
+ paste->connect("pressed", this,"_paste_pressed");
+ file->connect("files_selected", this,"_files_load_request");
+ //dialog->connect("confirmed", this,"_delete_confirm_pressed");
+ tree->connect("item_edited", this,"_item_edited");
+ loading_scene=false;
+
+}
+
+
+void ResourcePreloaderEditorPlugin::edit(Object *p_object) {
+
+ preloader_editor->set_undo_redo(&get_undo_redo());
+ ResourcePreloader * s = p_object->cast_to<ResourcePreloader>();
+ if (!s)
+ return;
+
+ preloader_editor->edit(s);
+}
+
+bool ResourcePreloaderEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("ResourcePreloader");
+}
+
+void ResourcePreloaderEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ //preloader_editor->show();
+ button->show();
+ editor->make_bottom_panel_item_visible(preloader_editor);
+ //preloader_editor->set_process(true);
+ } else {
+
+ if (preloader_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+ button->hide();
+ //preloader_editor->hide();
+ //preloader_editor->set_process(false);
+ }
+
+}
+
+ResourcePreloaderEditorPlugin::ResourcePreloaderEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ preloader_editor = memnew( ResourcePreloaderEditor );
+ preloader_editor->set_custom_minimum_size(Size2(0,250));
+
+ button=editor->add_bottom_panel_item("ResourcePreloader",preloader_editor);
+ button->hide();
+
+ //preloader_editor->set_anchor( MARGIN_TOP, Control::ANCHOR_END);
+ //preloader_editor->set_margin( MARGIN_TOP, 120 );
+
+
+
+
+}
+
+
+ResourcePreloaderEditorPlugin::~ResourcePreloaderEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/resource_preloader_editor_plugin.h b/editor/plugins/resource_preloader_editor_plugin.h
new file mode 100644
index 0000000000..54ccad4341
--- /dev/null
+++ b/editor/plugins/resource_preloader_editor_plugin.h
@@ -0,0 +1,108 @@
+/*************************************************************************/
+/* resource_preloader_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef RESOURCE_PRELOADER_EDITOR_PLUGIN_H
+#define RESOURCE_PRELOADER_EDITOR_PLUGIN_H
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/gui/tree.h"
+#include "scene/main/resource_preloader.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/dialogs.h"
+
+
+class ResourcePreloaderEditor : public PanelContainer {
+
+ GDCLASS(ResourcePreloaderEditor, PanelContainer );
+
+ Button *load;
+ Button *_delete;
+ Button *paste;
+ Tree *tree;
+ bool loading_scene;
+
+
+ EditorFileDialog *file;
+
+ AcceptDialog *dialog;
+
+ ResourcePreloader *preloader;
+
+
+ void _load_pressed();
+ void _load_scene_pressed();
+ void _files_load_request(const Vector<String>& p_paths);
+ void _paste_pressed();
+ void _delete_pressed();
+ void _delete_confirm_pressed();
+ void _update_library();
+ void _item_edited();
+
+ UndoRedo *undo_redo;
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; }
+
+ void edit(ResourcePreloader* p_preloader);
+ ResourcePreloaderEditor();
+};
+
+class ResourcePreloaderEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ResourcePreloaderEditorPlugin, EditorPlugin );
+
+ ResourcePreloaderEditor *preloader_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "ResourcePreloader"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ResourcePreloaderEditorPlugin(EditorNode *p_node);
+ ~ResourcePreloaderEditorPlugin();
+
+};
+
+#endif // RESOURCE_PRELOADER_EDITOR_PLUGIN_H
diff --git a/editor/plugins/rich_text_editor_plugin.cpp b/editor/plugins/rich_text_editor_plugin.cpp
new file mode 100644
index 0000000000..797ee8e8ea
--- /dev/null
+++ b/editor/plugins/rich_text_editor_plugin.cpp
@@ -0,0 +1,164 @@
+/*************************************************************************/
+/* rich_text_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "rich_text_editor_plugin.h"
+
+#include "os/file_access.h"
+#include "canvas_item_editor_plugin.h"
+
+void RichTextEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_FIXED_PROCESS: {
+
+
+ } break;
+ }
+
+}
+void RichTextEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+
+void RichTextEditor::_file_selected(const String& p_path) {
+
+ CharString cs;
+ FileAccess *fa = FileAccess::open(p_path,FileAccess::READ);
+ if (!fa) {
+ ERR_FAIL();
+ }
+
+ while(!fa->eof_reached())
+ cs.push_back(fa->get_8());
+ cs.push_back(0);
+ memdelete(fa);
+
+ String bbcode;
+ bbcode.parse_utf8(&cs[0]);
+ node->parse_bbcode(bbcode);
+
+}
+
+void RichTextEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case PARSE_BBCODE: {
+
+ file_dialog->popup_centered_ratio();
+ } break;
+ case CLEAR: {
+
+ node->clear();
+
+ } break;
+
+ }
+}
+
+void RichTextEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_menu_option"),&RichTextEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_file_selected"),&RichTextEditor::_file_selected);
+
+}
+
+void RichTextEditor::edit(Node *p_rich_text) {
+
+ node=p_rich_text->cast_to<RichTextLabel>();
+
+}
+RichTextEditor::RichTextEditor() {
+
+ options = memnew( MenuButton );
+ //add_child(options);
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(options);
+ options->set_area_as_parent_rect();
+
+ options->set_text("RichText");
+ options->get_popup()->add_item(TTR("Parse BBCode"),PARSE_BBCODE);
+ options->get_popup()->add_item(TTR("Clear"),CLEAR);
+
+ options->get_popup()->connect("id_pressed", this,"_menu_option");
+ file_dialog = memnew( EditorFileDialog );
+ add_child(file_dialog);
+ file_dialog->add_filter("*.txt");
+ file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->connect("file_selected",this,"_file_selected");
+}
+
+
+void RichTextEditorPlugin::edit(Object *p_object) {
+
+ rich_text_editor->edit(p_object->cast_to<Node>());
+}
+
+bool RichTextEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("RichTextLabel");
+}
+
+void RichTextEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ rich_text_editor->options->show();
+ } else {
+
+ rich_text_editor->options->hide();
+ rich_text_editor->edit(NULL);
+ }
+
+}
+
+RichTextEditorPlugin::RichTextEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ rich_text_editor = memnew( RichTextEditor );
+ editor->get_viewport()->add_child(rich_text_editor);
+
+ rich_text_editor->set_margin(MARGIN_LEFT,184);
+ rich_text_editor->set_margin(MARGIN_RIGHT,230);
+ rich_text_editor->set_margin(MARGIN_TOP,0);
+ rich_text_editor->set_margin(MARGIN_BOTTOM,10);
+
+ rich_text_editor->options->hide();
+
+}
+
+
+RichTextEditorPlugin::~RichTextEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/rich_text_editor_plugin.h b/editor/plugins/rich_text_editor_plugin.h
new file mode 100644
index 0000000000..c7f95fb479
--- /dev/null
+++ b/editor/plugins/rich_text_editor_plugin.h
@@ -0,0 +1,91 @@
+/*************************************************************************/
+/* rich_text_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef RICH_TEXT_EDITOR_PLUGIN_H
+#define RICH_TEXT_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/file_dialog.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class RichTextEditor : public Control {
+
+ GDCLASS(RichTextEditor, Control );
+
+ friend class RichTextEditorPlugin;
+
+ enum {
+
+ PARSE_BBCODE,
+ CLEAR
+ };
+
+ Panel *panel;
+ MenuButton *options;
+ RichTextLabel *node;
+ EditorFileDialog *file_dialog;
+
+ void _file_selected(const String& p_path);
+ void _menu_option(int p_option);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(Node *p_rich_text);
+ RichTextEditor();
+};
+
+class RichTextEditorPlugin : public EditorPlugin {
+
+ GDCLASS( RichTextEditorPlugin, EditorPlugin );
+
+ RichTextEditor *rich_text_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "RichText"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ RichTextEditorPlugin(EditorNode *p_node);
+ ~RichTextEditorPlugin();
+
+};
+
+#endif // RICH_TEXT_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sample_editor_plugin.cpp b/editor/plugins/sample_editor_plugin.cpp
new file mode 100644
index 0000000000..b6b96c946e
--- /dev/null
+++ b/editor/plugins/sample_editor_plugin.cpp
@@ -0,0 +1,451 @@
+/*************************************************************************/
+/* sample_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "sample_editor_plugin.h"
+
+#if 0
+#include "io/resource_loader.h"
+#include "global_config.h"
+#include "editor/editor_settings.h"
+
+
+
+
+void SampleEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void SampleEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ play->set_icon( get_icon("Play","EditorIcons") );
+ stop->set_icon( get_icon("Stop","EditorIcons") );
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //get_scene()->connect("node_removed",this,"_node_removed");
+
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ }
+}
+
+void SampleEditor::_play_pressed() {
+
+ player->play("default",true);
+ stop->set_pressed(false);
+ play->set_pressed(true);
+}
+void SampleEditor::_stop_pressed() {
+
+ player->stop_all();
+ play->set_pressed(false);
+}
+
+void SampleEditor::generate_preview_texture(const Ref<Sample>& p_sample,Ref<ImageTexture> &p_texture) {
+
+
+ PoolVector<uint8_t> data = p_sample->get_data();
+
+ PoolVector<uint8_t> img;
+ int w = p_texture->get_width();
+ int h = p_texture->get_height();
+ img.resize(w*h*3);
+ PoolVector<uint8_t>::Write imgdata = img.write();
+ uint8_t * imgw = imgdata.ptr();
+ PoolVector<uint8_t>::Read sampledata = data.read();
+ const uint8_t *sdata=sampledata.ptr();
+
+ bool stereo = p_sample->is_stereo();
+ bool _16=p_sample->get_format()==Sample::FORMAT_PCM16;
+ int len = p_sample->get_length();
+
+ if (len<1)
+ return;
+
+ if (p_sample->get_format()==Sample::FORMAT_IMA_ADPCM) {
+
+
+ struct IMA_ADPCM_State {
+
+ int16_t step_index;
+ int32_t predictor;
+ /* values at loop point */
+ int16_t loop_step_index;
+ int32_t loop_predictor;
+ int32_t last_nibble;
+ int32_t loop_pos;
+ int32_t window_ofs;
+ const uint8_t *ptr;
+ } ima_adpcm;
+
+ ima_adpcm.step_index=0;
+ ima_adpcm.predictor=0;
+ ima_adpcm.loop_step_index=0;
+ ima_adpcm.loop_predictor=0;
+ ima_adpcm.last_nibble=-1;
+ ima_adpcm.loop_pos=0x7FFFFFFF;
+ ima_adpcm.window_ofs=0;
+ ima_adpcm.ptr=NULL;
+
+
+ for(int i=0;i<w;i++) {
+
+ float max[2]={-1e10,-1e10};
+ float min[2]={1e10,1e10};
+ int from = i*len/w;
+ int to = (i+1)*len/w;
+ if (to>=len)
+ to=len-1;
+
+ for(int j=from;j<to;j++) {
+
+ while(j>ima_adpcm.last_nibble) {
+
+ static const int16_t _ima_adpcm_step_table[89] = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+ };
+
+ static const int8_t _ima_adpcm_index_table[16] = {
+ -1, -1, -1, -1, 2, 4, 6, 8,
+ -1, -1, -1, -1, 2, 4, 6, 8
+ };
+
+ int16_t nibble,diff,step;
+
+ ima_adpcm.last_nibble++;
+ const uint8_t *src_ptr=sdata;
+
+ int ofs = ima_adpcm.last_nibble>>1;
+
+ if (stereo)
+ ofs*=2;
+
+ nibble = (ima_adpcm.last_nibble&1)?
+ (src_ptr[ofs]>>4):(src_ptr[ofs]&0xF);
+
+ step=_ima_adpcm_step_table[ima_adpcm.step_index];
+
+ ima_adpcm.step_index += _ima_adpcm_index_table[nibble];
+ if (ima_adpcm.step_index<0)
+ ima_adpcm.step_index=0;
+ if (ima_adpcm.step_index>88)
+ ima_adpcm.step_index=88;
+
+ diff = step >> 3 ;
+ if (nibble & 1)
+ diff += step >> 2 ;
+ if (nibble & 2)
+ diff += step >> 1 ;
+ if (nibble & 4)
+ diff += step ;
+ if (nibble & 8)
+ diff = -diff ;
+
+ ima_adpcm.predictor+=diff;
+ if (ima_adpcm.predictor<-0x8000)
+ ima_adpcm.predictor=-0x8000;
+ else if (ima_adpcm.predictor>0x7FFF)
+ ima_adpcm.predictor=0x7FFF;
+
+
+ /* store loop if there */
+ if (ima_adpcm.last_nibble==ima_adpcm.loop_pos) {
+
+ ima_adpcm.loop_step_index = ima_adpcm.step_index;
+ ima_adpcm.loop_predictor = ima_adpcm.predictor;
+ }
+
+ }
+
+ float v=ima_adpcm.predictor/32767.0;
+ if (v>max[0])
+ max[0]=v;
+ if (v<min[0])
+ min[0]=v;
+ }
+
+ for(int j=0;j<h;j++) {
+ float v = (j/(float)h) * 2.0 - 1.0;
+ uint8_t* imgofs = &imgw[(uint64_t(j)*w+i)*3];
+ if (v>min[0] && v<max[0]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+ }
+ } else {
+ for(int i=0;i<w;i++) {
+ // i trust gcc will optimize this loop
+ float max[2]={-1e10,-1e10};
+ float min[2]={1e10,1e10};
+ int c=stereo?2:1;
+ int from = uint64_t(i)*len/w;
+ int to = (uint64_t(i)+1)*len/w;
+ if (to>=len)
+ to=len-1;
+
+ if (_16) {
+ const int16_t*src =(const int16_t*)sdata;
+
+ for(int j=0;j<c;j++) {
+
+ for(int k=from;k<=to;k++) {
+
+ float v = src[uint64_t(k)*c+j]/32768.0;
+ if (v>max[j])
+ max[j]=v;
+ if (v<min[j])
+ min[j]=v;
+ }
+
+ }
+ } else {
+
+ const int8_t*src =(const int8_t*)sdata;
+
+ for(int j=0;j<c;j++) {
+
+ for(int k=from;k<=to;k++) {
+
+ float v = src[uint64_t(k)*c+j]/128.0;
+ if (v>max[j])
+ max[j]=v;
+ if (v<min[j])
+ min[j]=v;
+ }
+
+ }
+ }
+
+ if (!stereo) {
+ for(int j=0;j<h;j++) {
+ float v = (j/(float)h) * 2.0 - 1.0;
+ uint8_t* imgofs = &imgw[(uint64_t(j)*w+i)*3];
+ if (v>min[0] && v<max[0]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+ } else {
+
+ for(int j=0;j<h;j++) {
+
+ int half;
+ float v;
+ if (j<(h/2)) {
+ half=0;
+ v = (j/(float)(h/2)) * 2.0 - 1.0;
+ } else {
+ half=1;
+ v = ((j-(h/2))/(float)(h/2)) * 2.0 - 1.0;
+ }
+
+ uint8_t* imgofs = &imgw[(uint64_t(j)*w+i)*3];
+ if (v>min[half] && v<max[half]) {
+ imgofs[0]=255;
+ imgofs[1]=150;
+ imgofs[2]=80;
+ } else {
+ imgofs[0]=0;
+ imgofs[1]=0;
+ imgofs[2]=0;
+ }
+ }
+
+ }
+
+ }
+ }
+
+ imgdata = PoolVector<uint8_t>::Write();
+
+
+ p_texture->set_data(Image(w,h,0,Image::FORMAT_RGB8,img));
+
+}
+
+void SampleEditor::_update_sample() {
+
+ player->stop_all();
+
+ generate_preview_texture(sample,peakdisplay);
+ info_label->set_text(TTR("Length:")+" "+String::num(sample->get_length()/(float)sample->get_mix_rate(),2)+"s");
+
+ if (library->has_sample("default"))
+ library->remove_sample("default");
+
+ library->add_sample("default",sample);
+}
+
+
+
+void SampleEditor::edit(Ref<Sample> p_sample) {
+
+ sample=p_sample;
+
+ if (!sample.is_null())
+ _update_sample();
+ else {
+
+ hide();
+ set_fixed_process(false);
+ }
+
+}
+
+
+
+void SampleEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&SampleEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_play_pressed"),&SampleEditor::_play_pressed);
+ ClassDB::bind_method(D_METHOD("_stop_pressed"),&SampleEditor::_stop_pressed);
+
+}
+
+SampleEditor::SampleEditor() {
+
+ player = memnew(SamplePlayer);
+ add_child(player);
+ add_style_override("panel", get_stylebox("panel","Panel"));
+ library = Ref<SampleLibrary>(memnew(SampleLibrary));
+ player->set_sample_library(library);
+ sample_texframe = memnew( TextureRect );
+ add_child(sample_texframe);
+ sample_texframe->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
+ sample_texframe->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
+ sample_texframe->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,30);
+ sample_texframe->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,5);
+
+ info_label = memnew( Label );
+ sample_texframe->add_child(info_label);
+ info_label->set_area_as_parent_rect();
+ info_label->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,15);
+ info_label->set_margin(MARGIN_BOTTOM,4);
+ info_label->set_margin(MARGIN_RIGHT,4);
+ info_label->set_align(Label::ALIGN_RIGHT);
+
+
+ play = memnew( Button );
+
+ play->set_pos(Point2( 5, 5 ));
+ play->set_size( Size2(1,1 ) );
+ play->set_toggle_mode(true);
+ add_child(play);
+
+ stop = memnew( Button );
+
+ stop->set_pos(Point2( 35, 5 ));
+ stop->set_size( Size2(1,1 ) );
+ stop->set_toggle_mode(true);
+ add_child(stop);
+
+ peakdisplay=Ref<ImageTexture>( memnew( ImageTexture) );
+ peakdisplay->create( EDITOR_DEF("editors/sample_editor/preview_width",512),EDITOR_DEF("editors/sample_editor/preview_height",128),Image::FORMAT_RGB8);
+ sample_texframe->set_expand(true);
+ sample_texframe->set_texture(peakdisplay);
+
+ play->connect("pressed", this,"_play_pressed");
+ stop->connect("pressed", this,"_stop_pressed");
+
+ set_custom_minimum_size(Size2(1,150)*EDSCALE);
+
+}
+
+
+void SampleEditorPlugin::edit(Object *p_object) {
+
+ Sample * s = p_object->cast_to<Sample>();
+ if (!s)
+ return;
+
+ sample_editor->edit(Ref<Sample>(s));
+}
+
+bool SampleEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Sample");
+}
+
+void SampleEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ sample_editor->show();
+ //sample_editor->set_process(true);
+ } else {
+
+ sample_editor->hide();
+ //sample_editor->set_process(false);
+ }
+
+}
+
+SampleEditorPlugin::SampleEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ sample_editor = memnew( SampleEditor );
+ add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM,sample_editor);
+ sample_editor->hide();
+
+
+
+}
+
+
+SampleEditorPlugin::~SampleEditorPlugin()
+{
+}
+
+#endif
diff --git a/editor/plugins/sample_editor_plugin.h b/editor/plugins/sample_editor_plugin.h
new file mode 100644
index 0000000000..dae9cef9f4
--- /dev/null
+++ b/editor/plugins/sample_editor_plugin.h
@@ -0,0 +1,92 @@
+/*************************************************************************/
+/* sample_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SAMPLE_EDITOR_PLUGIN_H
+#define SAMPLE_EDITOR_PLUGIN_H
+
+#if 0
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/audio/sample_player.h"
+#include "scene/resources/sample.h"
+#include "scene/resources/sample_library.h"
+
+
+class SampleEditor : public Panel {
+
+ GDCLASS(SampleEditor, Panel );
+
+
+ SamplePlayer *player;
+ Label *info_label;
+ Ref<ImageTexture> peakdisplay;
+ Ref<Sample> sample;
+ Ref<SampleLibrary> library;
+ TextureRect *sample_texframe;
+ Button *stop;
+ Button *play;
+
+ void _play_pressed();
+ void _stop_pressed();
+ void _update_sample();
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ static void generate_preview_texture(const Ref<Sample>& p_sample,Ref<ImageTexture> &p_texture);
+ void edit(Ref<Sample> p_sample);
+ SampleEditor();
+};
+
+
+class SampleEditorPlugin : public EditorPlugin {
+
+ GDCLASS( SampleEditorPlugin, EditorPlugin );
+
+ SampleEditor *sample_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Sample"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ SampleEditorPlugin(EditorNode *p_node);
+ ~SampleEditorPlugin();
+
+};
+
+#endif
+
+#endif // SAMPLE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sample_library_editor_plugin.cpp b/editor/plugins/sample_library_editor_plugin.cpp
new file mode 100644
index 0000000000..4ead1d2709
--- /dev/null
+++ b/editor/plugins/sample_library_editor_plugin.cpp
@@ -0,0 +1,546 @@
+/*************************************************************************/
+/* sample_library_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#if 0
+#include "sample_library_editor_plugin.h"
+
+#include "io/resource_loader.h"
+#include "global_config.h"
+#include "editor/editor_settings.h"
+#include "scene/main/viewport.h"
+#include "sample_editor_plugin.h"
+
+
+void SampleLibraryEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void SampleLibraryEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_PROCESS) {
+ if (is_playing && !player->is_active()) {
+ TreeItem *tl=last_sample_playing->cast_to<TreeItem>();
+ tl->set_button(0,0,get_icon("Play","EditorIcons"));
+ is_playing = false;
+ set_process(false);
+ }
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ load->set_icon( get_icon("Folder","EditorIcons") );
+ load->set_tooltip(TTR("Open Sample File(s)"));
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //NodePath("/root")->connect("node_removed", this,"_node_removed",Vector<Variant>(),true);
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ }
+}
+
+void SampleLibraryEditor::_file_load_request(const PoolVector<String>& p_path) {
+
+
+ for(int i=0;i<p_path.size();i++) {
+
+ String path = p_path[i];
+ Ref<Sample> sample = ResourceLoader::load(path,"Sample");
+ if (sample.is_null()) {
+ dialog->set_text(TTR("ERROR: Couldn't load sample!"));
+ dialog->set_title(TTR("Error!"));
+ //dialog->get_cancel()->set_text("Close");
+ dialog->get_ok()->set_text(TTR("Close"));
+ dialog->popup_centered_minsize();
+ return; ///beh should show an error i guess
+ }
+ String basename = path.get_file().get_basename();
+ String name=basename;
+ int counter=0;
+ while(sample_library->has_sample(name)) {
+ counter++;
+ name=basename+"_"+itos(counter);
+ }
+
+ undo_redo->create_action(TTR("Add Sample"));
+ undo_redo->add_do_method(sample_library.operator->(),"add_sample",name,sample);
+ undo_redo->add_undo_method(sample_library.operator->(),"remove_sample",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+ }
+}
+
+void SampleLibraryEditor::_load_pressed() {
+
+ file->popup_centered_ratio();
+
+}
+
+void SampleLibraryEditor::_button_pressed(Object *p_item,int p_column, int p_id) {
+
+ TreeItem *ti=p_item->cast_to<TreeItem>();
+ String name = ti->get_text(0);
+
+ if (p_column==0) { // Play/Stop
+
+ String btn_type;
+ if(!is_playing) {
+ is_playing = true;
+ btn_type = TTR("Stop");
+ player->play(name,true);
+ last_sample_playing = p_item;
+ set_process(true);
+ } else {
+ player->stop_all();
+ if(last_sample_playing != p_item){
+ TreeItem *tl=last_sample_playing->cast_to<TreeItem>();
+ tl->set_button(p_column,0,get_icon("Play","EditorIcons"));
+ btn_type = TTR("Stop");
+ player->play(name,true);
+ last_sample_playing = p_item;
+ } else {
+ btn_type = TTR("Play");
+ is_playing = false;
+ }
+ }
+ ti->set_button(p_column,0,get_icon(btn_type,"EditorIcons"));
+ } else if (p_column==1) { // Edit
+
+ get_tree()->get_root()->get_child(0)->call("_resource_selected",sample_library->get_sample(name));
+ } else if (p_column==5) { // Delete
+
+ ti->select(0);
+ _delete_pressed();
+ }
+
+
+}
+
+
+
+
+
+void SampleLibraryEditor::_item_edited() {
+
+ if (!tree->get_selected())
+ return;
+
+ TreeItem *s = tree->get_selected();
+
+ if (tree->get_selected_column()==0) { // Name
+ // renamed
+ String old_name=s->get_metadata(0);
+ String new_name=s->get_text(0);
+ if (old_name==new_name)
+ return;
+
+ if (new_name=="" || new_name.find("\\")!=-1 || new_name.find("/")!=-1 || sample_library->has_sample(new_name)) {
+
+ s->set_text(0,old_name);
+ return;
+ }
+
+ Ref<Sample> samp = sample_library->get_sample(old_name);
+ undo_redo->create_action(TTR("Rename Sample"));
+ undo_redo->add_do_method(sample_library.operator->(),"remove_sample",old_name);
+ undo_redo->add_do_method(sample_library.operator->(),"add_sample",new_name,samp);
+ undo_redo->add_undo_method(sample_library.operator->(),"remove_sample",new_name);
+ undo_redo->add_undo_method(sample_library.operator->(),"add_sample",old_name,samp);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+ } else if (tree->get_selected_column()==3) { // Volume dB
+
+ StringName n = s->get_text(0);
+ sample_library->sample_set_volume_db(n,s->get_range(3));
+
+ } else if (tree->get_selected_column()==4) { // Pitch scale
+
+ StringName n = s->get_text(0);
+ sample_library->sample_set_pitch_scale(n,s->get_range(4));
+
+ }
+
+
+}
+
+void SampleLibraryEditor::_delete_pressed() {
+
+ if (!tree->get_selected())
+ return;
+
+ String to_remove = tree->get_selected()->get_text(0);
+ undo_redo->create_action(TTR("Delete Sample"));
+ undo_redo->add_do_method(sample_library.operator->(),"remove_sample",to_remove);
+ undo_redo->add_undo_method(sample_library.operator->(),"add_sample",to_remove,sample_library->get_sample(to_remove));
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+}
+
+
+void SampleLibraryEditor::_update_library() {
+
+ player->stop_all();
+
+ tree->clear();
+ tree->set_hide_root(true);
+ TreeItem *root = tree->create_item(NULL);
+
+ List<StringName> names;
+ sample_library->get_sample_list(&names);
+ names.sort_custom<StringName::AlphCompare>();
+
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+
+ TreeItem *ti = tree->create_item(root);
+
+ // Name + Play/Stop
+ ti->set_cell_mode(0,TreeItem::CELL_MODE_STRING);
+ ti->set_editable(0,true);
+ ti->set_selectable(0,true);
+ ti->set_text(0,E->get());
+ ti->set_metadata(0,E->get());
+ ti->add_button(0,get_icon("Play","EditorIcons"));
+
+ Ref<Sample> smp = sample_library->get_sample(E->get());
+
+ // Preview/edit
+ Ref<ImageTexture> preview( memnew( ImageTexture ));
+ preview->create(128,16,Image::FORMAT_RGB8);
+ SampleEditor::generate_preview_texture(smp,preview);
+ ti->set_cell_mode(1,TreeItem::CELL_MODE_ICON);
+ ti->set_selectable(1,false);
+ ti->set_editable(1,false);
+ ti->set_icon(1,preview);
+ ti->add_button(1,get_icon("Edit","EditorIcons"));
+
+ // Format
+ ti->set_cell_mode(2,TreeItem::CELL_MODE_STRING);
+ ti->set_editable(2,false);
+ ti->set_selectable(2,false);
+ ti->set_text(2,String()+(smp->get_format()==Sample::FORMAT_PCM16?TTR("16 Bits")+", ":(smp->get_format()==Sample::FORMAT_PCM8?TTR("8 Bits")+", ":"IMA-ADPCM,"))+(smp->is_stereo()?TTR("Stereo"):TTR("Mono")));
+
+ // Volume dB
+ ti->set_cell_mode(3,TreeItem::CELL_MODE_RANGE);
+ ti->set_range_config(3,-60,24,0.01);
+ ti->set_selectable(3,true);
+ ti->set_editable(3,true);
+ ti->set_range(3,sample_library->sample_get_volume_db(E->get()));
+
+ // Pitch scale
+ ti->set_cell_mode(4,TreeItem::CELL_MODE_RANGE);
+ ti->set_range_config(4,0.01,100,0.01);
+ ti->set_selectable(4,true);
+ ti->set_editable(4,true);
+ ti->set_range(4,sample_library->sample_get_pitch_scale(E->get()));
+
+ // Delete
+ ti->set_cell_mode(5,TreeItem::CELL_MODE_STRING);
+ ti->add_button(5,get_icon("Remove","EditorIcons"));
+
+ }
+
+ //player->add_sample("default",sample);
+}
+
+
+
+void SampleLibraryEditor::edit(Ref<SampleLibrary> p_sample_library) {
+
+ sample_library=p_sample_library;
+
+
+ if (!sample_library.is_null()) {
+ player->set_sample_library(sample_library);
+ _update_library();
+ } else {
+
+ hide();
+ }
+
+}
+
+Variant SampleLibraryEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ TreeItem*ti =tree->get_item_at_pos(p_point);
+ if (!ti)
+ return Variant();
+
+ String name = ti->get_metadata(0);
+
+ RES res = sample_library->get_sample(name);
+ if (!res.is_valid())
+ return Variant();
+
+ return EditorNode::get_singleton()->drag_resource(res,p_from);
+
+
+}
+
+bool SampleLibraryEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const {
+
+
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return false;
+
+ if (d.has("from") && (Object*)(d["from"])==tree)
+ return false;
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ Ref<Sample> sample = r;
+
+ if (sample.is_valid()) {
+
+ return true;
+ }
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+ if (files.size()==0)
+ return false;
+
+ for(int i=0;i<files.size();i++) {
+ String file = files[0];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+ if (ftype!="Sample") {
+ return false;
+ }
+
+ }
+
+ return true;
+
+ }
+ return false;
+}
+
+void SampleLibraryEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) {
+
+ if (!can_drop_data_fw(p_point,p_data,p_from))
+ return;
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return;
+
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ Ref<Sample> sample = r;
+
+ if (sample.is_valid()) {
+
+ String basename;
+ if (sample->get_name()!="") {
+ basename=sample->get_name();
+ } else if (sample->get_path().is_resource_file()) {
+ basename = sample->get_path().get_basename();
+ } else {
+ basename="Sample";
+ }
+
+ String name=basename;
+ int counter=0;
+ while(sample_library->has_sample(name)) {
+ counter++;
+ name=basename+"_"+itos(counter);
+ }
+
+ undo_redo->create_action(TTR("Add Sample"));
+ undo_redo->add_do_method(sample_library.operator->(),"add_sample",name,sample);
+ undo_redo->add_undo_method(sample_library.operator->(),"remove_sample",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+ }
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ PoolVector<String> files = d["files"];
+
+ _file_load_request(files);
+
+ }
+
+}
+
+
+void SampleLibraryEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&SampleLibraryEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_load_pressed"),&SampleLibraryEditor::_load_pressed);
+ ClassDB::bind_method(D_METHOD("_item_edited"),&SampleLibraryEditor::_item_edited);
+ ClassDB::bind_method(D_METHOD("_delete_pressed"),&SampleLibraryEditor::_delete_pressed);
+ ClassDB::bind_method(D_METHOD("_file_load_request"),&SampleLibraryEditor::_file_load_request);
+ ClassDB::bind_method(D_METHOD("_update_library"),&SampleLibraryEditor::_update_library);
+ ClassDB::bind_method(D_METHOD("_button_pressed"),&SampleLibraryEditor::_button_pressed);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &SampleLibraryEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SampleLibraryEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &SampleLibraryEditor::drop_data_fw);
+
+}
+
+SampleLibraryEditor::SampleLibraryEditor() {
+
+ player = memnew(SamplePlayer);
+ add_child(player);
+ add_style_override("panel", get_stylebox("panel","Panel"));
+
+
+ load = memnew( Button );
+ load->set_pos(Point2( 5, 5 ));
+ load->set_size( Size2(1,1 ) );
+ add_child(load);
+
+ file = memnew( EditorFileDialog );
+ add_child(file);
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("Sample",&extensions);
+ for(int i=0;i<extensions.size();i++)
+ file->add_filter("*."+extensions[i]);
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+
+ tree = memnew( Tree );
+ tree->set_columns(6);
+ add_child(tree);
+ tree->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
+ tree->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
+ tree->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,30);
+ tree->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,5);
+ tree->set_column_titles_visible(true);
+ tree->set_column_title(0,TTR("Name"));
+ tree->set_column_title(1,TTR("Preview"));
+ tree->set_column_title(2,TTR("Format"));
+ tree->set_column_title(3,"dB");
+ tree->set_column_title(4,TTR("Pitch"));
+ tree->set_column_title(5,"");
+
+ tree->set_column_min_width(1,150);
+ tree->set_column_min_width(2,100);
+ tree->set_column_min_width(3,50);
+ tree->set_column_min_width(4,50);
+ tree->set_column_min_width(5,32);
+ tree->set_column_expand(1,false);
+ tree->set_column_expand(2,false);
+ tree->set_column_expand(3,false);
+ tree->set_column_expand(4,false);
+ tree->set_column_expand(5,false);
+
+ tree->set_drag_forwarding(this);
+
+ dialog = memnew( ConfirmationDialog );
+ add_child( dialog );
+
+ tree->connect("button_pressed",this,"_button_pressed");
+ load->connect("pressed", this,"_load_pressed");
+ file->connect("files_selected", this,"_file_load_request");
+ tree->connect("item_edited", this,"_item_edited");
+
+ is_playing = false;
+}
+
+
+void SampleLibraryEditorPlugin::edit(Object *p_object) {
+
+ sample_library_editor->set_undo_redo(&get_undo_redo());
+ SampleLibrary * s = p_object->cast_to<SampleLibrary>();
+ if (!s)
+ return;
+
+ sample_library_editor->edit(Ref<SampleLibrary>(s));
+}
+
+bool SampleLibraryEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("SampleLibrary");
+}
+
+void SampleLibraryEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ //sample_library_editor->show();
+ button->show();
+ editor->make_bottom_panel_item_visible(sample_library_editor);
+ //sample_library_editor->set_process(true);
+ } else {
+
+ if (sample_library_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+ button->hide();
+
+ //sample_library_editor->set_process(false);
+ }
+
+}
+
+SampleLibraryEditorPlugin::SampleLibraryEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ sample_library_editor = memnew( SampleLibraryEditor );
+
+ //editor->get_viewport()->add_child(sample_library_editor);
+ sample_library_editor->set_custom_minimum_size(Size2(0,250));
+ button=p_node->add_bottom_panel_item("SampleLibrary",sample_library_editor);
+ button->hide();
+
+ //sample_library_editor->set_area_as_parent_rect();
+ //sample_library_editor->set_anchor( MARGIN_TOP, Control::ANCHOR_END);
+ //sample_library_editor->set_margin( MARGIN_TOP, 120 );
+ //sample_library_editor->hide();
+
+
+
+}
+
+
+SampleLibraryEditorPlugin::~SampleLibraryEditorPlugin()
+{
+}
+#endif
diff --git a/editor/plugins/sample_library_editor_plugin.h b/editor/plugins/sample_library_editor_plugin.h
new file mode 100644
index 0000000000..4bbc29b147
--- /dev/null
+++ b/editor/plugins/sample_library_editor_plugin.h
@@ -0,0 +1,108 @@
+/*************************************************************************/
+/* sample_library_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SAMPLE_LIBRARY_EDITOR_PLUGIN_H
+#define SAMPLE_LIBRARY_EDITOR_PLUGIN_H
+
+
+#if 0
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/audio/sample_player.h"
+#include "scene/resources/sample.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/dialogs.h"
+
+
+class SampleLibraryEditor : public Panel {
+
+ GDCLASS(SampleLibraryEditor, Panel );
+
+
+
+ SamplePlayer *player;
+ Ref<SampleLibrary> sample_library;
+ Button *load;
+ Tree *tree;
+ bool is_playing;
+ Object *last_sample_playing;
+
+ EditorFileDialog *file;
+
+ ConfirmationDialog *dialog;
+
+
+ void _load_pressed();
+ void _file_load_request(const PoolVector<String>& p_path);
+ void _delete_pressed();
+ void _update_library();
+ void _item_edited();
+
+ UndoRedo *undo_redo;
+
+ void _button_pressed(Object *p_item,int p_column, int p_id);
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; }
+ void edit(Ref<SampleLibrary> p_sample);
+ SampleLibraryEditor();
+};
+
+class SampleLibraryEditorPlugin : public EditorPlugin {
+
+ GDCLASS( SampleLibraryEditorPlugin, EditorPlugin );
+
+ SampleLibraryEditor *sample_library_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "SampleLibrary"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ SampleLibraryEditorPlugin(EditorNode *p_node);
+ ~SampleLibraryEditorPlugin();
+
+};
+
+#endif
+#endif // SAMPLE_LIBRARY_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sample_player_editor_plugin.cpp b/editor/plugins/sample_player_editor_plugin.cpp
new file mode 100644
index 0000000000..7e2683dedf
--- /dev/null
+++ b/editor/plugins/sample_player_editor_plugin.cpp
@@ -0,0 +1,203 @@
+/*************************************************************************/
+/* sample_player_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#if 0
+#include "sample_player_editor_plugin.h"
+
+
+#include "scene/resources/sample_library.h"
+
+
+void SamplePlayerEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ play->set_icon( get_icon("Play","EditorIcons") );
+ stop->set_icon( get_icon("Stop","EditorIcons") );
+ }
+
+}
+
+void SamplePlayerEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+void SamplePlayerEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_play"),&SamplePlayerEditor::_play);
+ ClassDB::bind_method(D_METHOD("_stop"),&SamplePlayerEditor::_stop);
+
+}
+
+
+void SamplePlayerEditor::_play() {
+
+ if (!node)
+ return;
+ if (samples->get_item_count()<=0)
+ return;
+
+ node->call("play",samples->get_item_text( samples->get_selected() ));
+ stop->set_pressed(false);
+ play->set_pressed(true);
+}
+
+void SamplePlayerEditor::_stop() {
+
+ if (!node)
+ return;
+ if (samples->get_item_count()<=0)
+ return;
+
+ node->call("stop_all");
+ print_line("STOP ALL!!");
+ stop->set_pressed(true);
+ play->set_pressed(false);
+
+}
+
+
+void SamplePlayerEditor::_update_sample_library() {
+
+ samples->clear();
+ Ref<SampleLibrary> sl = node->call("get_sample_library");
+ if (sl.is_null()) {
+ samples->add_item("<NO SAMPLE LIBRARY>");
+ return; //no sample library;
+ }
+
+ List<StringName> samplenames;
+ sl->get_sample_list(&samplenames);
+ samplenames.sort_custom<StringName::AlphCompare>();
+ for(List<StringName>::Element *E=samplenames.front();E;E=E->next()) {
+ samples->add_item(E->get());
+ }
+
+}
+
+void SamplePlayerEditor::edit(Node *p_sample_player) {
+
+ node=p_sample_player;
+ if (node) {
+ _update_sample_library();
+ }
+
+}
+SamplePlayerEditor::SamplePlayerEditor() {
+
+
+ play = memnew( Button );
+
+ play->set_pos(Point2( 5, 5 ));
+ play->set_toggle_mode(true);
+ play->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_END,250);
+ play->set_anchor_and_margin(MARGIN_RIGHT,Control::ANCHOR_END,230);
+ play->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,0);
+ play->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,0);
+
+ add_child(play);
+
+ stop = memnew( Button );
+
+ stop->set_pos(Point2( 35, 5 ));
+ stop->set_toggle_mode(true);
+ stop->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_END,220);
+ stop->set_anchor_and_margin(MARGIN_RIGHT,Control::ANCHOR_END,200);
+ stop->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,0);
+ stop->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,0);
+ add_child(stop);
+
+ samples = memnew( OptionButton );
+ samples->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_END,190);
+ samples->set_anchor_and_margin(MARGIN_RIGHT,Control::ANCHOR_END,5);
+ samples->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,0);
+ samples->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,0);
+ add_child(samples);
+
+ play->connect("pressed", this,"_play");
+ stop->connect("pressed", this,"_stop");
+
+}
+
+
+void SamplePlayerEditorPlugin::edit(Object *p_object) {
+
+ sample_player_editor->edit(p_object->cast_to<Node>());
+}
+
+bool SamplePlayerEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("SamplePlayer2D") || p_object->is_class("SamplePlayer") || p_object->is_class("SpatialSamplePlayer");
+}
+
+void SamplePlayerEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ sample_player_editor->show();
+ sample_player_editor->set_fixed_process(true);
+ } else {
+
+ sample_player_editor->hide();
+ sample_player_editor->set_fixed_process(false);
+ sample_player_editor->edit(NULL);
+ }
+
+}
+
+SamplePlayerEditorPlugin::SamplePlayerEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ sample_player_editor = memnew( SamplePlayerEditor );
+ editor->get_viewport()->add_child(sample_player_editor);
+
+ sample_player_editor->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ sample_player_editor->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+ sample_player_editor->set_margin(MARGIN_LEFT,250);
+ sample_player_editor->set_margin(MARGIN_RIGHT,0);
+ sample_player_editor->set_margin(MARGIN_TOP,0);
+ sample_player_editor->set_margin(MARGIN_BOTTOM,10);
+
+
+ sample_player_editor->hide();
+
+
+
+}
+
+
+SamplePlayerEditorPlugin::~SamplePlayerEditorPlugin()
+{
+}
+
+
+#endif
diff --git a/editor/plugins/sample_player_editor_plugin.h b/editor/plugins/sample_player_editor_plugin.h
new file mode 100644
index 0000000000..c1d599540a
--- /dev/null
+++ b/editor/plugins/sample_player_editor_plugin.h
@@ -0,0 +1,90 @@
+/*************************************************************************/
+/* sample_player_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SAMPLE_PLAYER_EDITOR_PLUGIN_H
+#define SAMPLE_PLAYER_EDITOR_PLUGIN_H
+
+#if 0
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/spatial_sample_player.h"
+#include "scene/gui/option_button.h"
+#include "scene/audio/sample_player.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class SamplePlayerEditor : public Control {
+
+ GDCLASS(SamplePlayerEditor, Control );
+
+ Panel *panel;
+ Button * play;
+ Button * stop;
+ OptionButton *samples;
+ Node *node;
+
+
+ void _update_sample_library();
+ void _play();
+ void _stop();
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(Node *p_sample_player);
+ SamplePlayerEditor();
+};
+
+class SamplePlayerEditorPlugin : public EditorPlugin {
+
+ GDCLASS( SamplePlayerEditorPlugin, EditorPlugin );
+
+ SamplePlayerEditor *sample_player_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "SamplePlayer"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ SamplePlayerEditorPlugin(EditorNode *p_node);
+ ~SamplePlayerEditorPlugin();
+
+};
+
+#endif
+#endif // SAMPLE_PLAYER_EDITOR_PLUGIN_H
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
new file mode 100644
index 0000000000..3631d39f9a
--- /dev/null
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -0,0 +1,2491 @@
+/*************************************************************************/
+/* script_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "script_editor_plugin.h"
+
+#include "editor/editor_settings.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "os/keyboard.h"
+#include "os/os.h"
+#include "editor/editor_node.h"
+#include "editor/script_editor_debugger.h"
+#include "global_config.h"
+#include "os/file_access.h"
+#include "scene/main/viewport.h"
+#include "os/keyboard.h"
+#include "os/input.h"
+
+/*** SCRIPT EDITOR ****/
+
+
+
+void ScriptEditorBase::_bind_methods() {
+
+ ADD_SIGNAL(MethodInfo("name_changed"));
+ ADD_SIGNAL(MethodInfo("request_help_search",PropertyInfo(Variant::STRING,"topic")));
+ ADD_SIGNAL(MethodInfo("request_open_script_at_line",PropertyInfo(Variant::OBJECT,"script"),PropertyInfo(Variant::INT,"line")));
+ ADD_SIGNAL(MethodInfo("request_save_history"));
+ ADD_SIGNAL(MethodInfo("go_to_help",PropertyInfo(Variant::STRING,"what")));
+
+}
+
+static bool _can_open_in_editor(Script* p_script) {
+
+ String path = p_script->get_path();
+
+ if (path.find("::")!=-1) {
+ //refuse handling this if it can't be edited
+
+ bool valid=false;
+ for(int i=0;i<EditorNode::get_singleton()->get_editor_data().get_edited_scene_count();i++) {
+ if (path.begins_with(EditorNode::get_singleton()->get_editor_data().get_scene_path(i))) {
+ valid=true;
+ break;
+ }
+ }
+
+ return valid;
+ }
+
+ return true;
+}
+
+
+class EditorScriptCodeCompletionCache : public ScriptCodeCompletionCache {
+
+
+ struct Cache {
+ uint64_t time_loaded;
+ RES cache;
+ };
+
+ Map<String,Cache> cached;
+
+
+public:
+
+ uint64_t max_time_cache;
+ int max_cache_size;
+
+ void cleanup() {
+
+ List< Map<String,Cache>::Element * > to_clean;
+
+
+ Map<String,Cache>::Element *I=cached.front();
+ while(I) {
+ if ((OS::get_singleton()->get_ticks_msec()-I->get().time_loaded)>max_time_cache) {
+ to_clean.push_back(I);
+ }
+ I=I->next();
+ }
+
+ while(to_clean.front()) {
+ cached.erase(to_clean.front()->get());
+ to_clean.pop_front();
+ }
+ }
+
+ RES get_cached_resource(const String& p_path) {
+
+ Map<String,Cache>::Element *E=cached.find(p_path);
+ if (!E) {
+
+ Cache c;
+ c.cache=ResourceLoader::load(p_path);
+ E=cached.insert(p_path,c);
+ }
+
+ E->get().time_loaded=OS::get_singleton()->get_ticks_msec();
+
+ if (cached.size()>max_cache_size) {
+ uint64_t older;
+ Map<String,Cache>::Element *O=cached.front();
+ older=O->get().time_loaded;
+ Map<String,Cache>::Element *I=O;
+ while(I) {
+ if (I->get().time_loaded<older) {
+ older = I->get().time_loaded;
+ O=I;
+ }
+ I=I->next();
+ }
+
+ if (O!=E) {//should never heppane..
+ cached.erase(O);
+ }
+ }
+
+ return E->get().cache;
+ }
+
+
+ EditorScriptCodeCompletionCache() {
+
+ max_cache_size=128;
+ max_time_cache=5*60*1000; //minutes, five
+ }
+
+};
+
+#define SORT_SCRIPT_LIST
+
+void ScriptEditorQuickOpen::popup(const Vector<String>& p_functions, bool p_dontclear) {
+
+ popup_centered_ratio(0.6);
+ if (p_dontclear)
+ search_box->select_all();
+ else
+ search_box->clear();
+ search_box->grab_focus();
+ functions=p_functions;
+ _update_search();
+
+
+}
+
+
+void ScriptEditorQuickOpen::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void ScriptEditorQuickOpen::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ search_options->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+
+}
+
+
+
+void ScriptEditorQuickOpen::_update_search() {
+
+
+ search_options->clear();
+ TreeItem *root = search_options->create_item();
+
+ for(int i=0;i<functions.size();i++) {
+
+ String file = functions[i];
+ if ((search_box->get_text()=="" || file.findn(search_box->get_text())!=-1)) {
+
+ TreeItem *ti = search_options->create_item(root);
+ ti->set_text(0,file);
+ if (root->get_children()==ti)
+ ti->select(0);
+
+ }
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+void ScriptEditorQuickOpen::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+ int line = ti->get_text(0).get_slice(":",1).to_int();
+
+ emit_signal("goto_line",line-1);
+ hide();
+}
+
+void ScriptEditorQuickOpen::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+
+
+ }
+}
+
+
+
+
+void ScriptEditorQuickOpen::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&ScriptEditorQuickOpen::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&ScriptEditorQuickOpen::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&ScriptEditorQuickOpen::_sbox_input);
+
+ ADD_SIGNAL(MethodInfo("goto_line",PropertyInfo(Variant::INT,"line")));
+
+}
+
+
+ScriptEditorQuickOpen::ScriptEditorQuickOpen() {
+
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+ search_box = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Search:"),search_box);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("Open"));
+ get_ok()->set_disabled(true);
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
+ search_options->connect("item_activated",this,"_confirmed");
+ search_options->set_hide_root(true);
+}
+
+
+/////////////////////////////////
+
+ScriptEditor *ScriptEditor::script_editor=NULL;
+
+/*** SCRIPT EDITOR ******/
+
+String ScriptEditor::_get_debug_tooltip(const String&p_text,Node *_se) {
+
+ //ScriptEditorBase *se=_se->cast_to<ScriptEditorBase>();
+
+ String val = debugger->get_var_value(p_text);
+ if (val!=String()) {
+ return p_text+": "+val;
+ } else {
+
+ return String();
+ }
+}
+
+void ScriptEditor::_breaked(bool p_breaked,bool p_can_debug) {
+
+ if (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))) {
+ return;
+ }
+
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_NEXT), !(p_breaked && p_can_debug));
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_STEP), !(p_breaked && p_can_debug) );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_BREAK), p_breaked );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), !p_breaked );
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se) {
+
+ continue;
+ }
+
+ se->set_debugger_active(p_breaked);
+ }
+
+}
+
+void ScriptEditor::_show_debugger(bool p_show) {
+
+ //debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show);
+}
+
+void ScriptEditor::_script_created(Ref<Script> p_script) {
+ editor->push_item(p_script.operator->());
+}
+
+
+void ScriptEditor::_goto_script_line2(int p_line) {
+
+ int selected = tab_container->get_current_tab();
+ if (selected<0 || selected>=tab_container->get_child_count())
+ return;
+
+ ScriptEditorBase *current = tab_container->get_child(selected)->cast_to<ScriptEditorBase>();
+ if (!current)
+ return;
+
+ current->goto_line(p_line);
+
+}
+
+void ScriptEditor::_goto_script_line(REF p_script,int p_line) {
+
+
+ editor->push_item(p_script.ptr());
+
+ int selected = tab_container->get_current_tab();
+ if (selected<0 || selected>=tab_container->get_child_count())
+ return;
+
+ ScriptEditorBase *current = tab_container->get_child(selected)->cast_to<ScriptEditorBase>();
+ if (!current)
+ return;
+
+ current->goto_line(p_line,true);
+
+}
+
+
+void ScriptEditor::_update_history_arrows() {
+
+ script_back->set_disabled( history_pos<=0 );
+ script_forward->set_disabled( history_pos>=history.size()-1 );
+}
+
+void ScriptEditor::_save_history() {
+
+
+ if (history_pos>=0 && history_pos<history.size() && history[history_pos].control==tab_container->get_current_tab_control()) {
+
+ Node *n = tab_container->get_current_tab_control();
+
+ if (n->cast_to<ScriptEditorBase>()) {
+
+ history[history_pos].state=n->cast_to<ScriptEditorBase>()->get_edit_state();
+ }
+ if (n->cast_to<EditorHelp>()) {
+
+ history[history_pos].state=n->cast_to<EditorHelp>()->get_scroll();
+ }
+ }
+
+ history.resize(history_pos+1);
+ ScriptHistory sh;
+ sh.control=tab_container->get_current_tab_control();
+ sh.state=Variant();
+
+ history.push_back(sh);
+ history_pos++;
+
+ _update_history_arrows();
+}
+
+
+void ScriptEditor::_go_to_tab(int p_idx) {
+
+ Node *cn = tab_container->get_child(p_idx);
+ if (!cn)
+ return;
+ Control *c = cn->cast_to<Control>();
+ if (!c)
+ return;
+
+ if (history_pos>=0 && history_pos<history.size() && history[history_pos].control==tab_container->get_current_tab_control()) {
+
+ Node *n = tab_container->get_current_tab_control();
+
+ if (n->cast_to<ScriptEditorBase>()) {
+
+ history[history_pos].state=n->cast_to<ScriptEditorBase>()->get_edit_state();
+ }
+ if (n->cast_to<EditorHelp>()) {
+
+ history[history_pos].state=n->cast_to<EditorHelp>()->get_scroll();
+ }
+ }
+
+ history.resize(history_pos+1);
+ ScriptHistory sh;
+ sh.control=c;
+ sh.state=Variant();
+
+ history.push_back(sh);
+ history_pos++;
+
+
+ tab_container->set_current_tab(p_idx);
+
+ c = tab_container->get_current_tab_control();
+
+ if (c->cast_to<ScriptEditorBase>()) {
+
+ script_name_label->set_text(c->cast_to<ScriptEditorBase>()->get_name());
+ script_icon->set_texture(c->cast_to<ScriptEditorBase>()->get_icon());
+ if (is_visible_in_tree())
+ c->cast_to<ScriptEditorBase>()->ensure_focus();
+ }
+ if (c->cast_to<EditorHelp>()) {
+
+ script_name_label->set_text(c->cast_to<EditorHelp>()->get_class());
+ script_icon->set_texture(get_icon("Help","EditorIcons"));
+ if (is_visible_in_tree())
+ c->cast_to<EditorHelp>()->set_focused();
+ }
+
+
+
+ c->set_meta("__editor_pass",++edit_pass);
+ _update_history_arrows();
+ _update_script_colors();
+ _update_selected_editor_menu();
+}
+
+void ScriptEditor::_close_tab(int p_idx, bool p_save) {
+
+ int selected = p_idx;
+ if (selected<0 || selected>=tab_container->get_child_count())
+ return;
+
+ Node *tselected = tab_container->get_child(selected);
+ ScriptEditorBase *current = tab_container->get_child(selected)->cast_to<ScriptEditorBase>();
+ if (current) {
+ if (p_save) {
+ apply_scripts();
+ }
+ if (current->get_edit_menu()) {
+ memdelete(current->get_edit_menu());
+ }
+ }
+
+ //remove from history
+ history.resize(history_pos+1);
+
+ for(int i=0;i<history.size();i++) {
+ if (history[i].control==tselected) {
+ history.remove(i);
+ i--;
+ history_pos--;
+ }
+ }
+
+ if (history_pos>=history.size()) {
+ history_pos=history.size()-1;
+ }
+
+ int idx = tab_container->get_current_tab();
+ memdelete(tselected);
+ if (idx>=tab_container->get_child_count())
+ idx=tab_container->get_child_count()-1;
+ if (idx>=0) {
+
+ if (history_pos>=0) {
+ idx = history[history_pos].control->get_index();
+ }
+ tab_container->set_current_tab(idx);
+
+ //script_list->select(idx);
+ }
+
+
+ _update_history_arrows();
+
+
+
+ _update_script_names();
+ _save_layout();
+}
+
+void ScriptEditor::_close_current_tab() {
+
+ _close_tab(tab_container->get_current_tab());
+
+}
+
+void ScriptEditor::_close_discard_current_tab(const String& p_str) {
+ _close_tab(tab_container->get_current_tab(), false);
+ erase_tab_confirm->hide();
+}
+
+void ScriptEditor::_close_docs_tab() {
+
+ int child_count = tab_container->get_child_count();
+ for (int i = child_count-1; i>=0; i--) {
+
+ EditorHelp *se = tab_container->get_child(i)->cast_to<EditorHelp>();
+
+ if (se) {
+ _close_tab(i);
+ }
+
+ }
+
+}
+
+void ScriptEditor::_close_all_tabs() {
+
+ int child_count = tab_container->get_child_count();
+ for (int i = child_count-1; i>=0; i--) {
+
+ tab_container->set_current_tab(i);
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+
+ if (se) {
+
+ // Maybe there are unsaved changes
+ if (se->is_unsaved()) {
+ _ask_close_current_unsaved_tab(se);
+ continue;
+ }
+
+ }
+
+ _close_current_tab();
+ }
+
+}
+
+void ScriptEditor::_ask_close_current_unsaved_tab(ScriptEditorBase *current) {
+ erase_tab_confirm->set_text("Close and save changes?\n\""+current->get_name()+"\"");
+ erase_tab_confirm->popup_centered_minsize();
+}
+
+
+void ScriptEditor::_resave_scripts(const String& p_str) {
+
+ apply_scripts();
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+
+
+ Ref<Script> script = se->get_edited_script();
+
+ if (script->get_path()=="" || script->get_path().find("local://")!=-1 || script->get_path().find("::")!=-1)
+ continue; //internal script, who cares
+
+ if (trim_trailing_whitespace_on_save) {
+ se->trim_trailing_whitespace();
+ }
+ editor->save_resource(script);
+ se->tag_saved_version();
+ }
+
+ disk_changed->hide();
+
+}
+
+void ScriptEditor::_reload_scripts(){
+
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se) {
+
+ continue;
+ }
+
+
+ Ref<Script> script = se->get_edited_script();
+
+ if (script->get_path()=="" || script->get_path().find("local://")!=-1 || script->get_path().find("::")!=-1) {
+
+ continue; //internal script, who cares
+ }
+
+
+ uint64_t last_date = script->get_last_modified_time();
+ uint64_t date = FileAccess::get_modified_time(script->get_path());
+
+ //printf("last date: %lli vs date: %lli\n",last_date,date);
+ if (last_date==date) {
+ continue;
+ }
+
+
+ Ref<Script> rel_script = ResourceLoader::load(script->get_path(),script->get_class(),true);
+ ERR_CONTINUE(!rel_script.is_valid());
+ script->set_source_code( rel_script->get_source_code() );
+ script->set_last_modified_time( rel_script->get_last_modified_time() );
+ script->reload();
+ se->reload_text();
+
+
+ }
+
+ disk_changed->hide();
+ _update_script_names();
+
+}
+
+
+
+void ScriptEditor::_res_saved_callback(const Ref<Resource>& p_res) {
+
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se) {
+
+ continue;
+ }
+
+
+ Ref<Script> script = se->get_edited_script();
+
+ if (script->get_path()=="" || script->get_path().find("local://")!=-1 || script->get_path().find("::")!=-1) {
+ continue; //internal script, who cares
+ }
+
+ if (script==p_res) {
+
+ se->tag_saved_version();
+ }
+
+ }
+
+ _update_script_names();
+
+
+ if (!pending_auto_reload && auto_reload_running_scripts) {
+ call_deferred("_live_auto_reload_running_scripts");
+ pending_auto_reload=true;
+ }
+}
+
+void ScriptEditor::_live_auto_reload_running_scripts() {
+ pending_auto_reload=false;
+ debugger->reload_scripts();
+}
+
+
+bool ScriptEditor::_test_script_times_on_disk(Ref<Script> p_for_script) {
+
+
+ disk_changed_list->clear();
+ TreeItem *r = disk_changed_list->create_item();
+ disk_changed_list->set_hide_root(true);
+
+ bool need_ask=false;
+ bool need_reload=false;
+ bool use_autoreload=bool(EDITOR_DEF("text_editor/files/auto_reload_scripts_on_external_change",false));
+
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (se) {
+
+ Ref<Script> script = se->get_edited_script();
+
+ if (p_for_script.is_valid() && p_for_script!=script)
+ continue;
+
+ if (script->get_path()=="" || script->get_path().find("local://")!=-1 || script->get_path().find("::")!=-1)
+ continue; //internal script, who cares
+
+
+ uint64_t last_date = script->get_last_modified_time();
+ uint64_t date = FileAccess::get_modified_time(script->get_path());
+
+ //printf("last date: %lli vs date: %lli\n",last_date,date);
+ if (last_date!=date) {
+
+ TreeItem *ti = disk_changed_list->create_item(r);
+ ti->set_text(0,script->get_path().get_file());
+
+ if (!use_autoreload || se->is_unsaved()) {
+ need_ask=true;
+ }
+ need_reload=true;
+ //r->set_metadata(0,);
+ }
+ }
+ }
+
+
+
+ if (need_reload) {
+ if (!need_ask) {
+ script_editor->_reload_scripts();
+ need_reload=false;
+ } else {
+ disk_changed->call_deferred("popup_centered_ratio",0.5);
+ }
+ }
+
+ return need_reload;
+}
+
+
+void ScriptEditor::_file_dialog_action(String p_file) {
+
+ switch (file_dialog_option) {
+ case FILE_SAVE_THEME_AS: {
+ if(!EditorSettings::get_singleton()->save_text_editor_theme_as(p_file)) {
+ editor->show_warning(TTR("Error while saving theme"), TTR("Error saving"));
+ }
+ } break;
+ case FILE_IMPORT_THEME: {
+ if(!EditorSettings::get_singleton()->import_text_editor_theme(p_file)) {
+ editor->show_warning(TTR("Error importing theme"), TTR("Error importing"));
+ }
+ } break;
+ }
+ file_dialog_option = -1;
+}
+
+void ScriptEditor::_menu_option(int p_option) {
+
+
+ switch(p_option) {
+ case FILE_NEW: {
+ script_create_dialog->config("Node", ".gd");
+ script_create_dialog->popup_centered(Size2(300, 300)*EDSCALE);
+ } break;
+ case FILE_OPEN: {
+
+ editor->open_resource("Script");
+ return;
+ } break;
+ case FILE_SAVE_ALL: {
+
+ if (_test_script_times_on_disk())
+ return;
+
+ save_all_scripts();
+ } break;
+ case FILE_IMPORT_THEME: {
+ file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file_dialog_option = FILE_IMPORT_THEME;
+ file_dialog->clear_filters();
+ file_dialog->add_filter("*.tet");
+ file_dialog->popup_centered_ratio();
+ file_dialog->set_title(TTR("Import Theme"));
+ } break;
+ case FILE_RELOAD_THEME: {
+ EditorSettings::get_singleton()->load_text_editor_theme();
+ } break;
+ case FILE_SAVE_THEME: {
+ if(!EditorSettings::get_singleton()->save_text_editor_theme()) {
+ editor->show_warning(TTR("Error while saving theme"), TTR("Error saving"));
+ }
+ } break;
+ case FILE_SAVE_THEME_AS: {
+ file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file_dialog_option = FILE_SAVE_THEME_AS;
+ file_dialog->clear_filters();
+ file_dialog->add_filter("*.tet");
+ file_dialog->set_current_path(EditorSettings::get_singleton()->get_settings_path() + "/text_editor_themes/" + EditorSettings::get_singleton()->get("text_editor/theme/color_theme"));
+ file_dialog->popup_centered_ratio();
+ file_dialog->set_title(TTR("Save Theme As.."));
+ } break;
+ case SEARCH_HELP: {
+
+ help_search_dialog->popup();
+ } break;
+ case SEARCH_CLASSES: {
+
+ String current;
+
+ if (tab_container->get_tab_count()>0) {
+ EditorHelp *eh = tab_container->get_child( tab_container->get_current_tab() )->cast_to<EditorHelp>();
+ if (eh) {
+ current=eh->get_class();
+ }
+ }
+
+ help_index->popup();
+
+ if (current!="") {
+ help_index->call_deferred("select_class",current);
+ }
+ } break;
+ case SEARCH_WEBSITE: {
+
+ OS::get_singleton()->shell_open("http://docs.godotengine.org/");
+ } break;
+
+ case WINDOW_NEXT: {
+
+ _history_forward();
+ } break;
+ case WINDOW_PREV: {
+ _history_back();
+ } break;
+ case DEBUG_SHOW: {
+ if (debugger) {
+ bool visible = debug_menu->get_popup()->is_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW) );
+ debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), !visible);
+ if (visible)
+ debugger->hide();
+ else
+ debugger->show();
+ }
+ } break;
+ case DEBUG_SHOW_KEEP_OPEN: {
+ bool visible = debug_menu->get_popup()->is_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN) );
+ if (debugger)
+ debugger->set_hide_on_stop(visible);
+ debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN), !visible);
+ } break;
+ }
+
+
+ int selected = tab_container->get_current_tab();
+ if (selected<0 || selected>=tab_container->get_child_count())
+ return;
+
+ ScriptEditorBase *current = tab_container->get_child(selected)->cast_to<ScriptEditorBase>();
+ if (current) {
+
+ switch(p_option) {
+ case FILE_NEW: {
+ script_create_dialog->config("Node", ".gd");
+ script_create_dialog->popup_centered(Size2(300, 300)*EDSCALE);
+ } break;
+ case FILE_SAVE: {
+
+ if (_test_script_times_on_disk())
+ return;
+
+ if (trim_trailing_whitespace_on_save)
+ current->trim_trailing_whitespace();
+ editor->save_resource( current->get_edited_script() );
+
+ } break;
+ case FILE_SAVE_AS: {
+
+ current->trim_trailing_whitespace();
+ editor->push_item(current->get_edited_script()->cast_to<Object>());
+ editor->save_resource_as( current->get_edited_script() );
+
+ } break;
+
+ case FILE_TOOL_RELOAD:
+ case FILE_TOOL_RELOAD_SOFT: {
+
+ current->reload(p_option==FILE_TOOL_RELOAD_SOFT);
+
+ } break;
+
+ case FILE_CLOSE: {
+ if (current->is_unsaved()) {
+ _ask_close_current_unsaved_tab(current);
+ } else {
+ _close_current_tab();
+ }
+ } break;
+ case CLOSE_DOCS: {
+ _close_docs_tab();
+ } break;
+ case CLOSE_ALL: {
+ _close_all_tabs();
+ } break;
+ case DEBUG_NEXT: {
+
+ if (debugger)
+ debugger->debug_next();
+ } break;
+ case DEBUG_STEP: {
+
+ if (debugger)
+ debugger->debug_step();
+
+ } break;
+ case DEBUG_BREAK: {
+
+ if (debugger)
+ debugger->debug_break();
+
+ } break;
+ case DEBUG_CONTINUE: {
+
+ if (debugger)
+ debugger->debug_continue();
+
+ } break;
+ case WINDOW_MOVE_LEFT: {
+
+ if (tab_container->get_current_tab()>0) {
+ tab_container->call_deferred("set_current_tab",tab_container->get_current_tab()-1);
+ script_list->call_deferred("select",tab_container->get_current_tab()-1);
+ tab_container->move_child(current,tab_container->get_current_tab()-1);
+ _update_script_names();
+ }
+ } break;
+ case WINDOW_MOVE_RIGHT: {
+
+ if (tab_container->get_current_tab()<tab_container->get_child_count()-1) {
+ tab_container->call_deferred("set_current_tab",tab_container->get_current_tab()+1);
+ script_list->call_deferred("select",tab_container->get_current_tab()+1);
+ tab_container->move_child(current,tab_container->get_current_tab()+1);
+ _update_script_names();
+ }
+
+
+ } break;
+
+ default: {
+
+ if (p_option>=WINDOW_SELECT_BASE) {
+
+ tab_container->set_current_tab(p_option-WINDOW_SELECT_BASE);
+ script_list->select(p_option-WINDOW_SELECT_BASE);
+
+ }
+ }
+ }
+ }
+
+ EditorHelp *help = tab_container->get_current_tab_control()->cast_to<EditorHelp>();
+ if (help) {
+
+ switch(p_option) {
+
+ case HELP_SEARCH_FIND: {
+ help->popup_search();
+ } break;
+ case HELP_SEARCH_FIND_NEXT: {
+ help->search_again();
+ } break;
+ case FILE_CLOSE: {
+ _close_current_tab();
+ } break;
+ case CLOSE_DOCS: {
+ _close_docs_tab();
+ } break;
+ case CLOSE_ALL: {
+ _close_all_tabs();
+ } break;
+
+
+ }
+ }
+
+
+}
+
+void ScriptEditor::_tab_changed(int p_which) {
+
+ ensure_select_current();
+}
+
+void ScriptEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ editor->connect("play_pressed",this,"_editor_play");
+ editor->connect("pause_pressed",this,"_editor_pause");
+ editor->connect("stop_pressed",this,"_editor_stop");
+ editor->connect("script_add_function_request",this,"_add_callback");
+ editor->connect("resource_saved",this,"_res_saved_callback");
+ script_list->connect("item_selected",this,"_script_selected");
+ script_split->connect("dragged",this,"_script_split_dragged");
+ autosave_timer->connect("timeout",this,"_autosave_scripts");
+ {
+ float autosave_time = EditorSettings::get_singleton()->get("text_editor/files/autosave_interval_secs");
+ if (autosave_time>0) {
+ autosave_timer->set_wait_time(autosave_time);
+ autosave_timer->start();
+ } else {
+ autosave_timer->stop();
+ }
+ }
+
+ EditorSettings::get_singleton()->connect("settings_changed",this,"_editor_settings_changed");
+ help_search->set_icon(get_icon("Help","EditorIcons"));
+ site_search->set_icon(get_icon("Godot","EditorIcons"));
+ class_search->set_icon(get_icon("ClassList","EditorIcons"));
+
+ script_forward->set_icon(get_icon("Forward","EditorIcons"));
+ script_back->set_icon(get_icon("Back","EditorIcons"));
+
+
+
+
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ get_tree()->connect("tree_changed",this,"_tree_changed");
+ editor->connect("request_help",this,"_request_help");
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ editor->disconnect("play_pressed",this,"_editor_play");
+ editor->disconnect("pause_pressed",this,"_editor_pause");
+ editor->disconnect("stop_pressed",this,"_editor_stop");
+
+ }
+
+ if (p_what==MainLoop::NOTIFICATION_WM_FOCUS_IN) {
+
+ _test_script_times_on_disk();
+ _update_modified_scripts_for_external_editor();
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ }
+
+}
+
+bool ScriptEditor::can_take_away_focus() const {
+
+ int selected = tab_container->get_current_tab();
+ if (selected<0 || selected>=tab_container->get_child_count())
+ return true;
+
+ ScriptEditorBase *current = tab_container->get_child(selected)->cast_to<ScriptEditorBase>();
+ if (!current)
+ return true;
+
+
+ return current->can_lose_focus_on_node_selection();
+
+}
+
+void ScriptEditor::close_builtin_scripts_from_scene(const String& p_scene) {
+
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+
+ if (se) {
+
+ Ref<Script> script = se->get_edited_script();
+ if (!script.is_valid())
+ continue;
+
+ if (script->get_path().find("::")!=-1 && script->get_path().begins_with(p_scene)) { //is an internal script and belongs to scene being closed
+ _close_tab(i);
+ i--;
+
+ }
+ }
+
+ }
+
+
+}
+
+void ScriptEditor::edited_scene_changed() {
+
+ _update_modified_scripts_for_external_editor();
+
+}
+
+static const Node * _find_node_with_script(const Node* p_node, const RefPtr & p_script) {
+
+ if (p_node->get_script()==p_script)
+ return p_node;
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ const Node *result = _find_node_with_script(p_node->get_child(i),p_script);
+ if (result)
+ return result;
+ }
+
+ return NULL;
+}
+
+Dictionary ScriptEditor::get_state() const {
+
+
+ //apply_scripts();
+
+ Dictionary state;
+#if 0
+ Array paths;
+ int open=-1;
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptTextEditor *se = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
+ if (!se)
+ continue;
+
+
+ Ref<Script> script = se->get_edited_script();
+ if (script->get_path()!="" && script->get_path().find("local://")==-1 && script->get_path().find("::")==-1) {
+
+ paths.push_back(script->get_path());
+ } else {
+
+
+ const Node *owner = _find_node_with_script(get_tree()->get_root(),script.get_ref_ptr());
+ if (owner)
+ paths.push_back(owner->get_path());
+
+ }
+
+ if (i==tab_container->get_current_tab())
+ open=i;
+ }
+
+ if (paths.size())
+ state["sources"]=paths;
+ if (open!=-1)
+ state["current"]=open;
+
+#endif
+ return state;
+}
+void ScriptEditor::set_state(const Dictionary& p_state) {
+
+#if 0
+ print_line("attempt set state: "+String(Variant(p_state)));
+
+ if (!p_state.has("sources"))
+ return; //bleh
+
+ Array sources = p_state["sources"];
+ for(int i=0;i<sources.size();i++) {
+
+ Variant source=sources[i];
+
+ Ref<Script> script;
+
+ if (source.get_type()==Variant::NODE_PATH) {
+
+
+ Node *owner=get_tree()->get_root()->get_node(source);
+ if (!owner)
+ continue;
+
+ script = owner->get_script();
+ } else if (source.get_type()==Variant::STRING) {
+
+
+ script = ResourceLoader::load(source,"Script");
+ }
+
+
+ if (script.is_null()) //ah well..
+ continue;
+
+ editor->call("_resource_selected",script);
+ }
+
+ if (p_state.has("current")) {
+ tab_container->set_current_tab(p_state["current"]);
+ }
+#endif
+
+}
+void ScriptEditor::clear() {
+#if 0
+ List<ScriptTextEditor*> stes;
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptTextEditor *se = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
+ if (!se)
+ continue;
+ stes.push_back(se);
+
+ }
+
+ while(stes.size()) {
+
+ memdelete(stes.front()->get());
+ stes.pop_front();
+ }
+
+ int idx = tab_container->get_current_tab();
+ if (idx>=tab_container->get_child_count())
+ idx=tab_container->get_child_count()-1;
+ if (idx>=0) {
+ tab_container->set_current_tab(idx);
+ script_list->select( script_list->find_metadata(idx) );
+ }
+
+#endif
+
+
+}
+
+
+void ScriptEditor::get_breakpoints(List<String> *p_breakpoints) {
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+
+ List<int> bpoints;
+ se->get_breakpoints(&bpoints);
+ Ref<Script> script = se->get_edited_script();
+ String base = script->get_path();
+ ERR_CONTINUE( base.begins_with("local://") || base=="" );
+
+ for(List<int>::Element *E=bpoints.front();E;E=E->next()) {
+
+ p_breakpoints->push_back(base+":"+itos(E->get()+1));
+ }
+ }
+
+}
+
+
+
+
+
+void ScriptEditor::ensure_focus_current() {
+
+ if (!is_inside_tree())
+ return;
+
+ int cidx = tab_container->get_current_tab();
+ if (cidx<0 || cidx>=tab_container->get_tab_count());
+ Control *c = tab_container->get_child(cidx)->cast_to<Control>();
+ if (!c)
+ return;
+ ScriptEditorBase *se = c->cast_to<ScriptEditorBase>();
+ if (!se)
+ return;
+ se->ensure_focus();
+}
+
+void ScriptEditor::_script_selected(int p_idx) {
+
+ grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing
+
+ _go_to_tab(script_list->get_item_metadata(p_idx));
+ grab_focus_block=false;
+}
+
+void ScriptEditor::ensure_select_current() {
+
+
+ if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) {
+
+ Node *current = tab_container->get_child(tab_container->get_current_tab());
+
+
+ ScriptEditorBase *se = current->cast_to<ScriptEditorBase>();
+ if (se) {
+
+ Ref<Script> script = se->get_edited_script();
+
+ if (!grab_focus_block && is_visible_in_tree())
+ se->ensure_focus();
+
+
+ //edit_menu->show();
+ //search_menu->show();
+
+
+ }
+
+ EditorHelp *eh = current->cast_to<EditorHelp>();
+
+ if (eh) {
+ //edit_menu->hide();
+ //search_menu->hide();
+ //script_search_menu->show();
+
+ }
+ }
+
+ _update_selected_editor_menu();
+
+
+
+}
+
+void ScriptEditor::_find_scripts(Node* p_base, Node* p_current, Set<Ref<Script> > &used) {
+ if (p_current!=p_base && p_current->get_owner()!=p_base)
+ return;
+
+ if (p_current->get_script_instance()) {
+ Ref<Script> scr = p_current->get_script();
+ if (scr.is_valid())
+ used.insert(scr);
+ }
+
+ for(int i=0;i<p_current->get_child_count();i++) {
+ _find_scripts(p_base,p_current->get_child(i),used);
+ }
+
+}
+
+struct _ScriptEditorItemData {
+
+ String name;
+ String sort_key;
+ Ref<Texture> icon;
+ int index;
+ String tooltip;
+ bool used;
+ int category;
+
+
+ bool operator<(const _ScriptEditorItemData& id) const {
+
+ return category==id.category?sort_key<id.sort_key:category<id.category;
+ }
+
+};
+
+
+void ScriptEditor::_update_script_colors() {
+
+ bool script_temperature_enabled = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_enabled");
+ bool highlight_current = EditorSettings::get_singleton()->get("text_editor/open_scripts/highlight_current_script");
+
+ int hist_size = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_history_size");
+ Color hot_color=EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_hot_color");
+ Color cold_color=EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_cold_color");
+
+ for(int i=0;i<script_list->get_item_count();i++) {
+
+ int c = script_list->get_item_metadata(i);
+ Node *n = tab_container->get_child(c);
+ if (!n)
+ continue;
+
+ script_list->set_item_custom_bg_color(i,Color(0,0,0,0));
+
+ bool current = tab_container->get_current_tab() == c;
+ if (current && highlight_current) {
+ script_list->set_item_custom_bg_color(i, EditorSettings::get_singleton()->get("text_editor/open_scripts/current_script_background_color"));
+
+ } else if (script_temperature_enabled) {
+
+ if (!n->has_meta("__editor_pass")) {
+ continue;
+ }
+
+ int pass=n->get_meta("__editor_pass");
+ int h = edit_pass - pass;
+ if (h>hist_size) {
+ continue;
+ }
+ int non_zero_hist_size = ( hist_size == 0 ) ? 1 : hist_size;
+ float v = Math::ease((edit_pass-pass)/float(non_zero_hist_size),0.4);
+
+ script_list->set_item_custom_bg_color(i,hot_color.linear_interpolate(cold_color,v));
+ }
+ }
+}
+
+void ScriptEditor::_update_script_names() {
+
+ if (restoring_layout)
+ return;
+
+ waiting_update_names=false;
+ Set<Ref<Script> > used;
+ Node* edited = EditorNode::get_singleton()->get_edited_scene();
+ if (edited) {
+ _find_scripts(edited,edited,used);
+ }
+
+ script_list->clear();
+ bool split_script_help = EditorSettings::get_singleton()->get("text_editor/open_scripts/group_help_pages");
+ ScriptSortBy sort_by = (ScriptSortBy) (int) EditorSettings::get_singleton()->get("text_editor/open_scripts/sort_scripts_by");
+ ScriptListName display_as = (ScriptListName) (int) EditorSettings::get_singleton()->get("text_editor/open_scripts/list_script_names_as");
+
+ Vector<_ScriptEditorItemData> sedata;
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (se) {
+
+ String name = se->get_name();
+ Ref<Texture> icon = se->get_icon();
+ String path = se->get_edited_script()->get_path();
+
+ _ScriptEditorItemData sd;
+ sd.icon=icon;
+ sd.name=name;
+ sd.tooltip=path;
+ sd.index=i;
+ sd.used=used.has(se->get_edited_script());
+ sd.category=0;
+
+ switch (sort_by) {
+ case SORT_BY_NAME: {
+ sd.sort_key=name.to_lower();
+ } break;
+ case SORT_BY_PATH: {
+ sd.sort_key=path;
+ } break;
+ }
+
+ switch (display_as) {
+ case DISPLAY_NAME: {
+ sd.name=name;
+ } break;
+ case DISPLAY_DIR_AND_NAME: {
+ if (!path.get_base_dir().get_file().empty()) {
+ sd.name=path.get_base_dir().get_file() + "/" + name;
+ } else {
+ sd.name=name;
+ }
+ } break;
+ case DISPLAY_FULL_PATH: {
+ sd.name=path;
+ } break;
+ }
+
+
+ sedata.push_back(sd);
+ }
+
+ EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
+ if (eh) {
+
+ String name = eh->get_class();
+ Ref<Texture> icon = get_icon("Help","EditorIcons");
+ String tooltip = name+" Class Reference";
+
+ _ScriptEditorItemData sd;
+ sd.icon=icon;
+ sd.name=name;
+ sd.sort_key=name;
+ sd.tooltip=tooltip;
+ sd.index=i;
+ sd.used=false;
+ sd.category=split_script_help?1:0;
+ sedata.push_back(sd);
+
+ }
+
+ }
+
+ sedata.sort();
+
+ for(int i=0;i<sedata.size();i++) {
+
+ script_list->add_item(sedata[i].name,sedata[i].icon);
+ int index = script_list->get_item_count()-1;
+ script_list->set_item_tooltip(index,sedata[i].tooltip);
+ script_list->set_item_metadata(index,sedata[i].index);
+ if (sedata[i].used) {
+
+ script_list->set_item_custom_bg_color(index,Color(88/255.0,88/255.0,60/255.0));
+ }
+ if (tab_container->get_current_tab()==sedata[i].index) {
+ script_list->select(index);
+ script_name_label->set_text(sedata[i].name);
+ script_icon->set_texture(sedata[i].icon);
+
+ }
+ }
+
+ _update_script_colors();
+
+
+
+
+}
+
+
+
+void ScriptEditor::edit(const Ref<Script>& p_script, bool p_grab_focus) {
+
+ if (p_script.is_null())
+ return;
+
+ // refuse to open built-in if scene is not loaded
+
+
+
+
+ // see if already has it
+
+ bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
+
+ if (p_script->get_path().is_resource_file() && bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))) {
+
+ String path = EditorSettings::get_singleton()->get("text_editor/external/exec_path");
+ String flags = EditorSettings::get_singleton()->get("text_editor/external/exec_flags");
+ List<String> args;
+ flags=flags.strip_edges();
+ if (flags!=String()) {
+ Vector<String> flagss = flags.split(" ",false);
+ for(int i=0;i<flagss.size();i++)
+ args.push_back(flagss[i]);
+ }
+
+ args.push_back(GlobalConfig::get_singleton()->globalize_path(p_script->get_path()));
+ Error err = OS::get_singleton()->execute(path,args,false);
+ if (err==OK)
+ return;
+ WARN_PRINT("Couldn't open external text editor, using internal");
+ }
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+
+ if (se->get_edited_script()==p_script) {
+
+ if (open_dominant || !EditorNode::get_singleton()->is_changing_scene()) {
+ if (tab_container->get_current_tab()!=i) {
+ _go_to_tab(i);
+ script_list->select( script_list->find_metadata(i) );
+ }
+ if (is_visible_in_tree())
+ se->ensure_focus();
+ }
+ return;
+ }
+ }
+
+ // doesn't have it, make a new one
+
+ ScriptEditorBase *se;
+
+ for(int i=script_editor_func_count-1;i>=0;i--) {
+ se = script_editor_funcs[i](p_script);
+ if (se)
+ break;
+ }
+ ERR_FAIL_COND(!se);
+ tab_container->add_child(se);
+
+ se->set_edited_script(p_script);
+ se->set_tooltip_request_func("_get_debug_tooltip",this);
+ if (se->get_edit_menu()) {
+ se->get_edit_menu()->hide();
+ menu_hb->add_child(se->get_edit_menu());
+ menu_hb->move_child(se->get_edit_menu(),1);
+ }
+
+
+ if (p_grab_focus) {
+ _go_to_tab(tab_container->get_tab_count()-1);
+ }
+
+
+
+
+
+ _update_script_names();
+ _save_layout();
+ se->connect("name_changed",this,"_update_script_names");
+ se->connect("request_help_search",this,"_help_search");
+ se->connect("request_open_script_at_line",this,"_goto_script_line");
+ se->connect("go_to_help",this,"_help_class_goto");
+ se->connect("request_save_history",this,"_save_history");
+
+
+
+
+ //test for modification, maybe the script was not edited but was loaded
+
+ _test_script_times_on_disk(p_script);
+ _update_modified_scripts_for_external_editor(p_script);
+
+}
+
+void ScriptEditor::save_all_scripts() {
+
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+
+
+ if (!se->is_unsaved())
+ continue;
+
+ if (trim_trailing_whitespace_on_save) {
+ se->trim_trailing_whitespace();
+ }
+
+ Ref<Script> script = se->get_edited_script();
+ if (script.is_valid())
+ se->apply_code();
+
+ if (script->get_path()!="" && script->get_path().find("local://")==-1 &&script->get_path().find("::")==-1) {
+ //external script, save it
+
+ editor->save_resource(script);
+ //ResourceSaver::save(script->get_path(),script);
+
+ }
+
+ }
+
+ _update_script_names();
+
+}
+
+void ScriptEditor::apply_scripts() const {
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+ se->apply_code();
+ }
+
+}
+
+void ScriptEditor::_editor_play() {
+
+ debugger->start();
+ debug_menu->get_popup()->grab_focus();
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_STEP), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_BREAK), false );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true );
+
+ //debugger_gui->start_listening(Globals::get_singleton()->get("debug/debug_port"));
+}
+
+void ScriptEditor::_editor_pause() {
+
+
+}
+void ScriptEditor::_editor_stop() {
+
+ debugger->stop();
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_STEP), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_BREAK), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true );
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se) {
+
+ continue;
+ }
+
+ se->set_debugger_active(false);
+ }
+}
+
+
+void ScriptEditor::_add_callback(Object *p_obj, const String& p_function, const PoolStringArray& p_args) {
+
+ //print_line("add callback! hohoho"); kinda sad to remove this
+ ERR_FAIL_COND(!p_obj);
+ Ref<Script> script = p_obj->get_script();
+ ERR_FAIL_COND( !script.is_valid() );
+
+ editor->push_item(script.ptr());
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+ if (se->get_edited_script()!=script)
+ continue;
+
+ se->add_callback(p_function,p_args);
+
+ _go_to_tab(i);
+
+ script_list->select( script_list->find_metadata(i) );
+
+ break;
+
+ }
+
+}
+
+void ScriptEditor::_save_layout() {
+
+ if (restoring_layout) {
+ return;
+ }
+
+ editor->save_layout();
+}
+
+void ScriptEditor::_editor_settings_changed() {
+
+ trim_trailing_whitespace_on_save = EditorSettings::get_singleton()->get("text_editor/files/trim_trailing_whitespace_on_save");
+ float autosave_time = EditorSettings::get_singleton()->get("text_editor/files/autosave_interval_secs");
+ if (autosave_time>0) {
+ autosave_timer->set_wait_time(autosave_time);
+ autosave_timer->start();
+ } else {
+ autosave_timer->stop();
+ }
+
+ if (current_theme == "") {
+ current_theme = EditorSettings::get_singleton()->get("text_editor/theme/color_theme");
+ } else if (current_theme != EditorSettings::get_singleton()->get("text_editor/theme/color_theme")) {
+ current_theme = EditorSettings::get_singleton()->get("text_editor/theme/color_theme");
+ EditorSettings::get_singleton()->load_text_editor_theme();
+ }
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (!se)
+ continue;
+
+ se->update_settings();
+ }
+ _update_script_colors();
+ _update_script_names();
+
+ ScriptServer::set_reload_scripts_on_save(EDITOR_DEF("text_editor/files/auto_reload_and_parse_scripts_on_save",true));
+
+}
+
+void ScriptEditor::_autosave_scripts() {
+
+ save_all_scripts();
+}
+
+void ScriptEditor::_tree_changed() {
+
+ if (waiting_update_names)
+ return;
+
+ waiting_update_names=true;
+ call_deferred("_update_script_names");
+}
+
+void ScriptEditor::_script_split_dragged(float) {
+
+ _save_layout();
+}
+
+void ScriptEditor::_unhandled_input(const InputEvent& p_event) {
+ if (p_event.key.pressed || !is_visible_in_tree()) return;
+ if (ED_IS_SHORTCUT("script_editor/next_script", p_event)) {
+ int next_tab = script_list->get_current() + 1;
+ next_tab %= script_list->get_item_count();
+ _go_to_tab(script_list->get_item_metadata(next_tab));
+ _update_script_names();
+ }
+ if (ED_IS_SHORTCUT("script_editor/prev_script", p_event)) {
+ int next_tab = script_list->get_current() - 1;
+ next_tab = next_tab >= 0 ? next_tab : script_list->get_item_count() - 1;
+ _go_to_tab(script_list->get_item_metadata(next_tab));
+ _update_script_names();
+ }
+}
+
+void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
+
+ if (!bool(EDITOR_DEF("text_editor/files/restore_scripts_on_load",true))) {
+ return;
+ }
+
+ if (!p_layout->has_section_key("ScriptEditor","open_scripts") && !p_layout->has_section_key("ScriptEditor","open_help"))
+ return;
+
+ Array scripts = p_layout->get_value("ScriptEditor","open_scripts");
+ Array helps;
+ if (p_layout->has_section_key("ScriptEditor","open_help"))
+ helps=p_layout->get_value("ScriptEditor","open_help");
+
+ restoring_layout=true;
+
+ for(int i=0;i<scripts.size();i++) {
+
+ String path = scripts[i];
+ if (!FileAccess::exists(path))
+ continue;
+ Ref<Script> scr = ResourceLoader::load(path);
+ if (scr.is_valid()) {
+ edit(scr);
+ }
+ }
+
+ for(int i=0;i<helps.size();i++) {
+
+ String path = helps[i];
+ _help_class_open(path);
+ }
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+ tab_container->get_child(i)->set_meta("__editor_pass",Variant());
+ }
+
+
+ if (p_layout->has_section_key("ScriptEditor","split_offset")) {
+ script_split->set_split_offset(p_layout->get_value("ScriptEditor","split_offset"));
+ }
+
+ restoring_layout=false;
+
+ _update_script_names();
+}
+
+void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
+
+ Array scripts;
+ Array helps;
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (se) {
+
+ String path = se->get_edited_script()->get_path();
+ if (!path.is_resource_file())
+ continue;
+
+ scripts.push_back(path);
+ }
+
+ EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
+
+ if (eh) {
+
+ helps.push_back(eh->get_class());
+ }
+
+
+ }
+
+ p_layout->set_value("ScriptEditor","open_scripts",scripts);
+ p_layout->set_value("ScriptEditor","open_help",helps);
+ p_layout->set_value("ScriptEditor","split_offset",script_split->get_split_offset());
+}
+
+
+void ScriptEditor::_help_class_open(const String& p_class) {
+
+ if (p_class=="")
+ return;
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
+
+ if (eh && eh->get_class()==p_class) {
+
+ _go_to_tab(i);
+ _update_script_names();
+ return;
+ }
+ }
+
+ EditorHelp * eh = memnew( EditorHelp );
+
+
+ eh->set_name(p_class);
+ tab_container->add_child(eh);
+ _go_to_tab(tab_container->get_tab_count()-1);
+ eh->go_to_class(p_class,0);
+ eh->connect("go_to_help",this,"_help_class_goto");
+ _update_script_names();
+ _save_layout();
+}
+
+void ScriptEditor::_help_class_goto(const String& p_desc) {
+
+ String cname=p_desc.get_slice(":",1);
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
+
+ if (eh && eh->get_class()==cname) {
+
+ _go_to_tab(i);
+ eh->go_to_help(p_desc);
+ _update_script_names();
+ return;
+ }
+ }
+
+ EditorHelp * eh = memnew( EditorHelp );
+
+ eh->set_name(cname);
+ tab_container->add_child(eh);
+ _go_to_tab(tab_container->get_tab_count()-1);
+ eh->go_to_help(p_desc);
+ eh->connect("go_to_help",this,"_help_class_goto");
+ _update_script_names();
+ _save_layout();
+}
+
+void ScriptEditor::_update_selected_editor_menu() {
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ bool current = tab_container->get_current_tab() == i;
+
+ ScriptEditorBase *se = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+ if (se && se->get_edit_menu()) {
+
+ if (current)
+ se->get_edit_menu()->show();
+ else
+ se->get_edit_menu()->hide();
+ }
+
+ }
+
+ EditorHelp *eh=tab_container->get_current_tab_control()->cast_to<EditorHelp>();
+ if (eh) {
+ script_search_menu->show();
+ } else {
+ script_search_menu->hide();
+ }
+}
+
+void ScriptEditor::_update_history_pos(int p_new_pos) {
+
+ Node *n = tab_container->get_current_tab_control();
+
+ if (n->cast_to<ScriptEditorBase>()) {
+
+ history[history_pos].state=n->cast_to<ScriptEditorBase>()->get_edit_state();
+ }
+ if (n->cast_to<EditorHelp>()) {
+
+ history[history_pos].state=n->cast_to<EditorHelp>()->get_scroll();
+ }
+
+ history_pos=p_new_pos;
+ tab_container->set_current_tab(history[history_pos].control->get_index());
+
+ n = history[history_pos].control;
+
+ if (n->cast_to<ScriptEditorBase>()) {
+
+ n->cast_to<ScriptEditorBase>()->set_edit_state(history[history_pos].state);
+ n->cast_to<ScriptEditorBase>()->ensure_focus();
+ }
+
+ if (n->cast_to<EditorHelp>()) {
+
+ n->cast_to<EditorHelp>()->set_scroll(history[history_pos].state);
+ n->cast_to<EditorHelp>()->set_focused();
+ }
+
+ n->set_meta("__editor_pass",++edit_pass);
+ _update_script_names();
+ _update_history_arrows();
+ _update_selected_editor_menu();
+
+}
+
+void ScriptEditor::_history_forward() {
+
+ if (history_pos<history.size()-1) {
+ _update_history_pos(history_pos+1);
+ }
+}
+
+void ScriptEditor::_history_back(){
+
+ if (history_pos>0) {
+ _update_history_pos(history_pos-1);
+ }
+
+}
+void ScriptEditor::set_scene_root_script( Ref<Script> p_script ) {
+
+ bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
+
+ if (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")))
+ return;
+
+ if (open_dominant && p_script.is_valid() && _can_open_in_editor(p_script.ptr())) {
+ edit(p_script);
+ }
+}
+
+bool ScriptEditor::script_go_to_method(Ref<Script> p_script, const String& p_method) {
+
+
+ for (int i=0;i<tab_container->get_child_count();i++) {
+ ScriptEditorBase *current = tab_container->get_child(i)->cast_to<ScriptEditorBase>();
+
+ if (current && current->get_edited_script()==p_script) {
+ if (current->goto_method(p_method)) {
+ edit(p_script);
+ return true;
+ }
+ break;
+ }
+ }
+ return false;
+}
+
+void ScriptEditor::set_live_auto_reload_running_scripts(bool p_enabled) {
+
+ auto_reload_running_scripts=p_enabled;
+}
+
+void ScriptEditor::_help_search(String p_text) {
+ help_search_dialog->popup(p_text);
+}
+
+void ScriptEditor::_open_script_request(const String& p_path) {
+
+ Ref<Script> script = ResourceLoader::load(p_path);
+ if (script.is_valid()) {
+ script_editor->edit(script,false);
+ }
+}
+
+int ScriptEditor::script_editor_func_count=0;
+CreateScriptEditorFunc ScriptEditor::script_editor_funcs[ScriptEditor::SCRIPT_EDITOR_FUNC_MAX];
+
+void ScriptEditor::register_create_script_editor_function(CreateScriptEditorFunc p_func) {
+
+ ERR_FAIL_COND(script_editor_func_count==SCRIPT_EDITOR_FUNC_MAX);
+ script_editor_funcs[script_editor_func_count++]=p_func;
+}
+
+void ScriptEditor::_bind_methods() {
+
+ ClassDB::bind_method("_file_dialog_action",&ScriptEditor::_file_dialog_action);
+ ClassDB::bind_method("_tab_changed",&ScriptEditor::_tab_changed);
+ ClassDB::bind_method("_menu_option",&ScriptEditor::_menu_option);
+ ClassDB::bind_method("_close_current_tab",&ScriptEditor::_close_current_tab);
+ ClassDB::bind_method("_close_discard_current_tab", &ScriptEditor::_close_discard_current_tab);
+ ClassDB::bind_method("_close_docs_tab", &ScriptEditor::_close_docs_tab);
+ ClassDB::bind_method("_close_all_tabs", &ScriptEditor::_close_all_tabs);
+ ClassDB::bind_method("_editor_play",&ScriptEditor::_editor_play);
+ ClassDB::bind_method("_editor_pause",&ScriptEditor::_editor_pause);
+ ClassDB::bind_method("_editor_stop",&ScriptEditor::_editor_stop);
+ ClassDB::bind_method("_add_callback",&ScriptEditor::_add_callback);
+ ClassDB::bind_method("_reload_scripts",&ScriptEditor::_reload_scripts);
+ ClassDB::bind_method("_resave_scripts",&ScriptEditor::_resave_scripts);
+ ClassDB::bind_method("_res_saved_callback",&ScriptEditor::_res_saved_callback);
+ ClassDB::bind_method("_goto_script_line",&ScriptEditor::_goto_script_line);
+ ClassDB::bind_method("_goto_script_line2",&ScriptEditor::_goto_script_line2);
+ ClassDB::bind_method("_help_search",&ScriptEditor::_help_search);
+ ClassDB::bind_method("_save_history",&ScriptEditor::_save_history);
+
+
+
+ ClassDB::bind_method("_breaked",&ScriptEditor::_breaked);
+ ClassDB::bind_method("_show_debugger",&ScriptEditor::_show_debugger);
+ ClassDB::bind_method("_get_debug_tooltip",&ScriptEditor::_get_debug_tooltip);
+ ClassDB::bind_method("_autosave_scripts",&ScriptEditor::_autosave_scripts);
+ ClassDB::bind_method("_editor_settings_changed",&ScriptEditor::_editor_settings_changed);
+ ClassDB::bind_method("_update_script_names",&ScriptEditor::_update_script_names);
+ ClassDB::bind_method("_tree_changed",&ScriptEditor::_tree_changed);
+ ClassDB::bind_method("_script_selected",&ScriptEditor::_script_selected);
+ ClassDB::bind_method("_script_created",&ScriptEditor::_script_created);
+ ClassDB::bind_method("_script_split_dragged",&ScriptEditor::_script_split_dragged);
+ ClassDB::bind_method("_help_class_open",&ScriptEditor::_help_class_open);
+ ClassDB::bind_method("_help_class_goto",&ScriptEditor::_help_class_goto);
+ ClassDB::bind_method("_request_help",&ScriptEditor::_help_class_open);
+ ClassDB::bind_method("_history_forward",&ScriptEditor::_history_forward);
+ ClassDB::bind_method("_history_back",&ScriptEditor::_history_back);
+ ClassDB::bind_method("_live_auto_reload_running_scripts",&ScriptEditor::_live_auto_reload_running_scripts);
+ ClassDB::bind_method("_unhandled_input",&ScriptEditor::_unhandled_input);
+
+}
+
+ScriptEditor::ScriptEditor(EditorNode *p_editor) {
+
+ current_theme = "";
+
+ completion_cache = memnew( EditorScriptCodeCompletionCache );
+ restoring_layout=false;
+ waiting_update_names=false;
+ pending_auto_reload=false;
+ auto_reload_running_scripts=false;
+ editor=p_editor;
+
+ menu_hb = memnew( HBoxContainer );
+ add_child(menu_hb);
+
+
+ script_split = memnew( HSplitContainer );
+ add_child(script_split);
+ script_split->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ script_list = memnew( ItemList );
+ script_split->add_child(script_list);
+ script_list->set_custom_minimum_size(Size2(0,0));
+ script_split->set_split_offset(140);
+
+ tab_container = memnew( TabContainer );
+ tab_container->set_tabs_visible(false);
+ script_split->add_child(tab_container);
+
+
+ tab_container->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ ED_SHORTCUT("script_editor/next_script", TTR("Next script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_GREATER);
+ ED_SHORTCUT("script_editor/prev_script", TTR("Previous script"), KEY_MASK_CMD | KEY_LESS);
+ set_process_unhandled_input(true);
+
+ file_menu = memnew( MenuButton );
+ menu_hb->add_child(file_menu);
+ file_menu->set_text(TTR("File"));
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New")), FILE_NEW);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open")), FILE_OPEN);
+ file_menu->get_popup()->add_separator();
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KEY_MASK_ALT|KEY_MASK_CMD|KEY_S), FILE_SAVE);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As..")), FILE_SAVE_AS);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_MASK_ALT|KEY_S), FILE_SAVE_ALL);
+ file_menu->get_popup()->add_separator();
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_R), FILE_TOOL_RELOAD_SOFT);
+ file_menu->get_popup()->add_separator();
+
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_previous", TTR("History Prev"), KEY_MASK_ALT|KEY_LEFT), WINDOW_PREV);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_next", TTR("History Next"), KEY_MASK_ALT|KEY_RIGHT), WINDOW_NEXT);
+ file_menu->get_popup()->add_separator();
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme")), FILE_IMPORT_THEME);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), FILE_RELOAD_THEME);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_theme", TTR("Save Theme")), FILE_SAVE_THEME);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As")), FILE_SAVE_THEME_AS);
+ file_menu->get_popup()->add_separator();
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KEY_MASK_CMD | KEY_W), FILE_CLOSE);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_all", TTR("Close All")), CLOSE_ALL);
+ file_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+
+
+ script_search_menu = memnew( MenuButton );
+ menu_hb->add_child(script_search_menu);
+ script_search_menu->set_text(TTR("Search"));
+ script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find.."), KEY_MASK_CMD|KEY_F), HELP_SEARCH_FIND);
+ script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
+ script_search_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+ script_search_menu->hide();
+
+
+ debug_menu = memnew( MenuButton );
+ menu_hb->add_child(debug_menu);
+ debug_menu->set_text(TTR("Debug"));
+ debug_menu->get_popup()->add_separator();
+ debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
+ debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
+ debug_menu->get_popup()->add_separator();
+ debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/break", TTR("Break")), DEBUG_BREAK);
+ debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/continue", TTR("Continue")), DEBUG_CONTINUE);
+ debug_menu->get_popup()->add_separator();
+ //debug_menu->get_popup()->add_check_item("Show Debugger",DEBUG_SHOW);
+ debug_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("debugger/keep_debugger_open", TTR("Keep Debugger Open")), DEBUG_SHOW_KEEP_OPEN);
+ debug_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true);
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_STEP), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_BREAK), true );
+ debug_menu->get_popup()->set_item_disabled( debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true );
+
+
+#if 0
+ window_menu = memnew( MenuButton );
+ menu_hb->add_child(window_menu);
+ window_menu->set_text(TTR("Window"));
+ window_menu->get_popup()->add_item(TTR("Close"),WINDOW_CLOSE,KEY_MASK_CMD|KEY_W);
+ window_menu->get_popup()->add_separator();
+ window_menu->get_popup()->add_item(TTR("Move Left"),WINDOW_MOVE_LEFT,KEY_MASK_CMD|KEY_LEFT);
+ window_menu->get_popup()->add_item(TTR("Move Right"),WINDOW_MOVE_RIGHT,KEY_MASK_CMD|KEY_RIGHT);
+ window_menu->get_popup()->add_separator();
+ window_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+#endif
+
+
+ menu_hb->add_spacer();
+
+
+ script_icon = memnew( TextureRect );
+ menu_hb->add_child(script_icon);
+ script_name_label = memnew( Label );
+ menu_hb->add_child(script_name_label);
+
+ script_icon->hide();
+ script_name_label->hide();
+
+ menu_hb->add_spacer();
+
+ site_search = memnew( ToolButton );
+ site_search->set_text(TTR("Tutorials"));
+ site_search->connect("pressed",this,"_menu_option",varray(SEARCH_WEBSITE));
+ menu_hb->add_child(site_search);
+ site_search->set_tooltip(TTR("Open https://godotengine.org at tutorials section."));
+
+ class_search = memnew( ToolButton );
+ class_search->set_text(TTR("Classes"));
+ class_search->connect("pressed",this,"_menu_option",varray(SEARCH_CLASSES));
+ menu_hb->add_child(class_search);
+ class_search->set_tooltip(TTR("Search the class hierarchy."));
+
+ help_search = memnew( ToolButton );
+ help_search->set_text(TTR("Search Help"));
+ help_search->connect("pressed",this,"_menu_option",varray(SEARCH_HELP));
+ menu_hb->add_child(help_search);
+ help_search->set_tooltip(TTR("Search the reference documentation."));
+
+ menu_hb->add_child( memnew( VSeparator) );
+
+ script_back = memnew( ToolButton );
+ script_back->connect("pressed",this,"_history_back");
+ menu_hb->add_child(script_back);
+ script_back->set_disabled(true);
+ script_back->set_tooltip(TTR("Go to previous edited document."));
+
+ script_forward = memnew( ToolButton );
+ script_forward->connect("pressed",this,"_history_forward");
+ menu_hb->add_child(script_forward);
+ script_forward->set_disabled(true);
+ script_forward->set_tooltip(TTR("Go to next edited document."));
+
+
+
+ tab_container->connect("tab_changed", this,"_tab_changed");
+
+ erase_tab_confirm = memnew( ConfirmationDialog );
+ erase_tab_confirm->get_ok()->set_text(TTR("Save"));
+ erase_tab_confirm->add_button(TTR("Discard"), OS::get_singleton()->get_swap_ok_cancel(), "discard");
+ erase_tab_confirm->connect("confirmed", this,"_close_current_tab");
+ erase_tab_confirm->connect("custom_action", this, "_close_discard_current_tab");
+ add_child(erase_tab_confirm);
+
+ script_create_dialog = memnew(ScriptCreateDialog);
+ script_create_dialog->set_title(TTR("Create Script"));
+ add_child(script_create_dialog);
+ script_create_dialog->connect("script_created", this, "_script_created");
+
+ file_dialog_option = -1;
+ file_dialog = memnew( EditorFileDialog );
+ add_child(file_dialog);
+ file_dialog->connect("file_selected", this,"_file_dialog_action");
+
+
+ debugger = memnew( ScriptEditorDebugger(editor) );
+ debugger->connect("goto_script_line",this,"_goto_script_line");
+ debugger->connect("show_debugger",this,"_show_debugger");
+
+ disk_changed = memnew( ConfirmationDialog );
+ {
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ disk_changed->add_child(vbc);
+ //disk_changed->set_child_rect(vbc);
+
+ Label *dl = memnew( Label );
+ dl->set_text(TTR("The following files are newer on disk.\nWhat action should be taken?:"));
+ vbc->add_child(dl);
+
+ disk_changed_list = memnew( Tree );
+ vbc->add_child(disk_changed_list);
+ disk_changed_list->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ disk_changed->connect("confirmed",this,"_reload_scripts");
+ disk_changed->get_ok()->set_text(TTR("Reload"));
+
+ disk_changed->add_button(TTR("Resave"),!OS::get_singleton()->get_swap_ok_cancel(),"resave");
+ disk_changed->connect("custom_action",this,"_resave_scripts");
+
+
+ }
+
+ add_child(disk_changed);
+
+ script_editor=this;
+
+
+ Button *db = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Debugger"),debugger);
+ debugger->set_tool_button(db);
+
+
+ debugger->connect("breaked",this,"_breaked");
+
+ autosave_timer = memnew( Timer );
+ autosave_timer->set_one_shot(false);
+ add_child(autosave_timer);
+
+ grab_focus_block=false;
+
+ help_search_dialog = memnew( EditorHelpSearch );
+ add_child(help_search_dialog);
+ help_search_dialog->connect("go_to_help",this,"_help_class_goto");
+
+
+ help_index = memnew( EditorHelpIndex );
+ add_child(help_index);
+ help_index->connect("open_class",this,"_help_class_open");
+
+ history_pos=-1;
+ //debugger_gui->hide();
+
+ edit_pass=0;
+ trim_trailing_whitespace_on_save = false;
+
+ ScriptServer::edit_request_func=_open_script_request;
+}
+
+
+ScriptEditor::~ScriptEditor() {
+
+ memdelete(completion_cache);
+}
+
+void ScriptEditorPlugin::edit(Object *p_object) {
+
+ if (!p_object->cast_to<Script>())
+ return;
+
+ script_editor->edit(p_object->cast_to<Script>());
+
+}
+
+bool ScriptEditorPlugin::handles(Object *p_object) const {
+
+ if (p_object->cast_to<Script>()) {
+
+ bool valid = _can_open_in_editor(p_object->cast_to<Script>());
+
+ if (!valid) { //user tried to open it by clicking
+ EditorNode::get_singleton()->show_warning(TTR("Built-in scripts can only be edited when the scene they belong to is loaded"));
+ }
+ return valid;
+ }
+
+ return p_object->is_class("Script");
+}
+
+void ScriptEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ script_editor->show();
+ script_editor->set_process(true);
+ script_editor->ensure_select_current();
+ } else {
+
+ script_editor->hide();
+ script_editor->set_process(false);
+ }
+
+}
+
+void ScriptEditorPlugin::selected_notify() {
+
+ script_editor->ensure_select_current();
+}
+
+Dictionary ScriptEditorPlugin::get_state() const {
+
+ return script_editor->get_state();
+}
+
+void ScriptEditorPlugin::set_state(const Dictionary& p_state) {
+
+ script_editor->set_state(p_state);
+}
+void ScriptEditorPlugin::clear() {
+
+ script_editor->clear();
+}
+
+void ScriptEditorPlugin::save_external_data() {
+
+ script_editor->save_all_scripts();
+}
+
+void ScriptEditorPlugin::apply_changes() {
+
+ script_editor->apply_scripts();
+}
+
+void ScriptEditorPlugin::restore_global_state() {
+
+
+}
+
+void ScriptEditorPlugin::save_global_state() {
+
+}
+
+void ScriptEditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
+
+ script_editor->set_window_layout(p_layout);
+}
+
+void ScriptEditorPlugin::get_window_layout(Ref<ConfigFile> p_layout){
+
+ script_editor->get_window_layout(p_layout);
+}
+
+
+void ScriptEditorPlugin::get_breakpoints(List<String> *p_breakpoints) {
+
+
+ return script_editor->get_breakpoints(p_breakpoints);
+}
+
+void ScriptEditorPlugin::edited_scene_changed() {
+
+ script_editor->edited_scene_changed();
+}
+
+
+
+ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ script_editor = memnew( ScriptEditor(p_node) );
+ editor->get_viewport()->add_child(script_editor);
+ script_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+
+ script_editor->hide();
+
+ EDITOR_DEF("text_editor/files/auto_reload_scripts_on_external_change",true);
+ ScriptServer::set_reload_scripts_on_save(EDITOR_DEF("text_editor/files/auto_reload_and_parse_scripts_on_save",true));
+ EDITOR_DEF("text_editor/files/open_dominant_script_on_scene_change",true);
+ EDITOR_DEF("text_editor/external/use_external_editor",false);
+ EDITOR_DEF("text_editor/external/exec_path","");
+ EDITOR_DEF("text_editor/open_scripts/script_temperature_enabled",true);
+ EDITOR_DEF("text_editor/open_scripts/highlight_current_script", true);
+ EDITOR_DEF("text_editor/open_scripts/script_temperature_history_size",15);
+ EDITOR_DEF("text_editor/open_scripts/script_temperature_hot_color",Color(1,0,0,0.3));
+ EDITOR_DEF("text_editor/open_scripts/script_temperature_cold_color",Color(0,0,1,0.3));
+ EDITOR_DEF("text_editor/open_scripts/current_script_background_color",Color(0.81,0.81,0.14,0.63));
+ EDITOR_DEF("text_editor/open_scripts/group_help_pages",true);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT,"text_editor/open_scripts/sort_scripts_by",PROPERTY_HINT_ENUM,"Name,Path"));
+ EDITOR_DEF("text_editor/open_scripts/sort_scripts_by",0);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT,"text_editor/open_scripts/list_script_names_as",PROPERTY_HINT_ENUM,"Name,Parent Directory And Name,Full Path"));
+ EDITOR_DEF("text_editor/open_scripts/list_script_names_as",0);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"text_editor/external/exec_path",PROPERTY_HINT_GLOBAL_FILE));
+ EDITOR_DEF("text_editor/external/exec_flags","");
+
+
+}
+
+
+ScriptEditorPlugin::~ScriptEditorPlugin()
+{
+}
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
new file mode 100644
index 0000000000..bf5316363c
--- /dev/null
+++ b/editor/plugins/script_editor_plugin.h
@@ -0,0 +1,394 @@
+/*************************************************************************/
+/* script_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCRIPT_EDITOR_PLUGIN_H
+#define SCRIPT_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/script_create_dialog.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/text_edit.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/tree.h"
+#include "scene/main/timer.h"
+#include "script_language.h"
+#include "editor/code_editor.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/item_list.h"
+#include "editor/editor_help.h"
+
+class ScriptEditorQuickOpen : public ConfirmationDialog {
+
+ GDCLASS(ScriptEditorQuickOpen,ConfirmationDialog )
+
+ LineEdit *search_box;
+ Tree *search_options;
+ String function;
+
+ void _update_search();
+
+ void _sbox_input(const InputEvent& p_ie);
+ Vector<String> functions;
+
+
+ void _confirmed();
+ void _text_changed(const String& p_newtext);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void popup(const Vector<String>& p_base,bool p_dontclear=false);
+ ScriptEditorQuickOpen();
+};
+
+
+class ScriptEditorDebugger;
+
+
+
+class ScriptEditorBase : public Control {
+
+ GDCLASS( ScriptEditorBase, Control );
+protected:
+ static void _bind_methods();
+public:
+
+ virtual void apply_code()=0;
+ virtual Ref<Script> get_edited_script() const=0;
+ virtual Vector<String> get_functions()=0;
+ virtual void set_edited_script(const Ref<Script>& p_script)=0;
+ virtual void reload_text()=0;
+ virtual String get_name()=0;
+ virtual Ref<Texture> get_icon()=0;
+ virtual bool is_unsaved()=0;
+ virtual Variant get_edit_state()=0;
+ virtual void set_edit_state(const Variant& p_state)=0;
+ virtual void goto_line(int p_line,bool p_with_error=false)=0;
+ virtual void trim_trailing_whitespace()=0;
+ virtual void ensure_focus()=0;
+ virtual void tag_saved_version()=0;
+ virtual void reload(bool p_soft)=0;
+ virtual void get_breakpoints(List<int> *p_breakpoints)=0;
+ virtual bool goto_method(const String& p_method)=0;
+ virtual void add_callback(const String& p_function,PoolStringArray p_args)=0;
+ virtual void update_settings()=0;
+ virtual void set_debugger_active(bool p_active)=0;
+ virtual bool can_lose_focus_on_node_selection() { return true; }
+
+ virtual void set_tooltip_request_func(String p_method,Object* p_obj)=0;
+ virtual Control *get_edit_menu()=0;
+
+ ScriptEditorBase() {}
+};
+
+
+typedef ScriptEditorBase* (*CreateScriptEditorFunc)(const Ref<Script>& p_script);
+
+
+class EditorScriptCodeCompletionCache;
+
+class ScriptEditor : public VBoxContainer {
+
+ GDCLASS(ScriptEditor, VBoxContainer );
+
+
+ EditorNode *editor;
+ enum {
+ FILE_NEW,
+ FILE_OPEN,
+ FILE_SAVE,
+ FILE_SAVE_AS,
+ FILE_SAVE_ALL,
+ FILE_IMPORT_THEME,
+ FILE_RELOAD_THEME,
+ FILE_SAVE_THEME,
+ FILE_SAVE_THEME_AS,
+ FILE_CLOSE,
+ CLOSE_DOCS,
+ CLOSE_ALL,
+ FILE_TOOL_RELOAD,
+ FILE_TOOL_RELOAD_SOFT,
+ DEBUG_NEXT,
+ DEBUG_STEP,
+ DEBUG_BREAK,
+ DEBUG_CONTINUE,
+ DEBUG_SHOW,
+ DEBUG_SHOW_KEEP_OPEN,
+ SEARCH_HELP,
+ SEARCH_CLASSES,
+ SEARCH_WEBSITE,
+ HELP_SEARCH_FIND,
+ HELP_SEARCH_FIND_NEXT,
+ WINDOW_MOVE_LEFT,
+ WINDOW_MOVE_RIGHT,
+ WINDOW_NEXT,
+ WINDOW_PREV,
+ WINDOW_SELECT_BASE=100
+ };
+
+ enum ScriptSortBy {
+ SORT_BY_NAME,
+ SORT_BY_PATH,
+ };
+
+ enum ScriptListName {
+ DISPLAY_NAME,
+ DISPLAY_DIR_AND_NAME,
+ DISPLAY_FULL_PATH,
+ };
+
+ HBoxContainer *menu_hb;
+ MenuButton *file_menu;
+ MenuButton *edit_menu;
+ MenuButton *script_search_menu;
+ MenuButton *debug_menu;
+ Timer *autosave_timer;
+ uint64_t idle;
+
+ Button *help_search;
+ Button *site_search;
+ Button *class_search;
+ EditorHelpSearch *help_search_dialog;
+
+ ItemList *script_list;
+ HSplitContainer *script_split;
+ TabContainer *tab_container;
+ EditorFileDialog *file_dialog;
+ ConfirmationDialog *erase_tab_confirm;
+ ScriptCreateDialog *script_create_dialog;
+ ScriptEditorDebugger* debugger;
+ ToolButton *scripts_visible;
+
+ String current_theme;
+
+ TextureRect *script_icon;
+ Label *script_name_label;
+
+ ToolButton *script_back;
+ ToolButton *script_forward;
+
+ enum {
+ SCRIPT_EDITOR_FUNC_MAX=32
+ };
+
+ static int script_editor_func_count;
+ static CreateScriptEditorFunc script_editor_funcs[SCRIPT_EDITOR_FUNC_MAX];
+
+ struct ScriptHistory {
+
+ Control *control;
+ Variant state;
+ };
+
+ Vector<ScriptHistory> history;
+ int history_pos;
+
+
+ EditorHelpIndex *help_index;
+
+ void _tab_changed(int p_which);
+ void _menu_option(int p_optin);
+
+ Tree *disk_changed_list;
+ ConfirmationDialog *disk_changed;
+
+ bool restoring_layout;
+
+ String _get_debug_tooltip(const String&p_text,Node *_ste);
+
+ void _resave_scripts(const String& p_str);
+ void _reload_scripts();
+
+ bool _test_script_times_on_disk(Ref<Script> p_for_script=Ref<Script>());
+
+ void _close_tab(int p_idx, bool p_save=true);
+
+ void _close_current_tab();
+ void _close_discard_current_tab(const String& p_str);
+ void _close_docs_tab();
+ void _close_all_tabs();
+
+ void _ask_close_current_unsaved_tab(ScriptEditorBase *current);
+
+ bool grab_focus_block;
+
+ bool pending_auto_reload;
+ bool auto_reload_running_scripts;
+ void _live_auto_reload_running_scripts();
+
+ void _update_selected_editor_menu();
+
+ EditorScriptCodeCompletionCache *completion_cache;
+
+ void _editor_play();
+ void _editor_pause();
+ void _editor_stop();
+
+ int edit_pass;
+
+ void _add_callback(Object *p_obj, const String& p_function, const PoolStringArray& p_args);
+ void _res_saved_callback(const Ref<Resource>& p_res);
+
+ bool trim_trailing_whitespace_on_save;
+
+ void _trim_trailing_whitespace(TextEdit *tx);
+
+ void _goto_script_line2(int p_line);
+ void _goto_script_line(REF p_script,int p_line);
+ void _breaked(bool p_breaked,bool p_can_debug);
+ void _show_debugger(bool p_show);
+ void _update_window_menu();
+ void _script_created(Ref<Script> p_script);
+
+ void _save_layout();
+ void _editor_settings_changed();
+ void _autosave_scripts();
+
+ void _update_script_names();
+
+ void _script_selected(int p_idx);
+
+ void _find_scripts(Node* p_base, Node* p_current,Set<Ref<Script> >& used);
+
+ void _tree_changed();
+
+ void _script_split_dragged(float);
+
+ void _unhandled_input(const InputEvent& p_event);
+
+ void _help_search(String p_text);
+
+ void _history_forward();
+ void _history_back();
+
+ bool waiting_update_names;
+
+ void _help_class_open(const String& p_class);
+ void _help_class_goto(const String& p_desc);
+ void _update_history_arrows();
+ void _save_history();
+ void _go_to_tab(int p_idx);
+ void _update_history_pos(int p_new_pos);
+ void _update_script_colors();
+ void _update_modified_scripts_for_external_editor(Ref<Script> p_for_script=Ref<Script>());
+
+ int file_dialog_option;
+ void _file_dialog_action(String p_file);
+
+ static void _open_script_request(const String& p_path);
+
+ static ScriptEditor *script_editor;
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ static ScriptEditor *get_singleton() { return script_editor; }
+
+ void ensure_focus_current();
+ void apply_scripts() const;
+
+ void ensure_select_current();
+ void edit(const Ref<Script>& p_script,bool p_grab_focus=true);
+
+ Dictionary get_state() const;
+ void set_state(const Dictionary& p_state);
+ void clear();
+
+ void get_breakpoints(List<String> *p_breakpoints);
+
+ //void swap_lines(TextEdit *tx, int line1, int line2);
+
+ void save_all_scripts();
+
+ void set_window_layout(Ref<ConfigFile> p_layout);
+ void get_window_layout(Ref<ConfigFile> p_layout);
+
+ void set_scene_root_script( Ref<Script> p_script );
+
+ bool script_go_to_method(Ref<Script> p_script, const String& p_method);
+
+ virtual void edited_scene_changed();
+
+ void close_builtin_scripts_from_scene(const String& p_scene);
+
+ void goto_help(const String& p_desc) { _help_class_goto(p_desc); }
+
+ bool can_take_away_focus() const;
+
+ ScriptEditorDebugger *get_debugger() { return debugger; }
+ void set_live_auto_reload_running_scripts(bool p_enabled);
+
+ static void register_create_script_editor_function(CreateScriptEditorFunc p_func);
+ ScriptEditor(EditorNode *p_editor);
+ ~ScriptEditor();
+};
+
+class ScriptEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ScriptEditorPlugin, EditorPlugin );
+
+ ScriptEditor *script_editor;
+ EditorNode *editor;
+public:
+
+ virtual String get_name() const { return "Script"; }
+ bool has_main_screen() const { return true; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+ virtual void selected_notify();
+
+ Dictionary get_state() const;
+ virtual void set_state(const Dictionary& p_state);
+ virtual void clear();
+
+ virtual void save_external_data();
+ virtual void apply_changes();
+
+ virtual void restore_global_state();
+ virtual void save_global_state();
+
+ virtual void set_window_layout(Ref<ConfigFile> p_layout);
+ virtual void get_window_layout(Ref<ConfigFile> p_layout);
+
+ virtual void get_breakpoints(List<String> *p_breakpoints);
+
+
+ virtual void edited_scene_changed();
+
+ ScriptEditorPlugin(EditorNode *p_node);
+ ~ScriptEditorPlugin();
+
+};
+
+#endif // SCRIPT_EDITOR_PLUGIN_H
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
new file mode 100644
index 0000000000..8723a863f0
--- /dev/null
+++ b/editor/plugins/script_text_editor.cpp
@@ -0,0 +1,1401 @@
+/*************************************************************************/
+/* script_text_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "script_text_editor.h"
+
+#include "editor/editor_settings.h"
+#include "os/keyboard.h"
+#include "editor/script_editor_debugger.h"
+#include "editor/editor_node.h"
+
+Vector<String> ScriptTextEditor::get_functions() {
+
+
+ String errortxt;
+ int line=-1,col;
+ TextEdit *te=code_editor->get_text_edit();
+ String text = te->get_text();
+ List<String> fnc;
+
+ if (script->get_language()->validate(text,line,col,errortxt,script->get_path(),&fnc)) {
+
+ //if valid rewrite functions to latest
+ functions.clear();
+ for (List<String>::Element *E=fnc.front();E;E=E->next()) {
+
+ functions.push_back(E->get());
+ }
+
+
+ }
+
+ return functions;
+}
+
+void ScriptTextEditor::apply_code() {
+
+ if (script.is_null())
+ return;
+ //print_line("applying code");
+ script->set_source_code(code_editor->get_text_edit()->get_text());
+ script->update_exports();
+}
+
+Ref<Script> ScriptTextEditor::get_edited_script() const {
+
+ return script;
+}
+
+bool ScriptTextEditor::goto_method(const String& p_method) {
+
+
+ Vector<String> functions = get_functions();
+
+ String method_search = p_method + ":";
+
+ for (int i=0;i<functions.size();i++) {
+ String function=functions[i];
+
+ if (function.begins_with(method_search)) {
+
+ int line=function.get_slice(":",1).to_int();
+ goto_line(line-1);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ScriptTextEditor::_load_theme_settings() {
+
+ TextEdit *text_edit = code_editor->get_text_edit();
+
+ text_edit->clear_colors();
+
+ /* keyword color */
+
+
+ text_edit->add_color_override("background_color", EDITOR_DEF("text_editor/highlighting/background_color",Color(0,0,0,0)));
+ text_edit->add_color_override("completion_background_color", EDITOR_DEF("text_editor/highlighting/completion_background_color", Color(0,0,0,0)));
+ text_edit->add_color_override("completion_selected_color", EDITOR_DEF("text_editor/highlighting/completion_selected_color", Color::html("434244")));
+ text_edit->add_color_override("completion_existing_color", EDITOR_DEF("text_editor/highlighting/completion_existing_color", Color::html("21dfdfdf")));
+ text_edit->add_color_override("completion_scroll_color", EDITOR_DEF("text_editor/highlighting/completion_scroll_color", Color::html("ffffff")));
+ text_edit->add_color_override("completion_font_color", EDITOR_DEF("text_editor/highlighting/completion_font_color", Color::html("aaaaaa")));
+ text_edit->add_color_override("font_color",EDITOR_DEF("text_editor/highlighting/text_color",Color(0,0,0)));
+ text_edit->add_color_override("line_number_color",EDITOR_DEF("text_editor/highlighting/line_number_color",Color(0,0,0)));
+ text_edit->add_color_override("caret_color",EDITOR_DEF("text_editor/highlighting/caret_color",Color(0,0,0)));
+ text_edit->add_color_override("caret_background_color",EDITOR_DEF("text_editor/highlighting/caret_background_color",Color(0,0,0)));
+ text_edit->add_color_override("font_selected_color",EDITOR_DEF("text_editor/highlighting/text_selected_color",Color(1,1,1)));
+ text_edit->add_color_override("selection_color",EDITOR_DEF("text_editor/highlighting/selection_color",Color(0.2,0.2,1)));
+ text_edit->add_color_override("brace_mismatch_color",EDITOR_DEF("text_editor/highlighting/brace_mismatch_color",Color(1,0.2,0.2)));
+ text_edit->add_color_override("current_line_color",EDITOR_DEF("text_editor/highlighting/current_line_color",Color(0.3,0.5,0.8,0.15)));
+ text_edit->add_color_override("line_length_guideline_color", EDITOR_DEF("text_editor/highlighting/line_length_guideline_color", Color(0,0,0)));
+ text_edit->add_color_override("word_highlighted_color",EDITOR_DEF("text_editor/highlighting/word_highlighted_color",Color(0.8,0.9,0.9,0.15)));
+ text_edit->add_color_override("number_color",EDITOR_DEF("text_editor/highlighting/number_color",Color(0.9,0.6,0.0,2)));
+ text_edit->add_color_override("function_color",EDITOR_DEF("text_editor/highlighting/function_color",Color(0.4,0.6,0.8)));
+ text_edit->add_color_override("member_variable_color",EDITOR_DEF("text_editor/highlighting/member_variable_color",Color(0.9,0.3,0.3)));
+ text_edit->add_color_override("mark_color", EDITOR_DEF("text_editor/highlighting/mark_color", Color(1.0,0.4,0.4,0.4)));
+ text_edit->add_color_override("breakpoint_color", EDITOR_DEF("text_editor/highlighting/breakpoint_color", Color(0.8,0.8,0.4,0.2)));
+ text_edit->add_color_override("search_result_color",EDITOR_DEF("text_editor/highlighting/search_result_color",Color(0.05,0.25,0.05,1)));
+ text_edit->add_color_override("search_result_border_color",EDITOR_DEF("text_editor/highlighting/search_result_border_color",Color(0.1,0.45,0.1,1)));
+ text_edit->add_color_override("symbol_color",EDITOR_DEF("text_editor/highlighting/symbol_color",Color::hex(0x005291ff)));
+ text_edit->add_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing",4));
+
+ Color keyword_color= EDITOR_DEF("text_editor/highlighting/keyword_color",Color(0.5,0.0,0.2));
+
+ List<String> keywords;
+ script->get_language()->get_reserved_words(&keywords);
+ for(List<String>::Element *E=keywords.front();E;E=E->next()) {
+
+ text_edit->add_keyword_color(E->get(),keyword_color);
+ }
+
+ //colorize core types
+ Color basetype_color= EDITOR_DEF("text_editor/highlighting/base_type_color",Color(0.3,0.3,0.0));
+
+ text_edit->add_keyword_color("Vector2",basetype_color);
+ text_edit->add_keyword_color("Vector3",basetype_color);
+ text_edit->add_keyword_color("Plane",basetype_color);
+ text_edit->add_keyword_color("Quat",basetype_color);
+ text_edit->add_keyword_color("AABB",basetype_color);
+ text_edit->add_keyword_color("Matrix3",basetype_color);
+ text_edit->add_keyword_color("Transform",basetype_color);
+ text_edit->add_keyword_color("Color",basetype_color);
+ text_edit->add_keyword_color("Image",basetype_color);
+ text_edit->add_keyword_color("InputEvent",basetype_color);
+ text_edit->add_keyword_color("Rect2",basetype_color);
+ text_edit->add_keyword_color("NodePath",basetype_color);
+
+ //colorize engine types
+ Color type_color= EDITOR_DEF("text_editor/highlighting/engine_type_color",Color(0.0,0.2,0.4));
+
+ List<StringName> types;
+ ClassDB::get_class_list(&types);
+
+ for(List<StringName>::Element *E=types.front();E;E=E->next()) {
+
+ String n = E->get();
+ if (n.begins_with("_"))
+ n = n.substr(1, n.length());
+
+ text_edit->add_keyword_color(n,type_color);
+ }
+
+ //colorize comments
+ Color comment_color = EDITOR_DEF("text_editor/highlighting/comment_color",Color::hex(0x797e7eff));
+ List<String> comments;
+ script->get_language()->get_comment_delimiters(&comments);
+
+ for(List<String>::Element *E=comments.front();E;E=E->next()) {
+
+ String comment = E->get();
+ String beg = comment.get_slice(" ",0);
+ String end = comment.get_slice_count(" ")>1?comment.get_slice(" ",1):String();
+
+ text_edit->add_color_region(beg,end,comment_color,end=="");
+ }
+
+ //colorize strings
+ Color string_color = EDITOR_DEF("text_editor/highlighting/string_color",Color::hex(0x6b6f00ff));
+ List<String> strings;
+ script->get_language()->get_string_delimiters(&strings);
+
+ for (List<String>::Element *E=strings.front();E;E=E->next()) {
+
+ String string = E->get();
+ String beg = string.get_slice(" ",0);
+ String end = string.get_slice_count(" ")>1?string.get_slice(" ",1):String();
+ text_edit->add_color_region(beg,end,string_color,end=="");
+ }
+}
+
+
+void ScriptTextEditor::reload_text() {
+
+ ERR_FAIL_COND(script.is_null()) ;
+
+ TextEdit *te = code_editor->get_text_edit();
+ int column = te->cursor_get_column();
+ int row = te->cursor_get_line();
+ int h = te->get_h_scroll();
+ int v = te->get_v_scroll();
+
+ te->set_text(script->get_source_code());
+ te->clear_undo_history();
+ te->cursor_set_line(row);
+ te->cursor_set_column(column);
+ te->set_h_scroll(h);
+ te->set_v_scroll(v);
+
+ te->tag_saved_version();
+
+ code_editor->update_line_and_column();
+
+}
+
+void ScriptTextEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //emit_signal("name_changed");
+ }
+}
+
+void ScriptTextEditor::add_callback(const String& p_function,PoolStringArray p_args) {
+
+ String code = code_editor->get_text_edit()->get_text();
+ int pos = script->get_language()->find_function(p_function,code);
+ if (pos==-1) {
+ //does not exist
+ code_editor->get_text_edit()->deselect();
+ pos=code_editor->get_text_edit()->get_line_count()+2;
+ String func = script->get_language()->make_function("",p_function,p_args);
+ //code=code+func;
+ code_editor->get_text_edit()->cursor_set_line(pos+1);
+ code_editor->get_text_edit()->cursor_set_column(1000000); //none shall be that big
+ code_editor->get_text_edit()->insert_text_at_cursor("\n\n"+func);
+ }
+ code_editor->get_text_edit()->cursor_set_line(pos);
+ code_editor->get_text_edit()->cursor_set_column(1);
+}
+
+void ScriptTextEditor::update_settings() {
+
+ code_editor->update_editor_settings();
+}
+
+bool ScriptTextEditor::is_unsaved() {
+
+ return code_editor->get_text_edit()->get_version()!=code_editor->get_text_edit()->get_saved_version();
+}
+
+Variant ScriptTextEditor::get_edit_state() {
+
+ Dictionary state;
+
+ state["scroll_pos"]=code_editor->get_text_edit()->get_v_scroll();
+ state["column"]=code_editor->get_text_edit()->cursor_get_column();
+ state["row"]=code_editor->get_text_edit()->cursor_get_line();
+
+ return state;
+}
+
+void ScriptTextEditor::trim_trailing_whitespace() {
+
+ TextEdit *tx = code_editor->get_text_edit();
+
+ bool trimed_whitespace = false;
+ for (int i = 0; i < tx->get_line_count(); i++) {
+ String line = tx->get_line(i);
+ if (line.ends_with(" ") || line.ends_with("\t")) {
+
+ if (!trimed_whitespace) {
+ tx->begin_complex_operation();
+ trimed_whitespace = true;
+ }
+
+ int end = 0;
+ for (int j = line.length() - 1; j > -1; j--) {
+ if (line[j] != ' ' && line[j] != '\t') {
+ end = j+1;
+ break;
+ }
+ }
+ tx->set_line(i, line.substr(0, end));
+ }
+ }
+ if (trimed_whitespace) {
+ tx->end_complex_operation();
+ tx->update();
+ }
+}
+
+void ScriptTextEditor::tag_saved_version() {
+
+ code_editor->get_text_edit()->tag_saved_version();
+}
+
+void ScriptTextEditor::goto_line(int p_line, bool p_with_error) {
+ code_editor->get_text_edit()->cursor_set_line(p_line);
+}
+
+void ScriptTextEditor::ensure_focus() {
+
+ code_editor->get_text_edit()->grab_focus();
+}
+
+void ScriptTextEditor::set_edit_state(const Variant& p_state) {
+
+ Dictionary state=p_state;
+ code_editor->get_text_edit()->set_v_scroll(state["scroll_pos"]);
+ code_editor->get_text_edit()->cursor_set_column( state["column"]);
+ code_editor->get_text_edit()->cursor_set_line( state["row"] );
+ code_editor->get_text_edit()->grab_focus();
+
+ //int scroll_pos;
+ //int cursor_column;
+ //int cursor_row;
+}
+
+String ScriptTextEditor::get_name() {
+ String name;
+
+ if (script->get_path().find("local://")==-1 && script->get_path().find("::")==-1) {
+ name=script->get_path().get_file();
+ if (is_unsaved()) {
+ name+="(*)";
+ }
+ } else if (script->get_name()!="")
+ name=script->get_name();
+ else
+ name=script->get_class()+"("+itos(script->get_instance_ID())+")";
+
+ return name;
+
+}
+
+Ref<Texture> ScriptTextEditor::get_icon() {
+
+ if (get_parent_control() && get_parent_control()->has_icon(script->get_class(),"EditorIcons")) {
+ return get_parent_control()->get_icon(script->get_class(),"EditorIcons");
+ }
+
+ return Ref<Texture>();
+}
+
+
+
+void ScriptTextEditor::set_edited_script(const Ref<Script>& p_script) {
+
+ ERR_FAIL_COND(!script.is_null());
+
+ script=p_script;
+
+
+ _load_theme_settings();
+
+ code_editor->get_text_edit()->set_text(script->get_source_code());
+ code_editor->get_text_edit()->clear_undo_history();
+ code_editor->get_text_edit()->tag_saved_version();
+
+ emit_signal("name_changed");
+ code_editor->update_line_and_column();
+}
+
+
+void ScriptTextEditor::_validate_script() {
+
+ String errortxt;
+ int line=-1,col;
+ TextEdit *te=code_editor->get_text_edit();
+
+ String text = te->get_text();
+ List<String> fnc;
+
+ if (!script->get_language()->validate(text,line,col,errortxt,script->get_path(),&fnc)) {
+ String error_text="error("+itos(line)+","+itos(col)+"): "+errortxt;
+ code_editor->set_error(error_text);
+ } else {
+ code_editor->set_error("");
+ line=-1;
+ if (!script->is_tool()) {
+ script->set_source_code(text);
+ script->update_exports();
+ //script->reload(); //will update all the variables in property editors
+ }
+
+ functions.clear();
+ for (List<String>::Element *E=fnc.front();E;E=E->next()) {
+
+ functions.push_back(E->get());
+ }
+
+ }
+
+ line--;
+ for(int i=0;i<te->get_line_count();i++) {
+ te->set_line_as_marked(i,line==i);
+ }
+
+ emit_signal("name_changed");
+}
+
+
+static Node* _find_node_for_script(Node* p_base, Node*p_current, const Ref<Script>& p_script) {
+
+ if (p_current->get_owner()!=p_base && p_base!=p_current)
+ return NULL;
+ Ref<Script> c = p_current->get_script();
+ if (c==p_script)
+ return p_current;
+ for(int i=0;i<p_current->get_child_count();i++) {
+ Node *found = _find_node_for_script(p_base,p_current->get_child(i),p_script);
+ if (found)
+ return found;
+ }
+
+ return NULL;
+}
+
+static void _find_changed_scripts_for_external_editor(Node* p_base, Node*p_current, Set<Ref<Script> > &r_scripts) {
+
+ if (p_current->get_owner()!=p_base && p_base!=p_current)
+ return;
+ Ref<Script> c = p_current->get_script();
+
+ if (c.is_valid())
+ r_scripts.insert(c);
+
+ for(int i=0;i<p_current->get_child_count();i++) {
+ _find_changed_scripts_for_external_editor(p_base,p_current->get_child(i),r_scripts);
+ }
+
+}
+
+void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_for_script) {
+
+ if (!bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")))
+ return;
+
+ Set<Ref<Script> > scripts;
+
+ Node *base = get_tree()->get_edited_scene_root();
+ if (base) {
+ _find_changed_scripts_for_external_editor(base,base,scripts);
+ }
+
+ for (Set<Ref<Script> >::Element *E=scripts.front();E;E=E->next()) {
+
+ Ref<Script> script = E->get();
+
+ if (p_for_script.is_valid() && p_for_script!=script)
+ continue;
+
+ if (script->get_path()=="" || script->get_path().find("local://")!=-1 || script->get_path().find("::")!=-1) {
+
+ continue; //internal script, who cares, though weird
+ }
+
+ uint64_t last_date = script->get_last_modified_time();
+ uint64_t date = FileAccess::get_modified_time(script->get_path());
+
+ if (last_date!=date) {
+
+ Ref<Script> rel_script = ResourceLoader::load(script->get_path(),script->get_class(),true);
+ ERR_CONTINUE(!rel_script.is_valid());
+ script->set_source_code( rel_script->get_source_code() );
+ script->set_last_modified_time( rel_script->get_last_modified_time() );
+ script->update_exports();
+ }
+
+ }
+}
+
+
+void ScriptTextEditor::_code_complete_scripts(void* p_ud,const String& p_code, List<String>* r_options) {
+
+ ScriptTextEditor *ste = (ScriptTextEditor *)p_ud;
+ ste->_code_complete_script(p_code,r_options);
+}
+
+void ScriptTextEditor::_code_complete_script(const String& p_code, List<String>* r_options) {
+
+ if (color_panel->is_visible_in_tree()) return;
+ Node *base = get_tree()->get_edited_scene_root();
+ if (base) {
+ base = _find_node_for_script(base,base,script);
+ }
+ String hint;
+ Error err = script->get_language()->complete_code(p_code,script->get_path().get_base_dir(),base,r_options,hint);
+ if (hint!="") {
+ code_editor->get_text_edit()->set_code_hint(hint);
+ }
+
+}
+
+void ScriptTextEditor::_breakpoint_toggled(int p_row) {
+
+ ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(script->get_path(),p_row+1,code_editor->get_text_edit()->is_line_set_as_breakpoint(p_row));
+
+}
+
+static void swap_lines(TextEdit *tx, int line1, int line2)
+{
+ String tmp = tx->get_line(line1);
+ String tmp2 = tx->get_line(line2);
+ tx->set_line(line2, tmp);
+ tx->set_line(line1, tmp2);
+
+ tx->cursor_set_line(line2);
+}
+
+void ScriptTextEditor::_lookup_symbol(const String& p_symbol,int p_row, int p_column) {
+
+ Node *base = get_tree()->get_edited_scene_root();
+ if (base) {
+ base = _find_node_for_script(base,base,script);
+ }
+
+
+ ScriptLanguage::LookupResult result;
+ if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(),p_symbol,script->get_path().get_base_dir(),base,result)==OK) {
+
+ _goto_line(p_row);
+
+ switch(result.type) {
+ case ScriptLanguage::LookupResult::RESULT_SCRIPT_LOCATION: {
+
+ if (result.script.is_valid()) {
+ emit_signal("request_open_script_at_line",result.script,result.location-1);
+ } else {
+ emit_signal("request_save_history");
+ _goto_line(result.location-1);
+ }
+ } break;
+ case ScriptLanguage::LookupResult::RESULT_CLASS: {
+ emit_signal("go_to_help","class_name:"+result.class_name);
+ } break;
+ case ScriptLanguage::LookupResult::RESULT_CLASS_CONSTANT: {
+
+ StringName cname = result.class_name;
+ bool success;
+ while(true) {
+ ClassDB::get_integer_constant(cname,result.class_member,&success);
+ if (success) {
+ result.class_name=cname;
+ cname=ClassDB::get_parent_class(cname);
+ } else {
+ break;
+ }
+ }
+
+
+ emit_signal("go_to_help","class_constant:"+result.class_name+":"+result.class_member);
+
+ } break;
+ case ScriptLanguage::LookupResult::RESULT_CLASS_PROPERTY: {
+ emit_signal("go_to_help","class_property:"+result.class_name+":"+result.class_member);
+
+ } break;
+ case ScriptLanguage::LookupResult::RESULT_CLASS_METHOD: {
+
+ StringName cname = result.class_name;
+
+ while(true) {
+ if (ClassDB::has_method(cname,result.class_member)) {
+ result.class_name=cname;
+ cname=ClassDB::get_parent_class(cname);
+ } else {
+ break;
+ }
+ }
+
+ emit_signal("go_to_help","class_method:"+result.class_name+":"+result.class_member);
+
+ } break;
+ }
+
+ }
+}
+
+void ScriptTextEditor::_edit_option(int p_op) {
+
+ switch(p_op) {
+ case EDIT_UNDO: {
+ code_editor->get_text_edit()->undo();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+ } break;
+ case EDIT_REDO: {
+ code_editor->get_text_edit()->redo();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+ } break;
+ case EDIT_CUT: {
+
+ code_editor->get_text_edit()->cut();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+ } break;
+ case EDIT_COPY: {
+ code_editor->get_text_edit()->copy();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+
+ } break;
+ case EDIT_PASTE: {
+ code_editor->get_text_edit()->paste();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+
+ } break;
+ case EDIT_SELECT_ALL: {
+
+ code_editor->get_text_edit()->select_all();
+ code_editor->get_text_edit()->call_deferred("grab_focus");
+
+ } break;
+ case EDIT_MOVE_LINE_UP: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = script;
+ if (scr.is_null())
+ return;
+
+ tx->begin_complex_operation();
+ if (tx->is_selection_active())
+ {
+ int from_line = tx->get_selection_from_line();
+ int from_col = tx->get_selection_from_column();
+ int to_line = tx->get_selection_to_line();
+ int to_column = tx->get_selection_to_column();
+
+ for (int i = from_line; i <= to_line; i++)
+ {
+ int line_id = i;
+ int next_id = i - 1;
+
+ if (line_id == 0 || next_id < 0)
+ return;
+
+ swap_lines(tx, line_id, next_id);
+ }
+ int from_line_up = from_line > 0 ? from_line-1 : from_line;
+ int to_line_up = to_line > 0 ? to_line-1 : to_line;
+ tx->select(from_line_up, from_col, to_line_up, to_column);
+ }
+ else
+ {
+ int line_id = tx->cursor_get_line();
+ int next_id = line_id - 1;
+
+ if (line_id == 0 || next_id < 0)
+ return;
+
+ swap_lines(tx, line_id, next_id);
+ }
+ tx->end_complex_operation();
+ tx->update();
+
+ } break;
+ case EDIT_MOVE_LINE_DOWN: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+
+ tx->begin_complex_operation();
+ if (tx->is_selection_active())
+ {
+ int from_line = tx->get_selection_from_line();
+ int from_col = tx->get_selection_from_column();
+ int to_line = tx->get_selection_to_line();
+ int to_column = tx->get_selection_to_column();
+
+ for (int i = to_line; i >= from_line; i--)
+ {
+ int line_id = i;
+ int next_id = i + 1;
+
+ if (line_id == tx->get_line_count()-1 || next_id > tx->get_line_count())
+ return;
+
+ swap_lines(tx, line_id, next_id);
+ }
+ int from_line_down = from_line < tx->get_line_count() ? from_line+1 : from_line;
+ int to_line_down = to_line < tx->get_line_count() ? to_line+1 : to_line;
+ tx->select(from_line_down, from_col, to_line_down, to_column);
+ }
+ else
+ {
+ int line_id = tx->cursor_get_line();
+ int next_id = line_id + 1;
+
+ if (line_id == tx->get_line_count()-1 || next_id > tx->get_line_count())
+ return;
+
+ swap_lines(tx, line_id, next_id);
+ }
+ tx->end_complex_operation();
+ tx->update();
+
+ } break;
+ case EDIT_INDENT_LEFT: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+
+ tx->begin_complex_operation();
+ if (tx->is_selection_active())
+ {
+ tx->indent_selection_left();
+ }
+ else
+ {
+ int begin = tx->cursor_get_line();
+ String line_text = tx->get_line(begin);
+ // begins with tab
+ if (line_text.begins_with("\t"))
+ {
+ line_text = line_text.substr(1, line_text.length());
+ tx->set_line(begin, line_text);
+ }
+ // begins with 4 spaces
+ else if (line_text.begins_with(" "))
+ {
+ line_text = line_text.substr(4, line_text.length());
+ tx->set_line(begin, line_text);
+ }
+ }
+ tx->end_complex_operation();
+ tx->update();
+ //tx->deselect();
+
+ } break;
+ case EDIT_INDENT_RIGHT: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+
+ tx->begin_complex_operation();
+ if (tx->is_selection_active())
+ {
+ tx->indent_selection_right();
+ }
+ else
+ {
+ int begin = tx->cursor_get_line();
+ String line_text = tx->get_line(begin);
+ line_text = '\t' + line_text;
+ tx->set_line(begin, line_text);
+ }
+ tx->end_complex_operation();
+ tx->update();
+ //tx->deselect();
+
+ } break;
+ case EDIT_CLONE_DOWN: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+
+ int from_line = tx->cursor_get_line();
+ int to_line = tx->cursor_get_line();
+ int column = tx->cursor_get_column();
+
+ if (tx->is_selection_active()) {
+ from_line = tx->get_selection_from_line();
+ to_line = tx->get_selection_to_line();
+ column = tx->cursor_get_column();
+ }
+ int next_line = to_line + 1;
+
+ tx->begin_complex_operation();
+ for (int i = from_line; i <= to_line; i++) {
+
+ if (i >= tx->get_line_count() - 1) {
+ tx->set_line(i, tx->get_line(i) + "\n");
+ }
+ String line_clone = tx->get_line(i);
+ tx->insert_at(line_clone, next_line);
+ next_line++;
+ }
+
+ tx->cursor_set_column(column);
+ if (tx->is_selection_active()) {
+ tx->select(to_line + 1, tx->get_selection_from_column(), next_line - 1, tx->get_selection_to_column());
+ }
+
+ tx->end_complex_operation();
+ tx->update();
+
+ } break;
+ case EDIT_TOGGLE_COMMENT: {
+
+ TextEdit *tx = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+
+
+ tx->begin_complex_operation();
+ if (tx->is_selection_active())
+ {
+ int begin = tx->get_selection_from_line();
+ int end = tx->get_selection_to_line();
+
+ // End of selection ends on the first column of the last line, ignore it.
+ if(tx->get_selection_to_column() == 0)
+ end -= 1;
+
+ for (int i = begin; i <= end; i++)
+ {
+ String line_text = tx->get_line(i);
+
+ if (line_text.begins_with("#"))
+ line_text = line_text.substr(1, line_text.length());
+ else
+ line_text = "#" + line_text;
+ tx->set_line(i, line_text);
+ }
+ }
+ else
+ {
+ int begin = tx->cursor_get_line();
+ String line_text = tx->get_line(begin);
+
+ if (line_text.begins_with("#"))
+ line_text = line_text.substr(1, line_text.length());
+ else
+ line_text = "#" + line_text;
+ tx->set_line(begin, line_text);
+ }
+ tx->end_complex_operation();
+ tx->update();
+ //tx->deselect();
+
+ } break;
+ case EDIT_COMPLETE: {
+
+ code_editor->get_text_edit()->query_code_comple();
+
+ } break;
+ case EDIT_AUTO_INDENT: {
+
+ TextEdit *te = code_editor->get_text_edit();
+ String text = te->get_text();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+ int begin,end;
+ if (te->is_selection_active()) {
+ begin=te->get_selection_from_line();
+ end=te->get_selection_to_line();
+ } else {
+ begin=0;
+ end=te->get_line_count()-1;
+ }
+ scr->get_language()->auto_indent_code(text,begin,end);
+ te->set_text(text);
+
+
+ } break;
+ case EDIT_TRIM_TRAILING_WHITESAPCE: {
+ trim_trailing_whitespace();
+ } break;
+ case EDIT_PICK_COLOR: {
+ color_panel->popup();
+ } break;
+
+
+ case SEARCH_FIND: {
+
+ code_editor->get_find_replace_bar()->popup_search();
+ } break;
+ case SEARCH_FIND_NEXT: {
+
+ code_editor->get_find_replace_bar()->search_next();
+ } break;
+ case SEARCH_FIND_PREV: {
+
+ code_editor->get_find_replace_bar()->search_prev();
+ } break;
+ case SEARCH_REPLACE: {
+
+ code_editor->get_find_replace_bar()->popup_replace();
+ } break;
+ case SEARCH_LOCATE_FUNCTION: {
+
+ quick_open->popup(get_functions());
+ } break;
+ case SEARCH_GOTO_LINE: {
+
+ goto_line_dialog->popup_find_line(code_editor->get_text_edit());
+ } break;
+ case DEBUG_TOGGLE_BREAKPOINT: {
+ int line=code_editor->get_text_edit()->cursor_get_line();
+ bool dobreak = !code_editor->get_text_edit()->is_line_set_as_breakpoint(line);
+ code_editor->get_text_edit()->set_line_as_breakpoint(line,dobreak);
+ ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(get_edited_script()->get_path(),line+1,dobreak);
+ } break;
+ case DEBUG_REMOVE_ALL_BREAKPOINTS: {
+ List<int> bpoints;
+ code_editor->get_text_edit()->get_breakpoints(&bpoints);
+
+ for(List<int>::Element *E=bpoints.front();E;E=E->next()) {
+ int line = E->get();
+ bool dobreak = !code_editor->get_text_edit()->is_line_set_as_breakpoint(line);
+ code_editor->get_text_edit()->set_line_as_breakpoint(line,dobreak);
+ ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(get_edited_script()->get_path(),line+1,dobreak);
+ }
+ }
+ case DEBUG_GOTO_NEXT_BREAKPOINT: {
+ List<int> bpoints;
+ code_editor->get_text_edit()->get_breakpoints(&bpoints);
+ if (bpoints.size() <= 0) {
+ return;
+ }
+
+ int line=code_editor->get_text_edit()->cursor_get_line();
+ // wrap around
+ if (line >= bpoints[bpoints.size() - 1]) {
+ code_editor->get_text_edit()->cursor_set_line(bpoints[0]);
+ } else {
+ for(List<int>::Element *E=bpoints.front();E;E=E->next()) {
+ int bline = E->get();
+ if (bline > line) {
+ code_editor->get_text_edit()->cursor_set_line(bline);
+ return;
+ }
+ }
+ }
+
+ } break;
+ case DEBUG_GOTO_PREV_BREAKPOINT: {
+ List<int> bpoints;
+ code_editor->get_text_edit()->get_breakpoints(&bpoints);
+ if (bpoints.size() <= 0) {
+ return;
+ }
+
+ int line=code_editor->get_text_edit()->cursor_get_line();
+ // wrap around
+ if (line <= bpoints[0]) {
+ code_editor->get_text_edit()->cursor_set_line(bpoints[bpoints.size() - 1]);
+ } else {
+ for(List<int>::Element *E=bpoints.back();E;E=E->prev()) {
+ int bline = E->get();
+ if (bline < line) {
+ code_editor->get_text_edit()->cursor_set_line(bline);
+ return;
+ }
+ }
+ }
+
+ } break;
+
+ case HELP_CONTEXTUAL: {
+ String text = code_editor->get_text_edit()->get_selection_text();
+ if (text == "")
+ text = code_editor->get_text_edit()->get_word_under_cursor();
+ if (text != "") {
+ emit_signal("request_help_search",text);
+ }
+ } break;
+ }
+}
+
+void ScriptTextEditor::_bind_methods() {
+
+ ClassDB::bind_method("_validate_script",&ScriptTextEditor::_validate_script);
+ ClassDB::bind_method("_load_theme_settings",&ScriptTextEditor::_load_theme_settings);
+ ClassDB::bind_method("_breakpoint_toggled",&ScriptTextEditor::_breakpoint_toggled);
+ ClassDB::bind_method("_edit_option",&ScriptTextEditor::_edit_option);
+ ClassDB::bind_method("_goto_line",&ScriptTextEditor::_goto_line);
+ ClassDB::bind_method("_lookup_symbol",&ScriptTextEditor::_lookup_symbol);
+ ClassDB::bind_method("_text_edit_gui_input", &ScriptTextEditor::_text_edit_gui_input);
+ ClassDB::bind_method("_color_changed", &ScriptTextEditor::_color_changed);
+
+
+ ClassDB::bind_method("get_drag_data_fw",&ScriptTextEditor::get_drag_data_fw);
+ ClassDB::bind_method("can_drop_data_fw",&ScriptTextEditor::can_drop_data_fw);
+ ClassDB::bind_method("drop_data_fw",&ScriptTextEditor::drop_data_fw);
+
+}
+
+Control *ScriptTextEditor::get_edit_menu() {
+
+ return edit_hb;
+}
+
+void ScriptTextEditor::reload(bool p_soft) {
+
+ TextEdit *te = code_editor->get_text_edit();
+ Ref<Script> scr = get_edited_script();
+ if (scr.is_null())
+ return;
+ scr->set_source_code(te->get_text());
+ bool soft = p_soft || scr->get_instance_base_type()=="EditorPlugin"; //always soft-reload editor plugins
+
+ scr->get_language()->reload_tool_script(scr,soft);
+}
+
+void ScriptTextEditor::get_breakpoints(List<int> *p_breakpoints) {
+
+ code_editor->get_text_edit()->get_breakpoints(p_breakpoints);
+
+}
+
+void ScriptTextEditor::set_tooltip_request_func(String p_method,Object* p_obj) {
+
+ code_editor->get_text_edit()->set_tooltip_request_func(p_obj,p_method,this);
+}
+
+void ScriptTextEditor::set_debugger_active(bool p_active) {
+
+
+}
+
+
+Variant ScriptTextEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ return Variant();
+}
+
+bool ScriptTextEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ Dictionary d = p_data;
+ if (d.has("type") &&
+ (
+
+ String(d["type"])=="resource" ||
+ String(d["type"])=="files" ||
+ String(d["type"])=="nodes"
+ ) ) {
+
+
+ return true;
+ }
+
+
+ return false;
+
+}
+
+#ifdef TOOLS_ENABLED
+
+static Node* _find_script_node(Node* p_edited_scene,Node* p_current_node,const Ref<Script> &script) {
+
+ if (p_edited_scene!=p_current_node && p_current_node->get_owner()!=p_edited_scene)
+ return NULL;
+
+ Ref<Script> scr = p_current_node->get_script();
+
+ if (scr.is_valid() && scr==script)
+ return p_current_node;
+
+ for(int i=0;i<p_current_node->get_child_count();i++) {
+ Node *n = _find_script_node(p_edited_scene,p_current_node->get_child(i),script);
+ if (n)
+ return n;
+ }
+
+ return NULL;
+}
+
+#else
+
+static Node* _find_script_node(Node* p_edited_scene,Node* p_current_node,const Ref<Script> &script) {
+
+ return NULL;
+}
+#endif
+
+
+
+
+void ScriptTextEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ Dictionary d = p_data;
+
+ if (d.has("type") && String(d["type"])=="resource") {
+
+ Ref<Resource> res = d["resource"];
+ if (!res.is_valid()) {
+ return;
+ }
+
+ if (res->get_path().is_resource_file()) {
+ EditorNode::get_singleton()->show_warning("Only resources from filesystem can be dropped.");
+ return;
+ }
+
+ code_editor->get_text_edit()->insert_text_at_cursor(res->get_path());
+
+ }
+
+ if (d.has("type") && String(d["type"])=="files") {
+
+
+ Array files = d["files"];
+
+ String text_to_drop;
+ for(int i=0;i<files.size();i++) {
+
+ if (i>0)
+ text_to_drop+=",";
+ text_to_drop+="\""+String(files[i]).c_escape()+"\"";
+
+ }
+
+ code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop);
+
+ }
+
+ if (d.has("type") && String(d["type"])=="nodes") {
+
+ Node* sn = _find_script_node(get_tree()->get_edited_scene_root(),get_tree()->get_edited_scene_root(),script);
+
+
+ if (!sn) {
+ EditorNode::get_singleton()->show_warning("Can't drop nodes because script '"+get_name()+"' is not used in this scene.");
+ return;
+ }
+
+
+ Array nodes = d["nodes"];
+ String text_to_drop;
+ for(int i=0;i<nodes.size();i++) {
+
+ if (i>0)
+ text_to_drop+=",";
+
+ NodePath np = nodes[i];
+ Node *node = get_node(np);
+ if (!node) {
+ continue;
+ }
+
+
+
+ String path = sn->get_path_to(node);
+ text_to_drop+="\""+path.c_escape()+"\"";
+
+
+ }
+
+ code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop);
+
+
+ }
+
+
+
+}
+
+void ScriptTextEditor::_text_edit_gui_input(const InputEvent& ev) {
+ if (ev.type == InputEvent::MOUSE_BUTTON) {
+ InputEventMouseButton mb = ev.mouse_button;
+ if (mb.button_index == BUTTON_RIGHT && !mb.pressed) {
+
+ int col, row;
+ TextEdit* tx = code_editor->get_text_edit();
+ tx->_get_mouse_pos(Point2i(mb.global_x, mb.global_y)-tx->get_global_pos(), row, col);
+ Vector2 mpos = Vector2(mb.global_x, mb.global_y)-tx->get_global_pos();
+ bool have_selection = (tx->get_selection_text().length() > 0);
+ bool have_color = (tx->get_word_at_pos(mpos) == "Color");
+ if (have_color) {
+
+ String line = tx->get_line(row);
+ color_line = row;
+ int begin = 0;
+ int end = 0;
+ bool valid = false;
+ for (int i = col; i < line.length(); i++) {
+ if (line[i] == '(') {
+ begin = i;
+ continue;
+ }
+ else if (line[i] == ')') {
+ end = i+1;
+ valid = true;
+ break;
+ }
+ }
+ if (valid) {
+ color_args = line.substr(begin, end-begin);
+ String stripped = color_args.replace(" ", "").replace("(", "").replace(")", "");
+ Vector<float> color = stripped.split_floats(",");
+ if (color.size() > 2) {
+ float alpha = color.size() > 3 ? color[3] : 1.0f;
+ color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
+ }
+ color_panel->set_pos(get_global_transform().xform(get_local_mouse_pos()));
+ Size2 ms = Size2(300, color_picker->get_combined_minimum_size().height+10);
+ color_panel->set_size(ms);
+ } else {
+ have_color = false;
+ }
+ }
+ _make_context_menu(have_selection, have_color);
+ }
+ }
+}
+
+void ScriptTextEditor::_color_changed(const Color& p_color) {
+ String new_args;
+ if (p_color.a == 1.0f) {
+ new_args = String("("+rtos(p_color.r)+", "+rtos(p_color.g)+", "+rtos(p_color.b)+")");
+ } else {
+ new_args = String("("+rtos(p_color.r)+", "+rtos(p_color.g)+", "+rtos(p_color.b)+", "+rtos(p_color.a)+")");
+ }
+
+ String line = code_editor->get_text_edit()->get_line(color_line);
+ String new_line = line.replace(color_args, new_args);
+ color_args = new_args;
+ code_editor->get_text_edit()->set_line(color_line, new_line);
+}
+
+void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color) {
+
+ context_menu->clear();
+ if (p_selection) {
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
+ }
+
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
+ context_menu->add_separator();
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
+
+ if (p_selection) {
+ context_menu->add_separator();
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT);
+ context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT);
+ }
+ if (p_color) {
+ context_menu->add_separator();
+ context_menu->add_item(TTR("Pick Color"), EDIT_PICK_COLOR);
+ }
+ context_menu->set_pos(get_global_transform().xform(get_local_mouse_pos()));
+ context_menu->set_size(Vector2(1, 1));
+ context_menu->popup();
+}
+
+ScriptTextEditor::ScriptTextEditor() {
+
+ code_editor = memnew( CodeTextEditor );
+ add_child(code_editor);
+ code_editor->set_area_as_parent_rect();
+ code_editor->connect("validate_script",this,"_validate_script");
+ code_editor->connect("load_theme_settings",this,"_load_theme_settings");
+ code_editor->set_code_complete_func(_code_complete_scripts,this);
+ code_editor->get_text_edit()->connect("breakpoint_toggled", this, "_breakpoint_toggled");
+ code_editor->get_text_edit()->connect("symbol_lookup", this, "_lookup_symbol");
+
+ update_settings();
+
+ code_editor->get_text_edit()->set_callhint_settings(
+ EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line"),
+ EditorSettings::get_singleton()->get("text_editor/completion/callhint_tooltip_offset"));
+
+ code_editor->get_text_edit()->set_select_identifiers_on_hover(true);
+ code_editor->get_text_edit()->set_context_menu_enabled(false);
+ code_editor->get_text_edit()->connect("gui_input", this, "_text_edit_gui_input");
+
+ context_menu = memnew(PopupMenu);
+ add_child(context_menu);
+ context_menu->connect("id_pressed", this, "_edit_option");
+
+ color_panel = memnew(PopupPanel);
+ add_child(color_panel);
+ color_picker = memnew(ColorPicker);
+ color_panel->add_child(color_picker);
+ color_panel->set_child_rect(color_picker); //NOT
+ color_picker->connect("color_changed", this, "_color_changed");
+
+ edit_hb = memnew (HBoxContainer);
+
+ edit_menu = memnew( MenuButton );
+ edit_menu->set_text(TTR("Edit"));
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
+ edit_menu->get_popup()->add_separator();
+#ifdef OSX_ENABLED
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
+#else
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
+#endif
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/auto_indent"), EDIT_AUTO_INDENT);
+ edit_menu->get_popup()->connect("id_pressed", this,"_edit_option");
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_breakpoint"), DEBUG_TOGGLE_BREAKPOINT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/remove_all_breakpoints"), DEBUG_REMOVE_ALL_BREAKPOINTS);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_breakpoint"), DEBUG_GOTO_NEXT_BREAKPOINT);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_breakpoint"), DEBUG_GOTO_PREV_BREAKPOINT);
+
+ search_menu = memnew( MenuButton );
+ edit_hb->add_child(search_menu);
+ search_menu->set_text(TTR("Search"));
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
+ search_menu->get_popup()->add_separator();
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_function"), SEARCH_LOCATE_FUNCTION);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
+ search_menu->get_popup()->add_separator();
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/contextual_help"), HELP_CONTEXTUAL);
+
+ search_menu->get_popup()->connect("id_pressed", this,"_edit_option");
+
+ edit_hb->add_child(edit_menu);
+
+ quick_open = memnew( ScriptEditorQuickOpen );
+ add_child(quick_open);
+ quick_open->connect("goto_line",this,"_goto_line");
+
+ goto_line_dialog = memnew(GotoLineDialog);
+ add_child(goto_line_dialog);
+
+
+ code_editor->get_text_edit()->set_drag_forwarding(this);
+}
+
+static ScriptEditorBase * create_editor(const Ref<Script>& p_script) {
+
+ if (p_script->has_source_code()) {
+ return memnew( ScriptTextEditor );
+ }
+
+ return NULL;
+}
+
+void ScriptTextEditor::register_editor() {
+
+ ED_SHORTCUT("script_text_editor/undo", TTR("Undo"), KEY_MASK_CMD|KEY_Z);
+ ED_SHORTCUT("script_text_editor/redo", TTR("Redo"), KEY_MASK_CMD|KEY_Y);
+ ED_SHORTCUT("script_text_editor/cut", TTR("Cut"), KEY_MASK_CMD|KEY_X);
+ ED_SHORTCUT("script_text_editor/copy", TTR("Copy"), KEY_MASK_CMD|KEY_C);
+ ED_SHORTCUT("script_text_editor/paste", TTR("Paste"), KEY_MASK_CMD|KEY_V);
+ ED_SHORTCUT("script_text_editor/select_all", TTR("Select All"), KEY_MASK_CMD|KEY_A);
+ ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT|KEY_UP);
+ ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT|KEY_DOWN);
+
+ //leave these at zero, same can be accomplished with tab/shift-tab, including selection
+ //the next/previous in history shortcut in this case makes a lot more sene.
+
+ ED_SHORTCUT("script_text_editor/indent_left", TTR("Indent Left"), 0);
+ ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), 0);
+ ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KEY_MASK_CMD|KEY_K);
+ ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD|KEY_B);
+#ifdef OSX_ENABLED
+ ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CTRL|KEY_SPACE);
+#else
+ ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD|KEY_SPACE);
+#endif
+ ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CTRL|KEY_MASK_ALT|KEY_T);
+ ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KEY_MASK_CMD|KEY_I);
+
+ ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), KEY_F9);
+ ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KEY_MASK_CTRL|KEY_MASK_SHIFT|KEY_F9);
+ ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Goto Next Breakpoint"), KEY_MASK_CTRL|KEY_PERIOD);
+ ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Goto Previous Breakpoint"), KEY_MASK_CTRL|KEY_COMMA);
+
+ ED_SHORTCUT("script_text_editor/find", TTR("Find.."), KEY_MASK_CMD|KEY_F);
+ ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), KEY_F3);
+ ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT|KEY_F3);
+ ED_SHORTCUT("script_text_editor/replace", TTR("Replace.."), KEY_MASK_CMD|KEY_R);
+
+ ED_SHORTCUT("script_text_editor/goto_function", TTR("Goto Function.."), KEY_MASK_SHIFT|KEY_MASK_CMD|KEY_F);
+ ED_SHORTCUT("script_text_editor/goto_line", TTR("Goto Line.."), KEY_MASK_CMD|KEY_L);
+
+ ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KEY_MASK_SHIFT|KEY_F1);
+
+ ScriptEditor::register_create_script_editor_function(create_editor);
+}
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
new file mode 100644
index 0000000000..e30a78340e
--- /dev/null
+++ b/editor/plugins/script_text_editor.h
@@ -0,0 +1,159 @@
+/*************************************************************************/
+/* script_text_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCRIPT_TEXT_EDITOR_H
+#define SCRIPT_TEXT_EDITOR_H
+
+#include "script_editor_plugin.h"
+#include "scene/gui/color_picker.h"
+
+
+class ScriptTextEditor : public ScriptEditorBase {
+
+ GDCLASS( ScriptTextEditor, ScriptEditorBase );
+
+ CodeTextEditor *code_editor;
+
+ Ref<Script> script;
+
+
+ Vector<String> functions;
+
+ HBoxContainer *edit_hb;
+
+ MenuButton *edit_menu;
+ MenuButton *search_menu;
+ PopupMenu *context_menu;
+
+ GotoLineDialog *goto_line_dialog;
+ ScriptEditorQuickOpen *quick_open;
+
+ PopupPanel *color_panel;
+ ColorPicker *color_picker;
+ int color_line;
+ String color_args;
+
+ enum {
+ EDIT_UNDO,
+ EDIT_REDO,
+ EDIT_CUT,
+ EDIT_COPY,
+ EDIT_PASTE,
+ EDIT_SELECT_ALL,
+ EDIT_COMPLETE,
+ EDIT_AUTO_INDENT,
+ EDIT_TRIM_TRAILING_WHITESAPCE,
+ EDIT_TOGGLE_COMMENT,
+ EDIT_MOVE_LINE_UP,
+ EDIT_MOVE_LINE_DOWN,
+ EDIT_INDENT_RIGHT,
+ EDIT_INDENT_LEFT,
+ EDIT_CLONE_DOWN,
+ EDIT_PICK_COLOR,
+ SEARCH_FIND,
+ SEARCH_FIND_NEXT,
+ SEARCH_FIND_PREV,
+ SEARCH_REPLACE,
+ SEARCH_LOCATE_FUNCTION,
+ SEARCH_GOTO_LINE,
+ DEBUG_TOGGLE_BREAKPOINT,
+ DEBUG_REMOVE_ALL_BREAKPOINTS,
+ DEBUG_GOTO_NEXT_BREAKPOINT,
+ DEBUG_GOTO_PREV_BREAKPOINT,
+ HELP_CONTEXTUAL,
+ };
+
+
+protected:
+
+
+ static void _code_complete_scripts(void* p_ud,const String& p_code, List<String>* r_options);
+ void _breakpoint_toggled(int p_row);
+
+ //no longer virtual
+ void _validate_script();
+ void _code_complete_script(const String& p_code, List<String>* r_options);
+ void _load_theme_settings();
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+ void _edit_option(int p_op);
+ void _make_context_menu(bool p_selection, bool p_color);
+ void _text_edit_gui_input(const InputEvent& ev);
+ void _color_changed(const Color& p_color);
+
+ void _goto_line(int p_line) { goto_line(p_line); }
+ void _lookup_symbol(const String& p_symbol,int p_row, int p_column);
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+public:
+
+ virtual void apply_code();
+ virtual Ref<Script> get_edited_script() const;
+ virtual Vector<String> get_functions() ;
+ virtual void set_edited_script(const Ref<Script>& p_script);
+ virtual void reload_text();
+ virtual String get_name() ;
+ virtual Ref<Texture> get_icon() ;
+ virtual bool is_unsaved();
+
+ virtual Variant get_edit_state();
+ virtual void set_edit_state(const Variant& p_state);
+ virtual void ensure_focus();
+ virtual void trim_trailing_whitespace();
+ virtual void tag_saved_version();
+
+ virtual void goto_line(int p_line,bool p_with_error=false);
+
+ virtual void reload(bool p_soft);
+ virtual void get_breakpoints(List<int> *p_breakpoints);
+
+ virtual void add_callback(const String& p_function,PoolStringArray p_args);
+ virtual void update_settings();
+ virtual bool goto_method(const String& p_method);
+
+ virtual void set_tooltip_request_func(String p_method,Object* p_obj);
+
+ virtual void set_debugger_active(bool p_active);
+
+ Control *get_edit_menu();
+
+ static void register_editor();
+
+ ScriptTextEditor();
+
+};
+
+
+
+
+#endif // SCRIPT_TEXT_EDITOR_H
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
new file mode 100644
index 0000000000..c14d1650fd
--- /dev/null
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -0,0 +1,584 @@
+/*************************************************************************/
+/* shader_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "shader_editor_plugin.h"
+
+#include "editor/editor_settings.h"
+#include "spatial_editor_plugin.h"
+#include "scene/resources/shader_graph.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "os/keyboard.h"
+#include "editor/editor_node.h"
+#include "editor/property_editor.h"
+#include "os/os.h"
+#include "servers/visual/shader_types.h"
+
+/*** SETTINGS EDITOR ****/
+
+
+
+
+/*** SCRIPT EDITOR ****/
+
+
+Ref<Shader> ShaderTextEditor::get_edited_shader() const {
+
+ return shader;
+}
+void ShaderTextEditor::set_edited_shader(const Ref<Shader>& p_shader) {
+
+ shader=p_shader;
+
+
+ _load_theme_settings();
+
+ get_text_edit()->set_text(p_shader->get_code());
+
+ _line_col_changed();
+
+
+}
+
+
+void ShaderTextEditor::_load_theme_settings() {
+
+ get_text_edit()->clear_colors();
+
+ /* keyword color */
+
+ get_text_edit()->add_color_override("background_color", EDITOR_DEF("text_editor/highlighting/background_color",Color(0,0,0,0)));
+ get_text_edit()->add_color_override("completion_background_color", EDITOR_DEF("text_editor/highlighting/completion_background_color", Color(0,0,0,0)));
+ get_text_edit()->add_color_override("completion_selected_color", EDITOR_DEF("text_editor/highlighting/completion_selected_color", Color::html("434244")));
+ get_text_edit()->add_color_override("completion_existing_color", EDITOR_DEF("text_editor/highlighting/completion_existing_color", Color::html("21dfdfdf")));
+ get_text_edit()->add_color_override("completion_scroll_color", EDITOR_DEF("text_editor/highlighting/completion_scroll_color", Color::html("ffffff")));
+ get_text_edit()->add_color_override("completion_font_color", EDITOR_DEF("text_editor/highlighting/completion_font_color", Color::html("aaaaaa")));
+ get_text_edit()->add_color_override("font_color",EDITOR_DEF("text_editor/highlighting/text_color",Color(0,0,0)));
+ get_text_edit()->add_color_override("line_number_color",EDITOR_DEF("text_editor/highlighting/line_number_color",Color(0,0,0)));
+ get_text_edit()->add_color_override("caret_color",EDITOR_DEF("text_editor/highlighting/caret_color",Color(0,0,0)));
+ get_text_edit()->add_color_override("caret_background_color",EDITOR_DEF("text_editor/highlighting/caret_background_color",Color(0,0,0)));
+ get_text_edit()->add_color_override("font_selected_color",EDITOR_DEF("text_editor/highlighting/text_selected_color",Color(1,1,1)));
+ get_text_edit()->add_color_override("selection_color",EDITOR_DEF("text_editor/highlighting/selection_color",Color(0.2,0.2,1)));
+ get_text_edit()->add_color_override("brace_mismatch_color",EDITOR_DEF("text_editor/highlighting/brace_mismatch_color",Color(1,0.2,0.2)));
+ get_text_edit()->add_color_override("current_line_color",EDITOR_DEF("text_editor/highlighting/current_line_color",Color(0.3,0.5,0.8,0.15)));
+ get_text_edit()->add_color_override("word_highlighted_color",EDITOR_DEF("text_editor/highlighting/word_highlighted_color",Color(0.8,0.9,0.9,0.15)));
+ get_text_edit()->add_color_override("number_color",EDITOR_DEF("text_editor/highlighting/number_color",Color(0.9,0.6,0.0,2)));
+ get_text_edit()->add_color_override("function_color",EDITOR_DEF("text_editor/highlighting/function_color",Color(0.4,0.6,0.8)));
+ get_text_edit()->add_color_override("member_variable_color",EDITOR_DEF("text_editor/highlighting/member_variable_color",Color(0.9,0.3,0.3)));
+ get_text_edit()->add_color_override("mark_color", EDITOR_DEF("text_editor/highlighting/mark_color", Color(1.0,0.4,0.4,0.4)));
+ get_text_edit()->add_color_override("breakpoint_color", EDITOR_DEF("text_editor/highlighting/breakpoint_color", Color(0.8,0.8,0.4,0.2)));
+ get_text_edit()->add_color_override("search_result_color",EDITOR_DEF("text_editor/highlighting/search_result_color",Color(0.05,0.25,0.05,1)));
+ get_text_edit()->add_color_override("search_result_border_color",EDITOR_DEF("text_editor/highlighting/search_result_border_color",Color(0.1,0.45,0.1,1)));
+ get_text_edit()->add_color_override("symbol_color",EDITOR_DEF("text_editor/highlighting/symbol_color",Color::hex(0x005291ff)));
+
+ Color keyword_color= EDITOR_DEF("text_editor/highlighting/keyword_color",Color(0.5,0.0,0.2));
+
+
+ List<String> keywords;
+ ShaderLanguage::get_keyword_list(&keywords);
+
+ if (shader.is_valid()) {
+
+
+ for(const Map< StringName, Map<StringName,ShaderLanguage::DataType> >::Element *E=ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())).front();E;E=E->next()) {
+
+ for (const Map<StringName,ShaderLanguage::DataType>::Element *F=E->get().front();F;F=F->next()) {
+ keywords.push_back(F->key());
+ }
+
+ }
+
+ for(const Set<String>::Element *E =ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())).front();E;E=E->next()) {
+
+ keywords.push_back(E->get());
+
+ }
+ }
+
+
+ for(List<String>::Element *E=keywords.front();E;E=E->next()) {
+
+ get_text_edit()->add_keyword_color(E->get(),keyword_color);
+ }
+
+ //colorize core types
+ //Color basetype_color= EDITOR_DEF("text_editor/base_type_color",Color(0.3,0.3,0.0));
+
+
+ //colorize comments
+ Color comment_color = EDITOR_DEF("text_editor/highlighting/comment_color",Color::hex(0x797e7eff));
+
+ get_text_edit()->add_color_region("/*","*/",comment_color,false);
+ get_text_edit()->add_color_region("//","",comment_color,false);
+
+ /*//colorize strings
+ Color string_color = EDITOR_DEF("text_editor/string_color",Color::hex(0x6b6f00ff));
+
+ List<String> strings;
+ shader->get_shader_mode()->get_string_delimiters(&strings);
+
+ for (List<String>::Element *E=strings.front();E;E=E->next()) {
+
+ String string = E->get();
+ String beg = string.get_slice(" ",0);
+ String end = string.get_slice_count(" ")>1?string.get_slice(" ",1):String();
+ get_text_edit()->add_color_region(beg,end,string_color,end=="");
+ }*/
+}
+
+void ShaderTextEditor::_code_complete_script(const String& p_code, List<String>* r_options) {
+
+ print_line("code complete");
+
+ ShaderLanguage sl;
+ String calltip;
+
+ Error err = sl.complete(p_code,ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())),ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())),r_options,calltip);
+
+ if (calltip!="") {
+ get_text_edit()->set_code_hint(calltip);
+ }
+}
+
+void ShaderTextEditor::_validate_script() {
+
+ String code=get_text_edit()->get_text();
+ //List<StringName> params;
+ //shader->get_param_list(&params);
+
+ ShaderLanguage sl;
+
+ Error err = sl.compile(code,ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())),ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())));
+
+ if (err!=OK) {
+ String error_text="error("+itos(sl.get_error_line())+"): "+sl.get_error_text();
+ set_error(error_text);
+ get_text_edit()->set_line_as_marked(sl.get_error_line(),true);
+
+ } else {
+ for(int i=0;i<get_text_edit()->get_line_count();i++)
+ get_text_edit()->set_line_as_marked(i,false);
+ set_error("");
+ }
+
+ emit_signal("script_changed");
+}
+
+void ShaderTextEditor::_bind_methods() {
+
+
+ //ADD_SIGNAL( MethodInfo("script_changed") );
+
+}
+
+ShaderTextEditor::ShaderTextEditor() {
+
+
+}
+
+/*** SCRIPT EDITOR ******/
+
+
+
+void ShaderEditor::_menu_option(int p_option) {
+
+
+ ShaderTextEditor *current = shader_editor;
+
+ switch(p_option) {
+ case EDIT_UNDO: {
+
+
+ current->get_text_edit()->undo();
+ } break;
+ case EDIT_REDO: {
+ current->get_text_edit()->redo();
+
+ } break;
+ case EDIT_CUT: {
+
+ current->get_text_edit()->cut();
+ } break;
+ case EDIT_COPY: {
+ current->get_text_edit()->copy();
+
+ } break;
+ case EDIT_PASTE: {
+ current->get_text_edit()->paste();
+
+ } break;
+ case EDIT_SELECT_ALL: {
+
+ current->get_text_edit()->select_all();
+
+ } break;
+ case SEARCH_FIND: {
+
+ current->get_find_replace_bar()->popup_search();
+ } break;
+ case SEARCH_FIND_NEXT: {
+
+ current->get_find_replace_bar()->search_next();
+ } break;
+ case SEARCH_FIND_PREV: {
+
+ current->get_find_replace_bar()->search_prev();
+ } break;
+ case SEARCH_REPLACE: {
+
+ current->get_find_replace_bar()->popup_replace();
+ } break;
+ //case SEARCH_LOCATE_SYMBOL: {
+
+ //} break;
+ case SEARCH_GOTO_LINE: {
+
+ goto_line_dialog->popup_find_line(current->get_text_edit());
+ } break;
+
+ }
+}
+
+
+void ShaderEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+
+ }
+ if (p_what==NOTIFICATION_DRAW) {
+
+ RID ci = get_canvas_item();
+ Ref<StyleBox> style = get_stylebox("panel","Panel");
+ style->draw( ci, Rect2( Point2(), get_size() ) );
+
+ }
+
+}
+
+
+
+Dictionary ShaderEditor::get_state() const {
+#if 0
+ apply_shaders();
+
+ Dictionary state;
+
+ Array paths;
+ int open=-1;
+
+ for(int i=0;i<tab_container->get_child_count();i++) {
+
+ ShaderTextEditor *ste = tab_container->get_child(i)->cast_to<ShaderTextEditor>();
+ if (!ste)
+ continue;
+
+
+ Ref<Shader> shader = ste->get_edited_shader();
+ if (shader->get_path()!="" && shader->get_path().find("local://")==-1 && shader->get_path().find("::")==-1) {
+
+ paths.push_back(shader->get_path());
+ } else {
+
+
+ const Node *owner = _find_node_with_shader(get_root_node(),shader.get_ref_ptr());
+ if (owner)
+ paths.push_back(owner->get_path());
+
+ }
+
+ if (i==tab_container->get_current_tab())
+ open=i;
+ }
+
+ if (paths.size())
+ state["sources"]=paths;
+ if (open!=-1)
+ state["current"]=open;
+
+
+ return state;
+#endif
+ return Dictionary();
+}
+void ShaderEditor::set_state(const Dictionary& p_state) {
+#if 0
+ print_line("setting state..");
+ if (!p_state.has("sources"))
+ return; //bleh
+
+ Array sources = p_state["sources"];
+ for(int i=0;i<sources.size();i++) {
+
+ Variant source=sources[i];
+
+ Ref<Shader> shader;
+
+ if (source.get_type()==Variant::NODE_PATH) {
+
+ print_line("cain find owner at path "+String(source));
+ Node *owner=get_root_node()->get_node(source);
+ if (!owner)
+ continue;
+
+ shader = owner->get_shader();
+ } else if (source.get_type()==Variant::STRING) {
+
+ print_line("loading at path "+String(source));
+ shader = ResourceLoader::load(source,"Shader");
+ }
+
+ print_line("found shader at "+String(source)+"? - "+itos(shader.is_null()));
+ if (shader.is_null()) //ah well..
+ continue;
+
+ get_scene()->get_root_node()->call("_resource_selected",shader);
+ }
+
+ if (p_state.has("current"))
+ tab_container->set_current_tab(p_state["current"]);
+#endif
+}
+void ShaderEditor::clear() {
+
+}
+
+void ShaderEditor::_params_changed() {
+
+
+ shader_editor->_validate_script();
+}
+
+void ShaderEditor::_editor_settings_changed() {
+
+ shader_editor->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/completion/auto_brace_complete"));
+ shader_editor->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
+ shader_editor->get_text_edit()->set_tab_size(EditorSettings::get_singleton()->get("text_editor/indent/tab_size"));
+ shader_editor->get_text_edit()->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
+ shader_editor->get_text_edit()->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
+ shader_editor->get_text_edit()->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
+ shader_editor->get_text_edit()->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
+ shader_editor->get_text_edit()->cursor_set_blink_enabled(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink"));
+ shader_editor->get_text_edit()->cursor_set_blink_speed(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink_speed"));
+ shader_editor->get_text_edit()->add_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/theme/line_spacing"));
+ shader_editor->get_text_edit()->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
+}
+
+void ShaderEditor::_bind_methods() {
+
+ ClassDB::bind_method("_editor_settings_changed",&ShaderEditor::_editor_settings_changed);
+
+ ClassDB::bind_method("_menu_option",&ShaderEditor::_menu_option);
+ ClassDB::bind_method("_params_changed",&ShaderEditor::_params_changed);
+ ClassDB::bind_method("apply_shaders",&ShaderEditor::apply_shaders);
+ //ClassDB::bind_method("_close_current_tab",&ShaderEditor::_close_current_tab);
+}
+
+void ShaderEditor::ensure_select_current() {
+
+/*
+ if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) {
+
+ ShaderTextEditor *ste = tab_container->get_child(tab_container->get_current_tab())->cast_to<ShaderTextEditor>();
+ if (!ste)
+ return;
+ Ref<Shader> shader = ste->get_edited_shader();
+ get_scene()->get_root_node()->call("_resource_selected",shader);
+ }*/
+}
+
+void ShaderEditor::edit(const Ref<Shader>& p_shader) {
+
+ if (p_shader.is_null())
+ return;
+
+
+ shader=p_shader;
+
+ shader_editor->set_edited_shader(p_shader);
+
+ //vertex_editor->set_edited_shader(shader,ShaderLanguage::SHADER_MATERIAL_VERTEX);
+ // see if already has it
+
+
+}
+
+void ShaderEditor::save_external_data() {
+
+ if (shader.is_null())
+ return;
+ apply_shaders();
+
+ if (shader->get_path()!="" && shader->get_path().find("local://")==-1 &&shader->get_path().find("::")==-1) {
+ //external shader, save it
+ ResourceSaver::save(shader->get_path(),shader);
+ }
+}
+
+void ShaderEditor::apply_shaders() {
+
+
+ if (shader.is_valid()) {
+ shader->set_code(shader_editor->get_text_edit()->get_text());
+ shader->set_edited(true);
+ }
+}
+
+
+ShaderEditor::ShaderEditor() {
+
+
+ HBoxContainer *hbc = memnew( HBoxContainer);
+
+ add_child(hbc);
+
+ edit_menu = memnew( MenuButton );
+ hbc->add_child(edit_menu);
+ edit_menu->set_pos(Point2(5,-1));
+ edit_menu->set_text(TTR("Edit"));
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/undo", TTR("Undo"), KEY_MASK_CMD|KEY_Z), EDIT_UNDO);
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/redo", TTR("Redo"), KEY_MASK_CMD|KEY_Y), EDIT_REDO);
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/cut", TTR("Cut"), KEY_MASK_CMD|KEY_X), EDIT_CUT);
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy", TTR("Copy"), KEY_MASK_CMD|KEY_C), EDIT_COPY);
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/paste", TTR("Paste"), KEY_MASK_CMD|KEY_V), EDIT_PASTE);
+ edit_menu->get_popup()->add_separator();
+ edit_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/select_all", TTR("Select All"), KEY_MASK_CMD|KEY_A), EDIT_SELECT_ALL);
+ edit_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+
+ search_menu = memnew( MenuButton );
+ hbc->add_child(search_menu);
+ search_menu->set_pos(Point2(38,-1));
+ search_menu->set_text(TTR("Search"));
+ search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find.."), KEY_MASK_CMD|KEY_F), SEARCH_FIND);
+ search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), SEARCH_FIND_NEXT);
+ search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT|KEY_F3), SEARCH_FIND_PREV);
+ search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/replace", TTR("Replace.."), KEY_MASK_CMD|KEY_R), SEARCH_REPLACE);
+ search_menu->get_popup()->add_separator();
+ //search_menu->get_popup()->add_item("Locate Symbol..",SEARCH_LOCATE_SYMBOL,KEY_MASK_CMD|KEY_K);
+ search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/goto_line", TTR("Goto Line.."), KEY_MASK_CMD|KEY_L), SEARCH_GOTO_LINE);
+ search_menu->get_popup()->connect("id_pressed", this,"_menu_option");
+
+
+ goto_line_dialog = memnew(GotoLineDialog);
+ add_child(goto_line_dialog);
+
+ shader_editor = memnew( ShaderTextEditor );
+ add_child(shader_editor);
+ shader_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+
+
+ shader_editor->connect("script_changed", this,"apply_shaders");
+ EditorSettings::get_singleton()->connect("settings_changed",this,"_editor_settings_changed");
+
+ _editor_settings_changed();
+}
+
+
+void ShaderEditorPlugin::edit(Object *p_object) {
+
+ Shader* s = p_object->cast_to<Shader>();
+ shader_editor->edit(s);
+
+}
+
+bool ShaderEditorPlugin::handles(Object *p_object) const {
+
+ bool handles = true;
+ Shader *shader=p_object->cast_to<Shader>();
+ /*
+ if (!shader || shader->cast_to<ShaderGraph>()) // Dont handle ShaderGraph's
+ handles = false;
+ */
+
+ return shader!=NULL;
+}
+
+void ShaderEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ button->show();
+ editor->make_bottom_panel_item_visible(shader_editor);
+
+ } else {
+
+ button->hide();
+ if (shader_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+ shader_editor->apply_shaders();
+
+ }
+
+}
+
+void ShaderEditorPlugin::selected_notify() {
+
+ shader_editor->ensure_select_current();
+}
+
+Dictionary ShaderEditorPlugin::get_state() const {
+
+ return shader_editor->get_state();
+}
+
+void ShaderEditorPlugin::set_state(const Dictionary& p_state) {
+
+ shader_editor->set_state(p_state);
+}
+void ShaderEditorPlugin::clear() {
+
+ shader_editor->clear();
+}
+
+void ShaderEditorPlugin::save_external_data() {
+
+ shader_editor->save_external_data();
+}
+
+void ShaderEditorPlugin::apply_changes() {
+
+ shader_editor->apply_shaders();
+}
+
+ShaderEditorPlugin::ShaderEditorPlugin(EditorNode *p_node) {
+
+
+ editor=p_node;
+ shader_editor = memnew( ShaderEditor );
+
+ shader_editor->set_custom_minimum_size(Size2(0,300));
+ button=editor->add_bottom_panel_item("Shader",shader_editor);
+
+}
+
+
+ShaderEditorPlugin::~ShaderEditorPlugin() {
+}
+
+
diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h
new file mode 100644
index 0000000000..703913e431
--- /dev/null
+++ b/editor/plugins/shader_editor_plugin.h
@@ -0,0 +1,156 @@
+/*************************************************************************/
+/* shader_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SHADER_EDITOR_PLUGIN_H
+#define SHADER_EDITOR_PLUGIN_H
+
+#include "editor/code_editor.h"
+#include "editor/editor_plugin.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/text_edit.h"
+#include "scene/gui/menu_button.h"
+#include "scene/main/timer.h"
+#include "scene/resources/shader.h"
+#include "servers/visual/shader_language.h"
+
+class ShaderTextEditor : public CodeTextEditor {
+
+ GDCLASS( ShaderTextEditor, CodeTextEditor );
+
+ Ref<Shader> shader;
+
+protected:
+
+ static void _bind_methods();
+ virtual void _load_theme_settings();
+
+ virtual void _code_complete_script(const String& p_code, List<String>* r_options);
+
+public:
+
+ virtual void _validate_script();
+
+
+ Ref<Shader> get_edited_shader() const;
+ void set_edited_shader(const Ref<Shader>& p_shader);
+ ShaderTextEditor();
+
+};
+
+
+class ShaderEditor : public VBoxContainer {
+
+ GDCLASS(ShaderEditor, VBoxContainer );
+
+ enum {
+
+ EDIT_UNDO,
+ EDIT_REDO,
+ EDIT_CUT,
+ EDIT_COPY,
+ EDIT_PASTE,
+ EDIT_SELECT_ALL,
+ SEARCH_FIND,
+ SEARCH_FIND_NEXT,
+ SEARCH_FIND_PREV,
+ SEARCH_REPLACE,
+ //SEARCH_LOCATE_SYMBOL,
+ SEARCH_GOTO_LINE,
+
+ };
+
+ MenuButton *edit_menu;
+ MenuButton *search_menu;
+ MenuButton *settings_menu;
+ uint64_t idle;
+
+ GotoLineDialog *goto_line_dialog;
+ ConfirmationDialog *erase_tab_confirm;
+
+
+ ShaderTextEditor *shader_editor;
+
+
+ void _menu_option(int p_optin);
+ void _params_changed();
+ mutable Ref<Shader> shader;
+
+
+ void _editor_settings_changed();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void apply_shaders();
+
+ void ensure_select_current();
+ void edit(const Ref<Shader>& p_shader);
+
+ Dictionary get_state() const;
+ void set_state(const Dictionary& p_state);
+ void clear();
+
+ virtual Size2 get_minimum_size() const { return Size2(0,200); }
+ void save_external_data();
+
+ ShaderEditor();
+};
+
+class ShaderEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ShaderEditorPlugin, EditorPlugin );
+
+ bool _2d;
+ ShaderEditor *shader_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "Shader"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+ virtual void selected_notify();
+
+ Dictionary get_state() const;
+ virtual void set_state(const Dictionary& p_state);
+ virtual void clear();
+
+ virtual void save_external_data();
+ virtual void apply_changes();
+
+ ShaderEditorPlugin(EditorNode *p_node);
+ ~ShaderEditorPlugin();
+
+};
+
+#endif
diff --git a/editor/plugins/shader_graph_editor_plugin.cpp b/editor/plugins/shader_graph_editor_plugin.cpp
new file mode 100644
index 0000000000..dac63b4a9f
--- /dev/null
+++ b/editor/plugins/shader_graph_editor_plugin.cpp
@@ -0,0 +1,2948 @@
+/*************************************************************************/
+/* shader_graph_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "shader_graph_editor_plugin.h"
+
+#if 0
+
+#include "scene/gui/check_box.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/panel.h"
+#include "spatial_editor_plugin.h"
+#include "os/keyboard.h"
+#include "canvas_item_editor_plugin.h"
+
+void GraphColorRampEdit::_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && p_event.key.scancode==KEY_DELETE && grabbed!=-1) {
+
+ points.remove(grabbed);
+ grabbed=-1;
+ update();
+ emit_signal("ramp_changed");
+ accept_event();
+ }
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && p_event.mouse_button.pressed) {
+
+ update();
+ int x = p_event.mouse_button.x;
+ int total_w = get_size().width-get_size().height-3;
+ if (x>total_w+3) {
+
+ if (grabbed==-1)
+ return;
+ Size2 ms = Size2(350, picker->get_combined_minimum_size().height+10);
+ picker->set_color(points[grabbed].color);
+ popup->set_pos(get_global_pos()-Size2(0,ms.height));
+ popup->set_size(ms);
+ popup->popup();
+ return;
+ }
+
+
+ float ofs = CLAMP(x/float(total_w),0,1);
+
+ grabbed=-1;
+ grabbing=true;
+ int pos=-1;
+ for(int i=0;i<points.size();i++) {
+
+ if (ABS(x-points[i].offset*total_w)<4) {
+ grabbed=i;
+ }
+ if (points[i].offset<ofs)
+ pos=i;
+ }
+
+ grabbed_at=ofs;
+ //grab or select
+ if (grabbed!=-1) {
+ return;
+ }
+ //insert
+
+
+ Point p;
+ p.offset=ofs;
+
+ Point prev;
+ Point next;
+
+ if (pos==-1) {
+
+ prev.color=Color(0,0,0);
+ prev.offset=0;
+ if (points.size()) {
+ next=points[0];
+ } else {
+ next.color=Color(1,1,1);
+ next.offset=1.0;
+ }
+ } else {
+
+ if (pos==points.size()-1) {
+ next.color=Color(1,1,1);
+ next.offset=1.0;
+ } else {
+ next=points[pos+1];
+ }
+ prev=points[pos];
+
+ }
+
+ p.color=prev.color.linear_interpolate(next.color,(p.offset-prev.offset)/(next.offset-prev.offset));
+
+ points.push_back(p);
+ points.sort();
+ for(int i=0;i<points.size();i++) {
+ if (points[i].offset==ofs) {
+ grabbed=i;
+ break;
+ }
+ }
+
+ emit_signal("ramp_changed");
+
+ }
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && !p_event.mouse_button.pressed) {
+
+ if (grabbing) {
+ grabbing=false;
+ emit_signal("ramp_changed");
+ }
+ update();
+ }
+
+ if (p_event.type==InputEvent::MOUSE_MOTION && grabbing) {
+
+ int total_w = get_size().width-get_size().height-3;
+
+ int x = p_event.mouse_motion.x;
+ float newofs = CLAMP(x/float(total_w),0,1);
+
+ bool valid=true;
+ for(int i=0;i<points.size();i++) {
+
+ if (points[i].offset==newofs && i!=grabbed) {
+ valid=false;
+ }
+ }
+
+ if (!valid)
+ return;
+
+ points[grabbed].offset=newofs;
+
+ points.sort();
+ for(int i=0;i<points.size();i++) {
+ if (points[i].offset==newofs) {
+ grabbed=i;
+ break;
+ }
+ }
+
+ emit_signal("ramp_changed");
+
+ update();
+ }
+}
+
+void GraphColorRampEdit::_notification(int p_what){
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ if (!picker->is_connected("color_changed",this,"_color_changed")) {
+ picker->connect("color_changed",this,"_color_changed");
+ }
+ }
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+ Point prev;
+ prev.offset=0;
+ prev.color=Color(0,0,0);
+
+ int h = get_size().y;
+ int total_w = get_size().width-get_size().height-3;
+
+ for(int i=-1;i<points.size();i++) {
+
+ Point next;
+ if (i+1==points.size()) {
+ next.color=Color(1,1,1);
+ next.offset=1;
+ } else {
+ next=points[i+1];
+ }
+
+ if (prev.offset==next.offset) {
+ prev=next;
+ continue;
+ }
+
+ Vector<Vector2> points;
+ Vector<Color> colors;
+ points.push_back(Vector2(prev.offset*total_w,h));
+ points.push_back(Vector2(prev.offset*total_w,0));
+ points.push_back(Vector2(next.offset*total_w,0));
+ points.push_back(Vector2(next.offset*total_w,h));
+ colors.push_back(prev.color);
+ colors.push_back(prev.color);
+ colors.push_back(next.color);
+ colors.push_back(next.color);
+ draw_primitive(points,colors,Vector<Point2>());
+ prev=next;
+ }
+
+ for(int i=0;i<points.size();i++) {
+
+ Color col=i==grabbed?Color(1,0.0,0.0,0.9):Color(1,1,1,0.8);
+
+ draw_line(Vector2(points[i].offset*total_w,0),Vector2(points[i].offset*total_w,h-1),Color(0,0,0,0.7));
+ draw_line(Vector2(points[i].offset*total_w-1,h/2),Vector2(points[i].offset*total_w-1,h-1),col);
+ draw_line(Vector2(points[i].offset*total_w+1,h/2),Vector2(points[i].offset*total_w+1,h-1),col);
+ draw_line(Vector2(points[i].offset*total_w-1,h/2),Vector2(points[i].offset*total_w+1,h/2),col);
+ draw_line(Vector2(points[i].offset*total_w-1,h-1),Vector2(points[i].offset*total_w+1,h-1),col);
+
+ }
+
+ if (grabbed!=-1) {
+
+ draw_rect(Rect2(total_w+3,0,h,h),points[grabbed].color);
+ }
+
+ if (has_focus()) {
+
+ draw_line(Vector2(-1,-1),Vector2(total_w+1,-1),Color(1,1,1,0.6));
+ draw_line(Vector2(total_w+1,-1),Vector2(total_w+1,h+1),Color(1,1,1,0.6));
+ draw_line(Vector2(total_w+1,h+1),Vector2(-1,h+1),Color(1,1,1,0.6));
+ draw_line(Vector2(-1,-1),Vector2(-1,h+1),Color(1,1,1,0.6));
+ }
+
+ }
+}
+
+Size2 GraphColorRampEdit::get_minimum_size() const {
+
+ return Vector2(0,16);
+}
+
+
+void GraphColorRampEdit::_color_changed(const Color& p_color) {
+
+ if (grabbed==-1)
+ return;
+ points[grabbed].color=p_color;
+ update();
+ emit_signal("ramp_changed");
+
+}
+
+void GraphColorRampEdit::set_ramp(const Vector<float>& p_offsets,const Vector<Color>& p_colors) {
+
+ ERR_FAIL_COND(p_offsets.size()!=p_colors.size());
+ points.clear();
+ for(int i=0;i<p_offsets.size();i++) {
+ Point p;
+ p.offset=p_offsets[i];
+ p.color=p_colors[i];
+ points.push_back(p);
+ }
+
+ points.sort();
+ update();
+}
+
+Vector<float> GraphColorRampEdit::get_offsets() const{
+ Vector<float> ret;
+ for(int i=0;i<points.size();i++)
+ ret.push_back(points[i].offset);
+ return ret;
+}
+Vector<Color> GraphColorRampEdit::get_colors() const{
+
+ Vector<Color> ret;
+ for(int i=0;i<points.size();i++)
+ ret.push_back(points[i].color);
+ return ret;
+}
+
+
+void GraphColorRampEdit::_bind_methods(){
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&GraphColorRampEdit::_gui_input);
+ ClassDB::bind_method(D_METHOD("_color_changed"),&GraphColorRampEdit::_color_changed);
+ ADD_SIGNAL(MethodInfo("ramp_changed"));
+}
+
+GraphColorRampEdit::GraphColorRampEdit(){
+
+ grabbed=-1;
+ grabbing=false;
+ set_focus_mode(FOCUS_ALL);
+
+ popup = memnew( PopupPanel );
+ picker = memnew( ColorPicker );
+ popup->add_child(picker);
+ /popup->set_child_rect(picker);
+ add_child(popup);
+
+}
+////////////
+
+void GraphCurveMapEdit::_gui_input(const InputEvent& p_event) {
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && p_event.key.scancode==KEY_DELETE && grabbed!=-1) {
+
+ points.remove(grabbed);
+ grabbed=-1;
+ update();
+ emit_signal("curve_changed");
+ accept_event();
+ }
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && p_event.mouse_button.pressed) {
+
+ update();
+ Point2 p = Vector2(p_event.mouse_button.x,p_event.mouse_button.y)/get_size();
+ p.y=1.0-p.y;
+ grabbed=-1;
+ grabbing=true;
+
+ for(int i=0;i<points.size();i++) {
+
+ Vector2 ps = p*get_size();
+ Vector2 pt = Vector2(points[i].offset,points[i].height)*get_size();
+ if (ps.distance_to(pt)<4) {
+ grabbed=i;
+ }
+
+ }
+
+
+ //grab or select
+ if (grabbed!=-1) {
+ return;
+ }
+ //insert
+
+
+ Point np;
+ np.offset=p.x;
+ np.height=p.y;
+
+ points.push_back(np);
+ points.sort();
+ for(int i=0;i<points.size();i++) {
+ if (points[i].offset==p.x && points[i].height==p.y) {
+ grabbed=i;
+ break;
+ }
+ }
+
+ emit_signal("curve_changed");
+
+ }
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==1 && !p_event.mouse_button.pressed) {
+
+ if (grabbing) {
+ grabbing=false;
+ emit_signal("curve_changed");
+ }
+ update();
+ }
+
+ if (p_event.type==InputEvent::MOUSE_MOTION && grabbing && grabbed != -1) {
+
+ Point2 p = Vector2(p_event.mouse_button.x,p_event.mouse_button.y)/get_size();
+ p.y=1.0-p.y;
+
+ p.x = CLAMP(p.x,0.0,1.0);
+ p.y = CLAMP(p.y,0.0,1.0);
+
+ bool valid=true;
+
+ for(int i=0;i<points.size();i++) {
+
+ if (points[i].offset==p.x && points[i].height==p.y && i!=grabbed) {
+ valid=false;
+ }
+ }
+
+ if (!valid)
+ return;
+
+ points[grabbed].offset=p.x;
+ points[grabbed].height=p.y;
+
+ points.sort();
+ for(int i=0;i<points.size();i++) {
+ if (points[i].offset==p.x && points[i].height==p.y) {
+ grabbed=i;
+ break;
+ }
+ }
+
+ emit_signal("curve_changed");
+
+ update();
+ }
+}
+
+void GraphCurveMapEdit::_plot_curve(const Vector2& p_a,const Vector2& p_b,const Vector2& p_c,const Vector2& p_d) {
+
+ float geometry[4][4];
+ float tmp1[4][4];
+ float tmp2[4][4];
+ float deltas[4][4];
+ double x, dx, dx2, dx3;
+ double y, dy, dy2, dy3;
+ double d, d2, d3;
+ int lastx, lasty;
+ int newx, newy;
+ int ntimes;
+ int i,j;
+
+ int xmax=get_size().x;
+ int ymax=get_size().y;
+
+ /* construct the geometry matrix from the segment */
+ for (i = 0; i < 4; i++) {
+ geometry[i][2] = 0;
+ geometry[i][3] = 0;
+ }
+
+ geometry[0][0] = (p_a[0] * xmax);
+ geometry[1][0] = (p_b[0] * xmax);
+ geometry[2][0] = (p_c[0] * xmax);
+ geometry[3][0] = (p_d[0] * xmax);
+
+ geometry[0][1] = (p_a[1] * ymax);
+ geometry[1][1] = (p_b[1] * ymax);
+ geometry[2][1] = (p_c[1] * ymax);
+ geometry[3][1] = (p_d[1] * ymax);
+
+ /* subdivide the curve ntimes (1000) times */
+ ntimes = 4 * xmax;
+ /* ntimes can be adjusted to give a finer or coarser curve */
+ d = 1.0 / ntimes;
+ d2 = d * d;
+ d3 = d * d * d;
+
+ /* construct a temporary matrix for determining the forward differencing deltas */
+ tmp2[0][0] = 0; tmp2[0][1] = 0; tmp2[0][2] = 0; tmp2[0][3] = 1;
+ tmp2[1][0] = d3; tmp2[1][1] = d2; tmp2[1][2] = d; tmp2[1][3] = 0;
+ tmp2[2][0] = 6*d3; tmp2[2][1] = 2*d2; tmp2[2][2] = 0; tmp2[2][3] = 0;
+ tmp2[3][0] = 6*d3; tmp2[3][1] = 0; tmp2[3][2] = 0; tmp2[3][3] = 0;
+
+ /* compose the basis and geometry matrices */
+
+ static const float CR_basis[4][4] = {
+ { -0.5, 1.5, -1.5, 0.5 },
+ { 1.0, -2.5, 2.0, -0.5 },
+ { -0.5, 0.0, 0.5, 0.0 },
+ { 0.0, 1.0, 0.0, 0.0 },
+ };
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ tmp1[i][j] = (CR_basis[i][0] * geometry[0][j] +
+ CR_basis[i][1] * geometry[1][j] +
+ CR_basis[i][2] * geometry[2][j] +
+ CR_basis[i][3] * geometry[3][j]);
+ }
+ }
+ /* compose the above results to get the deltas matrix */
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ deltas[i][j] = (tmp2[i][0] * tmp1[0][j] +
+ tmp2[i][1] * tmp1[1][j] +
+ tmp2[i][2] * tmp1[2][j] +
+ tmp2[i][3] * tmp1[3][j]);
+ }
+ }
+
+
+ /* extract the x deltas */
+ x = deltas[0][0];
+ dx = deltas[1][0];
+ dx2 = deltas[2][0];
+ dx3 = deltas[3][0];
+
+ /* extract the y deltas */
+ y = deltas[0][1];
+ dy = deltas[1][1];
+ dy2 = deltas[2][1];
+ dy3 = deltas[3][1];
+
+
+ lastx = CLAMP (x, 0, xmax);
+ lasty = CLAMP (y, 0, ymax);
+
+ /* if (fix255)
+ {
+ cd->curve[cd->outline][lastx] = lasty;
+ }
+ else
+ {
+ cd->curve_ptr[cd->outline][lastx] = lasty;
+ if(gb_debug) printf("bender_plot_curve xmax:%d ymax:%d\n", (int)xmax, (int)ymax);
+ }
+*/
+ /* loop over the curve */
+ for (i = 0; i < ntimes; i++)
+ {
+ /* increment the x values */
+ x += dx;
+ dx += dx2;
+ dx2 += dx3;
+
+ /* increment the y values */
+ y += dy;
+ dy += dy2;
+ dy2 += dy3;
+
+ newx = CLAMP ((Math::round (x)), 0, xmax);
+ newy = CLAMP ((Math::round (y)), 0, ymax);
+
+ /* if this point is different than the last one...then draw it */
+ if ((lastx != newx) || (lasty != newy))
+ {
+#if 0
+ if(fix255)
+ {
+ /* use fixed array size (for the curve graph) */
+ cd->curve[cd->outline][newx] = newy;
+ }
+ else
+ {
+ /* use dynamic allocated curve_ptr (for the real curve) */
+ cd->curve_ptr[cd->outline][newx] = newy;
+
+ if(gb_debug) printf("outline: %d cX: %d cY: %d\n", (int)cd->outline, (int)newx, (int)newy);
+ }
+#endif
+ draw_line(Vector2(lastx,ymax-lasty),Vector2(newx,ymax-newy),Color(0.8,0.8,0.8,0.8),2.0);
+ }
+
+ lastx = newx;
+ lasty = newy;
+ }
+}
+
+
+void GraphCurveMapEdit::_notification(int p_what){
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ draw_style_box(get_stylebox("bg","Tree"),Rect2(Point2(),get_size()));
+
+ int w = get_size().x;
+ int h = get_size().y;
+
+ Vector2 prev=Vector2(0,0);
+ Vector2 prev2=Vector2(0,0);
+
+ for(int i=-1;i<points.size();i++) {
+
+ Vector2 next;
+ Vector2 next2;
+ if (i+1>=points.size()) {
+ next=Vector2(1,1);
+ } else {
+ next=Vector2(points[i+1].offset,points[i+1].height);
+ }
+
+ if (i+2>=points.size()) {
+ next2=Vector2(1,1);
+ } else {
+ next2=Vector2(points[i+2].offset,points[i+2].height);
+ }
+
+ /*if (i==-1 && prev.offset==next.offset) {
+ prev=next;
+ continue;
+ }*/
+
+ _plot_curve(prev2,prev,next,next2);
+
+ prev2=prev;
+ prev=next;
+ }
+
+ for(int i=0;i<points.size();i++) {
+
+ Color col=i==grabbed?Color(1,0.0,0.0,0.9):Color(1,1,1,0.8);
+
+
+ draw_rect(Rect2( Vector2(points[i].offset,1.0-points[i].height)*get_size()-Vector2(2,2),Vector2(5,5)),col);
+ }
+
+ /* if (grabbed!=-1) {
+
+ draw_rect(Rect2(total_w+3,0,h,h),points[grabbed].color);
+ }
+*/
+ if (has_focus()) {
+
+ draw_line(Vector2(-1,-1),Vector2(w+1,-1),Color(1,1,1,0.6));
+ draw_line(Vector2(w+1,-1),Vector2(w+1,h+1),Color(1,1,1,0.6));
+ draw_line(Vector2(w+1,h+1),Vector2(-1,h+1),Color(1,1,1,0.6));
+ draw_line(Vector2(-1,-1),Vector2(-1,h+1),Color(1,1,1,0.6));
+ }
+
+ }
+}
+
+Size2 GraphCurveMapEdit::get_minimum_size() const {
+
+ return Vector2(64,64);
+}
+
+
+
+void GraphCurveMapEdit::set_points(const Vector<Vector2>& p_points) {
+
+
+ points.clear();
+ for(int i=0;i<p_points.size();i++) {
+ Point p;
+ p.offset=p_points[i].x;
+ p.height=p_points[i].y;
+ points.push_back(p);
+ }
+
+ points.sort();
+ update();
+}
+
+Vector<Vector2> GraphCurveMapEdit::get_points() const {
+ Vector<Vector2> ret;
+ for(int i=0;i<points.size();i++)
+ ret.push_back(Vector2(points[i].offset,points[i].height));
+ return ret;
+}
+
+void GraphCurveMapEdit::_bind_methods(){
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&GraphCurveMapEdit::_gui_input);
+ ADD_SIGNAL(MethodInfo("curve_changed"));
+}
+
+GraphCurveMapEdit::GraphCurveMapEdit(){
+
+ grabbed=-1;
+ grabbing=false;
+ set_focus_mode(FOCUS_ALL);
+
+}
+
+
+////cbacks
+///
+void ShaderGraphView::_scalar_const_changed(double p_value,int p_id) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Scalar Constant"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"scalar_const_node_set_value",type,p_id,p_value);
+ ur->add_undo_method(graph.ptr(),"scalar_const_node_set_value",type,p_id,graph->scalar_const_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+
+void ShaderGraphView::_vec_const_changed(double p_value, int p_id,Array p_arr){
+
+ Vector3 val;
+ for(int i=0;i<p_arr.size();i++) {
+ val[i]=p_arr[i].call("get_val");
+ }
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Vec Constant"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"vec_const_node_set_value",type,p_id,val);
+ ur->add_undo_method(graph.ptr(),"vec_const_node_set_value",type,p_id,graph->vec_const_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_rgb_const_changed(const Color& p_color, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change RGB Constant"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"rgb_const_node_set_value",type,p_id,p_color);
+ ur->add_undo_method(graph.ptr(),"rgb_const_node_set_value",type,p_id,graph->rgb_const_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_scalar_op_changed(int p_op, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Scalar Operator"));
+ ur->add_do_method(graph.ptr(),"scalar_op_node_set_op",type,p_id,p_op);
+ ur->add_undo_method(graph.ptr(),"scalar_op_node_set_op",type,p_id,graph->scalar_op_node_get_op(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_vec_op_changed(int p_op, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Vec Operator"));
+ ur->add_do_method(graph.ptr(),"vec_op_node_set_op",type,p_id,p_op);
+ ur->add_undo_method(graph.ptr(),"vec_op_node_set_op",type,p_id,graph->vec_op_node_get_op(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+void ShaderGraphView::_vec_scalar_op_changed(int p_op, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Vec Scalar Operator"));
+ ur->add_do_method(graph.ptr(),"vec_scalar_op_node_set_op",type,p_id,p_op);
+ ur->add_undo_method(graph.ptr(),"vec_scalar_op_node_set_op",type,p_id,graph->vec_scalar_op_node_get_op(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_rgb_op_changed(int p_op, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change RGB Operator"));
+ ur->add_do_method(graph.ptr(),"rgb_op_node_set_op",type,p_id,p_op);
+ ur->add_undo_method(graph.ptr(),"rgb_op_node_set_op",type,p_id,graph->rgb_op_node_get_op(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+void ShaderGraphView::_xform_inv_rev_changed(bool p_enabled, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Toggle Rot Only"));
+ ur->add_do_method(graph.ptr(),"xform_vec_mult_node_set_no_translation",type,p_id,p_enabled);
+ ur->add_undo_method(graph.ptr(),"xform_vec_mult_node_set_no_translation",type,p_id,graph->xform_vec_mult_node_get_no_translation(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+void ShaderGraphView::_scalar_func_changed(int p_func, int p_id){
+
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Scalar Function"));
+ ur->add_do_method(graph.ptr(),"scalar_func_node_set_function",type,p_id,p_func);
+ ur->add_undo_method(graph.ptr(),"scalar_func_node_set_function",type,p_id,graph->scalar_func_node_get_function(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+void ShaderGraphView::_vec_func_changed(int p_func, int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Vec Function"));
+ ur->add_do_method(graph.ptr(),"vec_func_node_set_function",type,p_id,p_func);
+ ur->add_undo_method(graph.ptr(),"vec_func_node_set_function",type,p_id,graph->vec_func_node_get_function(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_scalar_input_changed(double p_value,int p_id){
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Scalar Uniform"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"scalar_input_node_set_value",type,p_id,p_value);
+ ur->add_undo_method(graph.ptr(),"scalar_input_node_set_value",type,p_id,graph->scalar_input_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_vec_input_changed(double p_value, int p_id,Array p_arr){
+
+ Vector3 val;
+ for(int i=0;i<p_arr.size();i++) {
+ val[i]=p_arr[i].call("get_val");
+ }
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Vec Uniform"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"vec_input_node_set_value",type,p_id,val);
+ ur->add_undo_method(graph.ptr(),"vec_input_node_set_value",type,p_id,graph->vec_input_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+void ShaderGraphView::_xform_input_changed(int p_id, Node *p_button){
+
+
+ ToolButton *tb = p_button->cast_to<ToolButton>();
+ ped_popup->set_pos(tb->get_global_pos()+Vector2(0,tb->get_size().height));
+ ped_popup->set_size(tb->get_size());
+ edited_id=p_id;
+ edited_def=-1;
+ ped_popup->edit(NULL,"",Variant::TRANSFORM,graph->xform_input_node_get_value(type,p_id),PROPERTY_HINT_NONE,"");
+ ped_popup->popup();
+
+}
+void ShaderGraphView::_xform_const_changed(int p_id, Node *p_button){
+
+ ToolButton *tb = p_button->cast_to<ToolButton>();
+ ped_popup->set_pos(tb->get_global_pos()+Vector2(0,tb->get_size().height));
+ ped_popup->set_size(tb->get_size());
+ edited_id=p_id;
+ edited_def=-1;
+ ped_popup->edit(NULL,"",Variant::TRANSFORM,graph->xform_const_node_get_value(type,p_id),PROPERTY_HINT_NONE,"");
+ ped_popup->popup();
+
+}
+
+void ShaderGraphView::_rgb_input_changed(const Color& p_color, int p_id){
+
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change RGB Uniform"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"rgb_input_node_set_value",type,p_id,p_color);
+ ur->add_undo_method(graph.ptr(),"rgb_input_node_set_value",type,p_id,graph->rgb_input_node_get_value(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+void ShaderGraphView::_tex_input_change(int p_id, Node *p_button){
+
+
+}
+void ShaderGraphView::_cube_input_change(int p_id){
+
+
+}
+
+void ShaderGraphView::_variant_edited() {
+
+ if (edited_def != -1) {
+
+ Variant v = ped_popup->get_variant();
+ Variant v2 = graph->default_get_value(type,edited_id,edited_def);
+ if (v2.get_type() == Variant::NIL)
+ switch (v.get_type()) {
+ case Variant::VECTOR3:
+ v2=Vector3();
+ break;
+ case Variant::REAL:
+ v2=0.0;
+ break;
+ case Variant::TRANSFORM:
+ v2=Transform();
+ break;
+ case Variant::COLOR:
+ v2=Color();
+ break;
+ default: {}
+ }
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Default Value"));
+ ur->add_do_method(graph.ptr(),"default_set_value",type,edited_id,edited_def, v);
+ ur->add_undo_method(graph.ptr(),"default_set_value",type,edited_id,edited_def, v2);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ return;
+ }
+
+ if (graph->node_get_type(type,edited_id)==ShaderGraph::NODE_XFORM_CONST) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change XForm Uniform"));
+ ur->add_do_method(graph.ptr(),"xform_const_node_set_value",type,edited_id,ped_popup->get_variant());
+ ur->add_undo_method(graph.ptr(),"xform_const_node_set_value",type,edited_id,graph->xform_const_node_get_value(type,edited_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ }
+
+
+ if (graph->node_get_type(type,edited_id)==ShaderGraph::NODE_XFORM_INPUT) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change XForm Uniform"));
+ ur->add_do_method(graph.ptr(),"xform_input_node_set_value",type,edited_id,ped_popup->get_variant());
+ ur->add_undo_method(graph.ptr(),"xform_input_node_set_value",type,edited_id,graph->xform_input_node_get_value(type,edited_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ }
+
+ if (graph->node_get_type(type,edited_id)==ShaderGraph::NODE_TEXTURE_INPUT) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Texture Uniform"));
+ ur->add_do_method(graph.ptr(),"texture_input_node_set_value",type,edited_id,ped_popup->get_variant());
+ ur->add_undo_method(graph.ptr(),"texture_input_node_set_value",type,edited_id,graph->texture_input_node_get_value(type,edited_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ }
+
+ if (graph->node_get_type(type,edited_id)==ShaderGraph::NODE_CUBEMAP_INPUT) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Cubemap Uniform"));
+ ur->add_do_method(graph.ptr(),"cubemap_input_node_set_value",type,edited_id,ped_popup->get_variant());
+ ur->add_undo_method(graph.ptr(),"cubemap_input_node_set_value",type,edited_id,graph->cubemap_input_node_get_value(type,edited_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ }
+
+}
+
+void ShaderGraphView::_comment_edited(int p_id,Node* p_button) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ TextEdit *te=p_button->cast_to<TextEdit>();
+ ur->create_action(TTR("Change Comment"),UndoRedo::MERGE_ENDS);
+ ur->add_do_method(graph.ptr(),"comment_node_set_text",type,p_id,te->get_text());
+ ur->add_undo_method(graph.ptr(),"comment_node_set_text",type,p_id,graph->comment_node_get_text(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+
+}
+
+void ShaderGraphView::_color_ramp_changed(int p_id,Node* p_ramp) {
+
+ GraphColorRampEdit *cr=p_ramp->cast_to<GraphColorRampEdit>();
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+
+ Vector<float> offsets=cr->get_offsets();
+ Vector<Color> colors=cr->get_colors();
+
+ PoolVector<float> new_offsets;
+ PoolVector<Color> new_colors;
+ {
+ new_offsets.resize(offsets.size());
+ new_colors.resize(colors.size());
+ PoolVector<float>::Write ow=new_offsets.write();
+ PoolVector<Color>::Write cw=new_colors.write();
+ for(int i=0;i<new_offsets.size();i++) {
+ ow[i]=offsets[i];
+ cw[i]=colors[i];
+ }
+
+ }
+
+
+ PoolVector<float> old_offsets=graph->color_ramp_node_get_offsets(type,p_id);
+ PoolVector<Color> old_colors=graph->color_ramp_node_get_colors(type,p_id);
+
+ if (old_offsets.size()!=new_offsets.size())
+ ur->create_action(TTR("Add/Remove to Color Ramp"));
+ else
+ ur->create_action(TTR("Modify Color Ramp"),UndoRedo::MERGE_ENDS);
+
+ ur->add_do_method(graph.ptr(),"color_ramp_node_set_ramp",type,p_id,new_colors,new_offsets);
+ ur->add_undo_method(graph.ptr(),"color_ramp_node_set_ramp",type,p_id,old_colors,old_offsets);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+
+void ShaderGraphView::_curve_changed(int p_id,Node* p_curve) {
+
+ GraphCurveMapEdit *cr=p_curve->cast_to<GraphCurveMapEdit>();
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+
+ Vector<Point2> points=cr->get_points();
+
+ PoolVector<Vector2> new_points;
+ {
+ new_points.resize(points.size());
+ PoolVector<Vector2>::Write ow=new_points.write();
+ for(int i=0;i<new_points.size();i++) {
+ ow[i]=points[i];
+ }
+
+ }
+
+
+ PoolVector<Vector2> old_points=graph->curve_map_node_get_points(type,p_id);
+
+ if (old_points.size()!=new_points.size())
+ ur->create_action(TTR("Add/Remove to Curve Map"));
+ else
+ ur->create_action(TTR("Modify Curve Map"),UndoRedo::MERGE_ENDS);
+
+ ur->add_do_method(graph.ptr(),"curve_map_node_set_points",type,p_id,new_points);
+ ur->add_undo_method(graph.ptr(),"curve_map_node_set_points",type,p_id,old_points);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+}
+
+
+void ShaderGraphView::_input_name_changed(const String& p_name, int p_id, Node *p_line_edit) {
+
+ LineEdit *le=p_line_edit->cast_to<LineEdit>();
+ ERR_FAIL_COND(!le);
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Input Name"));
+ ur->add_do_method(graph.ptr(),"input_node_set_name",type,p_id,p_name);
+ ur->add_undo_method(graph.ptr(),"input_node_set_name",type,p_id,graph->input_node_get_name(type,p_id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ block_update=true;
+ ur->commit_action();
+ block_update=false;
+ le->set_text(graph->input_node_get_name(type,p_id));
+}
+
+void ShaderGraphView::_tex_edited(int p_id,Node* p_button) {
+
+ ToolButton *tb = p_button->cast_to<ToolButton>();
+ ped_popup->set_pos(tb->get_global_pos()+Vector2(0,tb->get_size().height));
+ ped_popup->set_size(tb->get_size());
+ edited_id=p_id;
+ edited_def=-1;
+ ped_popup->edit(NULL,"",Variant::OBJECT,graph->texture_input_node_get_value(type,p_id),PROPERTY_HINT_RESOURCE_TYPE,"Texture");
+}
+
+void ShaderGraphView::_cube_edited(int p_id,Node* p_button) {
+
+ ToolButton *tb = p_button->cast_to<ToolButton>();
+ ped_popup->set_pos(tb->get_global_pos()+Vector2(0,tb->get_size().height));
+ ped_popup->set_size(tb->get_size());
+ edited_id=p_id;
+ edited_def=-1;
+ ped_popup->edit(NULL,"",Variant::OBJECT,graph->cubemap_input_node_get_value(type,p_id),PROPERTY_HINT_RESOURCE_TYPE,"CubeMap");
+}
+
+
+//////////////view/////////////
+
+
+void ShaderGraphView::_connection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+ int from_idx=-1;
+ int to_idx=-1;
+ for (Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+
+ if (p_from==E->get()->get_name())
+ from_idx=E->key();
+ if (p_to==E->get()->get_name())
+ to_idx=E->key();
+ }
+
+ ERR_FAIL_COND(from_idx==-1);
+ ERR_FAIL_COND(to_idx==-1);
+
+ ur->create_action(TTR("Connect Graph Nodes"));
+
+ List<ShaderGraph::Connection> conns;
+
+ graph->get_node_connections(type,&conns);
+ //disconnect/reconnect dependencies
+ ur->add_undo_method(graph.ptr(),"disconnect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ for(List<ShaderGraph::Connection>::Element *E=conns.front();E;E=E->next()) {
+
+ if (E->get().dst_id==to_idx && E->get().dst_slot==p_to_slot) {
+ ur->add_do_method(graph.ptr(),"disconnect_node",type,E->get().src_id,E->get().src_slot,E->get().dst_id,E->get().dst_slot);
+ ur->add_undo_method(graph.ptr(),"connect_node",type,E->get().src_id,E->get().src_slot,E->get().dst_id,E->get().dst_slot);
+ }
+ }
+ ur->add_do_method(graph.ptr(),"connect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+
+}
+
+void ShaderGraphView::_disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+
+ int from_idx=-1;
+ int to_idx=-1;
+ for (Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+
+ if (p_from==E->get()->get_name())
+ from_idx=E->key();
+ if (p_to==E->get()->get_name())
+ to_idx=E->key();
+ }
+
+ ERR_FAIL_COND(from_idx==-1);
+ ERR_FAIL_COND(to_idx==-1);
+
+ if (!graph->is_node_connected(type,from_idx,p_from_slot,to_idx,p_to_slot))
+ return; //nothing to disconnect
+
+ ur->create_action(TTR("Disconnect Graph Nodes"));
+
+ List<ShaderGraph::Connection> conns;
+
+ graph->get_node_connections(type,&conns);
+ //disconnect/reconnect dependencies
+ ur->add_do_method(graph.ptr(),"disconnect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ ur->add_undo_method(graph.ptr(),"connect_node",type,from_idx,p_from_slot,to_idx,p_to_slot);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+
+}
+
+void ShaderGraphView::_node_removed(int p_id) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Remove Shader Graph Node"));
+
+ ur->add_do_method(graph.ptr(),"node_remove",type,p_id);
+ ur->add_undo_method(graph.ptr(),"node_add",type,graph->node_get_type(type,p_id),p_id);
+ ur->add_undo_method(graph.ptr(),"node_set_state",type,p_id,graph->node_get_state(type,p_id));
+ List<ShaderGraph::Connection> conns;
+
+ graph->get_node_connections(type,&conns);
+ for(List<ShaderGraph::Connection>::Element *E=conns.front();E;E=E->next()) {
+
+ if (E->get().dst_id==p_id || E->get().src_id==p_id) {
+ ur->add_undo_method(graph.ptr(),"connect_node",type,E->get().src_id,E->get().src_slot,E->get().dst_id,E->get().dst_slot);
+ }
+ }
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+}
+
+void ShaderGraphView::_begin_node_move()
+{
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Move Shader Graph Node"));
+}
+
+void ShaderGraphView::_node_moved(const Vector2& p_from, const Vector2& p_to,int p_id) {
+
+
+ ERR_FAIL_COND(!node_map.has(p_id));
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->add_do_method(this,"_move_node",p_id,p_to);
+ ur->add_undo_method(this,"_move_node",p_id,p_from);
+}
+
+void ShaderGraphView::_end_node_move()
+{
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->commit_action();
+}
+
+void ShaderGraphView::_move_node(int p_id,const Vector2& p_to) {
+
+ ERR_FAIL_COND(!node_map.has(p_id));
+ node_map[p_id]->set_offset(p_to);
+ graph->node_set_pos(type,p_id,p_to);
+}
+
+void ShaderGraphView::_duplicate_nodes_request()
+{
+ Array s_id;
+
+ for(Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+ ShaderGraph::NodeType t=graph->node_get_type(type, E->key());
+ if (t==ShaderGraph::NODE_OUTPUT || t==ShaderGraph::NODE_INPUT)
+ continue;
+ GraphNode *gn = E->get();
+ if (gn && gn->is_selected())
+ s_id.push_back(E->key());
+ }
+
+ if (s_id.size()==0)
+ return;
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Duplicate Graph Node(s)"));
+ ur->add_do_method(this,"_duplicate_nodes",s_id);
+ List<int> n_ids = graph->generate_ids(type, s_id.size());
+ for (List<int>::Element *E=n_ids.front();E;E=E->next())
+ ur->add_undo_method(graph.ptr(),"node_remove",type,E->get());
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+}
+
+void ShaderGraphView::_duplicate_nodes(const Array &p_nodes)
+{
+ List<int> n = List<int>();
+ for (int i=0; i<p_nodes.size();i++)
+ n.push_back(p_nodes.get(i));
+ graph->duplicate_nodes(type, n);
+ call_deferred("_update_graph");
+}
+
+void ShaderGraphView::_delete_nodes_request()
+{
+ List<int> s_id=List<int>();
+
+ for(Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+ ShaderGraph::NodeType t=graph->node_get_type(type, E->key());
+ if (t==ShaderGraph::NODE_OUTPUT)
+ continue;
+ GraphNode *gn = E->get();
+ if (gn && gn->is_selected())
+ s_id.push_back(E->key());
+ }
+
+ if (s_id.size()==0)
+ return;
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Delete Shader Graph Node(s)"));
+
+ for (List<int>::Element *N=s_id.front();N;N=N->next()) {
+ ur->add_do_method(graph.ptr(),"node_remove",type,N->get());
+ ur->add_undo_method(graph.ptr(),"node_add",type,graph->node_get_type(type,N->get()),N->get());
+ ur->add_undo_method(graph.ptr(),"node_set_state",type,N->get(),graph->node_get_state(type,N->get()));
+ List<ShaderGraph::Connection> conns;
+
+ graph->get_node_connections(type,&conns);
+ for(List<ShaderGraph::Connection>::Element *E=conns.front();E;E=E->next()) {
+
+ if (E->get().dst_id==N->get() || E->get().src_id==N->get()) {
+ ur->add_undo_method(graph.ptr(),"connect_node",type,E->get().src_id,E->get().src_slot,E->get().dst_id,E->get().dst_slot);
+ }
+ }
+ }
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+}
+
+void ShaderGraphView::_default_changed(int p_id, Node *p_button, int p_param, int v_type, String p_hint)
+{
+ ToolButton *tb = p_button->cast_to<ToolButton>();
+ ped_popup->set_pos(tb->get_global_pos()+Vector2(0,tb->get_size().height));
+ ped_popup->set_size(tb->get_size());
+ edited_id=p_id;
+ edited_def=p_param;
+ Variant::Type vt = (Variant::Type)v_type;
+ Variant v = graph->default_get_value(type,p_id,edited_def);
+ int h=PROPERTY_HINT_NONE;
+ if (v.get_type() == Variant::NIL)
+ switch (vt) {
+ case Variant::VECTOR3:
+ v=Vector3();
+ break;
+ case Variant::REAL:
+ h=PROPERTY_HINT_RANGE;
+ v=0.0;
+ break;
+ case Variant::TRANSFORM:
+ v=Transform();
+ break;
+ case Variant::COLOR:
+ h=PROPERTY_HINT_COLOR_NO_ALPHA;
+ v=Color();
+ break;
+ default: {}
+ }
+
+ ped_popup->edit(NULL,"",vt,v,h,p_hint);
+
+ ped_popup->popup();
+}
+
+ToolButton *ShaderGraphView::make_label(String text, Variant::Type v_type) {
+ ToolButton *l = memnew( ToolButton );
+ l->set_text(text);
+ l->set_text_align(ToolButton::ALIGN_LEFT);
+ l->add_style_override("hover", l->get_stylebox("normal", "ToolButton"));
+ l->add_style_override("pressed", l->get_stylebox("normal", "ToolButton"));
+ l->add_style_override("focus", l->get_stylebox("normal", "ToolButton"));
+ switch (v_type) {
+ case Variant::REAL:
+ l->set_icon(ped_popup->get_icon("Real", "EditorIcons"));
+ break;
+ case Variant::VECTOR3:
+ l->set_icon(ped_popup->get_icon("Vector", "EditorIcons"));
+ break;
+ case Variant::TRANSFORM:
+ l->set_icon(ped_popup->get_icon("Matrix", "EditorIcons"));
+ break;
+ case Variant::COLOR:
+ l->set_icon(ped_popup->get_icon("Color", "EditorIcons"));
+ break;
+ default: {}
+ }
+ return l;
+}
+
+ToolButton *ShaderGraphView::make_editor(String text,GraphNode* gn,int p_id,int param,Variant::Type v_type, String p_hint) {
+ ToolButton *edit = memnew( ToolButton );
+ edit->set_text(text);
+ edit->set_text_align(ToolButton::ALIGN_LEFT);
+ edit->set_flat(false);
+ edit->add_style_override("normal", gn->get_stylebox("defaultframe", "GraphNode"));
+ edit->add_style_override("hover", gn->get_stylebox("defaultframe", "GraphNode"));
+ edit->add_style_override("pressed", gn->get_stylebox("defaultframe", "GraphNode"));
+ edit->add_style_override("focus", gn->get_stylebox("defaultfocus", "GraphNode"));
+ edit->connect("pressed",this,"_default_changed",varray(p_id,edit,param,v_type,p_hint));
+
+ switch (v_type) {
+ case Variant::REAL:
+ edit->set_icon(ped_popup->get_icon("Real", "EditorIcons"));
+ break;
+ case Variant::VECTOR3:
+ edit->set_icon(ped_popup->get_icon("Vector", "EditorIcons"));
+ break;
+ case Variant::TRANSFORM:
+ edit->set_icon(ped_popup->get_icon("Matrix", "EditorIcons"));
+ break;
+ case Variant::COLOR: {
+ Image icon_color = Image(15,15,false,Image::FORMAT_RGB8);
+ Color c = graph->default_get_value(type,p_id,param);
+ for (int x=1;x<14;x++)
+ for (int y=1;y<14;y++)
+ icon_color.put_pixel(x,y,c);
+ Ref<ImageTexture> t;
+ t.instance();
+ t->create_from_image(icon_color);
+ edit->set_icon(t);
+ } break;
+ default: {}
+ }
+ return edit;
+}
+
+void ShaderGraphView::_create_node(int p_id) {
+
+
+ GraphNode *gn = memnew( GraphNode );
+ gn->set_show_close_button(true);
+ Color typecol[4]={
+ Color(0.9,0.4,1),
+ Color(0.8,1,0.2),
+ Color(1,0.2,0.2),
+ Color(0,1,1)
+ };
+
+ const String hint_spin = "-65536,65535,0.001";
+ const String hint_slider = "0.0,1.0,0.01,slider";
+
+
+ switch(graph->node_get_type(type,p_id)) {
+
+ case ShaderGraph::NODE_INPUT: {
+
+ gn->set_title("Input");
+
+ List<ShaderGraph::SlotInfo> si;
+ ShaderGraph::get_input_output_node_slot_info(graph->get_mode(),type,&si);
+
+ int idx=0;
+ for (List<ShaderGraph::SlotInfo>::Element *E=si.front();E;E=E->next()) {
+ ShaderGraph::SlotInfo& s=E->get();
+ if (s.dir==ShaderGraph::SLOT_IN) {
+
+ Label *l= memnew( Label );
+ l->set_text(s.name);
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+ gn->set_slot(idx,false,0,Color(),true,s.type,typecol[s.type]);
+ idx++;
+ }
+ }
+
+ } break; // all inputs (case Shader type dependent)
+ case ShaderGraph::NODE_SCALAR_CONST: {
+ gn->set_title("Scalar");
+ SpinBox *sb = memnew( SpinBox );
+ sb->set_min(-100000);
+ sb->set_max(100000);
+ sb->set_step(0.001);
+ sb->set_val(graph->scalar_const_node_get_value(type,p_id));
+ sb->connect("value_changed",this,"_scalar_const_changed",varray(p_id));
+ gn->add_child(sb);
+ gn->set_slot(0,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; //scalar constant
+ case ShaderGraph::NODE_VEC_CONST: {
+
+ gn->set_title("Vector");
+ Array v3p(true);
+ for(int i=0;i<3;i++) {
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ Label *l = memnew( Label );
+ l->set_text(String::chr('X'+i));
+ hbc->add_child(l);
+ SpinBox *sb = memnew( SpinBox );
+ sb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ sb->set_min(-100000);
+ sb->set_max(100000);
+ sb->set_step(0.001);
+ sb->set_val(graph->vec_const_node_get_value(type,p_id)[i]);
+ sb->connect("value_changed",this,"_vec_const_changed",varray(p_id,v3p));
+ v3p.push_back(sb);
+ hbc->add_child(sb);
+ gn->add_child(hbc);
+ }
+ gn->set_slot(0,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+ } break; //vec3 constant
+ case ShaderGraph::NODE_RGB_CONST: {
+
+ gn->set_title("Color");
+ ColorPickerButton *cpb = memnew( ColorPickerButton );
+ cpb->set_color(graph->rgb_const_node_get_value(type,p_id));
+ cpb->connect("color_changed",this,"_rgb_const_changed",varray(p_id));
+ gn->add_child(cpb);
+ Label *l = memnew( Label );
+ l->set_text("RGB");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+ l = memnew( Label );
+ l->set_text("Alpha");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; //rgb constant (shows a color picker instead)
+ case ShaderGraph::NODE_XFORM_CONST: {
+ gn->set_title("XForm");
+ ToolButton *edit = memnew( ToolButton );
+ edit->set_text("edit..");
+ edit->connect("pressed",this,"_xform_const_changed",varray(p_id,edit));
+ gn->add_child(edit);
+ gn->set_slot(0,false,0,Color(),true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM]);
+
+ } break; // 4x4 matrix constant
+ case ShaderGraph::NODE_TIME: {
+
+ gn->set_title("Time");
+ Label *l = memnew( Label );
+ l->set_text("(s)");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+ gn->set_slot(0,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; // time in seconds
+ case ShaderGraph::NODE_SCREEN_TEX: {
+
+ gn->set_title("ScreenTex");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (!graph->is_slot_connected(type,p_id,0)) {
+ Vector3 v = graph->default_get_value(type, p_id, 0);
+ hbc->add_child(make_editor("UV: " + v,gn,p_id,0,Variant::VECTOR3));
+ } else {
+ hbc->add_child(make_label("UV",Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("RGB")));
+ gn->add_child(hbc);
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+ } break; // screen texture sampler (takes UV) (only usable in fragment case Shader)
+ case ShaderGraph::NODE_SCALAR_OP: {
+
+ gn->set_title("ScalarOp");
+ static const char* op_name[ShaderGraph::SCALAR_MAX_OP]={
+ ("Add"),
+ ("Sub"),
+ ("Mul"),
+ ("Div"),
+ ("Mod"),
+ ("Pow"),
+ ("Max"),
+ ("Min"),
+ ("Atan2")
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::SCALAR_MAX_OP;i++) {
+
+ ob->add_item(op_name[i],i);
+ }
+
+ ob->select(graph->scalar_op_node_get_op(type,p_id));
+ ob->connect("item_selected",this,"_scalar_op_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a",Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+Variant(v),gn,p_id,0,Variant::REAL,hint_spin));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b",Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+Variant(v),gn,p_id,1,Variant::REAL,hint_spin));
+ }
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+
+
+ } break; // scalar vs scalar op (mul: { } break; add: { } break; div: { } break; etc)
+ case ShaderGraph::NODE_VEC_OP: {
+
+ gn->set_title("VecOp");
+ static const char* op_name[ShaderGraph::VEC_MAX_OP]={
+ ("Add"),
+ ("Sub"),
+ ("Mul"),
+ ("Div"),
+ ("Mod"),
+ ("Pow"),
+ ("Max"),
+ ("Min"),
+ ("Cross")
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::VEC_MAX_OP;i++) {
+
+ ob->add_item(op_name[i],i);
+ }
+
+ ob->select(graph->vec_op_node_get_op(type,p_id));
+ ob->connect("item_selected",this,"_vec_op_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a",Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b",Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+v,gn,p_id,1,Variant::VECTOR3));
+ }
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+
+
+ } break; // vec3 vs vec3 op (mul: { } break;ad: { } break;div: { } break;crossprod: { } break;etc)
+ case ShaderGraph::NODE_VEC_SCALAR_OP: {
+
+ gn->set_title("VecScalarOp");
+ static const char* op_name[ShaderGraph::VEC_SCALAR_MAX_OP]={
+ ("Mul"),
+ ("Div"),
+ ("Pow"),
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::VEC_SCALAR_MAX_OP;i++) {
+
+ ob->add_item(op_name[i],i);
+ }
+
+ ob->select(graph->vec_scalar_op_node_get_op(type,p_id));
+ ob->connect("item_selected",this,"_vec_scalar_op_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a",Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b",Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+Variant(v),gn,p_id,1,Variant::REAL,hint_spin));
+ }
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+
+
+ } break; // vec3 vs scalar op (mul: { } break; add: { } break; div: { } break; etc)
+ case ShaderGraph::NODE_RGB_OP: {
+
+ gn->set_title("RGB Op");
+ static const char* op_name[ShaderGraph::RGB_MAX_OP]={
+ ("Screen"),
+ ("Difference"),
+ ("Darken"),
+ ("Lighten"),
+ ("Overlay"),
+ ("Dodge"),
+ ("Burn"),
+ ("SoftLight"),
+ ("HardLight")
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::RGB_MAX_OP;i++) {
+
+ ob->add_item(op_name[i],i);
+ }
+
+ ob->select(graph->rgb_op_node_get_op(type,p_id));
+ ob->connect("item_selected",this,"_rgb_op_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a",Variant::COLOR));
+ } else {
+ hbc->add_child(make_editor(String("a: "),gn,p_id,0,Variant::COLOR));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b",Variant::COLOR));
+ } else {
+ gn->add_child(make_editor(String("b: "),gn,p_id,1,Variant::COLOR));
+ }
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+
+ } break; // vec3 vs vec3 rgb op (with scalar amount): { } break; like brighten: { } break; darken: { } break; burn: { } break; dodge: { } break; multiply: { } break; etc.
+ case ShaderGraph::NODE_XFORM_MULT: {
+
+ gn->set_title("XFMult");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a",Variant::TRANSFORM));
+ } else {
+ hbc->add_child(make_editor(String("a: edit..."),gn,p_id,0,Variant::TRANSFORM));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b",Variant::TRANSFORM));
+ } else {
+ gn->add_child(make_editor(String("b: edit..."),gn,p_id,1,Variant::TRANSFORM));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM],true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM],false,0,Color());
+
+
+ } break; // mat4 x mat4
+ case ShaderGraph::NODE_XFORM_VEC_MULT: {
+
+ gn->set_title("XFVecMult");
+
+ CheckBox *button = memnew (CheckBox("RotOnly"));
+ button->set_pressed(graph->xform_vec_mult_node_get_no_translation(type,p_id));
+ button->connect("toggled",this,"_xform_inv_rev_changed",varray(p_id));
+
+ gn->add_child(button);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("xf",Variant::TRANSFORM));
+ } else {
+ hbc->add_child(make_editor(String("xf: edit..."),gn,p_id,0,Variant::TRANSFORM));
+ }
+ hbc->add_spacer();
+ Label *l = memnew(Label("out"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("a",Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("a: ")+v,gn,p_id,1,Variant::VECTOR3));
+ }
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+
+ } break;
+ case ShaderGraph::NODE_XFORM_VEC_INV_MULT: {
+
+ gn->set_title("XFVecInvMult");
+
+
+ CheckBox *button = memnew( CheckBox("RotOnly"));
+ button->set_pressed(graph->xform_vec_mult_node_get_no_translation(type,p_id));
+ button->connect("toggled",this,"_xform_inv_rev_changed",varray(p_id));
+
+ gn->add_child(button);
+
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ gn->add_child(make_label("a",Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ gn->add_child(make_editor(String("a: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ hbc->add_child(make_label("xf", Variant::TRANSFORM));
+ } else {
+ hbc->add_child(make_editor(String("xf: edit..."),gn,p_id,1,Variant::TRANSFORM));
+ }
+ hbc->add_spacer();
+ Label *l = memnew(Label("out"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+
+ } break; // mat4 x vec3 inverse mult (with no-translation option)
+ case ShaderGraph::NODE_SCALAR_FUNC: {
+
+ gn->set_title("ScalarFunc");
+ static const char* func_name[ShaderGraph::SCALAR_MAX_FUNC]={
+ ("Sin"),
+ ("Cos"),
+ ("Tan"),
+ ("ASin"),
+ ("ACos"),
+ ("ATan"),
+ ("SinH"),
+ ("CosH"),
+ ("TanH"),
+ ("Log"),
+ ("Exp"),
+ ("Sqrt"),
+ ("Abs"),
+ ("Sign"),
+ ("Floor"),
+ ("Round"),
+ ("Ceil"),
+ ("Frac"),
+ ("Satr"),
+ ("Neg")
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::SCALAR_MAX_FUNC;i++) {
+
+ ob->add_item(func_name[i],i);
+ }
+
+ ob->select(graph->scalar_func_node_get_function(type,p_id));
+ ob->connect("item_selected",this,"_scalar_func_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("in", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("in: ")+Variant(v),gn,p_id,0,Variant::REAL,hint_spin));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+ } break; // scalar function (sin: { } break; cos: { } break; etc)
+ case ShaderGraph::NODE_VEC_FUNC: {
+
+
+
+ gn->set_title("VecFunc");
+ static const char* func_name[ShaderGraph::VEC_MAX_FUNC]={
+ ("Normalize"),
+ ("Saturate"),
+ ("Negate"),
+ ("Reciprocal"),
+ ("RGB to HSV"),
+ ("HSV to RGB"),
+ };
+
+ OptionButton *ob = memnew( OptionButton );
+ for(int i=0;i<ShaderGraph::VEC_MAX_FUNC;i++) {
+
+ ob->add_item(func_name[i],i);
+ }
+
+ ob->select(graph->vec_func_node_get_function(type,p_id));
+ ob->connect("item_selected",this,"_vec_func_changed",varray(p_id));
+ gn->add_child(ob);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("in", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("in: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("out")));
+ gn->add_child(hbc);
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+ } break; // vector function (normalize: { } break; negate: { } break; reciprocal: { } break; rgb2hsv: { } break; hsv2rgb: { } break; etc: { } break; etc)
+ case ShaderGraph::NODE_VEC_LEN: {
+ gn->set_title("VecLength");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("in", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("in: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("len")));
+ gn->add_child(hbc);
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; // vec3 length
+ case ShaderGraph::NODE_DOT_PROD: {
+
+ gn->set_title("DotProduct");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("dp")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+v,gn,p_id,1,Variant::VECTOR3));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+
+ } break; // vec3 . vec3 (dot product -> scalar output)
+ case ShaderGraph::NODE_VEC_TO_SCALAR: {
+
+ gn->set_title("Vec2Scalar");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("vec", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("vec: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("x"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+ l=memnew(Label("y"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l );
+ l=memnew(Label("z"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l);
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+ gn->set_slot(2,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+
+
+ } break; // 1 vec3 input: { } break; 3 scalar outputs
+ case ShaderGraph::NODE_SCALAR_TO_VEC: {
+
+ gn->set_title("Scalar2Vec");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("x", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("x: ")+Variant(v),gn,p_id,0,Variant::REAL));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("vec")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("y", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("y: ")+Variant(v),gn,p_id,1,Variant::REAL));
+ }
+ if (graph->is_slot_connected(type, p_id, 2)) {
+ gn->add_child(make_label("in", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,2);
+ gn->add_child(make_editor(String("in: ")+Variant(v),gn,p_id,2,Variant::REAL));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+
+ } break; // 3 scalar input: { } break; 1 vec3 output
+ case ShaderGraph::NODE_VEC_TO_XFORM: {
+
+ gn->set_title("Vec2XForm");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("x", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("x: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("xf")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("y", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("y: ")+v,gn,p_id,1,Variant::VECTOR3));
+ }
+ if (graph->is_slot_connected(type, p_id, 2)) {
+ gn->add_child(make_label("z", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,2);
+ gn->add_child(make_editor(String("z: ")+v,gn,p_id,2,Variant::VECTOR3));
+ }
+ if (graph->is_slot_connected(type, p_id, 3)) {
+ gn->add_child(make_label("ofs", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,3);
+ gn->add_child(make_editor(String("ofs: ")+v,gn,p_id,3,Variant::VECTOR3));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+ gn->set_slot(3,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+
+ } break; // 3 vec input: { } break; 1 xform output
+ case ShaderGraph::NODE_XFORM_TO_VEC: {
+
+ gn->set_title("XForm2Vec");
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("fx", Variant::TRANSFORM));
+ } else {
+ hbc->add_child(make_editor(String("fx: edit..."),gn,p_id,0,Variant::TRANSFORM));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("x"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+ l=memnew(Label("y"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l );
+ l=memnew(Label("z"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l);
+ l=memnew(Label("ofs"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l);
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(3,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+ } break; // 3 vec input: { } break; 1 xform output
+ case ShaderGraph::NODE_SCALAR_INTERP: {
+
+ gn->set_title("ScalarInterp");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+Variant(v),gn,p_id,0,Variant::REAL,hint_spin));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("interp")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+Variant(v),gn,p_id,1,Variant::REAL,hint_spin));
+ }
+ if (graph->is_slot_connected(type, p_id, 2)) {
+ gn->add_child(make_label("c", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,2);
+ gn->add_child(make_editor(String("c: ")+Variant(v),gn,p_id,2,Variant::REAL,hint_slider));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+
+
+ } break; // scalar interpolation (with optional curve)
+ case ShaderGraph::NODE_VEC_INTERP: {
+
+ gn->set_title("VecInterp");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("a", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("a: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ hbc->add_child( memnew(Label("interp")));
+ gn->add_child(hbc);
+ if (graph->is_slot_connected(type, p_id, 1)) {
+ gn->add_child(make_label("b", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,1);
+ gn->add_child(make_editor(String("b: ")+v,gn,p_id,1,Variant::VECTOR3));
+ }
+ if (graph->is_slot_connected(type, p_id, 2)) {
+ gn->add_child(make_label("c", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,2);
+ gn->add_child(make_editor(String("c: ")+Variant(v),gn,p_id,2,Variant::REAL,hint_slider));
+ }
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],false,0,Color());
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],false,0,Color());
+
+ } break; // vec3 interpolation (with optional curve)
+ case ShaderGraph::NODE_COLOR_RAMP: {
+
+ gn->set_title("ColorRamp");
+ GraphColorRampEdit * ramp = memnew( GraphColorRampEdit );
+
+ PoolVector<real_t> offsets = graph->color_ramp_node_get_offsets(type,p_id);
+ PoolVector<Color> colors = graph->color_ramp_node_get_colors(type,p_id);
+
+ int oc = offsets.size();
+
+ if (oc) {
+ PoolVector<real_t>::Read rofs = offsets.read();
+ PoolVector<Color>::Read rcol = colors.read();
+
+ Vector<float> ofsv;
+ Vector<Color> colorv;
+ for(int i=0;i<oc;i++) {
+ ofsv.push_back(rofs[i]);
+ colorv.push_back(rcol[i]);
+ }
+
+ ramp->set_ramp(ofsv,colorv);
+
+ }
+
+ ramp->connect("ramp_changed",this,"_color_ramp_changed",varray(p_id,ramp));
+ ramp->set_custom_minimum_size(Size2(128,1));
+ gn->add_child(ramp);
+
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("c", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("c: ")+Variant(v),gn,p_id,0,Variant::REAL,hint_slider));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("rgb"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+ l=memnew(Label("alpha"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child( l);
+
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(2,false,ShaderGraph::SLOT_MAX,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+ } break; // scalar interpolation (with optional curve)
+ case ShaderGraph::NODE_CURVE_MAP: {
+
+ gn->set_title("CurveMap");
+ GraphCurveMapEdit * map = memnew( GraphCurveMapEdit );
+
+ PoolVector<Vector2> points = graph->curve_map_node_get_points(type,p_id);
+
+ int oc = points.size();
+
+ if (oc) {
+ PoolVector<Vector2>::Read rofs = points.read();
+
+
+ Vector<Vector2> ofsv;
+ for(int i=0;i<oc;i++) {
+ ofsv.push_back(rofs[i]);
+ }
+
+ map->set_points(ofsv);
+
+ }
+ map->connect("curve_changed",this,"_curve_changed",varray(p_id,map));
+
+ //map->connect("map_changed",this,"_curve_map_changed",varray(p_id,map));
+ map->set_custom_minimum_size(Size2(128,64));
+ gn->add_child(map);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("c", Variant::REAL));
+ } else {
+ float v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("c: ")+Variant(v),gn,p_id,0,Variant::REAL,hint_slider));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("cmap"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child( l);
+ gn->add_child(hbc);
+
+
+ gn->set_slot(1,true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR],true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+ } break; // scalar interpolation (with optional curve)
+
+ case ShaderGraph::NODE_SCALAR_INPUT: {
+
+ gn->set_title("ScalarUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+ SpinBox *sb = memnew( SpinBox );
+ sb->set_min(-100000);
+ sb->set_max(100000);
+ sb->set_step(0.001);
+ sb->set_val(graph->scalar_input_node_get_value(type,p_id));
+ sb->connect("value_changed",this,"_scalar_input_changed",varray(p_id));
+ gn->add_child(sb);
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; // scalar uniform (assignable in material)
+ case ShaderGraph::NODE_VEC_INPUT: {
+
+ gn->set_title("VectorUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+ Array v3p(true);
+ for(int i=0;i<3;i++) {
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ Label *l = memnew( Label );
+ l->set_text(String::chr('X'+i));
+ hbc->add_child(l);
+ SpinBox *sb = memnew( SpinBox );
+ sb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ sb->set_min(-100000);
+ sb->set_max(100000);
+ sb->set_step(0.001);
+ sb->set_val(graph->vec_input_node_get_value(type,p_id)[i]);
+ sb->connect("value_changed",this,"_vec_input_changed",varray(p_id,v3p));
+ v3p.push_back(sb);
+ hbc->add_child(sb);
+ gn->add_child(hbc);
+ }
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+
+ } break; // vec3 uniform (assignable in material)
+ case ShaderGraph::NODE_RGB_INPUT: {
+
+ gn->set_title("ColorUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+ ColorPickerButton *cpb = memnew( ColorPickerButton );
+ cpb->set_color(graph->rgb_input_node_get_value(type,p_id));
+ cpb->connect("color_changed",this,"_rgb_input_changed",varray(p_id));
+ gn->add_child(cpb);
+ Label *l = memnew( Label );
+ l->set_text("RGB");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+ l = memnew( Label );
+ l->set_text("Alpha");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+
+ gn->set_slot(2,false,0,Color(),true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(3,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+ } break; // color uniform (assignable in material)
+ case ShaderGraph::NODE_XFORM_INPUT: {
+ gn->set_title("XFUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+ ToolButton *edit = memnew( ToolButton );
+ edit->set_text("edit..");
+ edit->connect("pressed",this,"_xform_input_changed",varray(p_id,edit));
+ gn->add_child(edit);
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_XFORM,typecol[ShaderGraph::SLOT_TYPE_XFORM]);
+
+ } break; // mat4 uniform (assignable in material)
+ case ShaderGraph::NODE_TEXTURE_INPUT: {
+
+ gn->set_title("TexUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+ TextureRect *tex = memnew( TextureRect );
+ tex->set_expand(true);
+ tex->set_custom_minimum_size(Size2(80,80));
+ tex->set_drag_forwarding(this);
+ gn->add_child(tex);
+ tex->set_mouse_filter(MOUSE_FILTER_PASS);
+ tex->set_texture(graph->texture_input_node_get_value(type,p_id));
+ ToolButton *edit = memnew( ToolButton );
+ edit->set_text("edit..");
+ edit->connect("pressed",this,"_tex_edited",varray(p_id,edit));
+ gn->add_child(edit);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("UV", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("UV: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("RGB"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child(l);
+ gn->add_child(hbc);
+ l = memnew( Label );
+ l->set_text("Alpha");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+
+ gn->set_slot(3,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(4,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; // texture input (assignable in material)
+ case ShaderGraph::NODE_CUBEMAP_INPUT: {
+
+ gn->set_title("TexUniform");
+ LineEdit *le = memnew( LineEdit );
+ gn->add_child(le);
+ le->set_text(graph->input_node_get_name(type,p_id));
+ le->connect("text_entered",this,"_input_name_changed",varray(p_id,le));
+
+ ToolButton *edit = memnew( ToolButton );
+ edit->set_text("edit..");
+ edit->connect("pressed",this,"_cube_edited",varray(p_id,edit));
+ gn->add_child(edit);
+
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("UV", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("UV: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("RGB"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child(l);
+ gn->add_child(hbc);
+ l = memnew( Label );
+ l->set_text("Alpha");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+
+ gn->set_slot(2,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(3,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+ } break; // cubemap input (assignable in material)
+ case ShaderGraph::NODE_DEFAULT_TEXTURE: {
+
+ gn->set_title("CanvasItemTex");
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->add_constant_override("separation",0);
+ if (graph->is_slot_connected(type, p_id, 0)) {
+ hbc->add_child(make_label("UV", Variant::VECTOR3));
+ } else {
+ Vector3 v = graph->default_get_value(type,p_id,0);
+ hbc->add_child(make_editor(String("UV: ")+v,gn,p_id,0,Variant::VECTOR3));
+ }
+ hbc->add_spacer();
+ Label *l=memnew(Label("RGB"));
+ l->set_align(Label::ALIGN_RIGHT);
+ hbc->add_child(l);
+ gn->add_child(hbc);
+ l = memnew( Label );
+ l->set_text("Alpha");
+ l->set_align(Label::ALIGN_RIGHT);
+ gn->add_child(l);
+
+ gn->set_slot(0,true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC],true,ShaderGraph::SLOT_TYPE_VEC,typecol[ShaderGraph::SLOT_TYPE_VEC]);
+ gn->set_slot(1,false,0,Color(),true,ShaderGraph::SLOT_TYPE_SCALAR,typecol[ShaderGraph::SLOT_TYPE_SCALAR]);
+
+
+ } break; // screen texture sampler (takes UV) (only usable in fragment case Shader)
+
+ case ShaderGraph::NODE_OUTPUT: {
+ gn->set_title("Output");
+ gn->set_show_close_button(false);
+
+ List<ShaderGraph::SlotInfo> si;
+ ShaderGraph::get_input_output_node_slot_info(graph->get_mode(),type,&si);
+
+ Array colors;
+ colors.push_back("Color");
+ colors.push_back("LightColor");
+ colors.push_back("Light");
+ colors.push_back("ShadowColor");
+ colors.push_back("Diffuse");
+ colors.push_back("Specular");
+ colors.push_back("Emmision");
+ Array reals;
+ reals.push_back("Alpha");
+ reals.push_back("DiffuseAlpha");
+ reals.push_back("NormalMapDepth");
+ reals.push_back("SpecExp");
+ reals.push_back("Glow");
+ reals.push_back("ShadeParam");
+ reals.push_back("SpecularExp");
+ reals.push_back("LightAlpha");
+ reals.push_back("ShadowAlpha");
+ reals.push_back("PointSize");
+ reals.push_back("Discard");
+
+ int idx=0;
+ for (List<ShaderGraph::SlotInfo>::Element *E=si.front();E;E=E->next()) {
+ ShaderGraph::SlotInfo& s=E->get();
+ if (s.dir==ShaderGraph::SLOT_OUT) {
+ Variant::Type v;
+ if (colors.find(s.name)>=0)
+ v=Variant::COLOR;
+ else if (reals.find(s.name)>=0)
+ v=Variant::REAL;
+ else
+ v=Variant::VECTOR3;
+ gn->add_child(make_label(s.name, v));
+ gn->set_slot(idx,true,s.type,typecol[s.type],false,0,Color());
+ idx++;
+ }
+ }
+
+ } break; // output (case Shader type dependent)
+ case ShaderGraph::NODE_COMMENT: {
+ gn->set_title("Comment");
+ TextEdit *te = memnew(TextEdit);
+ te->set_custom_minimum_size(Size2(100,100));
+ gn->add_child(te);
+ te->set_text(graph->comment_node_get_text(type,p_id));
+ te->connect("text_changed",this,"_comment_edited",varray(p_id,te));
+
+ } break; // comment
+
+
+
+ }
+
+ gn->connect("dragged",this,"_node_moved",varray(p_id));
+ gn->connect("close_request",this,"_node_removed",varray(p_id),CONNECT_DEFERRED);
+ graph_edit->add_child(gn);
+ node_map[p_id]=gn;
+ gn->set_offset(graph->node_get_pos(type,p_id));
+
+
+}
+
+void ShaderGraphView::_update_graph() {
+
+
+ if (block_update)
+ return;
+
+ for (Map<int,GraphNode*>::Element *E=node_map.front();E;E=E->next()) {
+
+ memdelete(E->get());
+ }
+
+ node_map.clear();
+
+ if (!graph.is_valid())
+ return;
+
+
+ List<int> nl;
+ graph->get_node_list(type,&nl);
+
+ for(List<int>::Element *E=nl.front();E;E=E->next()) {
+
+ _create_node(E->get());
+ }
+ graph_edit->clear_connections();
+
+ List<ShaderGraph::Connection> connections;
+ graph->get_node_connections(type,&connections);
+ for(List<ShaderGraph::Connection>::Element *E=connections.front();E;E=E->next()) {
+
+ ERR_CONTINUE(!node_map.has(E->get().src_id) || !node_map.has(E->get().dst_id));
+ graph_edit->connect_node(node_map[E->get().src_id]->get_name(),E->get().src_slot,node_map[E->get().dst_id]->get_name(),E->get().dst_slot);
+ }
+
+}
+
+void ShaderGraphView::_sg_updated() {
+
+ if (!graph.is_valid())
+ return;
+ switch(graph->get_graph_error(type)) {
+ case ShaderGraph::GRAPH_OK: status->set_text(""); break;
+ case ShaderGraph::GRAPH_ERROR_CYCLIC: status->set_text(TTR("Error: Cyclic Connection Link")); break;
+ case ShaderGraph::GRAPH_ERROR_MISSING_CONNECTIONS: status->set_text(TTR("Error: Missing Input Connections")); break;
+ }
+}
+
+Variant ShaderGraphView::get_drag_data_fw(const Point2 &p_point, Control *p_from)
+{
+ TextureRect* frame = p_from->cast_to<TextureRect>();
+ if (!frame)
+ return Variant();
+
+ if (!frame->get_texture().is_valid())
+ return Variant();
+
+ RES res = frame->get_texture();
+ return EditorNode::get_singleton()->drag_resource(res,p_from);
+
+ return Variant();
+}
+
+bool ShaderGraphView::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const
+{
+ if (p_data.get_type() != Variant::DICTIONARY)
+ return false;
+
+ Dictionary d = p_data;
+
+ if (d.has("type")){
+ if (d["type"] == "resource" && d.has("resource")) {
+ Variant val = d["resource"];
+
+ if (val.get_type()==Variant::OBJECT) {
+ RES res = val;
+ if (res.is_valid() && res->cast_to<Texture>())
+ return true;
+ }
+ }
+ else if (d["type"] == "files" && d.has("files")) {
+ Vector<String> files = d["files"];
+ if (files.size() != 1)
+ return false;
+ return (ResourceLoader::get_resource_type(files[0]) == "ImageTexture");
+ }
+ }
+
+ return false;
+}
+
+void ShaderGraphView::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from)
+{
+ if (!can_drop_data_fw(p_point, p_data, p_from))
+ return;
+
+ TextureRect *frame = p_from->cast_to<TextureRect>();
+ if (!frame)
+ return;
+
+ Dictionary d = p_data;
+ Ref<Texture> tex;
+
+ if (d.has("type")) {
+ if (d["type"] == "resource" && d.has("resource")){
+ Variant val = d["resource"];
+
+ if (val.get_type()==Variant::OBJECT) {
+ RES res = val;
+ if (res.is_valid())
+ tex = Ref<Texture>(res->cast_to<Texture>());
+ }
+ }
+ else if (d["type"] == "files" && d.has("files")) {
+ Vector<String> files = d["files"];
+ RES res = ResourceLoader::load(files[0]);
+ if (res.is_valid())
+ tex = Ref<Texture>(res->cast_to<Texture>());
+ }
+ }
+
+ if (!tex.is_valid()) return;
+
+ GraphNode *gn = frame->get_parent()->cast_to<GraphNode>();
+ if (!gn) return;
+
+ int id = -1;
+ for(Map<int,GraphNode*>::Element *E = node_map.front();E;E=E->next())
+ if (E->get() == gn) {
+ id = E->key();
+ break;
+ }
+ print_line(String::num(double(id)));
+ if (id < 0) return;
+
+ if (graph->node_get_type(type,id)==ShaderGraph::NODE_TEXTURE_INPUT) {
+
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Texture Uniform"));
+ ur->add_do_method(graph.ptr(),"texture_input_node_set_value",type,id,tex);
+ ur->add_undo_method(graph.ptr(),"texture_input_node_set_value",type,id,graph->texture_input_node_get_value(type,id));
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+ }
+}
+
+void ShaderGraphView::set_graph(Ref<ShaderGraph> p_graph){
+
+
+ if (graph.is_valid()) {
+ graph->disconnect("updated",this,"_sg_updated");
+ }
+ graph=p_graph;
+ if (graph.is_valid()) {
+ graph->connect("updated",this,"_sg_updated");
+ }
+ _update_graph();
+ _sg_updated();
+
+}
+
+void ShaderGraphView::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ ped_popup->connect("variant_changed",this,"_variant_edited");
+ }
+}
+
+void ShaderGraphView::add_node(int p_type, const Vector2 &location) {
+
+ if (p_type==ShaderGraph::NODE_INPUT && graph->node_count(type, p_type)>0)
+ return;
+
+ List<int> existing;
+ graph->get_node_list(type,&existing);
+ existing.sort();
+ int newid=1;
+ for(List<int>::Element *E=existing.front();E;E=E->next()) {
+ if (!E->next() || (E->get()+1!=E->next()->get())){
+ newid=E->get()+1;
+ break;
+ }
+ }
+
+ Vector2 init_ofs = location;
+ while(true) {
+ bool valid=true;
+ for(List<int>::Element *E=existing.front();E;E=E->next()) {
+ Vector2 pos = graph->node_get_pos(type,E->get());
+ if (init_ofs==pos) {
+ init_ofs+=Vector2(20,20);
+ valid=false;
+ break;
+
+ }
+ }
+
+ if (valid)
+ break;
+ }
+ UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Add Shader Graph Node"));
+ ur->add_do_method(graph.ptr(),"node_add",type,p_type,newid);
+ ur->add_do_method(graph.ptr(),"node_set_pos",type,newid,init_ofs);
+ ur->add_undo_method(graph.ptr(),"node_remove",type,newid);
+ ur->add_do_method(this,"_update_graph");
+ ur->add_undo_method(this,"_update_graph");
+ ur->commit_action();
+
+}
+
+void ShaderGraphView::_bind_methods() {
+
+ ClassDB::bind_method("_update_graph",&ShaderGraphView::_update_graph);
+ ClassDB::bind_method("_begin_node_move", &ShaderGraphView::_begin_node_move);
+ ClassDB::bind_method("_node_moved",&ShaderGraphView::_node_moved);
+ ClassDB::bind_method("_end_node_move", &ShaderGraphView::_end_node_move);
+ ClassDB::bind_method("_move_node",&ShaderGraphView::_move_node);
+ ClassDB::bind_method("_node_removed",&ShaderGraphView::_node_removed);
+ ClassDB::bind_method("_connection_request",&ShaderGraphView::_connection_request);
+ ClassDB::bind_method("_disconnection_request",&ShaderGraphView::_disconnection_request);
+ ClassDB::bind_method("_duplicate_nodes_request", &ShaderGraphView::_duplicate_nodes_request);
+ ClassDB::bind_method("_duplicate_nodes", &ShaderGraphView::_duplicate_nodes);
+ ClassDB::bind_method("_delete_nodes_request", &ShaderGraphView::_delete_nodes_request);
+
+ ClassDB::bind_method("_default_changed",&ShaderGraphView::_default_changed);
+ ClassDB::bind_method("_scalar_const_changed",&ShaderGraphView::_scalar_const_changed);
+ ClassDB::bind_method("_vec_const_changed",&ShaderGraphView::_vec_const_changed);
+ ClassDB::bind_method("_rgb_const_changed",&ShaderGraphView::_rgb_const_changed);
+ ClassDB::bind_method("_xform_const_changed",&ShaderGraphView::_xform_const_changed);
+ ClassDB::bind_method("_scalar_op_changed",&ShaderGraphView::_scalar_op_changed);
+ ClassDB::bind_method("_vec_op_changed",&ShaderGraphView::_vec_op_changed);
+ ClassDB::bind_method("_vec_scalar_op_changed",&ShaderGraphView::_vec_scalar_op_changed);
+ ClassDB::bind_method("_rgb_op_changed",&ShaderGraphView::_rgb_op_changed);
+ ClassDB::bind_method("_xform_inv_rev_changed",&ShaderGraphView::_xform_inv_rev_changed);
+ ClassDB::bind_method("_scalar_func_changed",&ShaderGraphView::_scalar_func_changed);
+ ClassDB::bind_method("_vec_func_changed",&ShaderGraphView::_vec_func_changed);
+ ClassDB::bind_method("_scalar_input_changed",&ShaderGraphView::_scalar_input_changed);
+ ClassDB::bind_method("_vec_input_changed",&ShaderGraphView::_vec_input_changed);
+ ClassDB::bind_method("_xform_input_changed",&ShaderGraphView::_xform_input_changed);
+ ClassDB::bind_method("_rgb_input_changed",&ShaderGraphView::_rgb_input_changed);
+ ClassDB::bind_method("_tex_input_change",&ShaderGraphView::_tex_input_change);
+ ClassDB::bind_method("_cube_input_change",&ShaderGraphView::_cube_input_change);
+ ClassDB::bind_method("_input_name_changed",&ShaderGraphView::_input_name_changed);
+ ClassDB::bind_method("_tex_edited",&ShaderGraphView::_tex_edited);
+ ClassDB::bind_method("_variant_edited",&ShaderGraphView::_variant_edited);
+ ClassDB::bind_method("_cube_edited",&ShaderGraphView::_cube_edited);
+ ClassDB::bind_method("_comment_edited",&ShaderGraphView::_comment_edited);
+ ClassDB::bind_method("_color_ramp_changed",&ShaderGraphView::_color_ramp_changed);
+ ClassDB::bind_method("_curve_changed",&ShaderGraphView::_curve_changed);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ShaderGraphView::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &ShaderGraphView::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &ShaderGraphView::drop_data_fw);
+
+ ClassDB::bind_method("_sg_updated",&ShaderGraphView::_sg_updated);
+}
+
+ShaderGraphView::ShaderGraphView(ShaderGraph::ShaderType p_type) {
+
+ type=p_type;
+ graph_edit = memnew( GraphEdit );
+ block_update=false;
+ ped_popup = memnew( CustomPropertyEditor );
+ graph_edit->add_child(ped_popup);
+ status = memnew( Label );
+ graph_edit->get_top_layer()->add_child(status);
+ graph_edit->connect("_begin_node_move", this, "_begin_node_move");
+ graph_edit->connect("_end_node_move", this, "_end_node_move");
+ status->set_pos(Vector2(5,5));
+ status->add_color_override("font_color_shadow",Color(0,0,0));
+ status->add_color_override("font_color",Color(1,0.4,0.3));
+ status->add_constant_override("shadow_as_outline",1);
+ status->add_constant_override("shadow_offset_x",2);
+ status->add_constant_override("shadow_offset_y",2);
+ status->set_text("");
+}
+
+
+//////////////edit//////////////
+void ShaderGraphEditor::edit(Ref<ShaderGraph> p_shader) {
+
+ for(int i=0;i<ShaderGraph::SHADER_TYPE_MAX;i++) {
+ graph_edits[i]->set_graph(p_shader);
+ }
+}
+
+void ShaderGraphEditor::_add_node(int p_type) {
+
+ ShaderGraph::ShaderType shader_type=ShaderGraph::ShaderType(tabs->get_current_tab());
+ graph_edits[shader_type]->add_node(p_type, next_location);
+}
+
+void ShaderGraphEditor::_popup_requested(const Vector2 &p_position)
+{
+ Vector2 scroll_ofs=graph_edits[tabs->get_current_tab()]->get_graph_edit()->get_scroll_ofs();
+ next_location = get_local_mouse_pos() + scroll_ofs;
+ popup->set_global_pos(p_position);
+ popup->set_size( Size2( 200, 0) );
+ popup->popup();
+ popup->call_deferred("grab_click_focus");
+ popup->set_invalidate_click_until_motion();
+}
+
+void ShaderGraphEditor::_notification(int p_what) {
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ for(int i=0;i<ShaderGraph::NODE_TYPE_MAX;i++) {
+
+ if (i==ShaderGraph::NODE_OUTPUT)
+ continue;
+ if (!_2d && i==ShaderGraph::NODE_DEFAULT_TEXTURE)
+ continue;
+
+ String nn = node_names[i];
+ String ic = nn.get_slice(":",0);
+ String v = nn.get_slice(":",1);
+ bool addsep=false;
+ if (nn.ends_with(":")) {
+ addsep=true;
+ }
+ popup->add_icon_item(get_icon(ic,"EditorIcons"),v,i);
+ if (addsep)
+ popup->add_separator();
+ }
+ popup->connect("id_pressed",this,"_add_node");
+
+
+ }
+}
+
+void ShaderGraphEditor::_bind_methods() {
+
+ ClassDB::bind_method("_add_node",&ShaderGraphEditor::_add_node);
+ ClassDB::bind_method("_popup_requested",&ShaderGraphEditor::_popup_requested);
+}
+
+
+const char* ShaderGraphEditor::node_names[ShaderGraph::NODE_TYPE_MAX]={
+ ("GraphInput:Input"), // all inputs (shader type dependent)
+ ("GraphScalar:Scalar Constant"), //scalar constant
+ ("GraphVector:Vector Constant"), //vec3 constant
+ ("GraphRgb:RGB Constant"), //rgb constant (shows a color picker instead)
+ ("GraphXform:XForm Constant"), // 4x4 matrix constant
+ ("GraphTime:Time:"), // time in seconds
+ ("GraphTexscreen:Screen Sample"), // screen texture sampler (takes uv) (only usable in fragment shader)
+ ("GraphScalarOp:Scalar Operator"), // scalar vs scalar op (mul", add", div", etc)
+ ("GraphVecOp:Vector Operator"), // vec3 vs vec3 op (mul",ad",div",crossprod",etc)
+ ("GraphVecScalarOp:Scalar+Vector Operator"), // vec3 vs scalar op (mul", add", div", etc)
+ ("GraphRgbOp:RGB Operator:"), // vec3 vs vec3 rgb op (with scalar amount)", like brighten", darken", burn", dodge", multiply", etc.
+ ("GraphXformMult:XForm Multiply"), // mat4 x mat4
+ ("GraphXformVecMult:XForm+Vector Multiply"), // mat4 x vec3 mult (with no-translation option)
+ ("GraphXformVecImult:Form+Vector InvMultiply:"), // mat4 x vec3 inverse mult (with no-translation option)
+ ("GraphXformScalarFunc:Scalar Function"), // scalar function (sin", cos", etc)
+ ("GraphXformVecFunc:Vector Function"), // vector function (normalize", negate", reciprocal", rgb2hsv", hsv2rgb", etc", etc)
+ ("GraphVecLength:Vector Length"), // vec3 length
+ ("GraphVecDp:Dot Product:"), // vec3 . vec3 (dot product -> scalar output)
+ ("GraphVecToScalars:Vector -> Scalars"), // 1 vec3 input", 3 scalar outputs
+ ("GraphScalarsToVec:Scalars -> Vector"), // 3 scalar input", 1 vec3 output
+ ("GraphXformToVecs:XForm -> Vectors"), // 3 vec input", 1 xform output
+ ("GraphVecsToXform:Vectors -> XForm:"), // 3 vec input", 1 xform output
+ ("GraphScalarInterp:Scalar Interpolate"), // scalar interpolation (with optional curve)
+ ("GraphVecInterp:Vector Interpolate:"), // vec3 interpolation (with optional curve)
+ ("GraphColorRamp:Color Ramp"), // vec3 interpolation (with optional curve)
+ ("GraphCurveMap:Curve Remap:"), // vec3 interpolation (with optional curve)
+ ("GraphScalarUniform:Scalar Uniform"), // scalar uniform (assignable in material)
+ ("GraphVectorUniform:Vector Uniform"), // vec3 uniform (assignable in material)
+ ("GraphRgbUniform:RGB Uniform"), // color uniform (assignable in material)
+ ("GraphXformUniform:XForm Uniform"), // mat4 uniform (assignable in material)
+ ("GraphTextureUniform:Texture Uniform"), // texture input (assignable in material)
+ ("GraphCubeUniform:CubeMap Uniform:"), // cubemap input (assignable in material)
+ ("GraphDefaultTexture:CanvasItem Texture:"), // cubemap input (assignable in material)
+ ("Output"), // output (shader type dependent)
+ ("GraphComment:Comment"), // comment
+
+
+};
+ShaderGraphEditor::ShaderGraphEditor(bool p_2d) {
+ _2d=p_2d;
+
+ popup = memnew( PopupMenu );
+ add_child(popup);
+
+
+ tabs = memnew(TabContainer);
+ tabs->set_v_size_flags(SIZE_EXPAND_FILL);
+ add_child(tabs);
+ const char* sname[ShaderGraph::SHADER_TYPE_MAX]={
+ "Vertex",
+ "Fragment",
+ "Light"
+ };
+ for(int i=0;i<ShaderGraph::SHADER_TYPE_MAX;i++) {
+
+ graph_edits[i]= memnew( ShaderGraphView(ShaderGraph::ShaderType(i)) );
+ add_child(graph_edits[i]);
+ graph_edits[i]->get_graph_edit()->set_name(sname[i]);
+ tabs->add_child(graph_edits[i]->get_graph_edit());
+ graph_edits[i]->get_graph_edit()->connect("connection_request",graph_edits[i],"_connection_request");
+ graph_edits[i]->get_graph_edit()->connect("disconnection_request",graph_edits[i],"_disconnection_request");
+ graph_edits[i]->get_graph_edit()->connect("duplicate_nodes_request", graph_edits[i], "_duplicate_nodes_request");
+ graph_edits[i]->get_graph_edit()->connect("popup_request",this,"_popup_requested");
+ graph_edits[i]->get_graph_edit()->connect("delete_nodes_request",graph_edits[i],"_delete_nodes_request");
+ graph_edits[i]->get_graph_edit()->set_right_disconnects(true);
+ }
+
+ tabs->set_current_tab(1);
+
+ set_custom_minimum_size(Size2(100,300));
+}
+
+
+void ShaderGraphEditorPlugin::edit(Object *p_object) {
+
+ shader_editor->edit(p_object->cast_to<ShaderGraph>());
+}
+
+bool ShaderGraphEditorPlugin::handles(Object *p_object) const {
+
+ ShaderGraph *shader=p_object->cast_to<ShaderGraph>();
+ if (!shader)
+ return false;
+ if (_2d)
+ return shader->get_mode()==Shader::MODE_CANVAS_ITEM;
+ else
+ return shader->get_mode()==Shader::MODE_MATERIAL;
+}
+
+void ShaderGraphEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ shader_editor->show();
+ } else {
+
+ shader_editor->hide();
+ }
+
+}
+
+ShaderGraphEditorPlugin::ShaderGraphEditorPlugin(EditorNode *p_node, bool p_2d) {
+
+ _2d=p_2d;
+ editor=p_node;
+ shader_editor = memnew( ShaderGraphEditor(p_2d) );
+ shader_editor->hide();
+ if (p_2d)
+ CanvasItemEditor::get_singleton()->get_bottom_split()->add_child(shader_editor);
+ else
+ SpatialEditor::get_singleton()->get_shader_split()->add_child(shader_editor);
+
+
+ //editor->get_viewport()->add_child(shader_editor);
+ //shader_editor->set_area_as_parent_rect();
+ //shader_editor->hide();
+
+}
+
+
+ShaderGraphEditorPlugin::~ShaderGraphEditorPlugin()
+{
+}
+
+
+
+#endif
diff --git a/editor/plugins/shader_graph_editor_plugin.h b/editor/plugins/shader_graph_editor_plugin.h
new file mode 100644
index 0000000000..5143722242
--- /dev/null
+++ b/editor/plugins/shader_graph_editor_plugin.h
@@ -0,0 +1,242 @@
+/*************************************************************************/
+/* shader_graph_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SHADER_GRAPH_EDITOR_PLUGIN_H
+#define SHADER_GRAPH_EDITOR_PLUGIN_H
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/resources/shader.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/button.h"
+#include "scene/gui/graph_edit.h"
+#include "scene/gui/popup.h"
+#include "editor/property_editor.h"
+#include "scene/resources/shader_graph.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+#if 0
+class GraphColorRampEdit : public Control {
+
+ GDCLASS(GraphColorRampEdit,Control);
+
+
+ struct Point {
+
+ float offset;
+ Color color;
+ bool operator<(const Point& p_ponit) const {
+ return offset<p_ponit.offset;
+ }
+ };
+
+ PopupPanel *popup;
+ ColorPicker *picker;
+
+
+ bool grabbing;
+ int grabbed;
+ float grabbed_at;
+ Vector<Point> points;
+
+ void _color_changed(const Color& p_color);
+
+protected:
+ void _gui_input(const InputEvent& p_event);
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_ramp(const Vector<float>& p_offsets,const Vector<Color>& p_colors);
+ Vector<float> get_offsets() const;
+ Vector<Color> get_colors() const;
+ virtual Size2 get_minimum_size() const;
+ GraphColorRampEdit();
+};
+
+
+class GraphCurveMapEdit : public Control {
+
+ GDCLASS(GraphCurveMapEdit,Control);
+
+
+ struct Point {
+
+ float offset;
+ float height;
+ bool operator<(const Point& p_ponit) const {
+ return offset<p_ponit.offset;
+ }
+ };
+
+
+ bool grabbing;
+ int grabbed;
+ Vector<Point> points;
+
+ void _plot_curve(const Vector2& p_a,const Vector2& p_b,const Vector2& p_c,const Vector2& p_d);
+protected:
+ void _gui_input(const InputEvent& p_event);
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_points(const Vector<Vector2>& p_points);
+ Vector<Vector2> get_points() const;
+ virtual Size2 get_minimum_size() const;
+ GraphCurveMapEdit();
+};
+
+class ShaderGraphView : public Control {
+
+ GDCLASS(ShaderGraphView,Control);
+
+
+
+ CustomPropertyEditor *ped_popup;
+ bool block_update;
+
+ Label *status;
+ GraphEdit *graph_edit;
+ Ref<ShaderGraph> graph;
+ int edited_id;
+ int edited_def;
+
+ ShaderGraph::ShaderType type;
+
+ void _update_graph();
+ void _create_node(int p_id);
+
+
+ ToolButton *make_label(String text, Variant::Type v_type = Variant::NIL);
+ ToolButton *make_editor(String text, GraphNode* gn, int p_id, int param, Variant::Type type, String p_hint="");
+
+ void _connection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
+ void _disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
+
+ void _node_removed(int p_id);
+ void _begin_node_move();
+ void _node_moved(const Vector2& p_from, const Vector2& p_to,int p_id);
+ void _end_node_move();
+ void _move_node(int p_id,const Vector2& p_to);
+ void _duplicate_nodes_request();
+ void _duplicate_nodes(const Array &p_nodes);
+ void _delete_nodes_request();
+
+
+ void _default_changed(int p_id, Node* p_button, int p_param, int v_type, String p_hint);
+
+ void _scalar_const_changed(double p_value,int p_id);
+ void _vec_const_changed(double p_value, int p_id, Array p_arr);
+ void _rgb_const_changed(const Color& p_color, int p_id);
+ void _xform_const_changed(int p_id,Node* p_button);
+ void _scalar_op_changed(int p_op, int p_id);
+ void _vec_op_changed(int p_op, int p_id);
+ void _vec_scalar_op_changed(int p_op, int p_id);
+ void _rgb_op_changed(int p_op, int p_id);
+ void _xform_inv_rev_changed(bool p_enabled, int p_id);
+ void _scalar_func_changed(int p_func, int p_id);
+ void _vec_func_changed(int p_func, int p_id);
+ void _scalar_input_changed(double p_value,int p_id);
+ void _vec_input_changed(double p_value, int p_id, Array p_arr);
+ void _xform_input_changed(int p_id,Node* p_button);
+ void _rgb_input_changed(const Color& p_color, int p_id);
+ void _tex_input_change(int p_id,Node* p_button);
+ void _cube_input_change(int p_id);
+ void _input_name_changed(const String& p_name,int p_id,Node* p_line_edit);
+ void _tex_edited(int p_id,Node* p_button);
+ void _cube_edited(int p_id,Node* p_button);
+ void _variant_edited();
+ void _comment_edited(int p_id,Node* p_button);
+ void _color_ramp_changed(int p_id,Node* p_ramp);
+ void _curve_changed(int p_id,Node* p_curve);
+ void _sg_updated();
+ Map<int,GraphNode*> node_map;
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void add_node(int p_type, const Vector2 &location);
+ GraphEdit *get_graph_edit() { return graph_edit; }
+ void set_graph(Ref<ShaderGraph> p_graph);
+
+ ShaderGraphView(ShaderGraph::ShaderType p_type=ShaderGraph::SHADER_TYPE_FRAGMENT);
+};
+
+class ShaderGraphEditor : public VBoxContainer {
+
+ GDCLASS(ShaderGraphEditor,VBoxContainer);
+
+ PopupMenu *popup;
+ TabContainer *tabs;
+ ShaderGraphView *graph_edits[ShaderGraph::SHADER_TYPE_MAX];
+ static const char* node_names[ShaderGraph::NODE_TYPE_MAX];
+ Vector2 next_location;
+
+ bool _2d;
+ void _add_node(int p_type);
+ void _popup_requested(const Vector2 &p_position);
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void edit(Ref<ShaderGraph> p_shader);
+ ShaderGraphEditor(bool p_2d);
+};
+
+class ShaderGraphEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ShaderGraphEditorPlugin, EditorPlugin );
+
+ bool _2d;
+ ShaderGraphEditor *shader_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "ShaderGraph"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ShaderGraphEditorPlugin(EditorNode *p_node,bool p_2d);
+ ~ShaderGraphEditorPlugin();
+
+};
+#endif
+#endif
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
new file mode 100644
index 0000000000..8a7969c71b
--- /dev/null
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -0,0 +1,4131 @@
+/*************************************************************************/
+/* spatial_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "spatial_editor_plugin.h"
+
+#include "print_string.h"
+#include "os/keyboard.h"
+#include "scene/3d/visual_instance.h"
+#include "scene/3d/camera.h"
+#include "camera_matrix.h"
+#include "sort.h"
+#include "editor/editor_node.h"
+#include "editor/editor_settings.h"
+#include "scene/resources/surface_tool.h"
+#include "editor/spatial_editor_gizmos.h"
+#include "global_config.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "editor/animation_editor.h"
+
+#define DISTANCE_DEFAULT 4
+
+
+#define GIZMO_ARROW_SIZE 0.3
+#define GIZMO_RING_HALF_WIDTH 0.1
+//#define GIZMO_SCALE_DEFAULT 0.28
+#define GIZMO_SCALE_DEFAULT 0.15
+
+
+void SpatialEditorViewport::_update_camera() {
+ if (orthogonal) {
+ //camera->set_orthogonal(size.width*cursor.distance,get_znear(),get_zfar());
+ camera->set_orthogonal(2 * cursor.distance, 0.1, 8192);
+ }
+ else
+ camera->set_perspective(get_fov(), get_znear(), get_zfar());
+
+ Transform camera_transform;
+ camera_transform.translate(cursor.pos);
+ camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
+
+ if (orthogonal)
+ camera_transform.translate(0, 0, 4096);
+ else
+ camera_transform.translate(0, 0, cursor.distance);
+
+ if (camera->get_global_transform() != camera_transform) {
+ camera->set_global_transform(camera_transform);
+ update_transform_gizmo_view();
+ }
+}
+
+String SpatialEditorGizmo::get_handle_name(int p_idx) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_name"))
+ return get_script_instance()->call("get_handle_name", p_idx);
+
+ return "";
+}
+
+Variant SpatialEditorGizmo::get_handle_value(int p_idx) const{
+
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_value"))
+ return get_script_instance()->call("get_handle_value", p_idx);
+
+ return Variant();
+}
+
+void SpatialEditorGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point) {
+
+ if (get_script_instance() && get_script_instance()->has_method("set_handle"))
+ get_script_instance()->call("set_handle", p_idx, p_camera, p_point);
+}
+
+void SpatialEditorGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ if (get_script_instance() && get_script_instance()->has_method("commit_handle"))
+ get_script_instance()->call("commit_handle", p_idx, p_restore, p_cancel);
+}
+
+bool SpatialEditorGizmo::intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum) {
+
+ return false;
+}
+
+bool SpatialEditorGizmo::intersect_ray(const Camera *p_camera, const Point2 &p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle,bool p_sec_first) {
+
+ return false;
+}
+
+SpatialEditorGizmo::SpatialEditorGizmo(){
+
+ selected=false;
+}
+
+
+
+int SpatialEditorViewport::get_selected_count() const {
+
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ int count=0;
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->key()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ count++;
+ }
+
+ return count;
+}
+
+
+
+float SpatialEditorViewport::get_znear() const {
+
+ float val = spatial_editor->get_znear();
+ if (val<0.001)
+ val=0.001;
+ return val;
+}
+float SpatialEditorViewport::get_zfar() const{
+
+ float val = spatial_editor->get_zfar();
+ if (val<0.001)
+ val=0.001;
+ return val;
+
+}
+float SpatialEditorViewport::get_fov() const{
+
+ float val = spatial_editor->get_fov();
+ if (val<0.001)
+ val=0.001;
+ if (val>89)
+ val=89;
+ return val;
+
+}
+
+
+
+Transform SpatialEditorViewport::_get_camera_transform() const {
+
+ return camera->get_global_transform();
+}
+
+Vector3 SpatialEditorViewport::_get_camera_pos() const {
+
+ return _get_camera_transform().origin;
+}
+
+Point2 SpatialEditorViewport::_point_to_screen(const Vector3& p_point) {
+
+ return camera->unproject_position(p_point);
+
+}
+
+Vector3 SpatialEditorViewport::_get_ray_pos(const Vector2& p_pos) const {
+
+ return camera->project_ray_origin(p_pos);
+}
+
+
+Vector3 SpatialEditorViewport::_get_camera_normal() const {
+
+ return -_get_camera_transform().basis.get_axis(2);
+}
+
+Vector3 SpatialEditorViewport::_get_ray(const Vector2& p_pos) {
+
+
+ return camera->project_ray_normal(p_pos);
+
+
+}
+/*
+void SpatialEditorViewport::_clear_id(Spatial *p_node) {
+
+
+ editor_selection->remove_node(p_node);
+
+
+}
+*/
+void SpatialEditorViewport::_clear_selected() {
+
+ editor_selection->clear();
+}
+
+
+
+void SpatialEditorViewport::_select_clicked(bool p_append,bool p_single) {
+
+ if (!clicked)
+ return;
+
+ Object *obj = ObjectDB::get_instance(clicked);
+ if (!obj)
+ return;
+
+
+ Spatial *sp = obj->cast_to<Spatial>();
+ if (!sp)
+ return;
+
+ _select(sp, clicked_wants_append,true);
+}
+
+
+
+void SpatialEditorViewport::_select(Spatial *p_node, bool p_append,bool p_single) {
+
+
+ if (!p_append) {
+
+ // should not modify the selection..
+
+ editor_selection->clear();
+ editor_selection->add_node(p_node);
+
+ } else {
+
+ if (editor_selection->is_selected(p_node) && p_single) {
+ //erase
+ editor_selection->remove_node(p_node);
+ } else {
+
+ editor_selection->add_node(p_node);
+ }
+
+ }
+
+}
+
+ObjectID SpatialEditorViewport::_select_ray(const Point2& p_pos, bool p_append,bool &r_includes_current,int *r_gizmo_handle,bool p_alt_select) {
+
+ if (r_gizmo_handle)
+ *r_gizmo_handle=-1;
+
+ Vector3 ray=_get_ray(p_pos);
+ Vector3 pos=_get_ray_pos(p_pos);
+
+ Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_ray(pos,ray,get_tree()->get_root()->get_world()->get_scenario() );
+ Set<Ref<SpatialEditorGizmo> > found_gizmos;
+
+ ObjectID closest=0;
+ Spatial *item=NULL;
+ float closest_dist=1e20;
+ int selected_handle=-1;
+
+ for (int i=0;i<instances.size();i++) {
+
+ Object *obj=ObjectDB::get_instance(instances[i]);
+ if (!obj)
+ continue;
+
+ Spatial *spat=obj->cast_to<Spatial>();
+
+ if (!spat)
+ continue;
+
+ Ref<SpatialEditorGizmo> seg = spat->get_gizmo();
+
+ if (!seg.is_valid())
+ continue;
+
+ if (found_gizmos.has(seg))
+ continue;
+
+ found_gizmos.insert(seg);
+ Vector3 point;
+ Vector3 normal;
+
+ int handle=-1;
+ bool inters = seg->intersect_ray(camera,p_pos,point,normal,NULL,p_alt_select);
+
+ if (!inters)
+ continue;
+
+ float dist = pos.distance_to(point);
+
+ if (dist<0)
+ continue;
+
+ if (dist < closest_dist) {
+ closest=instances[i];
+ closest_dist=dist;
+ selected_handle=handle;
+ item=spat;
+ }
+
+ // if (editor_selection->is_selected(spat))
+ // r_includes_current=true;
+
+ }
+
+
+ if (!item)
+ return 0;
+
+ if (!editor_selection->is_selected(item) || (r_gizmo_handle && selected_handle>=0)) {
+
+ if (r_gizmo_handle)
+ *r_gizmo_handle=selected_handle;
+
+ }
+
+ return closest;
+
+}
+
+void SpatialEditorViewport::_find_items_at_pos(const Point2& p_pos,bool &r_includes_current,Vector<_RayResult> &results,bool p_alt_select) {
+
+ Vector3 ray=_get_ray(p_pos);
+ Vector3 pos=_get_ray_pos(p_pos);
+
+ Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_ray(pos,ray,get_tree()->get_root()->get_world()->get_scenario() );
+ Set<Ref<SpatialEditorGizmo> > found_gizmos;
+
+ r_includes_current=false;
+
+ for (int i=0;i<instances.size();i++) {
+
+ Object *obj=ObjectDB::get_instance(instances[i]);
+
+ if (!obj)
+ continue;
+
+ Spatial *spat=obj->cast_to<Spatial>();
+
+ if (!spat)
+ continue;
+
+ Ref<SpatialEditorGizmo> seg = spat->get_gizmo();
+
+ if (!seg.is_valid())
+ continue;
+
+ if (found_gizmos.has(seg))
+ continue;
+
+ found_gizmos.insert(seg);
+ Vector3 point;
+ Vector3 normal;
+
+ int handle=-1;
+ bool inters = seg->intersect_ray(camera,p_pos,point,normal,NULL,p_alt_select);
+
+ if (!inters)
+ continue;
+
+ float dist = pos.distance_to(point);
+
+ if (dist<0)
+ continue;
+
+
+
+ if (editor_selection->is_selected(spat))
+ r_includes_current=true;
+
+ _RayResult res;
+ res.item=spat;
+ res.depth=dist;
+ res.handle=handle;
+ results.push_back(res);
+ }
+
+
+ if (results.empty())
+ return;
+
+ results.sort();
+}
+
+
+Vector3 SpatialEditorViewport::_get_screen_to_space(const Vector3& p_pos) {
+
+
+ CameraMatrix cm;
+ cm.set_perspective(get_fov(),get_size().aspect(),get_znear(),get_zfar());
+ float screen_w,screen_h;
+ cm.get_viewport_size(screen_w,screen_h);
+
+ Transform camera_transform;
+ camera_transform.translate( cursor.pos );
+ camera_transform.basis.rotate(Vector3(1,0,0),-cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0,1,0),-cursor.y_rot);
+ camera_transform.translate(0,0,cursor.distance);
+
+ return camera_transform.xform(Vector3( ((p_pos.x/get_size().width)*2.0-1.0)*screen_w, ((1.0-(p_pos.y/get_size().height))*2.0-1.0)*screen_h,-get_znear()));
+
+}
+
+
+void SpatialEditorViewport::_select_region() {
+
+ if (cursor.region_begin==cursor.region_end)
+ return; //nothing really
+
+ Vector3 box[4]={
+ Vector3(
+ MIN( cursor.region_begin.x, cursor.region_end.x),
+ MIN( cursor.region_begin.y, cursor.region_end.y),
+ 0
+ ),
+ Vector3(
+ MAX( cursor.region_begin.x, cursor.region_end.x),
+ MIN( cursor.region_begin.y, cursor.region_end.y),
+ 0
+ ),
+ Vector3(
+ MAX( cursor.region_begin.x, cursor.region_end.x),
+ MAX( cursor.region_begin.y, cursor.region_end.y),
+ 0
+ ),
+ Vector3(
+ MIN( cursor.region_begin.x, cursor.region_end.x),
+ MAX( cursor.region_begin.y, cursor.region_end.y),
+ 0
+ )
+ };
+
+ Vector<Plane> frustum;
+
+ Vector3 cam_pos=_get_camera_pos();
+ Set<Ref<SpatialEditorGizmo> > found_gizmos;
+
+ for(int i=0;i<4;i++) {
+
+ Vector3 a=_get_screen_to_space(box[i]);
+ Vector3 b=_get_screen_to_space(box[(i+1)%4]);
+ frustum.push_back( Plane(a,b,cam_pos) );
+ }
+
+ Plane near( cam_pos, -_get_camera_normal() );
+ near.d-=get_znear();
+
+ frustum.push_back( near );
+
+ Plane far=-near;
+ far.d+=500.0;
+
+ frustum.push_back( far );
+
+ Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_convex(frustum,get_tree()->get_root()->get_world()->get_scenario());
+
+
+ for (int i=0;i<instances.size();i++) {
+
+ Object *obj=ObjectDB::get_instance(instances[i]);
+ if (!obj)
+ continue;
+ Spatial *sp = obj->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ Ref<SpatialEditorGizmo> seg = sp->get_gizmo();
+
+ if (!seg.is_valid())
+ continue;
+
+ if (found_gizmos.has(seg))
+ continue;
+
+ if (seg->intersect_frustum(camera,frustum))
+ _select(sp,true,false);
+ }
+
+}
+
+void SpatialEditorViewport::_update_name() {
+
+ String ortho = orthogonal?TTR("Orthogonal"):TTR("Perspective");
+
+ if (name!="")
+ view_menu->set_text("[ "+name+" "+ortho+" ]");
+ else
+ view_menu->set_text("[ "+ortho+" ]");
+}
+
+
+void SpatialEditorViewport::_compute_edit(const Point2& p_point) {
+
+ _edit.click_ray=_get_ray( Vector2( p_point.x, p_point.y ) );
+ _edit.click_ray_pos=_get_ray_pos( Vector2( p_point.x, p_point.y ) );
+ _edit.plane=TRANSFORM_VIEW;
+ spatial_editor->update_transform_gizmo();
+ _edit.center=spatial_editor->get_gizmo_transform().origin;
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ //Vector3 center;
+ //int nc=0;
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ se->original=se->sp->get_global_transform();
+ //center+=se->original.origin;
+ //nc++;
+ }
+
+ /*
+ if (nc)
+ _edit.center=center/float(nc);
+ */
+}
+
+static int _get_key_modifier(const String& p_property) {
+
+ switch(EditorSettings::get_singleton()->get(p_property).operator int()) {
+
+ case 0: return 0;
+ case 1: return KEY_SHIFT;
+ case 2: return KEY_ALT;
+ case 3: return KEY_META;
+ case 4: return KEY_CONTROL;
+ }
+ return 0;
+}
+
+bool SpatialEditorViewport::_gizmo_select(const Vector2& p_screenpos,bool p_hilite_only) {
+
+ if (!spatial_editor->is_gizmo_visible())
+ return false;
+ if (get_selected_count()==0) {
+ if (p_hilite_only)
+ spatial_editor->select_gizmo_hilight_axis(-1);
+ return false;
+ }
+
+
+ Vector3 ray_pos=_get_ray_pos( Vector2( p_screenpos.x, p_screenpos.y ) );
+ Vector3 ray=_get_ray( Vector2( p_screenpos.x, p_screenpos.y ) );
+
+ Transform gt = spatial_editor->get_gizmo_transform();
+ float gs=gizmo_scale;
+
+ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_MOVE) {
+
+ int col_axis=-1;
+ float col_d=1e20;
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 grabber_pos = gt.origin+gt.basis.get_axis(i)*gs;
+ float grabber_radius = gs*GIZMO_ARROW_SIZE;
+
+ Vector3 r;
+ if (Geometry::segment_intersects_sphere(ray_pos,ray_pos+ray*10000.0,grabber_pos,grabber_radius,&r)) {
+ float d = r.distance_to(ray_pos);
+ if (d<col_d) {
+ col_d=d;
+ col_axis=i;
+ }
+ }
+ }
+
+ if (col_axis!=-1) {
+
+
+ if (p_hilite_only) {
+
+ spatial_editor->select_gizmo_hilight_axis(col_axis);
+
+
+ } else {
+ //handle rotate
+ _edit.mode=TRANSFORM_TRANSLATE;
+ _compute_edit(Point2(p_screenpos.x,p_screenpos.y));
+ _edit.plane=TransformPlane(TRANSFORM_X_AXIS+col_axis);
+ }
+ return true;
+
+
+ }
+
+ }
+
+
+ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_ROTATE) {
+
+ int col_axis=-1;
+ float col_d=1e20;
+
+ for(int i=0;i<3;i++) {
+
+ Plane plane(gt.origin,gt.basis.get_axis(i).normalized());
+ Vector3 r;
+ if (!plane.intersects_ray(ray_pos,ray,&r))
+ continue;
+
+ float dist = r.distance_to(gt.origin);
+
+
+
+ if (dist > gs*(1-GIZMO_RING_HALF_WIDTH) && dist < gs *(1+GIZMO_RING_HALF_WIDTH)) {
+
+ float d = ray_pos.distance_to(r);
+ if (d<col_d) {
+ col_d=d;
+ col_axis=i;
+ }
+ }
+ }
+
+ if (col_axis!=-1) {
+
+ if (p_hilite_only) {
+
+ spatial_editor->select_gizmo_hilight_axis(col_axis+3);
+ } else {
+ //handle rotate
+ _edit.mode=TRANSFORM_ROTATE;
+ _compute_edit(Point2(p_screenpos.x,p_screenpos.y));
+ _edit.plane=TransformPlane(TRANSFORM_X_AXIS+col_axis);
+ }
+ return true;
+ }
+ }
+
+
+ if (p_hilite_only)
+ spatial_editor->select_gizmo_hilight_axis(-1);
+
+ return false;
+
+}
+
+
+void SpatialEditorViewport::_smouseenter() {
+
+ if (!surface->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
+ surface->grab_focus();
+}
+
+void SpatialEditorViewport::_list_select(InputEventMouseButton b) {
+
+ _find_items_at_pos(Vector2( b.x, b.y ),clicked_includes_current,selection_results,b.mod.shift);
+
+ Node *scene=editor->get_edited_scene();
+
+ for(int i=0;i<selection_results.size();i++) {
+ Spatial *item=selection_results[i].item;
+ if (item!=scene && item->get_owner()!=scene && !scene->is_editable_instance(item->get_owner())) {
+ //invalid result
+ selection_results.remove(i);
+ i--;
+ }
+
+ }
+
+
+ clicked_wants_append=b.mod.shift;
+
+ if (selection_results.size() == 1) {
+
+ clicked=selection_results[0].item->get_instance_ID();
+ selection_results.clear();
+
+ if (clicked) {
+ _select_clicked(clicked_wants_append,true);
+ clicked=0;
+ }
+
+ } else if (!selection_results.empty()) {
+
+ NodePath root_path = get_tree()->get_edited_scene_root()->get_path();
+ StringName root_name = root_path.get_name(root_path.get_name_count()-1);
+
+ for (int i = 0; i < selection_results.size(); i++) {
+
+ Spatial *spat=selection_results[i].item;
+
+ Ref<Texture> icon;
+ if (spat->has_meta("_editor_icon"))
+ icon=spat->get_meta("_editor_icon");
+ else
+ icon=get_icon( has_icon(spat->get_class(),"EditorIcons")?spat->get_class():String("Object"),"EditorIcons");
+
+ String node_path="/"+root_name+"/"+root_path.rel_path_to(spat->get_path());
+
+ selection_menu->add_item(spat->get_name());
+ selection_menu->set_item_icon(i, icon );
+ selection_menu->set_item_metadata(i, node_path);
+ selection_menu->set_item_tooltip(i,String(spat->get_name())+
+ "\nType: "+spat->get_class()+"\nPath: "+node_path);
+ }
+
+ selection_menu->set_global_pos(Vector2( b.global_x, b.global_y ));
+ selection_menu->popup();
+ selection_menu->call_deferred("grab_click_focus");
+ selection_menu->set_invalidate_click_until_motion();
+
+
+
+ }
+}
+void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
+
+ if (previewing)
+ return; //do NONE
+
+
+ {
+
+ EditorNode *en = editor;
+ EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
+
+ if (!over_plugin_list->empty()) {
+ bool discard = over_plugin_list->forward_spatial_gui_input(camera,p_event);
+ if (discard)
+ return;
+ }
+ }
+
+ switch(p_event.type) {
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &b=p_event.mouse_button;
+
+ switch(b.button_index) {
+
+ case BUTTON_WHEEL_UP: {
+
+
+ cursor.distance/=1.08;
+ if (cursor.distance<0.001)
+ cursor.distance=0.001;
+
+ } break;
+ case BUTTON_WHEEL_DOWN: {
+
+ if (cursor.distance<0.001)
+ cursor.distance=0.001;
+ cursor.distance*=1.08;
+
+ } break;
+ case BUTTON_RIGHT: {
+
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation_scheme").operator int();
+
+ if (b.pressed && _edit.gizmo.is_valid()) {
+ //restore
+ _edit.gizmo->commit_handle(_edit.gizmo_handle,_edit.gizmo_initial_value,true);
+ _edit.gizmo=Ref<SpatialEditorGizmo>();
+ }
+
+ if (_edit.mode==TRANSFORM_NONE && b.pressed) {
+
+ Plane cursor_plane(cursor.cursor_pos,_get_camera_normal());
+
+ Vector3 ray_origin = _get_ray_pos(Vector2(b.x,b.y));
+ Vector3 ray_dir = _get_ray(Vector2(b.x,b.y));
+
+
+ //gizmo modify
+
+ if (b.mod.control) {
+
+ Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_ray(ray_origin,ray_dir,get_tree()->get_root()->get_world()->get_scenario() );
+
+ Plane p(ray_origin,_get_camera_normal());
+
+ float min_d=1e10;
+ bool found=false;
+
+ for (int i=0;i<instances.size();i++) {
+
+
+ Object *obj=ObjectDB::get_instance(instances[i]);
+
+ if (!obj)
+ continue;
+
+ VisualInstance *vi=obj->cast_to<VisualInstance>();
+ if (!vi)
+ continue;
+
+ //optimize by checking AABB (although should pre sort by distance)
+ Rect3 aabb = vi->get_global_transform().xform(vi->get_aabb());
+ if (p.distance_to(aabb.get_support(-ray_dir))>min_d)
+ continue;
+
+ PoolVector<Face3> faces = vi->get_faces(VisualInstance::FACES_SOLID);
+ int c = faces.size();
+ if (c>0) {
+ PoolVector<Face3>::Read r = faces.read();
+
+ for(int j=0;j<c;j++) {
+
+ Vector3 inters;
+ if (r[j].intersects_ray(ray_origin,ray_dir,&inters)) {
+
+ float d = p.distance_to(inters);
+ if (d<0)
+ continue;
+
+ if (d<min_d) {
+ min_d=d;
+ found=true;
+ }
+ }
+
+ }
+ }
+
+ }
+
+ if (found) {
+
+ //cursor.cursor_pos=ray_origin+ray_dir*min_d;
+ //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos));
+
+ }
+
+ } else {
+ Vector3 new_pos;
+ if (cursor_plane.intersects_ray(ray_origin,ray_dir,&new_pos)) {
+
+ //cursor.cursor_pos=new_pos;
+ //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos));
+ }
+ }
+
+ if (b.mod.alt) {
+
+ if (nav_scheme == NAVIGATION_MAYA)
+ break;
+
+ _list_select(b);
+ return;
+
+ }
+ }
+
+ if (_edit.mode!=TRANSFORM_NONE && b.pressed) {
+ //cancel motion
+ _edit.mode=TRANSFORM_NONE;
+ //_validate_selection();
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ sp->set_global_transform( se->original );
+
+ }
+ surface->update();
+ //VisualServer::get_singleton()->poly_clear(indicators);
+ set_message(TTR("Transform Aborted."),3);
+ }
+ } break;
+ case BUTTON_MIDDLE: {
+
+ if (b.pressed && _edit.mode!=TRANSFORM_NONE) {
+
+ switch(_edit.plane ) {
+
+ case TRANSFORM_VIEW: {
+
+ _edit.plane=TRANSFORM_X_AXIS;
+ set_message(TTR("X-Axis Transform."),2);
+ name="";
+ _update_name();
+ } break;
+ case TRANSFORM_X_AXIS: {
+
+ _edit.plane=TRANSFORM_Y_AXIS;
+ set_message(TTR("Y-Axis Transform."),2);
+
+ } break;
+ case TRANSFORM_Y_AXIS: {
+
+ _edit.plane=TRANSFORM_Z_AXIS;
+ set_message(TTR("Z-Axis Transform."),2);
+
+ } break;
+ case TRANSFORM_Z_AXIS: {
+
+ _edit.plane=TRANSFORM_VIEW;
+ set_message(TTR("View Plane Transform."),2);
+
+ } break;
+ }
+
+ }
+ } break;
+ case BUTTON_LEFT: {
+
+ if (b.pressed) {
+
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation_scheme").operator int();
+ if ( (nav_scheme==NAVIGATION_MAYA || nav_scheme==NAVIGATION_MODO) && b.mod.alt) {
+ break;
+ }
+
+ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_LIST_SELECT) {
+ _list_select(b);
+ break;
+ }
+
+ _edit.mouse_pos=Point2(b.x,b.y);
+ _edit.snap=false;
+ _edit.mode=TRANSFORM_NONE;
+
+
+ //gizmo has priority over everything
+
+ bool can_select_gizmos=true;
+
+ {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
+ can_select_gizmos = view_menu->get_popup()->is_item_checked( idx );
+ }
+
+
+
+ if (can_select_gizmos && spatial_editor->get_selected()) {
+
+ Ref<SpatialEditorGizmo> seg = spatial_editor->get_selected()->get_gizmo();
+ if (seg.is_valid()) {
+ int handle=-1;
+ Vector3 point;
+ Vector3 normal;
+ bool inters = seg->intersect_ray(camera,_edit.mouse_pos,point,normal,&handle,b.mod.shift);
+ if (inters && handle!=-1) {
+
+ _edit.gizmo=seg;
+ _edit.gizmo_handle=handle;
+ //_edit.gizmo_initial_pos=seg->get_handle_pos(gizmo_handle);
+ _edit.gizmo_initial_value=seg->get_handle_value(handle);
+ break;
+
+ }
+ }
+ }
+
+
+
+ if (_gizmo_select(_edit.mouse_pos))
+ break;
+
+ clicked=0;
+ clicked_includes_current=false;
+
+
+ if ((spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT && b.mod.control) || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_ROTATE) {
+
+ /* HANDLE ROTATION */
+ if (get_selected_count()==0)
+ break; //bye
+ //handle rotate
+ _edit.mode=TRANSFORM_ROTATE;
+ _compute_edit(Point2(b.x,b.y));
+ break;
+
+ }
+
+ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_MOVE) {
+
+ if (get_selected_count()==0)
+ break; //bye
+ //handle rotate
+ _edit.mode=TRANSFORM_TRANSLATE;
+ _compute_edit(Point2(b.x,b.y));
+ break;
+
+
+ }
+
+
+ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SCALE) {
+
+ if (get_selected_count()==0)
+ break; //bye
+ //handle rotate
+ _edit.mode=TRANSFORM_SCALE;
+ _compute_edit(Point2(b.x,b.y));
+ break;
+
+
+ }
+
+
+
+ // todo scale
+
+ int gizmo_handle=-1;
+
+ clicked=_select_ray(Vector2( b.x, b.y ),b.mod.shift,clicked_includes_current,&gizmo_handle,b.mod.shift);
+
+ //clicking is always deferred to either move or release
+
+ clicked_wants_append=b.mod.shift;
+
+ if (!clicked) {
+
+ if (!clicked_wants_append)
+ _clear_selected();
+
+ //default to regionselect
+ cursor.region_select=true;
+ cursor.region_begin=Point2(b.x,b.y);
+ cursor.region_end=Point2(b.x,b.y);
+ }
+
+ if (clicked && gizmo_handle>=0) {
+
+ Object *obj=ObjectDB::get_instance(clicked);
+ if (obj) {
+
+ Spatial *spa = obj->cast_to<Spatial>();
+ if (spa) {
+
+ Ref<SpatialEditorGizmo> seg=spa->get_gizmo();
+ if (seg.is_valid()) {
+
+ _edit.gizmo=seg;
+ _edit.gizmo_handle=gizmo_handle;
+ //_edit.gizmo_initial_pos=seg->get_handle_pos(gizmo_handle);
+ _edit.gizmo_initial_value=seg->get_handle_value(gizmo_handle);
+ //print_line("GIZMO: "+itos(gizmo_handle)+" FROMPOS: "+_edit.orig_gizmo_pos);
+ break;
+
+ }
+ }
+
+ }
+ //_compute_edit(Point2(b.x,b.y)); //in case a motion happens..
+ }
+
+
+
+ surface->update();
+ } else {
+
+
+ if (_edit.gizmo.is_valid()) {
+
+ _edit.gizmo->commit_handle(_edit.gizmo_handle,_edit.gizmo_initial_value,false);
+ _edit.gizmo=Ref<SpatialEditorGizmo>();
+ break;
+ }
+ if (clicked) {
+ _select_clicked(clicked_wants_append,true);
+ //clickd processing was deferred
+ clicked=0;
+
+
+ }
+
+ if (cursor.region_select) {
+ _select_region();
+ cursor.region_select=false;
+ surface->update();
+ }
+
+
+ if (_edit.mode!=TRANSFORM_NONE) {
+
+
+ static const char* _transform_name[4]={"None","Rotate","Translate","Scale"};
+ undo_redo->create_action(_transform_name[_edit.mode]);
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ undo_redo->add_do_method(sp,"set_global_transform",sp->get_global_transform());
+ undo_redo->add_undo_method(sp,"set_global_transform",se->original);
+ }
+ undo_redo->commit_action();
+ _edit.mode=TRANSFORM_NONE;
+ //VisualServer::get_singleton()->poly_clear(indicators);
+ set_message("");
+ }
+
+
+ surface->update();
+ }
+ } break;
+ }
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+ const InputEventMouseMotion &m=p_event.mouse_motion;
+ _edit.mouse_pos=Point2(p_event.mouse_motion.x,p_event.mouse_motion.y);
+
+ if (spatial_editor->get_selected()) {
+
+
+ Ref<SpatialEditorGizmo> seg = spatial_editor->get_selected()->get_gizmo();
+ if (seg.is_valid()) {
+
+ int selected_handle=-1;
+
+ int handle=-1;
+ Vector3 point;
+ Vector3 normal;
+ bool inters = seg->intersect_ray(camera,_edit.mouse_pos,point,normal,&handle,false);
+ if (inters && handle!=-1) {
+
+ selected_handle=handle;
+
+ }
+
+ if (selected_handle!=spatial_editor->get_over_gizmo_handle()) {
+ spatial_editor->set_over_gizmo_handle(selected_handle);
+ spatial_editor->get_selected()->update_gizmo();
+ if (selected_handle!=-1)
+ spatial_editor->select_gizmo_hilight_axis(-1);
+ }
+ }
+ }
+
+ if (spatial_editor->get_over_gizmo_handle()==-1 && !(m.button_mask&1) && !_edit.gizmo.is_valid()) {
+
+ _gizmo_select(_edit.mouse_pos,true);
+
+ }
+
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation_scheme").operator int();
+ NavigationMode nav_mode = NAVIGATION_NONE;
+
+ if (_edit.gizmo.is_valid()) {
+
+ _edit.gizmo->set_handle(_edit.gizmo_handle,camera,Vector2(m.x,m.y));
+ Variant v = _edit.gizmo->get_handle_value(_edit.gizmo_handle);
+ String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle);
+ set_message(n+": "+String(v));
+
+ } else if (m.button_mask&1) {
+
+ if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt && m.mod.shift) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt && m.mod.control) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else {
+ if (clicked) {
+
+ if (!clicked_includes_current) {
+
+ _select_clicked(clicked_wants_append,true);
+ //clickd processing was deferred
+ }
+
+
+ _compute_edit(_edit.mouse_pos);
+ clicked=0;
+
+ _edit.mode=TRANSFORM_TRANSLATE;
+
+ }
+
+ if (cursor.region_select && nav_mode == NAVIGATION_NONE) {
+
+ cursor.region_end=Point2(m.x,m.y);
+ surface->update();
+ return;
+ }
+
+ if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE)
+ break;
+
+
+ Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) );
+ Vector3 ray=_get_ray( Vector2( m.x, m.y ) );
+
+
+ switch(_edit.mode) {
+
+ case TRANSFORM_SCALE: {
+
+
+ Plane plane=Plane(_edit.center,_get_camera_normal());
+
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
+
+ float center_click_dist = click.distance_to(_edit.center);
+ float center_inters_dist = intersection.distance_to(_edit.center);
+ if (center_click_dist==0)
+ break;
+
+ float scale = (center_inters_dist / center_click_dist)*100.0;
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+
+ scale = Math::stepify(scale,spatial_editor->get_scale_snap());
+ }
+
+ set_message(vformat(TTR("Scaling to %s%%."),String::num(scale,1)));
+ scale/=100.0;
+
+ Transform r;
+ r.basis.scale(Vector3(scale,scale,scale));
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+
+ Transform original=se->original;
+
+ Transform base=Transform( Basis(), _edit.center);
+ Transform t=base * (r * (base.inverse() * original));
+
+ sp->set_global_transform(t);
+ }
+
+ surface->update();
+
+ } break;
+
+ case TRANSFORM_TRANSLATE: {
+
+
+ Vector3 motion_mask;
+ Plane plane;
+
+ switch( _edit.plane ) {
+ case TRANSFORM_VIEW:
+ motion_mask=Vector3(0,0,0);
+ plane=Plane(_edit.center,_get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(0);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Y_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Z_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(2);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ }
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
+
+ //_validate_selection();
+ Vector3 motion = intersection-click;
+ if (motion_mask!=Vector3()) {
+ motion=motion_mask.dot(motion)*motion_mask;
+ }
+
+ float snap=0;
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+
+ snap = spatial_editor->get_translate_snap();
+ motion.snap(snap);
+ }
+
+ //set_message("Translating: "+motion);
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp) {
+ continue;
+ }
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ Transform t=se->original;
+ t.origin+=motion;
+ sp->set_global_transform(t);
+ }
+ } break;
+
+ case TRANSFORM_ROTATE: {
+
+
+ Plane plane;
+
+ switch( _edit.plane ) {
+ case TRANSFORM_VIEW:
+ plane=Plane(_edit.center,_get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(0));
+ break;
+ case TRANSFORM_Y_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(1));
+ break;
+ case TRANSFORM_Z_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(2));
+ break;
+ }
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
+
+
+ Vector3 y_axis=(click-_edit.center).normalized();
+ Vector3 x_axis=plane.normal.cross(y_axis).normalized();
+
+ float angle=Math::atan2( x_axis.dot(intersection-_edit.center), y_axis.dot(intersection-_edit.center) );
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+
+ float snap = spatial_editor->get_rotate_snap();
+
+ if (snap) {
+ angle=Math::rad2deg(angle)+snap*0.5; //else it wont reach +180
+ angle-=Math::fmod(angle,snap);
+ set_message(vformat(TTR("Rotating %s degrees."),rtos(angle)));
+ angle=Math::deg2rad(angle);
+ } else
+ set_message(vformat(TTR("Rotating %s degrees."),rtos(Math::rad2deg(angle))));
+
+ } else {
+ set_message(vformat(TTR("Rotating %s degrees."),rtos(Math::rad2deg(angle))));
+ }
+
+
+
+
+ Transform r;
+ r.basis.rotate(plane.normal,angle);
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+
+ Transform original=se->original;
+
+ Transform base=Transform( Basis(), _edit.center);
+ Transform t=base * r * base.inverse() * original;
+
+ sp->set_global_transform(t);
+ }
+
+ surface->update();
+ /*
+ VisualServer::get_singleton()->poly_clear(indicators);
+
+ Vector<Vector3> points;
+ Vector<Vector3> empty;
+ Vector<Color> colors;
+ points.push_back(intersection);
+ points.push_back(_edit.original.origin);
+ colors.push_back( Color(255,155,100) );
+ colors.push_back( Color(255,155,100) );
+ VisualServer::get_singleton()->poly_add_primitive(indicators,points,empty,colors,empty);
+ */
+ } break;
+ default:{}
+ }
+
+ }
+
+ } else if (m.button_mask&2) {
+
+ if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
+ nav_mode = NAVIGATION_ZOOM;
+ }
+
+ } else if (m.button_mask&4) {
+
+ if (nav_scheme == NAVIGATION_GODOT) {
+
+ int mod = 0;
+ if (m.mod.shift)
+ mod=KEY_SHIFT;
+ if (m.mod.alt)
+ mod=KEY_ALT;
+ if (m.mod.control)
+ mod=KEY_CONTROL;
+ if (m.mod.meta)
+ mod=KEY_META;
+
+ if (mod == _get_key_modifier("editors/3d/pan_modifier"))
+ nav_mode = NAVIGATION_PAN;
+ else if (mod == _get_key_modifier("editors/3d/zoom_modifier"))
+ nav_mode = NAVIGATION_ZOOM;
+ else if (mod == _get_key_modifier("editors/3d/orbit_modifier"))
+ nav_mode = NAVIGATION_ORBIT;
+
+ } else if (nav_scheme == NAVIGATION_MAYA) {
+ if (m.mod.alt)
+ nav_mode = NAVIGATION_PAN;
+ }
+
+ } else if (EditorSettings::get_singleton()->get("editors/3d/emulate_3_button_mouse")) {
+ // Handle trackpad (no external mouse) use case
+ int mod = 0;
+ if (m.mod.shift)
+ mod=KEY_SHIFT;
+ if (m.mod.alt)
+ mod=KEY_ALT;
+ if (m.mod.control)
+ mod=KEY_CONTROL;
+ if (m.mod.meta)
+ mod=KEY_META;
+
+ if(mod){
+ if (mod == _get_key_modifier("editors/3d/pan_modifier"))
+ nav_mode = NAVIGATION_PAN;
+ else if (mod == _get_key_modifier("editors/3d/zoom_modifier"))
+ nav_mode = NAVIGATION_ZOOM;
+ else if (mod == _get_key_modifier("editors/3d/orbit_modifier"))
+ nav_mode = NAVIGATION_ORBIT;
+ }
+ }
+
+ switch(nav_mode) {
+ case NAVIGATION_PAN:{
+
+ real_t pan_speed = 1/150.0;
+ int pan_speed_modifier = 10;
+ if (nav_scheme==NAVIGATION_MAYA && m.mod.shift)
+ pan_speed *= pan_speed_modifier;
+
+ Transform camera_transform;
+
+ camera_transform.translate(cursor.pos);
+ camera_transform.basis.rotate(Vector3(1,0,0),-cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0,1,0),-cursor.y_rot);
+ Vector3 translation(-m.relative_x*pan_speed,m.relative_y*pan_speed,0);
+ translation*=cursor.distance/DISTANCE_DEFAULT;
+ camera_transform.translate(translation);
+ cursor.pos=camera_transform.origin;
+
+ } break;
+
+ case NAVIGATION_ZOOM: {
+ real_t zoom_speed = 1/80.0;
+ int zoom_speed_modifier = 10;
+ if (nav_scheme==NAVIGATION_MAYA && m.mod.shift)
+ zoom_speed *= zoom_speed_modifier;
+
+ NavigationZoomStyle zoom_style = (NavigationZoomStyle)EditorSettings::get_singleton()->get("editors/3d/zoom_style").operator int();
+ if (zoom_style == NAVIGATION_ZOOM_HORIZONTAL) {
+ if ( m.relative_x > 0)
+ cursor.distance*=1-m.relative_x*zoom_speed;
+ else if (m.relative_x < 0)
+ cursor.distance/=1+m.relative_x*zoom_speed;
+ }
+ else {
+ if ( m.relative_y > 0)
+ cursor.distance*=1+m.relative_y*zoom_speed;
+ else if (m.relative_y < 0)
+ cursor.distance/=1-m.relative_y*zoom_speed;
+ }
+
+ } break;
+
+ case NAVIGATION_ORBIT: {
+ cursor.x_rot+=m.relative_y/80.0;
+ cursor.y_rot+=m.relative_x/80.0;
+ if (cursor.x_rot>Math_PI/2.0)
+ cursor.x_rot=Math_PI/2.0;
+ if (cursor.x_rot<-Math_PI/2.0)
+ cursor.x_rot=-Math_PI/2.0;
+ name="";
+ _update_name();
+ } break;
+
+ default: {}
+ }
+ } break;
+ case InputEvent::KEY: {
+ const InputEventKey &k = p_event.key;
+ if (!k.pressed)
+ break;
+
+ if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) {
+ if (_edit.mode != TRANSFORM_NONE) {
+ _edit.snap=true;
+ }
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/bottom_view", p_event)) {
+ cursor.y_rot = 0;
+ cursor.x_rot = -Math_PI/2.0;
+ set_message(TTR("Bottom View."),2);
+ name = TTR("Bottom");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/top_view", p_event)) {
+ cursor.y_rot = 0;
+ cursor.x_rot = Math_PI/2.0;
+ set_message(TTR("Top View."),2);
+ name = TTR("Top");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/rear_view", p_event)) {
+ cursor.x_rot = 0;
+ cursor.y_rot = Math_PI;
+ set_message(TTR("Rear View."),2);
+ name = TTR("Rear");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/front_view", p_event)) {
+ cursor.x_rot = 0;
+ cursor.y_rot=0;
+ set_message(TTR("Front View."),2);
+ name=TTR("Front");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/left_view", p_event)) {
+ cursor.x_rot=0;
+ cursor.y_rot = Math_PI/2.0;
+ set_message(TTR("Left View."),2);
+ name = TTR("Left");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/right_view", p_event)) {
+ cursor.x_rot=0;
+ cursor.y_rot = -Math_PI/2.0;
+ set_message(TTR("Right View."),2);
+ name = TTR("Right");
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/switch_perspective_orthogonal", p_event)) {
+ _menu_option(orthogonal?VIEW_PERSPECTIVE:VIEW_ORTHOGONAL);
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/insert_anim_key", p_event)) {
+ if (!get_selected_count() || _edit.mode!=TRANSFORM_NONE)
+ break;
+
+ if (!AnimationPlayerEditor::singleton->get_key_editor()->has_keying()) {
+ set_message(TTR("Keying is disabled (no key inserted)."));
+ break;
+ }
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ emit_signal("transform_key_request",sp,"",sp->get_transform());
+ }
+
+
+ set_message(TTR("Animation Key Inserted."));
+ }
+
+ if (k.scancode == KEY_SPACE) {
+ if (!k.pressed) emit_signal("toggle_maximize_view", this);
+ }
+
+ } break;
+
+ }
+
+}
+
+void SpatialEditorViewport::set_message(String p_message,float p_time) {
+
+ message=p_message;
+ message_time=p_time;
+
+}
+
+
+
+void SpatialEditorViewport::_notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ bool visible=is_visible_in_tree();
+
+ set_process(visible);
+
+ if (visible)
+ _update_camera();
+
+ call_deferred("update_transform_gizmo_view");
+ }
+
+ if (p_what==NOTIFICATION_RESIZED) {
+
+ call_deferred("update_transform_gizmo_view");
+
+ }
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+
+ //force editr camera
+ /*
+ current_camera=get_root_node()->get_current_camera();
+ if (current_camera!=camera) {
+
+
+ }
+ */
+
+ _update_camera();
+
+ Map<Node*,Object*> &selection = editor_selection->get_selection();
+
+ bool changed=false;
+ bool exist=false;
+
+ for(Map<Node*,Object*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->key()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+
+ VisualInstance *vi=sp->cast_to<VisualInstance>();
+
+
+ if (se->aabb.has_no_surface()) {
+
+ se->aabb=vi?vi->get_aabb():Rect3( Vector3(-0.2,-0.2,-0.2),Vector3(0.4,0.4,0.4));
+ }
+
+ Transform t=sp->get_global_transform();
+ t.translate(se->aabb.pos);
+ t.basis.scale( se->aabb.size );
+
+ exist=true;
+ if (se->last_xform==t)
+ continue;
+ changed=true;
+ se->last_xform=t;
+ VisualServer::get_singleton()->instance_set_transform(se->sbox_instance,t);
+
+ }
+
+ if (changed || (spatial_editor->is_gizmo_visible() && !exist)) {
+ spatial_editor->update_transform_gizmo();
+ }
+
+ if (message_time>0) {
+
+ if (message!=last_message) {
+ surface->update();
+ last_message=message;
+ }
+
+ message_time-=get_fixed_process_delta_time();
+ if (message_time<0)
+ surface->update();
+ }
+
+ //update shadow atlas if changed
+
+ int shadowmap_size = GlobalConfig::get_singleton()->get("rendering/shadow_atlas/size");
+ int atlas_q0 = GlobalConfig::get_singleton()->get("rendering/shadow_atlas/quadrant_0_subdiv");
+ int atlas_q1 = GlobalConfig::get_singleton()->get("rendering/shadow_atlas/quadrant_1_subdiv");
+ int atlas_q2 = GlobalConfig::get_singleton()->get("rendering/shadow_atlas/quadrant_2_subdiv");
+ int atlas_q3 = GlobalConfig::get_singleton()->get("rendering/shadow_atlas/quadrant_3_subdiv");
+
+
+ viewport->set_shadow_atlas_size(shadowmap_size);
+ viewport->set_shadow_atlas_quadrant_subdiv(0,Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0));
+ viewport->set_shadow_atlas_quadrant_subdiv(1,Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1));
+ viewport->set_shadow_atlas_quadrant_subdiv(2,Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2));
+ viewport->set_shadow_atlas_quadrant_subdiv(3,Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3));
+
+ //update msaa if changed
+
+ int msaa_mode = GlobalConfig::get_singleton()->get("rendering/quality/msaa");
+ viewport->set_msaa(Viewport::MSAA(msaa_mode));
+
+ bool hdr = GlobalConfig::get_singleton()->get("rendering/quality/hdr");
+ viewport->set_hdr(hdr);
+
+
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ surface->connect("draw",this,"_draw");
+ surface->connect("gui_input",this,"_sinput");
+ surface->connect("mouse_entered",this,"_smouseenter");
+ preview_camera->set_icon(get_icon("Camera","EditorIcons"));
+ _init_gizmo_instance(index);
+ }
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+
+ _finish_gizmo_instances();
+
+ }
+
+ if (p_what==NOTIFICATION_MOUSE_ENTER) {
+
+
+ }
+
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+
+ }
+
+}
+
+void SpatialEditorViewport::_draw() {
+
+ if (surface->has_focus()) {
+ Size2 size = surface->get_size();
+ Rect2 r =Rect2(Point2(),size);
+ get_stylebox("EditorFocus","EditorStyles")->draw(surface->get_canvas_item(),r);
+ }
+
+
+ RID ci=surface->get_canvas_item();
+
+ if (cursor.region_select) {
+
+ VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(cursor.region_begin,cursor.region_end-cursor.region_begin),Color(0.7,0.7,1.0,0.3));
+ }
+
+ if (message_time>0) {
+ Ref<Font> font = get_font("font","Label");
+ Point2 msgpos=Point2(5,get_size().y-20);
+ font->draw(ci,msgpos+Point2(1,1),message,Color(0,0,0,0.8));
+ font->draw(ci,msgpos+Point2(-1,-1),message,Color(0,0,0,0.8));
+ font->draw(ci,msgpos,message,Color(1,1,1,1));
+ }
+
+
+ if (_edit.mode==TRANSFORM_ROTATE) {
+
+ Point2 center = _point_to_screen(_edit.center);
+ VisualServer::get_singleton()->canvas_item_add_line(ci,_edit.mouse_pos, center, Color(0.4,0.7,1.0,0.8));
+
+
+ }
+
+ if (previewing) {
+
+
+ Size2 ss = Size2( GlobalConfig::get_singleton()->get("display/width"), GlobalConfig::get_singleton()->get("display/height") );
+ float aspect = ss.aspect();
+ Size2 s = get_size();
+
+ Rect2 draw_rect;
+
+
+ switch(previewing->get_keep_aspect_mode()) {
+ case Camera::KEEP_WIDTH: {
+
+ draw_rect.size = Size2(s.width,s.width/aspect);
+ draw_rect.pos.x=0;
+ draw_rect.pos.y=(s.height-draw_rect.size.y)*0.5;
+
+ } break;
+ case Camera::KEEP_HEIGHT: {
+
+ draw_rect.size = Size2(s.height*aspect,s.height);
+ draw_rect.pos.y=0;
+ draw_rect.pos.x=(s.width-draw_rect.size.x)*0.5;
+
+ } break;
+ }
+
+ draw_rect = Rect2(Vector2(),s).clip(draw_rect);
+
+ surface->draw_line(draw_rect.pos,draw_rect.pos+Vector2(draw_rect.size.x,0),Color(0.6,0.6,0.1,0.5),2.0);
+ surface->draw_line(draw_rect.pos+Vector2(draw_rect.size.x,0),draw_rect.pos+draw_rect.size,Color(0.6,0.6,0.1,0.5),2.0);
+ surface->draw_line(draw_rect.pos+draw_rect.size,draw_rect.pos+Vector2(0,draw_rect.size.y),Color(0.6,0.6,0.1,0.5),2.0);
+ surface->draw_line(draw_rect.pos,draw_rect.pos+Vector2(0,draw_rect.size.y),Color(0.6,0.6,0.1,0.5),2.0);
+ }
+
+}
+
+
+void SpatialEditorViewport::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case VIEW_TOP: {
+
+ cursor.x_rot=Math_PI/2.0;
+ cursor.y_rot=0;
+ name=TTR("Top");
+ _update_name();
+ } break;
+ case VIEW_BOTTOM: {
+
+ cursor.x_rot=-Math_PI/2.0;
+ cursor.y_rot=0;
+ name=TTR("Bottom");
+ _update_name();
+
+ } break;
+ case VIEW_LEFT: {
+
+ cursor.y_rot=Math_PI/2.0;
+ cursor.x_rot=0;
+ name=TTR("Left");
+ _update_name();
+
+ } break;
+ case VIEW_RIGHT: {
+
+ cursor.y_rot=-Math_PI/2.0;
+ cursor.x_rot=0;
+ name=TTR("Right");
+ _update_name();
+
+ } break;
+ case VIEW_FRONT: {
+
+ cursor.y_rot=0;
+ cursor.x_rot=0;
+ name=TTR("Front");
+ _update_name();
+
+ } break;
+ case VIEW_REAR: {
+
+ cursor.y_rot=Math_PI;
+ cursor.x_rot=0;
+ name=TTR("Rear");
+ _update_name();
+
+ } break;
+ case VIEW_CENTER_TO_ORIGIN: {
+
+ cursor.pos = Vector3(0,0,0);
+
+ } break;
+ case VIEW_CENTER_TO_SELECTION: {
+
+ focus_selection();
+
+ } break;
+ case VIEW_ALIGN_SELECTION_WITH_VIEW: {
+
+ if (!get_selected_count())
+ break;
+
+ Transform camera_transform = camera->get_global_transform();
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ undo_redo->create_action(TTR("Align with view"));
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ Transform xform = camera_transform;
+ xform.scale_basis(sp->get_scale());
+
+ undo_redo->add_do_method(sp,"set_global_transform",xform);
+ undo_redo->add_undo_method(sp,"set_global_transform",sp->get_global_transform());
+ }
+ undo_redo->commit_action();
+ } break;
+ case VIEW_ENVIRONMENT: {
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT);
+ bool current = view_menu->get_popup()->is_item_checked( idx );
+ current=!current;
+ if (current) {
+
+ camera->set_environment(RES());
+ } else {
+
+ camera->set_environment(SpatialEditor::get_singleton()->get_viewport_environment());
+ }
+
+ view_menu->get_popup()->set_item_checked( idx, current );
+
+
+ } break;
+ case VIEW_PERSPECTIVE: {
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), false );
+ orthogonal=false;
+ call_deferred("update_transform_gizmo_view");
+ _update_name();
+
+ } break;
+ case VIEW_ORTHOGONAL: {
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), true );
+ orthogonal=true;
+ call_deferred("update_transform_gizmo_view");
+ _update_name();
+
+ } break;
+ case VIEW_AUDIO_LISTENER: {
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
+ bool current = view_menu->get_popup()->is_item_checked( idx );
+ current=!current;
+ viewport->set_as_audio_listener(current);
+ view_menu->get_popup()->set_item_checked( idx, current );
+
+ } break;
+ case VIEW_GIZMOS: {
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
+ bool current = view_menu->get_popup()->is_item_checked( idx );
+ current=!current;
+ if (current)
+ camera->set_cull_mask( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+index))|(1<<GIZMO_EDIT_LAYER)|(1<<GIZMO_GRID_LAYER) );
+ else
+ camera->set_cull_mask( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+index))|(1<<GIZMO_GRID_LAYER) );
+ view_menu->get_popup()->set_item_checked( idx, current );
+
+ } break;
+
+ }
+
+}
+
+
+void SpatialEditorViewport::_preview_exited_scene() {
+
+ preview_camera->set_pressed(false);
+ _toggle_camera_preview(false);
+ view_menu->show();
+}
+
+
+void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
+
+ uint32_t layer=1<<(GIZMO_BASE_LAYER+p_idx);//|(1<<GIZMO_GRID_LAYER);
+
+ for(int i=0;i<3;i++) {
+ move_gizmo_instance[i]=VS::get_singleton()->instance_create();
+ VS::get_singleton()->instance_set_base(move_gizmo_instance[i],spatial_editor->get_move_gizmo(i)->get_rid());
+ VS::get_singleton()->instance_set_scenario(move_gizmo_instance[i],get_tree()->get_root()->get_world()->get_scenario());
+ VS::get_singleton()->instance_set_visible(move_gizmo_instance[i],false);
+ //VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true);
+ VS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
+ VS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i],layer);
+
+ rotate_gizmo_instance[i]=VS::get_singleton()->instance_create();
+ VS::get_singleton()->instance_set_base(rotate_gizmo_instance[i],spatial_editor->get_rotate_gizmo(i)->get_rid());
+ VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i],get_tree()->get_root()->get_world()->get_scenario());
+ VS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i],false);
+ //VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true);
+ VS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
+ VS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i],layer);
+ }
+
+}
+
+
+void SpatialEditorViewport::_finish_gizmo_instances() {
+
+
+ for(int i=0;i<3;i++) {
+ VS::get_singleton()->free(move_gizmo_instance[i]);
+ VS::get_singleton()->free(rotate_gizmo_instance[i]);
+ }
+
+}
+void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) {
+
+
+ ERR_FAIL_COND(p_activate && !preview);
+ ERR_FAIL_COND(!p_activate && !previewing);
+
+ if (!p_activate) {
+
+ previewing->disconnect("tree_exited",this,"_preview_exited_scene");
+ previewing=NULL;
+ VS::get_singleton()->viewport_attach_camera( viewport->get_viewport_rid(), camera->get_camera() ); //restore
+ if (!preview)
+ preview_camera->hide();
+ view_menu->show();
+ surface->update();
+
+ } else {
+
+ previewing=preview;
+ previewing->connect("tree_exited",this,"_preview_exited_scene");
+ VS::get_singleton()->viewport_attach_camera( viewport->get_viewport_rid(), preview->get_camera() ); //replace
+ view_menu->hide();
+ surface->update();
+
+ }
+}
+
+void SpatialEditorViewport::_selection_result_pressed(int p_result) {
+
+ if (selection_results.size() <= p_result)
+ return;
+
+ clicked=selection_results[p_result].item->get_instance_ID();
+
+ if (clicked) {
+ _select_clicked(clicked_wants_append,true);
+ clicked=0;
+ }
+}
+
+void SpatialEditorViewport::_selection_menu_hide() {
+
+ selection_results.clear();
+ selection_menu->clear();
+ selection_menu->set_size(Vector2(0, 0));
+}
+
+void SpatialEditorViewport::set_can_preview(Camera* p_preview) {
+
+ preview=p_preview;
+
+ if (!preview_camera->is_pressed()) {
+
+ if (p_preview) {
+ preview_camera->show();
+ } else {
+ preview_camera->hide();
+ }
+ }
+}
+
+void SpatialEditorViewport::update_transform_gizmo_view() {
+
+ if (!is_visible_in_tree())
+ return;
+
+ Transform xform = spatial_editor->get_gizmo_transform();
+
+
+ Transform camera_xform = camera->get_transform();
+ Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized();
+ Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized();
+ Plane p(camera_xform.origin,camz);
+ float gizmo_d = Math::abs( p.distance_to(xform.origin ));
+ float d0 = camera->unproject_position(camera_xform.origin+camz*gizmo_d).y;
+ float d1 = camera->unproject_position(camera_xform.origin+camz*gizmo_d+camy).y;
+ float dd = Math::abs(d0-d1);
+ if (dd==0)
+ dd=0.0001;
+
+ float gsize = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_size");
+ gizmo_scale=(gsize/Math::abs(dd));
+ Vector3 scale = Vector3(1,1,1) * gizmo_scale;
+
+ xform.basis.scale(scale);
+
+ //xform.basis.scale(GIZMO_SCALE_DEFAULT*Vector3(1,1,1));
+
+
+ for(int i=0;i<3;i++) {
+ VisualServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], xform );
+ VisualServer::get_singleton()->instance_set_visible(move_gizmo_instance[i],spatial_editor->is_gizmo_visible()&& (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_MOVE) );
+ VisualServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], xform );
+ VisualServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i],spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_ROTATE) );
+ }
+
+}
+
+void SpatialEditorViewport::set_state(const Dictionary& p_state) {
+
+ cursor.pos=p_state["pos"];
+ cursor.x_rot=p_state["x_rot"];
+ cursor.y_rot=p_state["y_rot"];
+ cursor.distance=p_state["distance"];
+ bool env = p_state["use_environment"];
+ bool orth = p_state["use_orthogonal"];
+ if (orth)
+ _menu_option(VIEW_ORTHOGONAL);
+ else
+ _menu_option(VIEW_PERSPECTIVE);
+ if (env != camera->get_environment().is_valid())
+ _menu_option(VIEW_ENVIRONMENT);
+ if (p_state.has("listener")) {
+ bool listener = p_state["listener"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
+ viewport->set_as_audio_listener(listener);
+ view_menu->get_popup()->set_item_checked( idx, listener );
+ }
+
+ if (p_state.has("previewing")) {
+ Node *pv = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["previewing"]);
+ if (pv && pv->cast_to<Camera>()) {
+ previewing=pv->cast_to<Camera>();
+ previewing->connect("tree_exited",this,"_preview_exited_scene");
+ VS::get_singleton()->viewport_attach_camera( viewport->get_viewport_rid(), previewing->get_camera() ); //replace
+ view_menu->hide();
+ surface->update();
+ preview_camera->set_pressed(true);
+ preview_camera->show();
+ }
+ }
+}
+
+Dictionary SpatialEditorViewport::get_state() const {
+
+ Dictionary d;
+ d["pos"]=cursor.pos;
+ d["x_rot"]=cursor.x_rot;
+ d["y_rot"]=cursor.y_rot;
+ d["distance"]=cursor.distance;
+ d["use_environment"]=camera->get_environment().is_valid();
+ d["use_orthogonal"]=camera->get_projection()==Camera::PROJECTION_ORTHOGONAL;
+ d["listener"]=viewport->is_audio_listener();
+ if (previewing) {
+ d["previewing"]=EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing);
+ }
+
+ return d;
+}
+
+
+void SpatialEditorViewport::_bind_methods(){
+
+ ClassDB::bind_method(D_METHOD("_draw"),&SpatialEditorViewport::_draw);
+ ClassDB::bind_method(D_METHOD("_smouseenter"),&SpatialEditorViewport::_smouseenter);
+ ClassDB::bind_method(D_METHOD("_sinput"),&SpatialEditorViewport::_sinput);
+ ClassDB::bind_method(D_METHOD("_menu_option"),&SpatialEditorViewport::_menu_option);
+ ClassDB::bind_method(D_METHOD("_toggle_camera_preview"),&SpatialEditorViewport::_toggle_camera_preview);
+ ClassDB::bind_method(D_METHOD("_preview_exited_scene"),&SpatialEditorViewport::_preview_exited_scene);
+ ClassDB::bind_method(D_METHOD("update_transform_gizmo_view"),&SpatialEditorViewport::update_transform_gizmo_view);
+ ClassDB::bind_method(D_METHOD("_selection_result_pressed"),&SpatialEditorViewport::_selection_result_pressed);
+ ClassDB::bind_method(D_METHOD("_selection_menu_hide"),&SpatialEditorViewport::_selection_menu_hide);
+
+ ADD_SIGNAL( MethodInfo("toggle_maximize_view", PropertyInfo(Variant::OBJECT, "viewport")) );
+}
+
+
+void SpatialEditorViewport::reset() {
+
+ orthogonal=false;
+ message_time=0;
+ message="";
+ last_message="";
+ name="";
+
+ cursor.x_rot=0.5;
+ cursor.y_rot=0.5;
+ cursor.distance=4;
+ cursor.region_select=false;
+ _update_name();
+}
+
+
+void SpatialEditorViewport::focus_selection() {
+ if (!get_selected_count())
+ return;
+
+ Vector3 center;
+ int count=0;
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ center+=sp->get_global_transform().origin;
+ count++;
+ }
+
+ if( count != 0 ) {
+ center/=float(count);
+ }
+
+ cursor.pos=center;
+}
+
+
+SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, EditorNode *p_editor, int p_index) {
+
+ _edit.mode=TRANSFORM_NONE;
+ _edit.plane=TRANSFORM_VIEW;
+ _edit.edited_gizmo=0;
+ _edit.snap=1;
+ _edit.gizmo_handle=0;
+
+
+
+ index=p_index;
+ editor=p_editor;
+ editor_selection=editor->get_editor_selection();
+ undo_redo=editor->get_undo_redo();
+ clicked=0;
+ clicked_includes_current=false;
+ orthogonal=false;
+ message_time=0;
+
+ spatial_editor=p_spatial_editor;
+ ViewportContainer *c=memnew(ViewportContainer);
+ c->set_stretch(true);
+ add_child(c);
+ c->set_area_as_parent_rect();
+ viewport = memnew( Viewport );
+ viewport->set_disable_input(true);
+
+ c->add_child(viewport);
+ surface = memnew( Control );
+ add_child(surface);
+ surface->set_area_as_parent_rect();
+ camera = memnew(Camera);
+ camera->set_disable_gizmo(true);
+ camera->set_cull_mask( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+p_index))|(1<<GIZMO_EDIT_LAYER)|(1<<GIZMO_GRID_LAYER) );
+ //camera->set_environment(SpatialEditor::get_singleton()->get_viewport_environment());
+ viewport->add_child(camera);
+ camera->make_current();
+ surface->set_focus_mode(FOCUS_ALL);
+
+ view_menu = memnew( MenuButton );
+ surface->add_child(view_menu);
+ view_menu->set_pos( Point2(4,4));
+ view_menu->set_self_modulate(Color(1,1,1,0.5));
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/top_view"), VIEW_TOP);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/bottom_view"), VIEW_BOTTOM);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/left_view"), VIEW_LEFT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/right_view"), VIEW_RIGHT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/front_view"), VIEW_FRONT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/rear_view"), VIEW_REAR);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_item(TTR("Perspective") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_PERSPECTIVE);
+ view_menu->get_popup()->add_check_item(TTR("Orthogonal") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_ORTHOGONAL);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE),true);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_environment", TTR("Environment")), VIEW_ENVIRONMENT);
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT),true);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_listener", TTR("Audio Listener")), VIEW_AUDIO_LISTENER);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_gizmos", TTR("Gizmos")),VIEW_GIZMOS);
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_GIZMOS),true);
+
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_origin"), VIEW_CENTER_TO_ORIGIN);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_selection_with_view"), VIEW_ALIGN_SELECTION_WITH_VIEW);
+ view_menu->get_popup()->connect("id_pressed",this,"_menu_option");
+
+ preview_camera = memnew( Button );
+ preview_camera->set_toggle_mode(true);
+ preview_camera->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,90);
+ preview_camera->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,10);
+ preview_camera->set_text("preview");
+ surface->add_child(preview_camera);
+ preview_camera->hide();
+ preview_camera->connect("toggled",this,"_toggle_camera_preview");
+ previewing=NULL;
+ preview=NULL;
+ gizmo_scale=1.0;
+
+ selection_menu = memnew( PopupMenu );
+ add_child(selection_menu);
+ selection_menu->set_custom_minimum_size(Vector2(100, 0));
+ selection_menu->connect("id_pressed", this, "_selection_result_pressed");
+ selection_menu->connect("popup_hide", this, "_selection_menu_hide");
+
+ if (p_index==0) {
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER),true);
+ viewport->set_as_audio_listener(true);
+ }
+
+
+ name=TTR("Top");
+ _update_name();
+
+ EditorSettings::get_singleton()->connect("settings_changed",this,"update_transform_gizmo_view");
+
+}
+
+
+
+
+
+
+
+SpatialEditor *SpatialEditor::singleton=NULL;
+
+SpatialEditorSelectedItem::~SpatialEditorSelectedItem() {
+
+ if (sbox_instance.is_valid())
+ VisualServer::get_singleton()->free(sbox_instance);
+}
+
+
+
+void SpatialEditor::select_gizmo_hilight_axis(int p_axis) {
+
+
+ for(int i=0;i<3;i++) {
+
+ move_gizmo[i]->surface_set_material(0,i==p_axis?gizmo_hl:gizmo_color[i]);
+ rotate_gizmo[i]->surface_set_material(0,(i+3)==p_axis?gizmo_hl:gizmo_color[i]);
+ }
+
+}
+
+void SpatialEditor::update_transform_gizmo() {
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+ Rect3 center;
+ bool first=true;
+
+ Basis gizmo_basis;
+ bool local_gizmo_coords = transform_menu->get_popup()->is_item_checked( transform_menu->get_popup()->get_item_index(MENU_TRANSFORM_LOCAL_COORDS) );
+
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ Transform xf = se->sp->get_global_transform();
+ if (first) {
+ center.pos=xf.origin;
+ first=false;
+ if (local_gizmo_coords) {
+ gizmo_basis=xf.basis;
+ gizmo_basis.orthonormalize();
+ }
+ } else {
+ center.expand_to(xf.origin);
+ gizmo_basis=Basis();
+ }
+ //count++;
+ }
+
+ Vector3 pcenter = center.pos+center.size*0.5;
+ gizmo.visible=!first;
+ gizmo.transform.origin=pcenter;
+ gizmo.transform.basis=gizmo_basis;
+
+ for(int i=0;i<4;i++) {
+ viewports[i]->update_transform_gizmo_view();
+ }
+
+}
+
+
+Object *SpatialEditor::_get_editor_data(Object *p_what) {
+
+ Spatial *sp = p_what->cast_to<Spatial>();
+ if (!sp)
+ return NULL;
+
+
+ SpatialEditorSelectedItem *si = memnew( SpatialEditorSelectedItem );
+
+ si->sp=sp;
+ si->sbox_instance=VisualServer::get_singleton()->instance_create2(selection_box->get_rid(),sp->get_world()->get_scenario());
+ VS::get_singleton()->instance_geometry_set_cast_shadows_setting(si->sbox_instance, VS::SHADOW_CASTING_SETTING_OFF);
+
+ if (get_tree()->is_editor_hint())
+ editor->call("edit_node",sp);
+
+ return si;
+}
+
+void SpatialEditor::_generate_selection_box() {
+
+ Rect3 aabb( Vector3(), Vector3(1,1,1) );
+ aabb.grow_by( aabb.get_longest_axis_size()/20.0 );
+
+ Ref<SurfaceTool> st = memnew( SurfaceTool );
+
+ st->begin(Mesh::PRIMITIVE_LINES);
+ for (int i=0;i<12;i++) {
+
+ Vector3 a,b;
+ aabb.get_edge(i,a,b);
+
+ /*Vector<Vector3> points;
+ Vector<Color> colors;
+ points.push_back(a);
+ points.push_back(b);*/
+
+ st->add_color( Color(1.0,1.0,0.8,0.8) );
+ st->add_vertex(a);
+ st->add_color( Color(1.0,1.0,0.8,0.4) );
+ st->add_vertex(a.linear_interpolate(b,0.2));
+
+ st->add_color( Color(1.0,1.0,0.8,0.4) );
+ st->add_vertex(a.linear_interpolate(b,0.8));
+ st->add_color( Color(1.0,1.0,0.8,0.8) );
+ st->add_vertex(b);
+
+ }
+
+ Ref<FixedSpatialMaterial> mat = memnew( FixedSpatialMaterial );
+ mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
+ mat->set_albedo(Color(1,1,1));
+ mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT,true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
+ st->set_material(mat);
+ selection_box = st->commit();
+}
+
+
+Dictionary SpatialEditor::get_state() const {
+
+
+ Dictionary d;
+
+ d["snap_enabled"]=snap_enabled;
+ d["translate_snap"]=get_translate_snap();
+ d["rotate_snap"]=get_rotate_snap();
+ d["scale_snap"]=get_scale_snap();
+
+ int local_coords_index=transform_menu->get_popup()->get_item_index(MENU_TRANSFORM_LOCAL_COORDS);
+ d["local_coords"]=transform_menu->get_popup()->is_item_checked( local_coords_index );
+
+ int vc=0;
+ if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT) ))
+ vc=1;
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS) ))
+ vc=2;
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS) ))
+ vc=3;
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS) ))
+ vc=4;
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT) ))
+ vc=5;
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT) ))
+ vc=6;
+
+ d["viewport_mode"]=vc;
+ Array vpdata;
+ for(int i=0;i<4;i++) {
+ vpdata.push_back( viewports[i]->get_state() );
+ }
+
+ d["viewports"]=vpdata;
+
+ d["default_light"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_LIGHT) );
+ d["ambient_light_color"]=settings_ambient_color->get_pick_color();
+
+ d["default_srgb"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_SRGB) );
+ d["show_grid"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID) );
+ d["show_origin"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN) );
+ d["fov"]=get_fov();
+ d["znear"]=get_znear();
+ d["zfar"]=get_zfar();
+ d["deflight_rot_x"]=settings_default_light_rot_x;
+ d["deflight_rot_y"]=settings_default_light_rot_y;
+
+ return d;
+}
+void SpatialEditor::set_state(const Dictionary& p_state) {
+
+ Dictionary d = p_state;
+
+ if (d.has("snap_enabled")) {
+ snap_enabled=d["snap_enabled"];
+ int snap_enabled_idx=transform_menu->get_popup()->get_item_index(MENU_TRANSFORM_USE_SNAP);
+ transform_menu->get_popup()->set_item_checked( snap_enabled_idx, snap_enabled );
+ }
+
+ if (d.has("translate_snap"))
+ snap_translate->set_text(d["translate_snap"]);
+
+ if (d.has("rotate_snap"))
+ snap_rotate->set_text(d["rotate_snap"]);
+
+ if (d.has("scale_snap"))
+ snap_scale->set_text(d["scale_snap"]);
+
+ if (d.has("local_coords")) {
+ int local_coords_idx=transform_menu->get_popup()->get_item_index(MENU_TRANSFORM_LOCAL_COORDS);
+ transform_menu->get_popup()->set_item_checked( local_coords_idx, d["local_coords"] );
+ update_transform_gizmo();
+ }
+
+ if (d.has("viewport_mode")) {
+ int vc = d["viewport_mode"];
+
+ if (vc==1)
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ else if (vc==2)
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
+ else if (vc==3)
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
+ else if (vc==4)
+ _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
+ else if (vc==5)
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ else if (vc==6)
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ }
+
+ if (d.has("viewports")) {
+ Array vp = d["viewports"];
+ ERR_FAIL_COND(vp.size()>4);
+
+ for(int i=0;i<4;i++) {
+ viewports[i]->set_state(vp[i]);
+ }
+ }
+
+ if (d.has("zfar"))
+ settings_zfar->set_value(float(d["zfar"]));
+ if (d.has("znear"))
+ settings_znear->set_value(float(d["znear"]));
+ if (d.has("fov"))
+ settings_fov->set_value(float(d["fov"]));
+
+ if (d.has("default_light")) {
+ bool use = d["default_light"];
+
+ bool existing = light_instance.is_valid();
+ if (use!=existing) {
+ if (existing) {
+ VisualServer::get_singleton()->free(light_instance);
+ light_instance=RID();
+ } else {
+ light_instance=VisualServer::get_singleton()->instance_create2(light,get_tree()->get_root()->get_world()->get_scenario());
+ VisualServer::get_singleton()->instance_set_transform(light_instance,light_transform);
+
+ }
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_LIGHT), light_instance.is_valid() );
+ }
+
+ }
+ if (d.has("ambient_light_color")) {
+ settings_ambient_color->set_pick_color(d["ambient_light_color"]);
+ //viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,d["ambient_light_color"]);
+ }
+
+ if (d.has("default_srgb")) {
+ bool use = d["default_srgb"];
+
+ //viewport_environment->set_enable_fx(Environment::FX_SRGB,use);
+ //view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_SRGB), use );
+ }
+ if (d.has("show_grid")) {
+ bool use = d["show_grid"];
+
+ if (use!=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID))) {
+ _menu_item_pressed(MENU_VIEW_GRID);
+ }
+ }
+
+ if (d.has("show_origin")) {
+ bool use = d["show_origin"];
+
+ if (use!=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN))) {
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), use );
+ VisualServer::get_singleton()->instance_set_visible(origin_instance,use);
+ }
+ }
+
+ if (d.has("deflight_rot_x"))
+ settings_default_light_rot_x=d["deflight_rot_x"];
+ if (d.has("deflight_rot_y"))
+ settings_default_light_rot_y=d["deflight_rot_y"];
+
+ _update_default_light_angle();
+
+
+}
+
+
+void SpatialEditor::edit(Spatial *p_spatial) {
+
+ if (p_spatial!=selected) {
+ if (selected) {
+
+ Ref<SpatialEditorGizmo> seg = selected->get_gizmo();
+ if (seg.is_valid()) {
+ seg->set_selected(false);
+ selected->update_gizmo();
+ }
+ }
+
+ selected=p_spatial;
+ over_gizmo_handle=-1;
+
+ if (selected) {
+
+ Ref<SpatialEditorGizmo> seg = selected->get_gizmo();
+ if (seg.is_valid()) {
+ seg->set_selected(true);
+ selected->update_gizmo();
+ }
+ }
+ }
+
+ /*
+ if (p_spatial) {
+ _validate_selection();
+ if (selected.has(p_spatial->get_instance_ID()) && selected.size()==1)
+ return;
+ _select(p_spatial->get_instance_ID(),false,true);
+
+ // should become the selection
+ }
+ */
+}
+
+void SpatialEditor::_xform_dialog_action() {
+
+ Transform t;
+ //translation
+ Vector3 scale;
+ Vector3 rotate;
+ Vector3 translate;
+
+ for(int i=0;i<3;i++) {
+ translate[i]=xform_translate[i]->get_text().to_double();
+ rotate[i]=Math::deg2rad(xform_rotate[i]->get_text().to_double());
+ scale[i]=xform_scale[i]->get_text().to_double();
+ }
+
+ t.basis.scale(scale);
+ t.basis.rotate(rotate);
+ t.origin=translate;
+
+
+ undo_redo->create_action(TTR("XForm Dialog"));
+
+ List<Node*> &selection = editor_selection->get_selected_node_list();
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
+
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
+
+ bool post = xform_type->get_selected()>0;
+
+ Transform tr = sp->get_global_transform();
+ if (post)
+ tr = tr * t;
+ else {
+
+ tr.basis = t.basis * tr.basis;
+ tr.origin+=t.origin;
+ }
+
+ undo_redo->add_do_method(sp,"set_global_transform",tr);
+ undo_redo->add_undo_method(sp,"set_global_transform",sp->get_global_transform());
+ }
+ undo_redo->commit_action();
+}
+
+void SpatialEditor::_menu_item_pressed(int p_option) {
+
+ switch(p_option) {
+
+ case MENU_TOOL_SELECT:
+ case MENU_TOOL_MOVE:
+ case MENU_TOOL_ROTATE:
+ case MENU_TOOL_SCALE:
+ case MENU_TOOL_LIST_SELECT: {
+
+ for(int i=0;i<TOOL_MAX;i++)
+ tool_button[i]->set_pressed(i==p_option);
+ tool_mode=(ToolMode)p_option;
+
+ //static const char *_mode[]={"Selection Mode.","Translation Mode.","Rotation Mode.","Scale Mode.","List Selection Mode."};
+ //set_message(_mode[p_option],3);
+ update_transform_gizmo();
+
+ } break;
+ case MENU_TRANSFORM_USE_SNAP: {
+
+ bool is_checked = transform_menu->get_popup()->is_item_checked( transform_menu->get_popup()->get_item_index(p_option) );
+ snap_enabled=!is_checked;
+ transform_menu->get_popup()->set_item_checked( transform_menu->get_popup()->get_item_index(p_option), snap_enabled );
+ } break;
+ case MENU_TRANSFORM_CONFIGURE_SNAP: {
+
+ snap_dialog->popup_centered(Size2(200,180));
+ } break;
+ case MENU_TRANSFORM_LOCAL_COORDS: {
+
+ bool is_checked = transform_menu->get_popup()->is_item_checked( transform_menu->get_popup()->get_item_index(p_option) );
+ transform_menu->get_popup()->set_item_checked( transform_menu->get_popup()->get_item_index(p_option), !is_checked );
+ update_transform_gizmo();
+
+ } break;
+ case MENU_TRANSFORM_DIALOG: {
+
+ for(int i=0;i<3;i++) {
+
+
+ xform_translate[i]->set_text("0");
+ xform_rotate[i]->set_text("0");
+ xform_scale[i]->set_text("1");
+
+ }
+
+ xform_dialog->popup_centered(Size2(200,200));
+
+ } break;
+ case MENU_VIEW_USE_DEFAULT_LIGHT: {
+
+ bool is_checked = view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(p_option) );
+
+ if (is_checked) {
+ VisualServer::get_singleton()->free(light_instance);
+ light_instance=RID();
+ } else {
+ light_instance=VisualServer::get_singleton()->instance_create2(light,get_tree()->get_root()->get_world()->get_scenario());
+ VisualServer::get_singleton()->instance_set_transform(light_instance,light_transform);
+
+ _update_default_light_angle();
+ }
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), light_instance.is_valid() );
+
+ } break;
+ case MENU_VIEW_USE_DEFAULT_SRGB: {
+
+ bool is_checked = view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(p_option) );
+
+ if (is_checked) {
+ //viewport_environment->set_enable_fx(Environment::FX_SRGB,false);
+ } else {
+ //viewport_environment->set_enable_fx(Environment::FX_SRGB,true);
+ }
+
+ is_checked = ! is_checked;
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), is_checked );
+
+
+ } break;
+ case MENU_VIEW_USE_1_VIEWPORT: {
+
+ for(int i=1;i<4;i++) {
+
+ viewports[i]->hide();
+ }
+
+ viewports[0]->set_area_as_parent_rect();
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false );
+
+ } break;
+ case MENU_VIEW_USE_2_VIEWPORTS: {
+
+ for(int i=1;i<4;i++) {
+
+ if (i==1 || i==3)
+ viewports[i]->hide();
+ else
+ viewports[i]->show();
+
+
+ }
+ viewports[0]->set_area_as_parent_rect();
+ //viewports[0]->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_RATIO,0.5);
+ viewports[2]->set_area_as_parent_rect();
+ //viewports[2]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false );
+
+ } break;
+ case MENU_VIEW_USE_2_VIEWPORTS_ALT: {
+
+ for(int i=1;i<4;i++) {
+
+ if (i==1 || i==3)
+ viewports[i]->hide();
+ else
+ viewports[i]->show();
+
+
+ }
+ viewports[0]->set_area_as_parent_rect();
+ //viewports[0]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ viewports[2]->set_area_as_parent_rect();
+ //viewports[2]->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false );
+
+ } break;
+ case MENU_VIEW_USE_3_VIEWPORTS: {
+
+ for(int i=1;i<4;i++) {
+
+ if (i==1)
+ viewports[i]->hide();
+ else
+ viewports[i]->show();
+ }
+ viewports[0]->set_area_as_parent_rect();
+ //viewports[0]->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_RATIO,0.5);
+ viewports[2]->set_area_as_parent_rect();
+ //viewports[2]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ //viewports[2]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+ viewports[3]->set_area_as_parent_rect();
+ //viewports[3]->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5);
+ //viewports[3]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false );
+
+ } break;
+ case MENU_VIEW_USE_3_VIEWPORTS_ALT: {
+
+ for(int i=1;i<4;i++) {
+
+ if (i==1)
+ viewports[i]->hide();
+ else
+ viewports[i]->show();
+ }
+ viewports[0]->set_area_as_parent_rect();
+ //viewports[0]->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_RATIO,0.5);
+ //viewports[0]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ viewports[2]->set_area_as_parent_rect();
+ //viewports[2]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+ //viewports[2]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ viewports[3]->set_area_as_parent_rect();
+ //viewports[3]->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), true );
+
+ } break;
+ case MENU_VIEW_USE_4_VIEWPORTS: {
+
+ for(int i=1;i<4;i++) {
+
+ viewports[i]->show();
+ }
+ viewports[0]->set_area_as_parent_rect();
+ //viewports[0]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ //viewports[0]->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_RATIO,0.5);
+ viewports[1]->set_area_as_parent_rect();
+ //viewports[1]->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5);
+ //viewports[1]->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_RATIO,0.5);
+ viewports[2]->set_area_as_parent_rect();
+ //viewports[2]->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_RATIO,0.5);
+ //viewports[2]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+ viewports[3]->set_area_as_parent_rect();
+ //viewports[3]->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_RATIO,0.5);
+ //viewports[3]->set_anchor_and_margin(MARGIN_TOP,ANCHOR_RATIO,0.5);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false );
+
+ } break;
+ case MENU_VIEW_DISPLAY_NORMAL: {
+
+
+ VisualServer::get_singleton()->scenario_set_debug( get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_DISABLED );
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_NORMAL), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_WIREFRAME), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_OVERDRAW), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_SHADELESS), false );
+
+ } break;
+ case MENU_VIEW_DISPLAY_WIREFRAME: {
+
+ VisualServer::get_singleton()->scenario_set_debug( get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_WIREFRAME );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_NORMAL), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_WIREFRAME), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_OVERDRAW), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_SHADELESS), false );
+
+ } break;
+ case MENU_VIEW_DISPLAY_OVERDRAW: {
+
+ VisualServer::get_singleton()->scenario_set_debug( get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_OVERDRAW );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_NORMAL), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_WIREFRAME), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_OVERDRAW), true );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_SHADELESS), false );
+
+ } break;
+ case MENU_VIEW_DISPLAY_SHADELESS: {
+
+ VisualServer::get_singleton()->scenario_set_debug( get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_SHADELESS );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_NORMAL), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_WIREFRAME), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_OVERDRAW), false );
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_SHADELESS), true );
+
+ } break;
+ case MENU_VIEW_ORIGIN: {
+
+ bool is_checked = view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(p_option) );
+
+ is_checked=!is_checked;
+ VisualServer::get_singleton()->instance_set_visible(origin_instance,is_checked);
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), is_checked);
+ } break;
+ case MENU_VIEW_GRID: {
+
+ bool is_checked = view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(p_option) );
+
+ grid_enabled=!is_checked;
+
+ for(int i=0;i<3;++i) {
+ if (grid_enable[i]) {
+ VisualServer::get_singleton()->instance_set_visible(grid_instance[i],grid_enabled);
+ grid_visible[i]=grid_enabled;
+ }
+ }
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), grid_enabled );
+
+
+ } break;
+ case MENU_VIEW_CAMERA_SETTINGS: {
+
+ settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size()+Size2(50,50));
+ } break;
+
+ }
+}
+
+
+void SpatialEditor::_init_indicators() {
+
+ //make sure that the camera indicator is not selectable
+ light=VisualServer::get_singleton()->light_create( VisualServer::LIGHT_DIRECTIONAL );
+ //VisualServer::get_singleton()->light_set_shadow( light, true );
+ light_instance=VisualServer::get_singleton()->instance_create2(light,get_tree()->get_root()->get_world()->get_scenario());
+
+
+
+ light_transform.rotate(Vector3(1,0,0),-Math_PI/5.0);
+ VisualServer::get_singleton()->instance_set_transform(light_instance,light_transform);
+
+
+ //RID mat = VisualServer::get_singleton()->fixed_material_create();
+ ///VisualServer::get_singleton()->fixed_material_set_flag(mat, VisualServer::FIXED_MATERIAL_FLAG_USE_ALPHA,true);
+ //VisualServer::get_singleton()->fixed_material_set_flag(mat, VisualServer::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY,true);
+
+
+ {
+
+ indicator_mat.instance();
+ indicator_mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
+ //indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ONTOP,true);
+ indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
+ indicator_mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
+
+ indicator_mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT,true);
+
+ PoolVector<Color> grid_colors[3];
+ PoolVector<Vector3> grid_points[3];
+ Vector<Color> origin_colors;
+ Vector<Vector3> origin_points;
+
+ Color grid_color = EditorSettings::get_singleton()->get("editors/3d/grid_color");
+
+ for(int i=0;i<3;i++) {
+ Vector3 axis;
+ axis[i]=1;
+ Vector3 axis_n1;
+ axis_n1[(i+1)%3]=1;
+ Vector3 axis_n2;
+ axis_n2[(i+2)%3]=1;
+
+ origin_colors.push_back(Color(axis.x,axis.y,axis.z));
+ origin_colors.push_back(Color(axis.x,axis.y,axis.z));
+ origin_points.push_back(axis*4096);
+ origin_points.push_back(axis*-4096);
+#define ORIGIN_GRID_SIZE 25
+
+ for(int j=-ORIGIN_GRID_SIZE;j<=ORIGIN_GRID_SIZE;j++) {
+
+
+ grid_colors[i].push_back(grid_color);
+ grid_colors[i].push_back(grid_color);
+ grid_colors[i].push_back(grid_color);
+ grid_colors[i].push_back(grid_color);
+ grid_points[i].push_back(axis_n1*ORIGIN_GRID_SIZE+axis_n2*j);
+ grid_points[i].push_back(-axis_n1*ORIGIN_GRID_SIZE+axis_n2*j);
+ grid_points[i].push_back(axis_n2*ORIGIN_GRID_SIZE+axis_n1*j);
+ grid_points[i].push_back(-axis_n2*ORIGIN_GRID_SIZE+axis_n1*j);
+
+ }
+
+ grid[i] = VisualServer::get_singleton()->mesh_create();
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[VisualServer::ARRAY_VERTEX]=grid_points[i];
+ d[VisualServer::ARRAY_COLOR]=grid_colors[i];
+ VisualServer::get_singleton()->mesh_add_surface_from_arrays(grid[i],VisualServer::PRIMITIVE_LINES,d);
+ VisualServer::get_singleton()->mesh_surface_set_material(grid[i],0,indicator_mat->get_rid());
+ grid_instance[i] = VisualServer::get_singleton()->instance_create2(grid[i],get_tree()->get_root()->get_world()->get_scenario());
+
+ grid_visible[i]=false;
+ grid_enable[i]=false;
+ VisualServer::get_singleton()->instance_set_visible(grid_instance[i],false);
+ VisualServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
+ VS::get_singleton()->instance_set_layer_mask(grid_instance[i], 1 << SpatialEditorViewport::GIZMO_GRID_LAYER);
+
+
+ }
+
+ origin = VisualServer::get_singleton()->mesh_create();
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[VisualServer::ARRAY_VERTEX]=origin_points;
+ d[VisualServer::ARRAY_COLOR]=origin_colors;
+
+ VisualServer::get_singleton()->mesh_add_surface_from_arrays(origin,VisualServer::PRIMITIVE_LINES,d);
+ VisualServer::get_singleton()->mesh_surface_set_material(origin,0,indicator_mat->get_rid());
+
+
+ //origin = VisualServer::get_singleton()->poly_create();
+ //VisualServer::get_singleton()->poly_add_primitive(origin,origin_points,Vector<Vector3>(),origin_colors,Vector<Vector3>());
+ //VisualServer::get_singleton()->poly_set_material(origin,indicator_mat,true);
+ origin_instance = VisualServer::get_singleton()->instance_create2(origin,get_tree()->get_root()->get_world()->get_scenario());
+ VS::get_singleton()->instance_set_layer_mask(origin_instance,1<<SpatialEditorViewport::GIZMO_GRID_LAYER);
+
+ VisualServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, VS::SHADOW_CASTING_SETTING_OFF);
+
+
+
+ VisualServer::get_singleton()->instance_set_visible(grid_instance[1],true);
+ grid_enable[1]=true;
+ grid_visible[1]=true;
+ grid_enabled=true;
+ last_grid_snap=1;
+
+ }
+
+ {
+ cursor_mesh = VisualServer::get_singleton()->mesh_create();
+ PoolVector<Vector3> cursor_points;
+ float cs = 0.25;
+ cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));
+ cursor_points.push_back(Vector3(0,0,+cs));
+ cursor_points.push_back(Vector3(0,0,-cs));
+ cursor_material.instance();
+ cursor_material->set_albedo(Color(0,1,1));
+ cursor_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
+
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[VS::ARRAY_VERTEX]=cursor_points;
+ VisualServer::get_singleton()->mesh_add_surface_from_arrays(cursor_mesh,VS::PRIMITIVE_LINES,d);
+ VisualServer::get_singleton()->mesh_surface_set_material(cursor_mesh,0,cursor_material->get_rid());
+
+ cursor_instance = VisualServer::get_singleton()->instance_create2(cursor_mesh,get_tree()->get_root()->get_world()->get_scenario());
+ VS::get_singleton()->instance_set_layer_mask(cursor_instance,1<<SpatialEditorViewport::GIZMO_GRID_LAYER);
+
+ VisualServer::get_singleton()->instance_geometry_set_cast_shadows_setting(cursor_instance, VS::SHADOW_CASTING_SETTING_OFF);
+
+
+ }
+
+
+ {
+
+ //move gizmo
+
+
+ float gizmo_alph = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity");
+
+ gizmo_hl = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ) );
+ gizmo_hl->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ gizmo_hl->set_flag(FixedSpatialMaterial::FLAG_ONTOP, true);
+ gizmo_hl->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ gizmo_hl->set_albedo(Color(1,1,1,gizmo_alph+0.2f));
+
+ for(int i=0;i<3;i++) {
+
+ move_gizmo[i]=Ref<Mesh>( memnew( Mesh ) );
+ rotate_gizmo[i]=Ref<Mesh>( memnew( Mesh ) );
+
+
+ Ref<FixedSpatialMaterial> mat = memnew( FixedSpatialMaterial );
+ mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_ONTOP, true);
+ mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ Color col;
+ col[i]=1.0;
+ col.a= gizmo_alph;
+ mat->set_albedo(col);
+ gizmo_color[i]=mat;
+
+
+
+
+ Vector3 ivec;
+ ivec[i]=1;
+ Vector3 nivec;
+ nivec[(i+1)%3]=1;
+ nivec[(i+2)%3]=1;
+ Vector3 ivec2;
+ ivec2[(i+1)%3]=1;
+ Vector3 ivec3;
+ ivec3[(i+2)%3]=1;
+
+
+ {
+
+ Ref<SurfaceTool> surftool = memnew( SurfaceTool );
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ //translate
+
+ const int arrow_points=5;
+ Vector3 arrow[5]={
+ nivec*0.0+ivec*0.0,
+ nivec*0.01+ivec*0.0,
+ nivec*0.01+ivec*1.0,
+ nivec*0.1+ivec*1.0,
+ nivec*0.0+ivec*(1+GIZMO_ARROW_SIZE),
+ };
+
+ int arrow_sides=6;
+
+
+ for(int k = 0; k < 7 ; k++) {
+
+
+ Basis ma(ivec,Math_PI*2*float(k)/arrow_sides);
+ Basis mb(ivec,Math_PI*2*float(k+1)/arrow_sides);
+
+
+ for(int j=0;j<arrow_points-1;j++) {
+
+ Vector3 points[4]={
+ ma.xform(arrow[j]),
+ mb.xform(arrow[j]),
+ mb.xform(arrow[j+1]),
+ ma.xform(arrow[j+1]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+ }
+
+ }
+
+ surftool->set_material(mat);
+ surftool->commit(move_gizmo[i]);
+ }
+
+ {
+
+
+ Ref<SurfaceTool> surftool = memnew( SurfaceTool );
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ Vector3 circle[5]={
+ ivec*0.02+ivec2*0.02+ivec2*1.0,
+ ivec*-0.02+ivec2*0.02+ivec2*1.0,
+ ivec*-0.02+ivec2*-0.02+ivec2*1.0,
+ ivec*0.02+ivec2*-0.02+ivec2*1.0,
+ ivec*0.02+ivec2*0.02+ivec2*1.0,
+ };
+
+
+ for(int k = 0; k < 33 ; k++) {
+
+
+ Basis ma(ivec,Math_PI*2*float(k)/32);
+ Basis mb(ivec,Math_PI*2*float(k+1)/32);
+
+
+ for(int j=0;j<4;j++) {
+
+ Vector3 points[4]={
+ ma.xform(circle[j]),
+ mb.xform(circle[j]),
+ mb.xform(circle[j+1]),
+ ma.xform(circle[j+1]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+ }
+
+ }
+
+ surftool->set_material(mat);
+ surftool->commit(rotate_gizmo[i]);
+
+ }
+
+
+ }
+ }
+
+ /*for(int i=0;i<4;i++) {
+
+ viewports[i]->init_gizmo_instance(i);
+ }*/
+
+ _generate_selection_box();
+
+
+ //get_scene()->get_root_node()->cast_to<EditorNode>()->get_scene_root()->add_child(camera);
+
+ //current_camera=camera;
+
+}
+
+void SpatialEditor::_finish_indicators() {
+
+ VisualServer::get_singleton()->free(origin_instance);
+ VisualServer::get_singleton()->free(origin);
+ for(int i=0;i<3;i++) {
+ VisualServer::get_singleton()->free(grid_instance[i]);
+ VisualServer::get_singleton()->free(grid[i]);
+ }
+ VisualServer::get_singleton()->free(light_instance);
+ VisualServer::get_singleton()->free(light);
+ //VisualServer::get_singleton()->free(poly);
+ //VisualServer::get_singleton()->free(indicators_instance);
+ //VisualServer::get_singleton()->free(indicators);
+
+ VisualServer::get_singleton()->free(cursor_instance);
+ VisualServer::get_singleton()->free(cursor_mesh);
+}
+
+void SpatialEditor::_instance_scene() {
+#if 0
+ EditorNode *en = get_scene()->get_root_node()->cast_to<EditorNode>();
+ ERR_FAIL_COND(!en);
+ String path = en->get_filesystem_dock()->get_selected_path();
+ if (path=="") {
+ set_message(TTR("No scene selected to instance!"));
+ return;
+ }
+
+ undo_redo->create_action(TTR("Instance at Cursor"));
+
+ Node* scene = en->request_instance_scene(path);
+
+ if (!scene) {
+ set_message(TTR("Could not instance scene!"));
+ undo_redo->commit_action(); //bleh
+ return;
+ }
+
+ Spatial *s = scene->cast_to<Spatial>();
+ if (s) {
+
+ undo_redo->add_do_method(s,"set_global_transform",Transform(Matrix3(),cursor.cursor_pos));
+ }
+
+ undo_redo->commit_action();
+#endif
+}
+
+void SpatialEditor::_unhandled_key_input(InputEvent p_event) {
+
+ if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack())
+ return;
+
+#if 0
+//i don't remember this being used, why was it here?
+ {
+
+ EditorNode *en = editor;
+ EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
+
+ if (!over_plugin_list->empty() && over_plugin_list->forward_gui_input(p_event)) {
+
+ return; //ate the over input event
+ }
+
+ }
+#endif
+
+ switch(p_event.type) {
+
+ case InputEvent::KEY: {
+
+
+ const InputEventKey &k=p_event.key;
+
+ if (!k.pressed)
+ break;
+
+ switch(k.scancode) {
+
+ case KEY_Q: _menu_item_pressed(MENU_TOOL_SELECT); break;
+ case KEY_W: _menu_item_pressed(MENU_TOOL_MOVE); break;
+ case KEY_E: _menu_item_pressed(MENU_TOOL_ROTATE); break;
+ case KEY_R: _menu_item_pressed(MENU_TOOL_SCALE); break;
+
+ case KEY_Z: {
+ if (k.mod.shift || k.mod.control || k.mod.command)
+ break;
+
+ if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_DISPLAY_WIREFRAME))) {
+ _menu_item_pressed(MENU_VIEW_DISPLAY_NORMAL);
+ } else {
+ _menu_item_pressed(MENU_VIEW_DISPLAY_WIREFRAME);
+ }
+ } break;
+
+#if 0
+#endif
+ }
+
+ } break;
+ }
+}
+void SpatialEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_READY) {
+
+ tool_button[SpatialEditor::TOOL_MODE_SELECT]->set_icon( get_icon("ToolSelect","EditorIcons") );
+ tool_button[SpatialEditor::TOOL_MODE_MOVE]->set_icon( get_icon("ToolMove","EditorIcons") );
+ tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon( get_icon("ToolRotate","EditorIcons") );
+ tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon( get_icon("ToolScale","EditorIcons") );
+ tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon( get_icon("ListSelect","EditorIcons") );
+ instance_button->set_icon( get_icon("SpatialAdd","EditorIcons") );
+ instance_button->hide();
+
+
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT),get_icon("Panels1","EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS),get_icon("Panels2","EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT),get_icon("Panels2Alt","EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS),get_icon("Panels3","EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT),get_icon("Panels3Alt","EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS),get_icon("Panels4","EditorIcons"));
+
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+
+ get_tree()->connect("node_removed",this,"_node_removed");
+ VS::get_singleton()->scenario_set_fallback_environment(get_viewport()->find_world()->get_scenario(),viewport_environment->get_rid());
+
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ gizmos = memnew( SpatialEditorGizmos );
+ _init_indicators();
+ _update_default_light_angle();
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ _finish_indicators();
+ memdelete( gizmos );
+
+ }
+}
+
+void SpatialEditor::add_control_to_menu_panel(Control *p_control) {
+
+
+ hbc_menu->add_child(p_control);
+}
+
+void SpatialEditor::set_can_preview(Camera* p_preview) {
+
+ for(int i=0;i<4;i++) {
+ viewports[i]->set_can_preview(p_preview);
+ }
+}
+
+VSplitContainer *SpatialEditor::get_shader_split() {
+
+ return shader_split;
+}
+
+HSplitContainer *SpatialEditor::get_palette_split() {
+
+ return palette_split;
+}
+
+
+void SpatialEditor::_request_gizmo(Object* p_obj) {
+
+ Spatial *sp=p_obj->cast_to<Spatial>();
+ if (!sp)
+ return;
+ if (editor->get_edited_scene() && (sp==editor->get_edited_scene() || sp->get_owner()==editor->get_edited_scene() || editor->get_edited_scene()->is_editable_instance(sp->get_owner()))) {
+
+ Ref<SpatialEditorGizmo> seg;
+
+ for(int i=0;i<EditorNode::get_singleton()->get_editor_data().get_editor_plugin_count();i++) {
+
+ seg = EditorNode::get_singleton()->get_editor_data().get_editor_plugin(i)->create_spatial_gizmo(sp);
+ if (seg.is_valid())
+ break;
+ }
+
+ if (!seg.is_valid()) {
+ seg = gizmos->get_gizmo(sp);
+ }
+
+ if (seg.is_valid()) {
+ sp->set_gizmo(seg);
+ }
+
+
+ if (seg.is_valid() && sp==selected) {
+ seg->set_selected(true);
+ selected->update_gizmo();
+ }
+
+ }
+}
+
+void SpatialEditor::_toggle_maximize_view(Object* p_viewport) {
+ if (!p_viewport) return;
+ SpatialEditorViewport *current_viewport = p_viewport->cast_to<SpatialEditorViewport>();
+ if (!current_viewport) return;
+
+ int index=-1;
+ bool maximized = false;
+ for(int i=0;i<4;i++) {
+ if (viewports[i]==current_viewport) {
+ index=i;
+ if ( current_viewport->get_global_rect() == viewport_base->get_global_rect() )
+ maximized=true;
+ break;
+ }
+ }
+ if (index==-1) return;
+
+ if (!maximized) {
+
+ for(int i=0;i<4;i++) {
+ if (i==index)
+ viewports[i]->set_area_as_parent_rect();
+ else
+ viewports[i]->hide();
+ }
+ } else {
+
+ for(int i=0;i<4;i++)
+ viewports[i]->show();
+
+ if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT) ))
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT) ))
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT) ))
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
+ }
+
+}
+
+
+void SpatialEditor::_node_removed(Node* p_node) {
+
+ if (p_node==selected)
+ selected=NULL;
+}
+
+void SpatialEditor::_bind_methods() {
+
+ //ClassDB::bind_method("_gui_input",&SpatialEditor::_gui_input);
+ ClassDB::bind_method("_unhandled_key_input",&SpatialEditor::_unhandled_key_input);
+ ClassDB::bind_method("_node_removed",&SpatialEditor::_node_removed);
+ ClassDB::bind_method("_menu_item_pressed",&SpatialEditor::_menu_item_pressed);
+ ClassDB::bind_method("_xform_dialog_action",&SpatialEditor::_xform_dialog_action);
+ ClassDB::bind_method("_instance_scene",&SpatialEditor::_instance_scene);
+ ClassDB::bind_method("_get_editor_data",&SpatialEditor::_get_editor_data);
+ ClassDB::bind_method("_request_gizmo",&SpatialEditor::_request_gizmo);
+ ClassDB::bind_method("_default_light_angle_input",&SpatialEditor::_default_light_angle_input);
+ ClassDB::bind_method("_update_ambient_light_color",&SpatialEditor::_update_ambient_light_color);
+ ClassDB::bind_method("_toggle_maximize_view",&SpatialEditor::_toggle_maximize_view);
+
+ ADD_SIGNAL( MethodInfo("transform_key_request") );
+
+
+}
+
+void SpatialEditor::clear() {
+
+ settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov",60.0));
+ settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near",0.1));
+ settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far",1500.0));
+
+ for(int i=0;i<4;i++) {
+ viewports[i]->reset();
+ }
+
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ _menu_item_pressed(MENU_VIEW_DISPLAY_NORMAL);
+
+
+ VisualServer::get_singleton()->instance_set_visible(origin_instance,true);
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), true);
+ for(int i=0;i<3;++i) {
+ if (grid_enable[i]) {
+ VisualServer::get_singleton()->instance_set_visible(grid_instance[i],true);
+ grid_visible[i]=true;
+ }
+ }
+
+ for(int i=0;i<4;i++) {
+
+ viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(SpatialEditorViewport::VIEW_AUDIO_LISTENER),i==0);
+ viewports[i]->viewport->set_as_audio_listener(i==0);
+ }
+
+ view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true );
+
+ settings_default_light_rot_x=Math_PI*0.3;
+ settings_default_light_rot_y=Math_PI*0.2;
+
+ //viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,Color(0.15,0.15,0.15));
+ settings_ambient_color->set_pick_color(Color(0.15,0.15,0.15));
+ if (!light_instance.is_valid())
+ _menu_item_pressed(MENU_VIEW_USE_DEFAULT_LIGHT);
+
+ _update_default_light_angle();
+
+
+}
+
+
+void SpatialEditor::_update_ambient_light_color(const Color& p_color) {
+
+ //viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,settings_ambient_color->get_color());
+
+}
+
+void SpatialEditor::_update_default_light_angle() {
+
+ Transform t;
+ t.basis.rotate(Vector3(1,0,0),-settings_default_light_rot_x);
+ t.basis.rotate(Vector3(0,1,0),-settings_default_light_rot_y);
+ settings_dlight->set_transform(t);
+ if (light_instance.is_valid()) {
+ VS::get_singleton()->instance_set_transform(light_instance,t);
+ }
+
+}
+
+void SpatialEditor::_default_light_angle_input(const InputEvent& p_event) {
+
+
+ if (p_event.type==InputEvent::MOUSE_MOTION && p_event.mouse_motion.button_mask&(0x1|0x2|0x4)) {
+
+ settings_default_light_rot_y = Math::fposmod(settings_default_light_rot_y - p_event.mouse_motion.relative_x*0.01,Math_PI*2.0);
+ settings_default_light_rot_x = Math::fposmod(settings_default_light_rot_x - p_event.mouse_motion.relative_y*0.01,Math_PI*2.0);
+ _update_default_light_angle();
+ }
+
+}
+
+
+SpatialEditor::SpatialEditor(EditorNode *p_editor) {
+
+ gizmo.visible=true;
+ gizmo.scale=1.0;
+
+ viewport_environment = Ref<Environment>( memnew( Environment ) );
+ undo_redo=p_editor->get_undo_redo();
+ VBoxContainer *vbc = this;
+
+ custom_camera=NULL;
+ singleton=this;
+ editor=p_editor;
+ editor_selection=editor->get_editor_selection();
+ editor_selection->add_editor_plugin(this);
+
+ snap_enabled=false;
+ tool_mode = TOOL_MODE_SELECT;
+
+ //set_focus_mode(FOCUS_ALL);
+
+ hbc_menu = memnew( HBoxContainer );
+ vbc->add_child(hbc_menu);
+
+
+ Vector<Variant> button_binds;
+ button_binds.resize(1);
+
+ tool_button[TOOL_MODE_SELECT] = memnew( ToolButton );
+ hbc_menu->add_child( tool_button[TOOL_MODE_SELECT] );
+ tool_button[TOOL_MODE_SELECT]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_SELECT]->set_flat(true);
+ tool_button[TOOL_MODE_SELECT]->set_pressed(true);
+ button_binds[0]=MENU_TOOL_SELECT;
+ tool_button[TOOL_MODE_SELECT]->connect("pressed", this,"_menu_item_pressed",button_binds);
+ tool_button[TOOL_MODE_SELECT]->set_tooltip("Select Mode (Q)\n"+keycode_get_string(KEY_MASK_CMD)+"Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection");
+
+
+ tool_button[TOOL_MODE_MOVE] = memnew( ToolButton );
+
+ hbc_menu->add_child( tool_button[TOOL_MODE_MOVE] );
+ tool_button[TOOL_MODE_MOVE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_MOVE]->set_flat(true);
+ button_binds[0]=MENU_TOOL_MOVE;
+ tool_button[TOOL_MODE_MOVE]->connect("pressed", this,"_menu_item_pressed",button_binds);
+ tool_button[TOOL_MODE_MOVE]->set_tooltip(TTR("Move Mode (W)"));
+
+ tool_button[TOOL_MODE_ROTATE] = memnew( ToolButton );
+ hbc_menu->add_child( tool_button[TOOL_MODE_ROTATE] );
+ tool_button[TOOL_MODE_ROTATE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_ROTATE]->set_flat(true);
+ button_binds[0]=MENU_TOOL_ROTATE;
+ tool_button[TOOL_MODE_ROTATE]->connect("pressed", this,"_menu_item_pressed",button_binds);
+ tool_button[TOOL_MODE_ROTATE]->set_tooltip(TTR("Rotate Mode (E)"));
+
+ tool_button[TOOL_MODE_SCALE] = memnew( ToolButton );
+ hbc_menu->add_child( tool_button[TOOL_MODE_SCALE] );
+ tool_button[TOOL_MODE_SCALE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_SCALE]->set_flat(true);
+ button_binds[0]=MENU_TOOL_SCALE;
+ tool_button[TOOL_MODE_SCALE]->connect("pressed", this,"_menu_item_pressed",button_binds);
+ tool_button[TOOL_MODE_SCALE]->set_tooltip(TTR("Scale Mode (R)"));
+
+ instance_button = memnew( Button );
+ hbc_menu->add_child( instance_button );
+ instance_button->set_flat(true);
+ instance_button->connect("pressed",this,"_instance_scene");
+ instance_button->hide();
+
+ VSeparator *vs = memnew( VSeparator );
+ hbc_menu->add_child(vs);
+
+ tool_button[TOOL_MODE_LIST_SELECT] = memnew( ToolButton );
+ hbc_menu->add_child( tool_button[TOOL_MODE_LIST_SELECT] );
+ tool_button[TOOL_MODE_LIST_SELECT]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_LIST_SELECT]->set_flat(true);
+ button_binds[0]=MENU_TOOL_LIST_SELECT;
+ tool_button[TOOL_MODE_LIST_SELECT]->connect("pressed", this,"_menu_item_pressed",button_binds);
+ tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
+
+ vs = memnew( VSeparator );
+ hbc_menu->add_child(vs);
+
+
+ ED_SHORTCUT("spatial_editor/bottom_view", TTR("Bottom View"), KEY_MASK_ALT+KEY_KP_7);
+ ED_SHORTCUT("spatial_editor/top_view", TTR("Top View"), KEY_KP_7);
+ ED_SHORTCUT("spatial_editor/rear_view", TTR("Rear View"), KEY_MASK_ALT+KEY_KP_1);
+ ED_SHORTCUT("spatial_editor/front_view", TTR("Front View"), KEY_KP_1);
+ ED_SHORTCUT("spatial_editor/left_view", TTR("Left View"), KEY_MASK_ALT+KEY_KP_3);
+ ED_SHORTCUT("spatial_editor/right_view", TTR("Right View"), KEY_KP_3);
+ ED_SHORTCUT("spatial_editor/switch_perspective_orthogonal", TTR("Switch Perspective/Orthogonal view"), KEY_KP_5);
+ ED_SHORTCUT("spatial_editor/snap", TTR("Snap"), KEY_S);
+ ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K);
+ ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O);
+ ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F);
+ ED_SHORTCUT("spatial_editor/align_selection_with_view", TTR("Align Selection With View"), KEY_MASK_ALT+KEY_MASK_CMD+KEY_F);
+
+
+ PopupMenu *p;
+
+ transform_menu = memnew( MenuButton );
+ transform_menu->set_text(TTR("Transform"));
+ hbc_menu->add_child( transform_menu );
+
+ p = transform_menu->get_popup();
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/use_snap", TTR("Use Snap")), MENU_TRANSFORM_USE_SNAP);
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap..")), MENU_TRANSFORM_CONFIGURE_SNAP);
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Local Coords")), MENU_TRANSFORM_LOCAL_COORDS);
+ //p->set_item_checked(p->get_item_count()-1,true);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/transform_dialog", TTR("Transform Dialog..")), MENU_TRANSFORM_DIALOG);
+
+ p->connect("id_pressed", this,"_menu_item_pressed");
+
+ view_menu = memnew( MenuButton );
+ view_menu->set_text(TTR("View"));
+ view_menu->set_pos( Point2( 212,0) );
+ hbc_menu->add_child( view_menu );
+
+ p = view_menu->get_popup();
+
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/use_default_light", TTR("Use Default Light")), MENU_VIEW_USE_DEFAULT_LIGHT);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/use_default_srgb", TTR("Use Default sRGB")), MENU_VIEW_USE_DEFAULT_SRGB);
+ p->add_separator();
+
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KEY_MASK_CMD+KEY_1), MENU_VIEW_USE_1_VIEWPORT);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KEY_MASK_CMD+KEY_2), MENU_VIEW_USE_2_VIEWPORTS);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KEY_MASK_ALT+KEY_MASK_CMD+KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"),KEY_MASK_CMD+KEY_3), MENU_VIEW_USE_3_VIEWPORTS);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KEY_MASK_ALT+KEY_MASK_CMD+KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD+KEY_4), MENU_VIEW_USE_4_VIEWPORTS);
+ p->add_separator();
+
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/display_normal", TTR("Display Normal")), MENU_VIEW_DISPLAY_NORMAL);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/display_wireframe", TTR("Display Wireframe")), MENU_VIEW_DISPLAY_WIREFRAME);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/display_overdraw", TTR("Display Overdraw")), MENU_VIEW_DISPLAY_OVERDRAW);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/display_shadeless", TTR("Display Shadeless")), MENU_VIEW_DISPLAY_SHADELESS);
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings")), MENU_VIEW_CAMERA_SETTINGS);
+
+
+ p->set_item_checked( p->get_item_index(MENU_VIEW_USE_DEFAULT_LIGHT), true );
+ p->set_item_checked( p->get_item_index(MENU_VIEW_DISPLAY_NORMAL), true );
+ p->set_item_checked( p->get_item_index(MENU_VIEW_ORIGIN), true );
+ p->set_item_checked( p->get_item_index(MENU_VIEW_GRID), true );
+
+
+ p->connect("id_pressed", this,"_menu_item_pressed");
+
+
+ /* REST OF MENU */
+
+ palette_split = memnew( HSplitContainer);
+ palette_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_child(palette_split);
+
+ shader_split = memnew( VSplitContainer );
+ shader_split->set_h_size_flags(SIZE_EXPAND_FILL);
+ palette_split->add_child(shader_split);
+ viewport_base = memnew( Control );
+ shader_split->add_child(viewport_base);
+ viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
+ for(int i=0;i<4;i++) {
+
+ viewports[i] = memnew( SpatialEditorViewport(this,editor,i) );
+ viewports[i]->connect("toggle_maximize_view",this,"_toggle_maximize_view");
+ viewport_base->add_child(viewports[i]);
+ }
+ //vbc->add_child(viewport_base);
+
+
+
+
+ /* SNAP DIALOG */
+
+ snap_dialog = memnew( ConfirmationDialog );
+ snap_dialog->set_title(TTR("Snap Settings"));
+ add_child(snap_dialog);
+
+ VBoxContainer *snap_dialog_vbc = memnew( VBoxContainer );
+ snap_dialog->add_child(snap_dialog_vbc);
+ //snap_dialog->set_child_rect(snap_dialog_vbc);
+
+ snap_translate = memnew( LineEdit );
+ snap_translate->set_text("1");
+ snap_dialog_vbc->add_margin_child(TTR("Translate Snap:"),snap_translate);
+
+ snap_rotate = memnew( LineEdit );
+ snap_rotate->set_text("5");
+ snap_dialog_vbc->add_margin_child(TTR("Rotate Snap (deg.):"),snap_rotate);
+
+ snap_scale = memnew( LineEdit );
+ snap_scale->set_text("5");
+ snap_dialog_vbc->add_margin_child(TTR("Scale Snap (%):"),snap_scale);
+
+ /* SETTINGS DIALOG */
+
+ settings_dialog = memnew( ConfirmationDialog );
+ settings_dialog->set_title(TTR("Viewport Settings"));
+ add_child(settings_dialog);
+ settings_vbc = memnew( VBoxContainer );
+ settings_vbc->set_custom_minimum_size(Size2(200,0));
+ settings_dialog->add_child(settings_vbc);
+ //settings_dialog->set_child_rect(settings_vbc);
+
+
+
+ settings_light_base = memnew( ViewportContainer );
+ settings_light_base->set_custom_minimum_size(Size2(128,128));
+ settings_light_base->connect("gui_input",this,"_default_light_angle_input");
+ settings_vbc->add_margin_child(TTR("Default Light Normal:"),settings_light_base);
+ settings_light_vp = memnew( Viewport );
+ settings_light_vp->set_disable_input(true);
+ settings_light_vp->set_use_own_world(true);
+ settings_light_base->add_child(settings_light_vp);
+
+ settings_dlight = memnew( DirectionalLight );
+ settings_light_vp->add_child(settings_dlight);
+ settings_sphere = memnew( ImmediateGeometry );
+ settings_sphere->begin(Mesh::PRIMITIVE_TRIANGLES,Ref<Texture>());
+ settings_sphere->set_color(Color(1,1,1));
+ settings_sphere->add_sphere(32,16,1);
+ settings_sphere->end();
+ settings_light_vp->add_child(settings_sphere);
+ settings_camera = memnew( Camera );
+ settings_light_vp->add_child(settings_camera);
+ settings_camera->set_translation(Vector3(0,0,2));
+ settings_camera->set_orthogonal(2.1,0.1,5);
+
+ settings_default_light_rot_x=Math_PI*0.3;
+ settings_default_light_rot_y=Math_PI*0.2;
+
+
+
+ settings_ambient_color = memnew( ColorPickerButton );
+ settings_vbc->add_margin_child(TTR("Ambient Light Color:"),settings_ambient_color);
+ settings_ambient_color->connect("color_changed",this,"_update_ambient_light_color");
+ settings_ambient_color->set_pick_color(Color(0.15,0.15,0.15));
+
+
+ settings_fov = memnew( SpinBox );
+ settings_fov->set_max(179);
+ settings_fov->set_min(1);
+ settings_fov->set_step(0.01);
+ settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov",60.0));
+ settings_vbc->add_margin_child(TTR("Perspective FOV (deg.):"),settings_fov);
+
+ settings_znear = memnew( SpinBox );
+ settings_znear->set_max(10000);
+ settings_znear->set_min(0.1);
+ settings_znear->set_step(0.01);
+ settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near",0.1));
+ settings_vbc->add_margin_child(TTR("View Z-Near:"),settings_znear);
+
+ settings_zfar = memnew( SpinBox );
+ settings_zfar->set_max(10000);
+ settings_zfar->set_min(0.1);
+ settings_zfar->set_step(0.01);
+ settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far",1500));
+ settings_vbc->add_margin_child(TTR("View Z-Far:"),settings_zfar);
+
+ //settings_dialog->get_cancel()->hide();
+ /* XFORM DIALOG */
+
+ xform_dialog = memnew( ConfirmationDialog );
+ xform_dialog->set_title(TTR("Transform Change"));
+ add_child(xform_dialog);
+ Label *l = memnew(Label);
+ l->set_text(TTR("Translate:"));
+ l->set_pos(Point2(5,5));
+ xform_dialog->add_child(l);
+
+ for(int i=0;i<3;i++) {
+
+ xform_translate[i] = memnew( LineEdit );
+ xform_translate[i]->set_pos( Point2(15+i*60,22) );
+ xform_translate[i]->set_size( Size2(50,12 ) );
+ xform_dialog->add_child( xform_translate[i] );
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Rotate (deg.):"));
+ l->set_pos(Point2(5,45));
+ xform_dialog->add_child(l);
+
+ for(int i=0;i<3;i++) {
+ xform_rotate[i] = memnew( LineEdit );
+ xform_rotate[i]->set_pos( Point2(15+i*60,62) );
+ xform_rotate[i]->set_size( Size2(50,22 ) );
+ xform_dialog->add_child(xform_rotate[i]);
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Scale (ratio):"));
+ l->set_pos(Point2(5,85));
+ xform_dialog->add_child(l);
+
+ for(int i=0;i<3;i++) {
+ xform_scale[i] = memnew( LineEdit );
+ xform_scale[i]->set_pos( Point2(15+i*60,102) );
+ xform_scale[i]->set_size( Size2(50,22 ) );
+ xform_dialog->add_child(xform_scale[i]);
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Transform Type"));
+ l->set_pos(Point2(5,125));
+ xform_dialog->add_child(l);
+
+ xform_type = memnew( OptionButton );
+ xform_type->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ xform_type->set_begin( Point2(15,142) );
+ xform_type->set_end( Point2(15,75) );
+ xform_type->add_item(TTR("Pre"));
+ xform_type->add_item(TTR("Post"));
+ xform_dialog->add_child(xform_type);
+
+ xform_dialog->connect("confirmed", this,"_xform_dialog_action");
+
+ scenario_debug=VisualServer::SCENARIO_DEBUG_DISABLED;
+
+ selected=NULL;
+
+ set_process_unhandled_key_input(true);
+ add_to_group("_spatial_editor_group");
+
+ EDITOR_DEF("editors/3d/manipulator_gizmo_size",80);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT,"editors/3d/manipulator_gizmo_size",PROPERTY_HINT_RANGE,"16,1024,1"));
+ EDITOR_DEF("editors/3d/manipulator_gizmo_opacity",0.2);
+
+ over_gizmo_handle=-1;
+}
+
+SpatialEditor::~SpatialEditor() {
+
+
+}
+
+
+
+
+void SpatialEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+
+ spatial_editor->show();
+ spatial_editor->set_process(true);
+ //VisualServer::get_singleton()->viewport_set_hide_scenario(editor->get_scene_root()->get_viewport(),false);
+ spatial_editor->grab_focus();
+
+ } else {
+
+ spatial_editor->hide();
+ spatial_editor->set_process(false);
+ //VisualServer::get_singleton()->viewport_set_hide_scenario(editor->get_scene_root()->get_viewport(),true);
+
+ }
+
+}
+void SpatialEditorPlugin::edit(Object *p_object) {
+
+ spatial_editor->edit(p_object->cast_to<Spatial>());
+}
+
+bool SpatialEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Spatial");
+}
+
+Dictionary SpatialEditorPlugin::get_state() const {
+ return spatial_editor->get_state();
+}
+
+void SpatialEditorPlugin::set_state(const Dictionary& p_state) {
+
+ spatial_editor->set_state(p_state);
+}
+
+void SpatialEditor::snap_cursor_to_plane(const Plane& p_plane) {
+
+ //cursor.pos=p_plane.project(cursor.pos);
+}
+
+void SpatialEditorPlugin::_bind_methods() {
+
+ ClassDB::bind_method("snap_cursor_to_plane",&SpatialEditorPlugin::snap_cursor_to_plane);
+
+}
+
+void SpatialEditorPlugin::snap_cursor_to_plane(const Plane& p_plane) {
+
+
+ spatial_editor->snap_cursor_to_plane(p_plane);
+}
+
+
+
+
+SpatialEditorPlugin::SpatialEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ spatial_editor = memnew( SpatialEditor(p_node) );
+ spatial_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor->get_viewport()->add_child(spatial_editor);
+
+ //spatial_editor->set_area_as_parent_rect();
+ spatial_editor->hide();
+ spatial_editor->connect("transform_key_request",editor,"_transform_keyed");
+
+ //spatial_editor->set_process(true);
+}
+
+
+SpatialEditorPlugin::~SpatialEditorPlugin() {
+
+}
diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h
new file mode 100644
index 0000000000..44ce4a0281
--- /dev/null
+++ b/editor/plugins/spatial_editor_plugin.h
@@ -0,0 +1,574 @@
+/*************************************************************************/
+/* spatial_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SPATIAL_EDITOR_PLUGIN_H
+#define SPATIAL_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/3d/visual_instance.h"
+#include "scene/3d/immediate_geometry.h"
+#include "scene/3d/light.h"
+#include "scene/gui/panel_container.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class Camera;
+class SpatialEditor;
+class SpatialEditorGizmos;
+
+class SpatialEditorGizmo : public SpatialGizmo {
+
+ GDCLASS(SpatialEditorGizmo,SpatialGizmo);
+
+ bool selected;
+public:
+
+ void set_selected(bool p_selected) { selected=p_selected; }
+ bool is_selected() const { return selected; }
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ virtual bool intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum);
+ virtual bool intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle=NULL,bool p_sec_first=false);
+ SpatialEditorGizmo();
+};
+
+
+class SpatialEditorViewport : public Control {
+
+ GDCLASS( SpatialEditorViewport, Control );
+friend class SpatialEditor;
+ enum {
+
+ VIEW_TOP,
+ VIEW_BOTTOM,
+ VIEW_LEFT,
+ VIEW_RIGHT,
+ VIEW_FRONT,
+ VIEW_REAR,
+ VIEW_CENTER_TO_ORIGIN,
+ VIEW_CENTER_TO_SELECTION,
+ VIEW_ALIGN_SELECTION_WITH_VIEW,
+ VIEW_PERSPECTIVE,
+ VIEW_ENVIRONMENT,
+ VIEW_ORTHOGONAL,
+ VIEW_AUDIO_LISTENER,
+ VIEW_GIZMOS,
+ };
+public:
+ enum {
+ GIZMO_BASE_LAYER=27,
+ GIZMO_EDIT_LAYER=26,
+ GIZMO_GRID_LAYER=25
+ };
+private:
+ int index;
+ String name;
+ void _menu_option(int p_option);
+ Size2 prev_size;
+
+ EditorNode *editor;
+ EditorSelection *editor_selection;
+ UndoRedo *undo_redo;
+
+ Button *preview_camera;
+
+ MenuButton *view_menu;
+
+ Control *surface;
+ Viewport *viewport;
+ Camera *camera;
+ bool transforming;
+ bool orthogonal;
+ float gizmo_scale;
+
+ struct _RayResult {
+
+ Spatial* item;
+ float depth;
+ int handle;
+ _FORCE_INLINE_ bool operator<(const _RayResult& p_rr) const { return depth<p_rr.depth; }
+ };
+
+ void _update_name();
+ void _compute_edit(const Point2& p_point);
+ void _clear_selected();
+ void _select_clicked(bool p_append,bool p_single);
+ void _select(Spatial *p_node, bool p_append,bool p_single);
+ ObjectID _select_ray(const Point2& p_pos, bool p_append,bool &r_includes_current,int *r_gizmo_handle=NULL,bool p_alt_select=false);
+ void _find_items_at_pos(const Point2& p_pos,bool &r_includes_current,Vector<_RayResult> &results,bool p_alt_select=false);
+ Vector3 _get_ray_pos(const Vector2& p_pos) const;
+ Vector3 _get_ray(const Vector2& p_pos);
+ Point2 _point_to_screen(const Vector3& p_point);
+ Transform _get_camera_transform() const;
+ int get_selected_count() const;
+
+ Vector3 _get_camera_pos() const;
+ Vector3 _get_camera_normal() const;
+ Vector3 _get_screen_to_space(const Vector3& p_vector3);
+
+ void _select_region();
+ bool _gizmo_select(const Vector2& p_screenpos,bool p_hilite_only=false);
+
+ float get_znear() const;
+ float get_zfar() const;
+ float get_fov() const;
+
+ ObjectID clicked;
+ Vector<_RayResult> selection_results;
+ bool clicked_includes_current;
+ bool clicked_wants_append;
+
+ PopupMenu *selection_menu;
+
+ enum NavigationScheme {
+ NAVIGATION_GODOT,
+ NAVIGATION_MAYA,
+ NAVIGATION_MODO,
+ };
+
+ enum NavigationZoomStyle {
+ NAVIGATION_ZOOM_VERTICAL,
+ NAVIGATION_ZOOM_HORIZONTAL
+ };
+
+ enum NavigationMode {
+ NAVIGATION_NONE,
+ NAVIGATION_PAN,
+ NAVIGATION_ZOOM,
+ NAVIGATION_ORBIT
+ };
+ enum TransformMode {
+ TRANSFORM_NONE,
+ TRANSFORM_ROTATE,
+ TRANSFORM_TRANSLATE,
+ TRANSFORM_SCALE
+
+ };
+ enum TransformPlane {
+ TRANSFORM_VIEW,
+ TRANSFORM_X_AXIS,
+ TRANSFORM_Y_AXIS,
+ TRANSFORM_Z_AXIS,
+ };
+
+ struct EditData {
+ TransformMode mode;
+ TransformPlane plane;
+ Transform original;
+ Vector3 click_ray;
+ Vector3 click_ray_pos;
+ Vector3 center;
+ Vector3 orig_gizmo_pos;
+ int edited_gizmo;
+ Point2 mouse_pos;
+ bool snap;
+ Ref<SpatialEditorGizmo> gizmo;
+ int gizmo_handle;
+ Variant gizmo_initial_value;
+ Vector3 gizmo_initial_pos;
+ } _edit;
+
+ struct Cursor {
+
+ Vector3 cursor_pos;
+
+ Vector3 pos;
+ float x_rot,y_rot,distance;
+ bool region_select;
+ Point2 region_begin,region_end;
+
+ Cursor() { x_rot=y_rot=0.5; distance=4; region_select=false; }
+ } cursor;
+
+ RID move_gizmo_instance[3], rotate_gizmo_instance[3];
+
+
+ String last_message;
+ String message;
+ float message_time;
+
+ void set_message(String p_message,float p_time=5);
+
+ //
+ void _update_camera();
+ void _draw();
+
+ void _smouseenter();
+ void _sinput(const InputEvent& p_ie);
+ SpatialEditor *spatial_editor;
+
+ Camera* previewing;
+ Camera* preview;
+
+ void _preview_exited_scene();
+ void _toggle_camera_preview(bool);
+ void _init_gizmo_instance(int p_idx);
+ void _finish_gizmo_instances();
+ void _selection_result_pressed(int);
+ void _selection_menu_hide();
+ void _list_select(InputEventMouseButton b);
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void update_transform_gizmo_view();
+
+ void set_can_preview(Camera* p_preview);
+ void set_state(const Dictionary& p_state);
+ Dictionary get_state() const;
+ void reset();
+
+ void focus_selection();
+
+ Viewport *get_viewport_node() { return viewport; }
+
+
+ SpatialEditorViewport(SpatialEditor *p_spatial_editor,EditorNode *p_editor,int p_index);
+};
+
+
+
+class SpatialEditorSelectedItem : public Object {
+
+ GDCLASS(SpatialEditorSelectedItem,Object);
+
+public:
+
+ Rect3 aabb;
+ Transform original; // original location when moving
+ Transform last_xform; // last transform
+ Spatial *sp;
+ RID sbox_instance;
+
+ SpatialEditorSelectedItem() { sp=NULL; }
+ ~SpatialEditorSelectedItem();
+};
+
+class SpatialEditor : public VBoxContainer {
+
+ GDCLASS(SpatialEditor, VBoxContainer );
+public:
+
+ enum ToolMode {
+
+ TOOL_MODE_SELECT,
+ TOOL_MODE_MOVE,
+ TOOL_MODE_ROTATE,
+ TOOL_MODE_SCALE,
+ TOOL_MODE_LIST_SELECT,
+ TOOL_MAX
+
+ };
+
+
+private:
+ EditorNode *editor;
+ EditorSelection *editor_selection;
+
+
+
+ Control *viewport_base;
+ SpatialEditorViewport *viewports[4];
+ VSplitContainer *shader_split;
+ HSplitContainer *palette_split;
+
+ /////
+
+ ToolMode tool_mode;
+ bool orthogonal;
+
+
+ VisualServer::ScenarioDebugMode scenario_debug;
+
+ RID light;
+ RID light_instance;
+ Transform light_transform;
+
+
+ RID origin;
+ RID origin_instance;
+ RID grid[3];
+ RID grid_instance[3];
+ bool grid_visible[3]; //currently visible
+ float last_grid_snap;
+ bool grid_enable[3]; //should be always visible if true
+ bool grid_enabled;
+
+ Ref<Mesh> move_gizmo[3], rotate_gizmo[3];
+ Ref<FixedSpatialMaterial> gizmo_color[3];
+ Ref<FixedSpatialMaterial> gizmo_hl;
+
+
+ int over_gizmo_handle;
+
+
+
+ Ref<Mesh> selection_box;
+ RID indicators;
+ RID indicators_instance;
+ RID cursor_mesh;
+ RID cursor_instance;
+ Ref<FixedSpatialMaterial> indicator_mat;
+ Ref<FixedSpatialMaterial> cursor_material;
+
+/*
+ struct Selected {
+ AABB aabb;
+ Transform original; // original location when moving
+ Transform last_xform; // last transform
+ Spatial *sp;
+ RID poly_instance;
+ };
+
+ Map<uint32_t,Selected> selected;
+*/
+ struct Gizmo {
+
+ bool visible;
+ float scale;
+ Transform transform;
+ } gizmo;
+
+
+
+
+ enum MenuOption {
+
+ MENU_TOOL_SELECT,
+ MENU_TOOL_MOVE,
+ MENU_TOOL_ROTATE,
+ MENU_TOOL_SCALE,
+ MENU_TOOL_LIST_SELECT,
+ MENU_TRANSFORM_USE_SNAP,
+ MENU_TRANSFORM_CONFIGURE_SNAP,
+ MENU_TRANSFORM_LOCAL_COORDS,
+ MENU_TRANSFORM_DIALOG,
+ MENU_VIEW_USE_1_VIEWPORT,
+ MENU_VIEW_USE_2_VIEWPORTS,
+ MENU_VIEW_USE_2_VIEWPORTS_ALT,
+ MENU_VIEW_USE_3_VIEWPORTS,
+ MENU_VIEW_USE_3_VIEWPORTS_ALT,
+ MENU_VIEW_USE_4_VIEWPORTS,
+ MENU_VIEW_USE_DEFAULT_LIGHT,
+ MENU_VIEW_USE_DEFAULT_SRGB,
+ MENU_VIEW_DISPLAY_NORMAL,
+ MENU_VIEW_DISPLAY_WIREFRAME,
+ MENU_VIEW_DISPLAY_OVERDRAW,
+ MENU_VIEW_DISPLAY_SHADELESS,
+ MENU_VIEW_ORIGIN,
+ MENU_VIEW_GRID,
+ MENU_VIEW_CAMERA_SETTINGS,
+
+ };
+
+
+ Button *tool_button[TOOL_MAX];
+ Button *instance_button;
+
+
+ MenuButton* transform_menu;
+ MenuButton* view_menu;
+
+ ConfirmationDialog *snap_dialog;
+ ConfirmationDialog *xform_dialog;
+ ConfirmationDialog *settings_dialog;
+
+ bool snap_enabled;
+ LineEdit *snap_translate;
+ LineEdit *snap_rotate;
+ LineEdit *snap_scale;
+ PanelContainer* menu_panel;
+
+ LineEdit *xform_translate[3];
+ LineEdit *xform_rotate[3];
+ LineEdit *xform_scale[3];
+ OptionButton *xform_type;
+
+ VBoxContainer *settings_vbc;
+ SpinBox *settings_fov;
+ SpinBox *settings_znear;
+ SpinBox *settings_zfar;
+ DirectionalLight *settings_dlight;
+ ImmediateGeometry *settings_sphere;
+ Camera *settings_camera;
+ float settings_default_light_rot_x;
+ float settings_default_light_rot_y;
+
+ ViewportContainer *settings_light_base;
+ Viewport *settings_light_vp;
+ ColorPickerButton *settings_ambient_color;
+ Image settings_light_dir_image;
+
+
+ void _xform_dialog_action();
+ void _menu_item_pressed(int p_option);
+
+ HBoxContainer *hbc_menu;
+
+
+
+//
+//
+ void _generate_selection_box();
+ UndoRedo *undo_redo;
+
+ void _instance_scene();
+ void _init_indicators();
+ void _finish_indicators();
+
+ void _toggle_maximize_view(Object* p_viewport);
+
+ Node *custom_camera;
+
+ Object *_get_editor_data(Object *p_what);
+
+ Ref<Environment> viewport_environment;
+
+ Spatial *selected;
+
+ void _request_gizmo(Object* p_obj);
+
+ static SpatialEditor *singleton;
+
+ void _node_removed(Node* p_node);
+ SpatialEditorGizmos *gizmos;
+ SpatialEditor();
+
+ void _update_ambient_light_color(const Color& p_color);
+ void _update_default_light_angle();
+ void _default_light_angle_input(const InputEvent& p_event);
+
+protected:
+
+
+
+
+ void _notification(int p_what);
+ //void _gui_input(InputEvent p_event);
+ void _unhandled_key_input(InputEvent p_event);
+
+ static void _bind_methods();
+public:
+
+
+ static SpatialEditor *get_singleton() { return singleton; }
+ void snap_cursor_to_plane(const Plane& p_plane);
+
+ float get_znear() const { return settings_znear->get_value(); }
+ float get_zfar() const { return settings_zfar->get_value(); }
+ float get_fov() const { return settings_fov->get_value(); }
+
+ Transform get_gizmo_transform() const { return gizmo.transform; }
+ bool is_gizmo_visible() const { return gizmo.visible; }
+
+ ToolMode get_tool_mode() const { return tool_mode; }
+ bool is_snap_enabled() const { return snap_enabled; }
+ float get_translate_snap() const { return snap_translate->get_text().to_double(); }
+ float get_rotate_snap() const { return snap_rotate->get_text().to_double(); }
+ float get_scale_snap() const { return snap_scale->get_text().to_double(); }
+
+ Ref<Mesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; }
+ Ref<Mesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }
+
+ void update_transform_gizmo();
+
+ void select_gizmo_hilight_axis(int p_axis);
+ void set_custom_camera(Node *p_camera) { custom_camera=p_camera; }
+
+ void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; }
+ Dictionary get_state() const;
+ void set_state(const Dictionary& p_state);
+
+ Ref<Environment> get_viewport_environment() { return viewport_environment; }
+
+ UndoRedo *get_undo_redo() { return undo_redo; }
+
+ void add_control_to_menu_panel(Control *p_control);
+
+ VSplitContainer *get_shader_split();
+ HSplitContainer *get_palette_split();
+
+ Spatial *get_selected() { return selected; }
+
+ int get_over_gizmo_handle() const { return over_gizmo_handle; }
+ void set_over_gizmo_handle(int idx) { over_gizmo_handle=idx; }
+
+ void set_can_preview(Camera* p_preview);
+
+ SpatialEditorViewport *get_editor_viewport(int p_idx) {
+ ERR_FAIL_INDEX_V(p_idx,4,NULL);
+ return viewports[p_idx];
+ }
+
+ Camera *get_camera() { return NULL; }
+ void edit(Spatial *p_spatial);
+ void clear();
+ SpatialEditor(EditorNode *p_editor);
+ ~SpatialEditor();
+};
+
+class SpatialEditorPlugin : public EditorPlugin {
+
+ GDCLASS( SpatialEditorPlugin, EditorPlugin );
+
+ SpatialEditor *spatial_editor;
+ EditorNode *editor;
+protected:
+ static void _bind_methods();
+public:
+
+ void snap_cursor_to_plane(const Plane& p_plane);
+
+ SpatialEditor *get_spatial_editor() { return spatial_editor; }
+ virtual String get_name() const { return "3D"; }
+ bool has_main_screen() const { return true; }
+ virtual void make_visible(bool p_visible);
+ virtual void edit(Object *p_object);
+ virtual bool handles(Object *p_object) const;
+
+ virtual Dictionary get_state() const;
+ virtual void set_state(const Dictionary& p_state);
+ virtual void clear() { spatial_editor->clear(); }
+
+
+ SpatialEditorPlugin(EditorNode *p_node);
+ ~SpatialEditorPlugin();
+
+};
+
+#endif
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
new file mode 100644
index 0000000000..44d6d3c6e1
--- /dev/null
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -0,0 +1,969 @@
+/*************************************************************************/
+/* sprite_frames_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "sprite_frames_editor_plugin.h"
+
+#include "io/resource_loader.h"
+#include "global_config.h"
+#include "editor/editor_settings.h"
+#include "scene/3d/sprite_3d.h"
+
+
+
+void SpriteFramesEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void SpriteFramesEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ load->set_icon( get_icon("Folder","EditorIcons") );
+ _delete->set_icon( get_icon("Del","EditorIcons") );
+ new_anim->set_icon( get_icon("New","EditorIcons") );
+ remove_anim->set_icon( get_icon("Del","EditorIcons") );
+
+ }
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //NodePath("/root")->connect("node_removed", this,"_node_removed",Vector<Variant>(),true);
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ }
+}
+
+void SpriteFramesEditor::_file_load_request(const PoolVector<String>& p_path,int p_at_pos) {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ List< Ref<Texture> > resources;
+
+ for(int i=0;i<p_path.size();i++) {
+
+ Ref<Texture> resource;
+ resource = ResourceLoader::load(p_path[i]);
+
+ if (resource.is_null()) {
+ dialog->set_text(TTR("ERROR: Couldn't load frame resource!"));
+ dialog->set_title(TTR("Error!"));
+ //dialog->get_cancel()->set_text("Close");
+ dialog->get_ok()->set_text(TTR("Close"));
+ dialog->popup_centered_minsize();
+ return; ///beh should show an error i guess
+ }
+
+ resources.push_back(resource);
+ }
+
+
+ if (resources.empty()) {
+ //print_line("added frames!");
+ return;
+ }
+
+ undo_redo->create_action(TTR("Add Frame"));
+ int fc=frames->get_frame_count(edited_anim);
+
+ int count=0;
+
+ for(List< Ref<Texture> >::Element *E=resources.front();E;E=E->next() ) {
+
+ undo_redo->add_do_method(frames,"add_frame",edited_anim,E->get(),p_at_pos==-1?-1:p_at_pos+count);
+ undo_redo->add_undo_method(frames,"remove_frame",edited_anim,p_at_pos==-1?fc:p_at_pos);
+ count++;
+
+ }
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+
+ undo_redo->commit_action();
+ //print_line("added frames!");
+}
+
+void SpriteFramesEditor::_load_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+ loading_scene=false;
+
+ file->clear_filters();
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("Texture",&extensions);
+ for(int i=0;i<extensions.size();i++)
+ file->add_filter("*."+extensions[i]);
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+
+ file->popup_centered_ratio();
+
+}
+
+
+void SpriteFramesEditor::_item_edited() {
+
+#if 0
+ if (!tree->get_selected())
+ return;
+
+ TreeItem *s = tree->get_selected();
+
+ if (tree->get_selected_column()==0) {
+ // renamed
+ String old_name=s->get_metadata(0);
+ String new_name=s->get_text(0);
+ if (old_name==new_name)
+ return;
+
+ if (new_name=="" || new_name.find("\\")!=-1 || new_name.find("/")!=-1 || frames->has_resource(new_name)) {
+
+ s->set_text(0,old_name);
+ return;
+ }
+
+ RES samp = frames->get_resource(old_name);
+ undo_redo->create_action("Rename Resource");
+ undo_redo->add_do_method(frames,"remove_resource",old_name);
+ undo_redo->add_do_method(frames,"add_resource",new_name,samp);
+ undo_redo->add_undo_method(frames,"remove_resource",new_name);
+ undo_redo->add_undo_method(frames,"add_resource",old_name,samp);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+ }
+#endif
+
+}
+
+void SpriteFramesEditor::_delete_confirm_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ if (tree->get_current()<0)
+ return;
+
+ sel-=1;
+ if (sel<0 && frames->get_frame_count(edited_anim))
+ sel=0;
+
+ int to_remove = tree->get_current();
+ sel=to_remove;
+ Ref<Texture> r = frames->get_frame(edited_anim,to_remove);
+ undo_redo->create_action(TTR("Delete Resource"));
+ undo_redo->add_do_method(frames,"remove_frame",edited_anim,to_remove);
+ undo_redo->add_undo_method(frames,"add_frame",edited_anim,r,to_remove);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+
+void SpriteFramesEditor::_paste_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ Ref<Texture> r=EditorSettings::get_singleton()->get_resource_clipboard();
+ if (!r.is_valid()) {
+ dialog->set_text(TTR("Resource clipboard is empty or not a texture!"));
+ dialog->set_title(TTR("Error!"));
+ //dialog->get_cancel()->set_text("Close");
+ dialog->get_ok()->set_text(TTR("Close"));
+ dialog->popup_centered_minsize();
+ return; ///beh should show an error i guess
+ }
+
+
+ undo_redo->create_action(TTR("Paste Frame"));
+ undo_redo->add_do_method(frames,"add_frame",edited_anim,r);
+ undo_redo->add_undo_method(frames,"remove_frame",edited_anim,frames->get_frame_count(edited_anim));
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_empty_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ int from=-1;
+
+ if (tree->get_current()>=0) {
+
+ from = tree->get_current();
+ sel=from;
+
+ } else {
+ from=frames->get_frame_count(edited_anim);
+ }
+
+
+
+ Ref<Texture> r;
+
+ undo_redo->create_action(TTR("Add Empty"));
+ undo_redo->add_do_method(frames,"add_frame",edited_anim,r,from);
+ undo_redo->add_undo_method(frames,"remove_frame",edited_anim,from);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_empty2_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ int from=-1;
+
+ if (tree->get_current()>=0) {
+
+ from = tree->get_current();
+ sel=from;
+
+ } else {
+ from=frames->get_frame_count(edited_anim);
+ }
+
+
+
+ Ref<Texture> r;
+
+ undo_redo->create_action(TTR("Add Empty"));
+ undo_redo->add_do_method(frames,"add_frame",edited_anim,r,from+1);
+ undo_redo->add_undo_method(frames,"remove_frame",edited_anim,from+1);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_up_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ if (tree->get_current()<0)
+ return;
+
+ int to_move = tree->get_current();
+ if (to_move<1)
+ return;
+
+ sel=to_move;
+ sel-=1;
+
+ Ref<Texture> r = frames->get_frame(edited_anim,to_move);
+ undo_redo->create_action(TTR("Delete Resource"));
+ undo_redo->add_do_method(frames,"set_frame",edited_anim,to_move,frames->get_frame(edited_anim,to_move-1));
+ undo_redo->add_do_method(frames,"set_frame",edited_anim,to_move-1,frames->get_frame(edited_anim,to_move));
+ undo_redo->add_undo_method(frames,"set_frame",edited_anim,to_move,frames->get_frame(edited_anim,to_move));
+ undo_redo->add_undo_method(frames,"set_frame",edited_anim,to_move-1,frames->get_frame(edited_anim,to_move-1));
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_down_pressed() {
+
+ ERR_FAIL_COND(!frames->has_animation(edited_anim));
+
+ if (tree->get_current()<0)
+ return;
+
+ int to_move = tree->get_current();
+ if (to_move<0 || to_move>=frames->get_frame_count(edited_anim)-1)
+ return;
+
+ sel=to_move;
+ sel+=1;
+
+ Ref<Texture> r = frames->get_frame(edited_anim,to_move);
+ undo_redo->create_action(TTR("Delete Resource"));
+ undo_redo->add_do_method(frames,"set_frame",edited_anim,to_move,frames->get_frame(edited_anim,to_move+1));
+ undo_redo->add_do_method(frames,"set_frame",edited_anim,to_move+1,frames->get_frame(edited_anim,to_move));
+ undo_redo->add_undo_method(frames,"set_frame",edited_anim,to_move,frames->get_frame(edited_anim,to_move));
+ undo_redo->add_undo_method(frames,"set_frame",edited_anim,to_move+1,frames->get_frame(edited_anim,to_move+1));
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+
+
+}
+
+
+void SpriteFramesEditor::_delete_pressed() {
+
+
+ if (tree->get_current()<0)
+ return;
+
+ _delete_confirm_pressed(); //it has undo.. why bother with a dialog..
+ /*
+ dialog->set_title("Confirm...");
+ dialog->set_text("Remove Resource '"+tree->get_selected()->get_text(0)+"' ?");
+ //dialog->get_cancel()->set_text("Cancel");
+ //dialog->get_ok()->show();
+ dialog->get_ok()->set_text("Remove");
+ dialog->popup_centered(Size2(300,60));*/
+
+}
+
+
+void SpriteFramesEditor::_animation_select() {
+
+ if (updating)
+ return;
+
+ TreeItem *selected = animations->get_selected();
+ ERR_FAIL_COND(!selected);
+ edited_anim=selected->get_text(0);
+ _update_library(true);
+
+}
+
+
+static void _find_anim_sprites(Node* p_node,List<Node*> *r_nodes,Ref<SpriteFrames> p_sfames) {
+
+ Node *edited = EditorNode::get_singleton()->get_edited_scene();
+ if (!edited)
+ return;
+ if (p_node!=edited && p_node->get_owner()!=edited)
+ return;
+
+ {
+ AnimatedSprite *as = p_node->cast_to<AnimatedSprite>();
+ if (as && as->get_sprite_frames()==p_sfames) {
+ r_nodes->push_back(p_node);
+ }
+ }
+
+ {
+ AnimatedSprite3D *as = p_node->cast_to<AnimatedSprite3D>();
+ if (as && as->get_sprite_frames()==p_sfames) {
+ r_nodes->push_back(p_node);
+ }
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+ _find_anim_sprites(p_node->get_child(i),r_nodes,p_sfames);
+ }
+
+}
+
+void SpriteFramesEditor::_animation_name_edited(){
+
+ if (updating)
+ return;
+
+ if (!frames->has_animation(edited_anim))
+ return;
+
+ TreeItem *edited = animations->get_edited();
+ if (!edited)
+ return;
+
+ String new_name = edited->get_text(0);
+
+ if (new_name==String(edited_anim))
+ return;
+
+ new_name=new_name.replace("/","_").replace(","," ");
+
+ String name=new_name;
+ int counter=0;
+ while(frames->has_animation(name)) {
+ counter++;
+ name=new_name+" "+itos(counter);
+ }
+
+ List<Node*> nodes;
+ _find_anim_sprites(EditorNode::get_singleton()->get_edited_scene(),&nodes,Ref<SpriteFrames>(frames));
+
+ undo_redo->create_action(TTR("Rename Animation"));
+ undo_redo->add_do_method(frames,"rename_animation",edited_anim,name);
+ undo_redo->add_undo_method(frames,"rename_animation",name,edited_anim);
+
+ for(List<Node*>::Element *E=nodes.front();E;E=E->next()) {
+
+ String current = E->get()->call("get_animation");
+ if (current!=edited_anim)
+ continue;
+
+ undo_redo->add_do_method(E->get(),"set_animation",name);
+ undo_redo->add_undo_method(E->get(),"set_animation",edited_anim);
+
+ }
+
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+
+ edited_anim=new_name;
+
+ undo_redo->commit_action();
+
+
+
+}
+void SpriteFramesEditor::_animation_add(){
+
+
+ String new_name = "New Anim";
+
+ String name=new_name;
+ int counter=0;
+ while(frames->has_animation(name)) {
+ counter++;
+ name=new_name+" "+itos(counter);
+ }
+
+ List<Node*> nodes;
+ _find_anim_sprites(EditorNode::get_singleton()->get_edited_scene(),&nodes,Ref<SpriteFrames>(frames));
+
+
+ undo_redo->create_action(TTR("Add Animation"));
+ undo_redo->add_do_method(frames,"add_animation",name);
+ undo_redo->add_undo_method(frames,"remove_animation",name);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+
+
+ for(List<Node*>::Element *E=nodes.front();E;E=E->next()) {
+
+ String current = E->get()->call("get_animation");
+ if (frames->has_animation(current))
+ continue;
+
+ undo_redo->add_do_method(E->get(),"set_animation",name);
+ undo_redo->add_undo_method(E->get(),"set_animation",current);
+
+ }
+
+ edited_anim=new_name;
+
+ undo_redo->commit_action();
+
+}
+void SpriteFramesEditor::_animation_remove(){
+
+ //fuck everything
+ if (updating)
+ return;
+
+ if (!frames->has_animation(edited_anim))
+ return;
+
+
+ undo_redo->create_action(TTR("Remove Animation"));
+ undo_redo->add_do_method(frames,"remove_animation",edited_anim);
+ undo_redo->add_undo_method(frames,"add_animation",edited_anim);
+ undo_redo->add_undo_method(frames,"set_animation_speed",edited_anim,frames->get_animation_speed(edited_anim));
+ undo_redo->add_undo_method(frames,"set_animation_loop",edited_anim,frames->get_animation_loop(edited_anim));
+ int fc = frames->get_frame_count(edited_anim);
+ for(int i=0;i<fc;i++) {
+ Ref<Texture> frame = frames->get_frame(edited_anim,i);
+ undo_redo->add_undo_method(frames,"add_frame",edited_anim,frame);
+ }
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+
+ undo_redo->commit_action();
+
+}
+
+
+void SpriteFramesEditor::_animation_loop_changed() {
+
+ if (updating)
+ return;
+
+ undo_redo->create_action(TTR("Change Animation Loop"));
+ undo_redo->add_do_method(frames,"set_animation_loop",edited_anim,anim_loop->is_pressed());
+ undo_redo->add_undo_method(frames,"set_animation_loop",edited_anim,frames->get_animation_loop(edited_anim));
+ undo_redo->add_do_method(this,"_update_library",true);
+ undo_redo->add_undo_method(this,"_update_library",true);
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_animation_fps_changed(double p_value) {
+
+ if (updating)
+ return;
+
+ undo_redo->create_action(TTR("Change Animation FPS"),UndoRedo::MERGE_ENDS);
+ undo_redo->add_do_method(frames,"set_animation_speed",edited_anim,p_value);
+ undo_redo->add_undo_method(frames,"set_animation_speed",edited_anim,frames->get_animation_speed(edited_anim));
+ undo_redo->add_do_method(this,"_update_library",true);
+ undo_redo->add_undo_method(this,"_update_library",true);
+
+ undo_redo->commit_action();
+
+}
+
+void SpriteFramesEditor::_update_library(bool p_skip_selector) {
+
+ updating=true;
+
+ if (!p_skip_selector) {
+ animations->clear();
+
+ TreeItem *anim_root=animations->create_item();
+
+ List<StringName> anim_names;
+
+ anim_names.sort_custom<StringName::AlphCompare>();
+
+ frames->get_animation_list(&anim_names);
+
+ anim_names.sort_custom<StringName::AlphCompare>();
+
+ for(List<StringName>::Element *E=anim_names.front();E;E=E->next()) {
+
+ String name = E->get();
+
+ TreeItem *it = animations->create_item(anim_root);
+
+ it->set_metadata(0,name);
+
+ it->set_text(0,name);
+ it->set_editable(0,true);
+
+ if (E->get()==edited_anim) {
+ it->select(0);
+ }
+ }
+ }
+
+
+ tree->clear();
+
+ if (!frames->has_animation(edited_anim)) {
+ updating=false;
+ return;
+ }
+
+
+ if (sel>=frames->get_frame_count(edited_anim))
+ sel=frames->get_frame_count(edited_anim)-1;
+ else if (sel<0 && frames->get_frame_count(edited_anim))
+ sel=0;
+
+ for(int i=0;i<frames->get_frame_count(edited_anim);i++) {
+
+
+ String name;
+ Ref<Texture> icon;
+
+
+ if (frames->get_frame(edited_anim,i).is_null()) {
+
+ name=itos(i)+": "+TTR("(empty)");
+
+ } else {
+ name=itos(i)+": "+frames->get_frame(edited_anim,i)->get_name();
+ icon=frames->get_frame(edited_anim,i);
+ }
+
+ tree->add_item(name,icon);
+ if (frames->get_frame(edited_anim,i).is_valid())
+ tree->set_item_tooltip(tree->get_item_count()-1,frames->get_frame(edited_anim,i)->get_path());
+ if (sel==i)
+ tree->select(tree->get_item_count()-1);
+ }
+
+ anim_speed->set_value(frames->get_animation_speed(edited_anim));
+ anim_loop->set_pressed(frames->get_animation_loop(edited_anim));
+
+ updating=false;
+ //player->add_resource("default",resource);
+}
+
+
+
+void SpriteFramesEditor::edit(SpriteFrames* p_frames) {
+
+ if (frames==p_frames)
+ return;
+
+ frames=p_frames;
+
+
+ if (p_frames) {
+
+ if (!p_frames->has_animation(edited_anim)) {
+
+ List<StringName> anim_names;
+ frames->get_animation_list(&anim_names);
+ anim_names.sort_custom<StringName::AlphCompare>();
+ if (anim_names.size()) {
+ edited_anim=anim_names.front()->get();
+ } else {
+ edited_anim=StringName();
+ }
+
+ }
+
+ _update_library();
+ } else {
+
+ hide();
+ //set_fixed_process(false);
+ }
+
+}
+
+
+Variant SpriteFramesEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ if (!frames->has_animation(edited_anim))
+ return false;
+
+ int idx = tree->get_item_at_pos(p_point,true);
+
+ if (idx<0 || idx>=frames->get_frame_count(edited_anim))
+ return Variant();
+
+ RES frame = frames->get_frame(edited_anim,idx);
+
+ if (frame.is_null())
+ return Variant();
+
+ return EditorNode::get_singleton()->drag_resource(frame,p_from);
+
+
+}
+
+bool SpriteFramesEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return false;
+
+ if (d.has("from") && (Object*)(d["from"])==tree)
+ return false;
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ Ref<Texture> texture = r;
+
+ if (texture.is_valid()) {
+
+ return true;
+ }
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+ if (files.size()==0)
+ return false;
+
+ for(int i=0;i<files.size();i++) {
+ String file = files[0];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+ if (!ClassDB::is_parent_class(ftype,"Texture")) {
+ return false;
+ }
+
+ }
+
+ return true;
+
+ }
+ return false;
+}
+
+void SpriteFramesEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ if (!can_drop_data_fw(p_point,p_data,p_from))
+ return;
+
+ Dictionary d = p_data;
+
+ if (!d.has("type"))
+ return;
+
+ int at_pos = tree->get_item_at_pos(p_point,true);
+
+ if (String(d["type"])=="resource" && d.has("resource")) {
+ RES r=d["resource"];
+
+ Ref<Texture> texture = r;
+
+ if (texture.is_valid()) {
+
+ undo_redo->create_action(TTR("Add Frame"));
+ undo_redo->add_do_method(frames,"add_frame",edited_anim,texture,at_pos==-1?-1:at_pos);
+ undo_redo->add_undo_method(frames,"remove_frame",edited_anim,at_pos==-1?frames->get_frame_count(edited_anim):at_pos);
+ undo_redo->add_do_method(this,"_update_library");
+ undo_redo->add_undo_method(this,"_update_library");
+ undo_redo->commit_action();
+
+ }
+ }
+
+
+ if (String(d["type"])=="files") {
+
+ PoolVector<String> files = d["files"];
+
+ _file_load_request(files,at_pos);
+ }
+
+}
+
+
+void SpriteFramesEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&SpriteFramesEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_load_pressed"),&SpriteFramesEditor::_load_pressed);
+ ClassDB::bind_method(D_METHOD("_empty_pressed"),&SpriteFramesEditor::_empty_pressed);
+ ClassDB::bind_method(D_METHOD("_empty2_pressed"),&SpriteFramesEditor::_empty2_pressed);
+ ClassDB::bind_method(D_METHOD("_item_edited"),&SpriteFramesEditor::_item_edited);
+ ClassDB::bind_method(D_METHOD("_delete_pressed"),&SpriteFramesEditor::_delete_pressed);
+ ClassDB::bind_method(D_METHOD("_paste_pressed"),&SpriteFramesEditor::_paste_pressed);
+ ClassDB::bind_method(D_METHOD("_delete_confirm_pressed"),&SpriteFramesEditor::_delete_confirm_pressed);
+ ClassDB::bind_method(D_METHOD("_file_load_request","files","atpos"),&SpriteFramesEditor::_file_load_request,DEFVAL(-1));
+ ClassDB::bind_method(D_METHOD("_update_library","skipsel"),&SpriteFramesEditor::_update_library,DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("_up_pressed"),&SpriteFramesEditor::_up_pressed);
+ ClassDB::bind_method(D_METHOD("_down_pressed"),&SpriteFramesEditor::_down_pressed);
+ ClassDB::bind_method(D_METHOD("_animation_select"),&SpriteFramesEditor::_animation_select);
+ ClassDB::bind_method(D_METHOD("_animation_name_edited"),&SpriteFramesEditor::_animation_name_edited);
+ ClassDB::bind_method(D_METHOD("_animation_add"),&SpriteFramesEditor::_animation_add);
+ ClassDB::bind_method(D_METHOD("_animation_remove"),&SpriteFramesEditor::_animation_remove);
+ ClassDB::bind_method(D_METHOD("_animation_loop_changed"),&SpriteFramesEditor::_animation_loop_changed);
+ ClassDB::bind_method(D_METHOD("_animation_fps_changed"),&SpriteFramesEditor::_animation_fps_changed);
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &SpriteFramesEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SpriteFramesEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &SpriteFramesEditor::drop_data_fw);
+
+
+}
+
+
+SpriteFramesEditor::SpriteFramesEditor() {
+
+ //add_style_override("panel", get_stylebox("panel","Panel"));
+
+ split = memnew( HSplitContainer );
+ add_child(split);
+
+ VBoxContainer *vbc_animlist = memnew( VBoxContainer );
+ split->add_child(vbc_animlist);
+ vbc_animlist->set_custom_minimum_size(Size2(150,0));
+ //vbc_animlist->set_v_size_flags(SIZE_EXPAND_FILL);
+
+
+ VBoxContainer *sub_vb = memnew( VBoxContainer );
+ vbc_animlist->add_margin_child(TTR("Animations"),sub_vb,true);
+ sub_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *hbc_animlist = memnew( HBoxContainer );
+ sub_vb->add_child(hbc_animlist);
+
+ new_anim = memnew( Button );
+ hbc_animlist->add_child(new_anim);
+ new_anim->connect("pressed",this,"_animation_add");
+
+
+ hbc_animlist->add_spacer();
+
+ remove_anim = memnew( Button );
+ hbc_animlist->add_child(remove_anim);
+ remove_anim->connect("pressed",this,"_animation_remove");
+
+ animations = memnew( Tree );
+ sub_vb->add_child(animations);
+ animations->set_v_size_flags(SIZE_EXPAND_FILL);
+ animations->set_hide_root(true);
+ animations->connect("cell_selected",this,"_animation_select");
+ animations->connect("item_edited",this,"_animation_name_edited");
+ animations->set_single_select_cell_editing_only_when_already_selected(true);
+
+
+ anim_speed = memnew( SpinBox);
+ vbc_animlist->add_margin_child(TTR("Speed (FPS):"),anim_speed);
+ anim_speed->set_min(0);
+ anim_speed->set_max(100);
+ anim_speed->set_step(0.01);
+ anim_speed->connect("value_changed",this,"_animation_fps_changed");
+
+ anim_loop = memnew( CheckButton );
+ anim_loop->set_text(TTR("Loop"));
+ vbc_animlist->add_child(anim_loop);
+ anim_loop->connect("pressed",this,"_animation_loop_changed");
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ split->add_child(vbc);
+ vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ sub_vb = memnew( VBoxContainer );
+ vbc->add_margin_child(TTR("Animation Frames"),sub_vb,true);
+
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ sub_vb->add_child(hbc);
+
+ //animations = memnew( ItemList );
+
+
+ load = memnew( Button );
+ load->set_tooltip(TTR("Load Resource"));
+ hbc->add_child(load);
+
+ paste = memnew( Button );
+ paste->set_text(TTR("Paste"));
+ hbc->add_child(paste);
+
+ empty = memnew( Button );
+ empty->set_text(TTR("Insert Empty (Before)"));
+ hbc->add_child(empty);
+
+ empty2 = memnew( Button );
+ empty2->set_text(TTR("Insert Empty (After)"));
+ hbc->add_child(empty2);
+
+ move_up = memnew( Button );
+ move_up->set_text(TTR("Up"));
+ hbc->add_child(move_up);
+
+ move_down = memnew( Button );
+ move_down->set_text(TTR("Down"));
+ hbc->add_child(move_down);
+
+ _delete = memnew( Button );
+ hbc->add_child(_delete);
+
+ file = memnew( EditorFileDialog );
+ add_child(file);
+
+
+ tree = memnew( ItemList );
+ tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_icon_mode(ItemList::ICON_MODE_TOP);
+
+ int thumbnail_size = 96;
+ tree->set_max_columns(0);
+ tree->set_icon_mode(ItemList::ICON_MODE_TOP);
+ tree->set_fixed_column_width(thumbnail_size*3/2);
+ tree->set_max_text_lines(2);
+ tree->set_fixed_icon_size(Size2(thumbnail_size,thumbnail_size));
+ //tree->set_min_icon_size(Size2(thumbnail_size,thumbnail_size));
+ tree->set_drag_forwarding(this);
+
+
+
+ sub_vb->add_child(tree);
+
+ dialog = memnew( AcceptDialog );
+ add_child( dialog );
+
+ load->connect("pressed", this,"_load_pressed");
+ _delete->connect("pressed", this,"_delete_pressed");
+ paste->connect("pressed", this,"_paste_pressed");
+ empty->connect("pressed", this,"_empty_pressed");
+ empty2->connect("pressed", this,"_empty2_pressed");
+ move_up->connect("pressed", this,"_up_pressed");
+ move_down->connect("pressed", this,"_down_pressed");
+ file->connect("files_selected", this,"_file_load_request");
+ //dialog->connect("confirmed", this,"_delete_confirm_pressed");
+ //tree->connect("item_selected", this,"_item_edited");
+ loading_scene=false;
+ sel=-1;
+
+ updating=false;
+
+ edited_anim="default";
+
+}
+
+
+void SpriteFramesEditorPlugin::edit(Object *p_object) {
+
+ frames_editor->set_undo_redo(&get_undo_redo());
+ SpriteFrames * s = p_object->cast_to<SpriteFrames>();
+ if (!s)
+ return;
+
+ frames_editor->edit(s);
+}
+
+bool SpriteFramesEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("SpriteFrames");
+}
+
+void SpriteFramesEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ button->show();
+ editor->make_bottom_panel_item_visible(frames_editor);
+ //frames_editor->set_process(true);
+ } else {
+
+ button->hide();
+ if (frames_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+
+ //frames_editor->set_process(false);
+ }
+
+}
+
+SpriteFramesEditorPlugin::SpriteFramesEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ frames_editor = memnew( SpriteFramesEditor );
+ frames_editor->set_custom_minimum_size(Size2(0,300));
+ button=editor->add_bottom_panel_item("SpriteFrames",frames_editor);
+ button->hide();
+
+
+
+}
+
+
+SpriteFramesEditorPlugin::~SpriteFramesEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h
new file mode 100644
index 0000000000..11f545b443
--- /dev/null
+++ b/editor/plugins/sprite_frames_editor_plugin.h
@@ -0,0 +1,138 @@
+/*************************************************************************/
+/* sprite_frames_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SPRITE_FRAMES_EDITOR_PLUGIN_H
+#define SPRITE_FRAMES_EDITOR_PLUGIN_H
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/gui/tree.h"
+#include "scene/2d/animated_sprite.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/split_container.h"
+
+
+class SpriteFramesEditor : public PanelContainer {
+
+ GDCLASS(SpriteFramesEditor, PanelContainer );
+
+ Button *load;
+ Button *_delete;
+ Button *paste;
+ Button *empty;
+ Button *empty2;
+ Button *move_up;
+ Button *move_down;
+ ItemList *tree;
+ bool loading_scene;
+ int sel;
+
+ HSplitContainer *split;
+ Button *new_anim;
+ Button *remove_anim;
+
+
+ Tree *animations;
+ SpinBox *anim_speed;
+ CheckButton *anim_loop;
+
+ EditorFileDialog *file;
+
+ AcceptDialog *dialog;
+
+ SpriteFrames *frames;
+
+ StringName edited_anim;
+
+ void _load_pressed();
+ void _load_scene_pressed();
+ void _file_load_request(const PoolVector<String>& p_path, int p_at_pos=-1);
+ void _paste_pressed();
+ void _empty_pressed();
+ void _empty2_pressed();
+ void _delete_pressed();
+ void _delete_confirm_pressed();
+ void _up_pressed();
+ void _down_pressed();
+ void _update_library(bool p_skip_selector=false);
+ void _item_edited();
+
+
+
+ void _animation_select();
+ void _animation_name_edited();
+ void _animation_add();
+ void _animation_remove();
+ void _animation_loop_changed();
+ void _animation_fps_changed(double p_value);
+
+ bool updating;
+
+ UndoRedo *undo_redo;
+
+ bool _is_drop_valid(const Dictionary& p_drag_data, const Dictionary& p_item_data) const;
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; }
+
+ void edit(SpriteFrames* p_frames);
+ SpriteFramesEditor();
+};
+
+class SpriteFramesEditorPlugin : public EditorPlugin {
+
+ GDCLASS( SpriteFramesEditorPlugin, EditorPlugin );
+
+ SpriteFramesEditor *frames_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "SpriteFrames"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ SpriteFramesEditorPlugin(EditorNode *p_node);
+ ~SpriteFramesEditorPlugin();
+
+};
+
+#endif // SPRITE_FRAMES_EDITOR_PLUGIN_H
diff --git a/editor/plugins/stream_editor_plugin.cpp b/editor/plugins/stream_editor_plugin.cpp
new file mode 100644
index 0000000000..449f6f610e
--- /dev/null
+++ b/editor/plugins/stream_editor_plugin.cpp
@@ -0,0 +1,149 @@
+/*************************************************************************/
+/* stream_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "stream_editor_plugin.h"
+
+#if 0
+
+void StreamEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ play->set_icon( get_icon("Play","EditorIcons") );
+ stop->set_icon( get_icon("Stop","EditorIcons") );
+ }
+
+}
+void StreamEditor::_node_removed(Node *p_node) {
+
+ if(p_node==node) {
+ node=NULL;
+ hide();
+ }
+
+}
+
+void StreamEditor::_play() {
+
+ node->call("play");
+}
+
+void StreamEditor::_stop() {
+
+ node->call("stop");
+}
+
+void StreamEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_play"),&StreamEditor::_play);
+ ClassDB::bind_method(D_METHOD("_stop"),&StreamEditor::_stop);
+
+}
+
+void StreamEditor::edit(Node *p_stream) {
+
+ node=p_stream;
+
+}
+StreamEditor::StreamEditor() {
+
+ play = memnew( Button );
+
+
+ play->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_END,60);
+ play->set_anchor_and_margin(MARGIN_RIGHT,Control::ANCHOR_END,40);
+ play->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,0);
+ play->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,0);
+
+ add_child(play);
+
+ stop = memnew( Button );
+
+ stop->set_pos(Point2( 35, 5 ));
+ stop->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_END,30);
+ stop->set_anchor_and_margin(MARGIN_RIGHT,Control::ANCHOR_END,10);
+ stop->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,0);
+ stop->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_BEGIN,0);
+ add_child(stop);
+
+
+ play->connect("pressed", this,"_play");
+ stop->connect("pressed", this,"_stop");
+
+}
+
+
+void StreamEditorPlugin::edit(Object *p_object) {
+
+ stream_editor->edit(p_object->cast_to<Node>());
+}
+
+bool StreamEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("StreamPlayer") || p_object->is_class("SpatialStreamPlayer");
+}
+
+void StreamEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ stream_editor->show();
+ stream_editor->set_fixed_process(true);
+ } else {
+
+ stream_editor->hide();
+ stream_editor->set_fixed_process(false);
+ stream_editor->edit(NULL);
+ }
+
+}
+
+StreamEditorPlugin::StreamEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ stream_editor = memnew( StreamEditor );
+ editor->get_viewport()->add_child(stream_editor);
+
+ stream_editor->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ stream_editor->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+ stream_editor->set_margin(MARGIN_LEFT,60);
+ stream_editor->set_margin(MARGIN_RIGHT,0);
+ stream_editor->set_margin(MARGIN_TOP,0);
+ stream_editor->set_margin(MARGIN_BOTTOM,10);
+
+
+ stream_editor->hide();
+
+
+
+}
+
+
+StreamEditorPlugin::~StreamEditorPlugin()
+{
+}
+
+#endif
diff --git a/editor/plugins/stream_editor_plugin.h b/editor/plugins/stream_editor_plugin.h
new file mode 100644
index 0000000000..2ae3b7100e
--- /dev/null
+++ b/editor/plugins/stream_editor_plugin.h
@@ -0,0 +1,84 @@
+/*************************************************************************/
+/* stream_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef STREAM_EDITOR_PLUGIN_H
+#define STREAM_EDITOR_PLUGIN_H
+
+#if 0
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/audio/stream_player.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class StreamEditor : public Control {
+
+ GDCLASS(StreamEditor, Control );
+
+ Button * play;
+ Button * stop;
+
+ Panel *panel;
+ Node *node;
+
+ void _play();
+ void _stop();
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+public:
+
+ void edit(Node *p_stream);
+ StreamEditor();
+};
+
+class StreamEditorPlugin : public EditorPlugin {
+
+ GDCLASS( StreamEditorPlugin, EditorPlugin );
+
+ StreamEditor *stream_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Stream"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ StreamEditorPlugin(EditorNode *p_node);
+ ~StreamEditorPlugin();
+
+};
+
+#endif // STREAM_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp
new file mode 100644
index 0000000000..396ebd0052
--- /dev/null
+++ b/editor/plugins/style_box_editor_plugin.cpp
@@ -0,0 +1,115 @@
+/*************************************************************************/
+/* style_box_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "style_box_editor_plugin.h"
+
+
+void StyleBoxEditor::edit(const Ref<StyleBox>& p_stylebox) {
+
+ if (stylebox.is_valid())
+ stylebox->disconnect("changed",this,"_sb_changed");
+ stylebox=p_stylebox;
+ if (p_stylebox.is_valid()) {
+ preview->add_style_override("panel",stylebox);
+ stylebox->connect("changed",this,"_sb_changed");
+
+ }
+}
+
+void StyleBoxEditor::_sb_changed() {
+
+ preview->update();
+}
+
+void StyleBoxEditor::_bind_methods() {
+
+ ClassDB::bind_method("_sb_changed",&StyleBoxEditor::_sb_changed);
+ //ClassDB::bind_method("_import",&StyleBoxEditor::_import);
+ //ClassDB::bind_method("_import_accept",&StyleBoxEditor::_import_accept);
+ //ClassDB::bind_method("_preview_text_changed",&StyleBoxEditor::_preview_text_changed);
+}
+
+StyleBoxEditor::StyleBoxEditor() {
+
+ panel = memnew( Panel );
+ add_child(panel);
+ panel->set_area_as_parent_rect();
+
+ Label *l = memnew( Label );
+ l->set_text(TTR("StyleBox Preview:"));
+ l->set_pos(Point2(5,5));
+ panel->add_child(l);
+
+
+ preview = memnew( Panel );
+ panel->add_child(preview);
+ preview->set_pos(Point2(50,50));
+ preview->set_size(Size2(200,100));
+
+
+}
+
+void StyleBoxEditorPlugin::edit(Object *p_node) {
+
+ if (p_node && p_node->cast_to<StyleBox>()) {
+ stylebox_editor->edit( p_node->cast_to<StyleBox>() );
+ stylebox_editor->show();
+ } else
+ stylebox_editor->hide();
+}
+
+bool StyleBoxEditorPlugin::handles(Object *p_node) const{
+
+ return p_node->is_class("StyleBox");
+}
+
+void StyleBoxEditorPlugin::make_visible(bool p_visible){
+
+ if (p_visible) {
+ button->show();
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(stylebox_editor);
+
+ } else {
+ if (stylebox_editor->is_visible_in_tree())
+ EditorNode::get_singleton()->hide_bottom_panel();
+ button->hide();
+ }
+}
+
+StyleBoxEditorPlugin::StyleBoxEditorPlugin(EditorNode *p_node) {
+
+ stylebox_editor = memnew( StyleBoxEditor );
+ stylebox_editor->set_custom_minimum_size(Size2(0,250));
+
+ //p_node->get_viewport()->add_child(stylebox_editor);
+ button = p_node->add_bottom_panel_item("StyleBox",stylebox_editor);
+ button->hide();
+
+
+}
+
diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h
new file mode 100644
index 0000000000..01e636472b
--- /dev/null
+++ b/editor/plugins/style_box_editor_plugin.h
@@ -0,0 +1,83 @@
+/*************************************************************************/
+/* style_box_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef STYLE_BOX_EDITOR_PLUGIN_H
+#define STYLE_BOX_EDITOR_PLUGIN_H
+
+#include "scene/resources/style_box.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/option_button.h"
+#include "editor/editor_node.h"
+
+
+class StyleBoxEditor : public Control {
+
+ GDCLASS( StyleBoxEditor, Control );
+
+ Panel *panel;
+ Panel *preview;
+
+ Ref<StyleBox> stylebox;
+
+ void _sb_changed();
+
+protected:
+
+
+ static void _bind_methods();
+public:
+
+ void edit(const Ref<StyleBox>& p_stylebox);
+
+ StyleBoxEditor();
+};
+
+
+
+class StyleBoxEditorPlugin : public EditorPlugin {
+
+ GDCLASS( StyleBoxEditorPlugin, EditorPlugin );
+
+ StyleBoxEditor *stylebox_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "StyleBox"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ StyleBoxEditorPlugin(EditorNode *p_node);
+
+};
+
+
+#endif // STYLE_BOX_EDITOR_PLUGIN_H
diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp
new file mode 100644
index 0000000000..af05094e5e
--- /dev/null
+++ b/editor/plugins/texture_editor_plugin.cpp
@@ -0,0 +1,169 @@
+/*************************************************************************/
+/* texture_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "texture_editor_plugin.h"
+
+#include "io/resource_loader.h"
+#include "global_config.h"
+#include "editor/editor_settings.h"
+
+void TextureEditor::_gui_input(InputEvent p_event) {
+
+
+}
+
+void TextureEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+ }
+
+
+ if (p_what==NOTIFICATION_READY) {
+
+ //get_scene()->connect("node_removed",this,"_node_removed");
+
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+
+ Ref<Texture> checkerboard = get_icon("Checkerboard","EditorIcons");
+ Size2 size = get_size();
+
+ draw_texture_rect(checkerboard,Rect2(Point2(),size),true);
+
+ int tex_width = texture->get_width() * size.height / texture ->get_height();
+ int tex_height = size.height;
+
+ if (tex_width>size.width) {
+ tex_width=size.width;
+ tex_height=texture->get_height() * tex_width / texture->get_width();
+ }
+
+ int ofs_x = (size.width - tex_width)/2;
+ int ofs_y = (size.height - tex_height)/2;
+
+ draw_texture_rect(texture,Rect2(ofs_x,ofs_y,tex_width,tex_height));
+
+ Ref<Font> font = get_font("font","Label");
+
+ String format;
+ if (texture->cast_to<ImageTexture>()) {
+ format = Image::get_format_name(texture->cast_to<ImageTexture>()->get_format());
+ } else {
+ format=texture->get_class();
+ }
+ String text = itos(texture->get_width())+"x"+itos(texture->get_height())+" "+format;
+
+ Size2 rect = font->get_string_size(text);
+
+ Vector2 draw_from = size-rect+Size2(-2,font->get_ascent()-2);
+ if (draw_from.x<0)
+ draw_from.x=0;
+
+ draw_string(font,draw_from+Vector2(2,2),text,Color(0,0,0,0.5),size.width);
+ draw_string(font,draw_from-Vector2(2,2),text,Color(0,0,0,0.5),size.width);
+ draw_string(font,draw_from,text,Color(1,1,1,1),size.width);
+ }
+}
+
+
+
+void TextureEditor::edit(Ref<Texture> p_texture) {
+
+ texture=p_texture;
+
+ if (!texture.is_null())
+ update();
+ else {
+
+ hide();
+ }
+
+}
+
+
+
+void TextureEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_gui_input"),&TextureEditor::_gui_input);
+
+}
+
+TextureEditor::TextureEditor() {
+
+ set_custom_minimum_size(Size2(1,150));
+
+}
+
+
+void TextureEditorPlugin::edit(Object *p_object) {
+
+ Texture * s = p_object->cast_to<Texture>();
+ if (!s)
+ return;
+
+ texture_editor->edit(Ref<Texture>(s));
+}
+
+bool TextureEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("Texture");
+}
+
+void TextureEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+ texture_editor->show();
+ //texture_editor->set_process(true);
+ } else {
+
+ texture_editor->hide();
+ //texture_editor->set_process(false);
+ }
+
+}
+
+TextureEditorPlugin::TextureEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ texture_editor = memnew( TextureEditor );
+ add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM,texture_editor);
+ texture_editor->hide();
+
+
+
+}
+
+
+TextureEditorPlugin::~TextureEditorPlugin()
+{
+}
+
+
diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h
new file mode 100644
index 0000000000..7ad0e918cf
--- /dev/null
+++ b/editor/plugins/texture_editor_plugin.h
@@ -0,0 +1,77 @@
+/*************************************************************************/
+/* texture_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef TEXTURE_EDITOR_PLUGIN_H
+#define TEXTURE_EDITOR_PLUGIN_H
+
+
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/resources/texture.h"
+
+
+class TextureEditor : public Control {
+
+ GDCLASS(TextureEditor, Control);
+
+
+ Ref<Texture> texture;
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(InputEvent p_event);
+ static void _bind_methods();
+public:
+
+ void edit(Ref<Texture> p_texture);
+ TextureEditor();
+};
+
+
+class TextureEditorPlugin : public EditorPlugin {
+
+ GDCLASS( TextureEditorPlugin, EditorPlugin );
+
+ TextureEditor *texture_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "Texture"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ TextureEditorPlugin(EditorNode *p_node);
+ ~TextureEditorPlugin();
+
+};
+
+#endif // TEXTURE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
new file mode 100644
index 0000000000..aabf938577
--- /dev/null
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -0,0 +1,1012 @@
+/*************************************************************************/
+/* texture_region_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Author: Mariano Suligoy */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "texture_region_editor_plugin.h"
+
+#include "core/core_string_names.h"
+#include "scene/gui/check_box.h"
+#include "os/input.h"
+#include "os/keyboard.h"
+
+void draw_margin_line(Control *edit_draw, Vector2 from, Vector2 to){
+ Vector2 line = (to-from).normalized() * 10;
+ while ((to - from).length_squared() > 200) {
+ edit_draw->draw_line(from, from + line,Color(0.97, 0.2, 0.2),2);
+ from += line*2;
+ }
+}
+
+void TextureRegionEditor::_region_draw()
+{
+ Ref<Texture> base_tex = NULL;
+ if(node_sprite)
+ base_tex = node_sprite->get_texture();
+ else if(node_patch9)
+ base_tex = node_patch9->get_texture();
+ else if(obj_styleBox.is_valid())
+ base_tex = obj_styleBox->get_texture();
+ else if(atlas_tex.is_valid())
+ base_tex = atlas_tex->get_atlas();
+ if (base_tex.is_null())
+ return;
+
+ Transform2D mtx;
+ mtx.elements[2]=-draw_ofs;
+ mtx.scale_basis(Vector2(draw_zoom,draw_zoom));
+
+ VS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(),mtx);
+ edit_draw->draw_texture(base_tex,Point2());
+ VS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(),Transform2D());
+
+ if (snap_mode == SNAP_GRID) {
+ Size2 s = edit_draw->get_size();
+ int last_cell;
+
+ if (snap_step.x!=0) {
+ if (snap_separation.x == 0)
+ for(int i=0;i<s.width;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i,0)).x-snap_offset.x)/snap_step.x));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ edit_draw->draw_line(Point2(i,0),Point2(i,s.height),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ else
+ for(int i=0;i<s.width;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i,0)).x-snap_offset.x)/(snap_step.x+snap_separation.x)));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ edit_draw->draw_rect(Rect2(i-snap_separation.x*draw_zoom,0,snap_separation.x*draw_zoom,s.height),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+
+ if (snap_step.y!=0) {
+ if (snap_separation.y == 0)
+ for(int i=0;i<s.height;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0,i)).y-snap_offset.y)/snap_step.y));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ edit_draw->draw_line(Point2(0,i),Point2(s.width,i),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ else
+ for(int i=0;i<s.height;i++) {
+ int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0,i)).y-snap_offset.y)/(snap_step.y+snap_separation.y)));
+ if (i==0)
+ last_cell=cell;
+ if (last_cell!=cell)
+ edit_draw->draw_rect(Rect2(0,i-snap_separation.y*draw_zoom,s.width,snap_separation.y*draw_zoom),Color(0.3,0.7,1,0.3));
+ last_cell=cell;
+ }
+ }
+ } else if (snap_mode == SNAP_AUTOSLICE) {
+ for (List<Rect2>::Element *E = autoslice_cache.front();E;E=E->next()) {
+ Rect2 r = E->get();
+ Vector2 endpoints[4]={
+ mtx.basis_xform(r.pos),
+ mtx.basis_xform(r.pos+Vector2(r.size.x,0)),
+ mtx.basis_xform(r.pos+r.size),
+ mtx.basis_xform(r.pos+Vector2(0,r.size.y))
+ };
+ for(int i=0;i<4;i++) {
+ int next = (i+1)%4;
+ edit_draw->draw_line(endpoints[i]-draw_ofs, endpoints[next]-draw_ofs, Color(0.3,0.7,1,1) , 2);
+ }
+ }
+ }
+
+ Ref<Texture> select_handle = get_icon("EditorHandle","EditorIcons");
+
+ Rect2 scroll_rect(Point2(),mtx.basis_xform(base_tex->get_size()));
+ scroll_rect.expand_to(mtx.basis_xform(edit_draw->get_size()));
+
+ Vector2 endpoints[4]={
+ mtx.basis_xform(rect.pos),
+ mtx.basis_xform(rect.pos+Vector2(rect.size.x,0)),
+ mtx.basis_xform(rect.pos+rect.size),
+ mtx.basis_xform(rect.pos+Vector2(0,rect.size.y))
+ };
+ Color color(0.9,0.5,0.5);
+ for(int i=0;i<4;i++) {
+
+ int prev = (i+3)%4;
+ int next = (i+1)%4;
+
+ Vector2 ofs = ((endpoints[i] - endpoints[prev]).normalized() + ((endpoints[i] - endpoints[next]).normalized())).normalized();
+ ofs*=1.4144*(select_handle->get_size().width/2);
+
+ edit_draw->draw_line(endpoints[i]-draw_ofs, endpoints[next]-draw_ofs, color , 2);
+
+ if (snap_mode != SNAP_AUTOSLICE)
+ edit_draw->draw_texture(select_handle,(endpoints[i]+ofs-(select_handle->get_size()/2)).floor()-draw_ofs);
+
+ ofs = (endpoints[next]-endpoints[i])/2;
+ ofs += (endpoints[next]-endpoints[i]).tangent().normalized()*(select_handle->get_size().width/2);
+
+ if (snap_mode != SNAP_AUTOSLICE)
+ edit_draw->draw_texture(select_handle,(endpoints[i]+ofs-(select_handle->get_size()/2)).floor()-draw_ofs);
+
+ scroll_rect.expand_to(endpoints[i]);
+ }
+
+ scroll_rect=scroll_rect.grow(200);
+ updating_scroll=true;
+ hscroll->set_min(scroll_rect.pos.x);
+ hscroll->set_max(scroll_rect.pos.x+scroll_rect.size.x);
+ hscroll->set_page(edit_draw->get_size().x);
+ hscroll->set_value(draw_ofs.x);
+ hscroll->set_step(0.001);
+
+ vscroll->set_min(scroll_rect.pos.y);
+ vscroll->set_max(scroll_rect.pos.y+scroll_rect.size.y);
+ vscroll->set_page(edit_draw->get_size().y);
+ vscroll->set_value(draw_ofs.y);
+ vscroll->set_step(0.001);
+ updating_scroll=false;
+
+ float margins[4];
+ if (node_patch9 || obj_styleBox.is_valid()) {
+ if (node_patch9) {
+ margins[0] = node_patch9->get_patch_margin(MARGIN_TOP);
+ margins[1] = node_patch9->get_patch_margin(MARGIN_BOTTOM);
+ margins[2] = node_patch9->get_patch_margin(MARGIN_LEFT);
+ margins[3] = node_patch9->get_patch_margin(MARGIN_RIGHT);
+ } else if (obj_styleBox.is_valid()) {
+ margins[0] = obj_styleBox->get_margin_size(MARGIN_TOP);
+ margins[1] = obj_styleBox->get_margin_size(MARGIN_BOTTOM);
+ margins[2] = obj_styleBox->get_margin_size(MARGIN_LEFT);
+ margins[3] = obj_styleBox->get_margin_size(MARGIN_RIGHT);
+ }
+ Vector2 pos[4] = {
+ mtx.basis_xform(Vector2(0,margins[0]))+Vector2(0,endpoints[0].y-draw_ofs.y),
+ -mtx.basis_xform(Vector2(0,margins[1]))+Vector2(0,endpoints[2].y-draw_ofs.y),
+ mtx.basis_xform(Vector2(margins[2],0))+Vector2(endpoints[0].x-draw_ofs.x,0),
+ -mtx.basis_xform(Vector2(margins[3],0))+Vector2(endpoints[2].x-draw_ofs.x,0)};
+
+ draw_margin_line(edit_draw,pos[0],pos[0]+Vector2(edit_draw->get_size().x,0));
+ draw_margin_line(edit_draw,pos[1],pos[1]+Vector2(edit_draw->get_size().x,0));
+ draw_margin_line(edit_draw,pos[2],pos[2]+Vector2(0,edit_draw->get_size().y));
+ draw_margin_line(edit_draw,pos[3],pos[3]+Vector2(0,edit_draw->get_size().y));
+ }
+}
+
+void TextureRegionEditor::_region_input(const InputEvent& p_input)
+{
+ Transform2D mtx;
+ mtx.elements[2]=-draw_ofs;
+ mtx.scale_basis(Vector2(draw_zoom,draw_zoom));
+
+ Vector2 endpoints[8]={
+ mtx.xform(rect.pos)+Vector2(-4,-4),
+ mtx.xform(rect.pos+Vector2(rect.size.x/2,0))+Vector2(0,-4),
+ mtx.xform(rect.pos+Vector2(rect.size.x,0))+Vector2(4,-4),
+ mtx.xform(rect.pos+Vector2(rect.size.x,rect.size.y/2))+Vector2(4,0),
+ mtx.xform(rect.pos+rect.size)+Vector2(4,4),
+ mtx.xform(rect.pos+Vector2(rect.size.x/2,rect.size.y))+Vector2(0,4),
+ mtx.xform(rect.pos+Vector2(0,rect.size.y))+Vector2(-4,4),
+ mtx.xform(rect.pos+Vector2(0,rect.size.y/2))+Vector2(-4,0)
+ };
+
+ if (p_input.type==InputEvent::MOUSE_BUTTON) {
+
+ const InputEventMouseButton &mb=p_input.mouse_button;
+
+ if (mb.button_index==BUTTON_LEFT) {
+
+ if (mb.pressed) {
+ if (node_patch9 || obj_styleBox.is_valid()) {
+ edited_margin = -1;
+ float margins[4];
+ if (node_patch9) {
+ margins[0] = node_patch9->get_patch_margin(MARGIN_TOP);
+ margins[1] = node_patch9->get_patch_margin(MARGIN_BOTTOM);
+ margins[2] = node_patch9->get_patch_margin(MARGIN_LEFT);
+ margins[3] = node_patch9->get_patch_margin(MARGIN_RIGHT);
+ } else if (obj_styleBox.is_valid()) {
+ margins[0] = obj_styleBox->get_margin_size(MARGIN_TOP);
+ margins[1] = obj_styleBox->get_margin_size(MARGIN_BOTTOM);
+ margins[2] = obj_styleBox->get_margin_size(MARGIN_LEFT);
+ margins[3] = obj_styleBox->get_margin_size(MARGIN_RIGHT);
+ }
+ Vector2 pos[4] = {
+ mtx.basis_xform(rect.pos+Vector2(0,margins[0]))-draw_ofs,
+ mtx.basis_xform(rect.pos+rect.size-Vector2(0,margins[1]))-draw_ofs,
+ mtx.basis_xform(rect.pos+Vector2(margins[2],0))-draw_ofs,
+ mtx.basis_xform(rect.pos+rect.size-Vector2(margins[3],0))-draw_ofs};
+ if (Math::abs(mb.y - pos[0].y) < 8) {
+ edited_margin = 0;
+ prev_margin = margins[0];
+ } else if (Math::abs(mb.y - pos[1].y) < 8) {
+ edited_margin = 1;
+ prev_margin = margins[1];
+ } else if (Math::abs(mb.x - pos[2].x) < 8) {
+ edited_margin = 2;
+ prev_margin = margins[2];
+ } else if (Math::abs(mb.x - pos[3].x) < 8) {
+ edited_margin = 3;
+ prev_margin = margins[3];
+ }
+ if (edited_margin >= 0) {
+ drag_from=Vector2(mb.x,mb.y);
+ drag=true;
+ }
+ }
+ if ( edited_margin < 0 && snap_mode == SNAP_AUTOSLICE) {
+ Vector2 point = mtx.affine_inverse().xform(Vector2(mb.x,mb.y));
+ for (List<Rect2>::Element *E=autoslice_cache.front();E;E=E->next()) {
+ if (E->get().has_point(point)) {
+ rect = E->get();
+ if (Input::get_singleton()->is_key_pressed(KEY_CONTROL)&&!(Input::get_singleton()->is_key_pressed(KEY_SHIFT|KEY_ALT))) {
+ Rect2 r;
+ if(node_sprite )
+ r=node_sprite->get_region_rect();
+ else if(node_patch9)
+ r=node_patch9->get_region_rect();
+ else if(obj_styleBox.is_valid())
+ r=obj_styleBox->get_region_rect();
+ else if(atlas_tex.is_valid())
+ r =atlas_tex->get_region();
+ rect.expand_to(r.pos);
+ rect.expand_to(r.pos+r.size);
+ }
+ undo_redo->create_action("Set Region Rect");
+ if(node_sprite){
+ undo_redo->add_do_method(node_sprite ,"set_region_rect",rect);
+ undo_redo->add_undo_method(node_sprite,"set_region_rect",node_sprite->get_region_rect());
+ } else if(node_patch9){
+ undo_redo->add_do_method(node_patch9 ,"set_region_rect",rect);
+ undo_redo->add_undo_method(node_patch9,"set_region_rect",node_patch9->get_region_rect());
+ } else if (obj_styleBox.is_valid()) {
+ undo_redo->add_do_method(obj_styleBox.ptr(),"set_region_rect",rect);
+ undo_redo->add_undo_method(obj_styleBox.ptr(),"set_region_rect",obj_styleBox->get_region_rect());
+ } else if (atlas_tex.is_valid()) {
+ undo_redo->add_do_method(atlas_tex.ptr(),"set_region",rect);
+ undo_redo->add_undo_method(atlas_tex.ptr(),"set_region",atlas_tex->get_region());
+ }
+ undo_redo->add_do_method(edit_draw,"update");
+ undo_redo->add_undo_method(edit_draw,"update");
+ undo_redo->commit_action();
+ break;
+ }
+ }
+ } else if (edited_margin < 0) {
+ drag_from=mtx.affine_inverse().xform(Vector2(mb.x,mb.y));
+ if (snap_mode == SNAP_PIXEL)
+ drag_from = drag_from.snapped(Vector2(1,1));
+ else if (snap_mode == SNAP_GRID)
+ drag_from=snap_point(drag_from);
+ drag=true;
+ if(node_sprite )
+ rect_prev=node_sprite->get_region_rect();
+ else if(node_patch9)
+ rect_prev=node_patch9->get_region_rect();
+ else if(obj_styleBox.is_valid())
+ rect_prev=obj_styleBox->get_region_rect();
+ else if(atlas_tex.is_valid())
+ rect_prev=atlas_tex->get_region();
+
+ for (int i=0; i<8;i++) {
+ Vector2 tuv=endpoints[i];
+ if (tuv.distance_to(Vector2(mb.x,mb.y))<8) {
+ drag_index=i;
+ }
+ }
+
+ if (drag_index==-1) {
+ creating = true;
+ rect = Rect2(drag_from,Size2());
+ }
+ }
+
+ } else if (drag) {
+ if (edited_margin >= 0) {
+ undo_redo->create_action("Set Margin");
+ static Margin m[4] = {MARGIN_TOP,MARGIN_BOTTOM,MARGIN_LEFT,MARGIN_RIGHT};
+ if (node_patch9) {
+ undo_redo->add_do_method(node_patch9 ,"set_patch_margin",m[edited_margin],node_patch9->get_patch_margin(m[edited_margin]));
+ undo_redo->add_undo_method(node_patch9,"set_patch_margin",m[edited_margin],prev_margin);
+ } else if (obj_styleBox.is_valid()) {
+ undo_redo->add_do_method(obj_styleBox.ptr() ,"set_margin_size",m[edited_margin],obj_styleBox->get_margin_size(m[edited_margin]));
+ undo_redo->add_undo_method(obj_styleBox.ptr(),"set_margin_size",m[edited_margin],prev_margin);
+ obj_styleBox->emit_signal(CoreStringNames::get_singleton()->changed);
+ }
+ edited_margin = -1;
+ } else {
+ undo_redo->create_action("Set Region Rect");
+ if(node_sprite){
+ undo_redo->add_do_method(node_sprite ,"set_region_rect",node_sprite->get_region_rect());
+ undo_redo->add_undo_method(node_sprite,"set_region_rect",rect_prev);
+ }
+ else if(atlas_tex.is_valid()){
+ undo_redo->add_do_method(atlas_tex.ptr() ,"set_region",atlas_tex->get_region());
+ undo_redo->add_undo_method(atlas_tex.ptr(),"set_region",rect_prev);
+ }
+ else if(node_patch9){
+ // FIXME: Is this intentional?
+ } else if(node_patch9){
+ undo_redo->add_do_method(node_patch9 ,"set_region_rect",node_patch9->get_region_rect());
+ undo_redo->add_undo_method(node_patch9,"set_region_rect",rect_prev);
+ } else if (obj_styleBox.is_valid()) {
+ undo_redo->add_do_method(obj_styleBox.ptr() ,"set_region_rect",obj_styleBox->get_region_rect());
+ undo_redo->add_undo_method(obj_styleBox.ptr(),"set_region_rect",rect_prev);
+ }
+ drag_index = -1;
+ }
+ undo_redo->add_do_method(edit_draw,"update");
+ undo_redo->add_undo_method(edit_draw,"update");
+ undo_redo->commit_action();
+ drag=false;
+ creating = false;
+ }
+
+ } else if (mb.button_index==BUTTON_RIGHT && mb.pressed) {
+
+ if (drag) {
+ drag=false;
+ if (edited_margin >= 0) {
+ static Margin m[4] = {MARGIN_TOP,MARGIN_BOTTOM,MARGIN_LEFT,MARGIN_RIGHT};
+ if (node_patch9)
+ node_patch9->set_patch_margin(m[edited_margin],prev_margin);
+ if (obj_styleBox.is_valid())
+ obj_styleBox->set_margin_size(m[edited_margin],prev_margin);
+ edited_margin = -1;
+ } else {
+ apply_rect(rect_prev);
+ rect=rect_prev;
+ edit_draw->update();
+ drag_index = -1;
+ }
+ }
+ } else if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
+ _zoom_in();
+ } else if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
+ _zoom_out();
+ }
+ } else if (p_input.type==InputEvent::MOUSE_MOTION) {
+
+ const InputEventMouseMotion &mm=p_input.mouse_motion;
+
+ if (mm.button_mask&BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
+
+ Vector2 draged(mm.relative_x,mm.relative_y);
+ hscroll->set_value( hscroll->get_value()-draged.x );
+ vscroll->set_value( vscroll->get_value()-draged.y );
+
+ } else if (drag) {
+
+ if (edited_margin >= 0) {
+ float new_margin;
+ if (edited_margin == 0)
+ new_margin = prev_margin + (mm.y-drag_from.y) / draw_zoom;
+ else if (edited_margin == 1)
+ new_margin = prev_margin - (mm.y-drag_from.y) / draw_zoom;
+ else if (edited_margin == 2)
+ new_margin = prev_margin + (mm.x-drag_from.x) / draw_zoom;
+ else if (edited_margin == 3)
+ new_margin = prev_margin - (mm.x-drag_from.x) / draw_zoom;
+ if (new_margin < 0)
+ new_margin = 0;
+ static Margin m[4] = {MARGIN_TOP,MARGIN_BOTTOM,MARGIN_LEFT,MARGIN_RIGHT};
+ if (node_patch9)
+ node_patch9->set_patch_margin(m[edited_margin],new_margin);
+ if (obj_styleBox.is_valid())
+ obj_styleBox->set_margin_size(m[edited_margin],new_margin);
+ } else {
+ Vector2 new_pos = mtx.affine_inverse().xform(Vector2(mm.x,mm.y));
+ if (snap_mode == SNAP_PIXEL)
+ new_pos = new_pos.snapped(Vector2(1,1));
+ else if (snap_mode == SNAP_GRID)
+ new_pos=snap_point(new_pos);
+
+ if (creating) {
+ rect = Rect2(drag_from,Size2());
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ edit_draw->update();
+ return;
+ }
+
+ switch(drag_index) {
+ case 0: {
+ Vector2 p=rect_prev.pos+rect_prev.size;
+ rect = Rect2(p,Size2());
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 1: {
+ Vector2 p=rect_prev.pos+Vector2(0,rect_prev.size.y);
+ rect = Rect2(p,Size2(rect_prev.size.x,0));
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 2: {
+ Vector2 p=rect_prev.pos+Vector2(0,rect_prev.size.y);
+ rect = Rect2(p,Size2());
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 3: {
+ Vector2 p=rect_prev.pos;
+ rect = Rect2(p,Size2(0,rect_prev.size.y));
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 4: {
+ Vector2 p=rect_prev.pos;
+ rect = Rect2(p,Size2());
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 5: {
+ Vector2 p=rect_prev.pos;
+ rect = Rect2(p,Size2(rect_prev.size.x,0));
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 6: {
+ Vector2 p=rect_prev.pos+Vector2(rect_prev.size.x,0);
+ rect = Rect2(p,Size2());
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+ case 7: {
+ Vector2 p=rect_prev.pos+Vector2(rect_prev.size.x,0);
+ rect = Rect2(p,Size2(0,rect_prev.size.y));
+ rect.expand_to(new_pos);
+ apply_rect(rect);
+ } break;
+
+ }
+ }
+ edit_draw->update();
+ }
+
+ }
+}
+
+void TextureRegionEditor::_scroll_changed(float)
+{
+ if (updating_scroll)
+ return;
+
+ draw_ofs.x=hscroll->get_value();
+ draw_ofs.y=vscroll->get_value();
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_mode(int p_mode)
+{
+ snap_mode_button->get_popup()->set_item_checked(snap_mode,false);
+ snap_mode = p_mode;
+ snap_mode_button->set_text(snap_mode_button->get_popup()->get_item_text(p_mode));
+ snap_mode_button->get_popup()->set_item_checked(snap_mode,true);
+
+ if (snap_mode == SNAP_GRID)
+ hb_grid->show();
+ else
+ hb_grid->hide();
+
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_off_x(float p_val)
+{
+ snap_offset.x=p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_off_y(float p_val)
+{
+ snap_offset.y=p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_step_x(float p_val)
+{
+ snap_step.x=p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_step_y(float p_val)
+{
+ snap_step.y=p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_sep_x(float p_val)
+{
+ snap_separation.x = p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_set_snap_sep_y(float p_val)
+{
+ snap_separation.y = p_val;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_zoom_in()
+{
+ if (draw_zoom < 8) {
+ draw_zoom *= 2;
+ edit_draw->update();
+ }
+}
+
+void TextureRegionEditor::_zoom_reset()
+{
+ if (draw_zoom == 1) return;
+ draw_zoom = 1;
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_zoom_out()
+{
+ if (draw_zoom > 0.25) {
+ draw_zoom /= 2;
+ edit_draw->update();
+ }
+}
+
+void TextureRegionEditor::apply_rect(const Rect2& rect){
+ if(node_sprite)
+ node_sprite->set_region_rect(rect);
+ else if(node_patch9)
+ node_patch9->set_region_rect(rect);
+ else if(obj_styleBox.is_valid())
+ obj_styleBox->set_region_rect(rect);
+ else if(atlas_tex.is_valid())
+ atlas_tex->set_region(rect);
+}
+
+void TextureRegionEditor::_notification(int p_what)
+{
+ switch(p_what) {
+ case NOTIFICATION_READY: {
+ zoom_out->set_icon(get_icon("ZoomLess", "EditorIcons"));
+ zoom_reset->set_icon(get_icon("ZoomReset", "EditorIcons"));
+ zoom_in->set_icon(get_icon("ZoomMore", "EditorIcons"));
+ icon_zoom->set_texture( get_icon("Zoom", "EditorIcons"));
+ } break;
+ }
+}
+
+void TextureRegionEditor::_node_removed(Object *p_obj)
+{
+ if(p_obj == node_sprite || p_obj == node_patch9 || p_obj == obj_styleBox.ptr() || p_obj == atlas_tex.ptr()) {
+ node_patch9 = NULL;
+ node_sprite = NULL;
+ obj_styleBox = Ref<StyleBox>(NULL);
+ atlas_tex = Ref<AtlasTexture>(NULL);
+ hide();
+ }
+}
+
+void TextureRegionEditor::_bind_methods()
+{
+ ClassDB::bind_method(D_METHOD("_edit_region"),&TextureRegionEditor::_edit_region);
+ ClassDB::bind_method(D_METHOD("_region_draw"),&TextureRegionEditor::_region_draw);
+ ClassDB::bind_method(D_METHOD("_region_input"),&TextureRegionEditor::_region_input);
+ ClassDB::bind_method(D_METHOD("_scroll_changed"),&TextureRegionEditor::_scroll_changed);
+ ClassDB::bind_method(D_METHOD("_node_removed"),&TextureRegionEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_set_snap_mode"),&TextureRegionEditor::_set_snap_mode);
+ ClassDB::bind_method(D_METHOD("_set_snap_off_x"),&TextureRegionEditor::_set_snap_off_x);
+ ClassDB::bind_method(D_METHOD("_set_snap_off_y"),&TextureRegionEditor::_set_snap_off_y);
+ ClassDB::bind_method(D_METHOD("_set_snap_step_x"),&TextureRegionEditor::_set_snap_step_x);
+ ClassDB::bind_method(D_METHOD("_set_snap_step_y"),&TextureRegionEditor::_set_snap_step_y);
+ ClassDB::bind_method(D_METHOD("_set_snap_sep_x"),&TextureRegionEditor::_set_snap_sep_x);
+ ClassDB::bind_method(D_METHOD("_set_snap_sep_y"),&TextureRegionEditor::_set_snap_sep_y);
+ ClassDB::bind_method(D_METHOD("_zoom_in"),&TextureRegionEditor::_zoom_in);
+ ClassDB::bind_method(D_METHOD("_zoom_reset"),&TextureRegionEditor::_zoom_reset);
+ ClassDB::bind_method(D_METHOD("_zoom_out"),&TextureRegionEditor::_zoom_out);
+}
+
+void TextureRegionEditor::edit(Object *p_obj)
+{
+ if (node_sprite && node_sprite->is_connected("texture_changed",this,"_edit_region"))
+ node_sprite->disconnect("texture_changed",this,"_edit_region");
+ if (node_patch9 && node_patch9->is_connected("texture_changed",this,"_edit_region"))
+ node_patch9->disconnect("texture_changed",this,"_edit_region");
+ if (obj_styleBox.is_valid() && obj_styleBox->is_connected("texture_changed",this,"_edit_region"))
+ obj_styleBox->disconnect("texture_changed",this,"_edit_region");
+ if (atlas_tex.is_valid() && atlas_tex->is_connected("atlas_changed",this,"_edit_region"))
+ atlas_tex->disconnect("atlas_changed",this,"_edit_region");
+ if (p_obj) {
+ node_sprite = p_obj->cast_to<Sprite>();
+ node_patch9 = p_obj->cast_to<NinePatchRect>();
+ if (p_obj->cast_to<StyleBoxTexture>())
+ obj_styleBox = Ref<StyleBoxTexture>(p_obj->cast_to<StyleBoxTexture>());
+ if (p_obj->cast_to<AtlasTexture>()) {
+ atlas_tex = Ref<AtlasTexture>(p_obj->cast_to<AtlasTexture>());
+ atlas_tex->connect("atlas_changed",this,"_edit_region");
+ } else {
+ p_obj->connect("texture_changed",this,"_edit_region");
+ }
+ p_obj->add_change_receptor(this);
+ p_obj->connect("tree_exited",this,"_node_removed",varray(p_obj),CONNECT_ONESHOT);
+ _edit_region();
+ } else {
+ if(node_sprite)
+ node_sprite->disconnect("tree_exited",this,"_node_removed");
+ else if(node_patch9)
+ node_patch9->disconnect("tree_exited",this,"_node_removed");
+ else if(obj_styleBox.is_valid())
+ obj_styleBox->disconnect("tree_exited",this,"_node_removed");
+ else if(atlas_tex.is_valid())
+ atlas_tex->disconnect("tree_exited",this,"_node_removed");
+
+ node_sprite = NULL;
+ node_patch9 = NULL;
+ obj_styleBox = Ref<StyleBoxTexture>(NULL);
+ atlas_tex = Ref<AtlasTexture>(NULL);
+ }
+ edit_draw->update();
+}
+
+void TextureRegionEditor::_changed_callback(Object *p_changed, const char *p_prop) {
+ if ((String)p_prop == "region_rect") {
+ _edit_region();
+ }
+}
+
+void TextureRegionEditor::_edit_region()
+{
+ Ref<Texture> texture = NULL;
+ if(node_sprite )
+ texture = node_sprite->get_texture();
+ else if(node_patch9 )
+ texture = node_patch9->get_texture();
+ else if(obj_styleBox.is_valid())
+ texture = obj_styleBox->get_texture();
+ else if(atlas_tex.is_valid())
+ texture = atlas_tex->get_atlas();
+
+ if (texture.is_null()) {
+ return;
+ }
+
+ autoslice_cache.clear();
+ Image i;
+ if (i.load(texture->get_path()) == OK) {
+ BitMap bm;
+ bm.create_from_image_alpha(i);
+ for (int y = 0; y < i.get_height(); y++) {
+ for (int x = 0; x < i.get_width(); x++) {
+ if (bm.get_bit(Point2(x,y))) {
+ bool found = false;
+ for (List<Rect2>::Element *E = autoslice_cache.front(); E; E=E->next()) {
+ Rect2 grown = E->get().grow(1.5);
+ if (grown.has_point(Point2(x,y))) {
+ E->get().expand_to(Point2(x,y));
+ E->get().expand_to(Point2(x+1,y+1));
+ x = E->get().pos.x+E->get().size.x-1;
+ bool merged = true;
+ while (merged) {
+ merged = false;
+ bool queue_erase = false;
+ for (List<Rect2>::Element *F = autoslice_cache.front(); F; F=F->next()) {
+ if (queue_erase){
+ autoslice_cache.erase(F->prev());
+ queue_erase = false;
+ }
+ if (F==E)
+ continue;
+ if (E->get().grow(1).intersects(F->get())) {
+ E->get().expand_to(F->get().pos);
+ E->get().expand_to(F->get().pos+F->get().size);
+ if (F->prev()) {
+ F=F->prev();
+ autoslice_cache.erase(F->next());
+ } else {
+ queue_erase = true;
+ //Cant delete the first rect in the list.
+ }
+ merged = true;
+ }
+ }
+ }
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ Rect2 new_rect(x,y,1,1);
+ autoslice_cache.push_back(new_rect);
+ }
+ }
+ }
+ }
+ }
+
+
+ if(node_sprite )
+ rect = node_sprite->get_region_rect();
+ else if(node_patch9 )
+ rect = node_patch9->get_region_rect();
+ else if(obj_styleBox.is_valid())
+ rect = obj_styleBox->get_region_rect();
+ else if (atlas_tex.is_valid())
+ rect = atlas_tex->get_region();
+
+ edit_draw->update();
+}
+
+inline float _snap_scalar(float p_offset, float p_step, float separation, float p_target) {
+ if (p_step != 0) {
+ float a = Math::stepify(p_target - p_offset, p_step+separation) + p_offset;
+ float b = a;
+ if (p_target >= 0)
+ b -= separation;
+ else
+ b += p_step;
+ return (Math::abs(p_target-a) < Math::abs(p_target-b)) ? a : b;
+ }
+ return p_target;
+}
+
+Vector2 TextureRegionEditor::snap_point(Vector2 p_target) const {
+ if (snap_mode == SNAP_GRID) {
+ p_target.x = _snap_scalar(snap_offset.x, snap_step.x, snap_separation.x, p_target.x);
+ p_target.y = _snap_scalar(snap_offset.y, snap_step.y, snap_separation.y, p_target.y);
+ }
+
+ return p_target;
+}
+
+TextureRegionEditor::TextureRegionEditor(EditorNode* p_editor)
+{
+ node_sprite = NULL;
+ node_patch9 = NULL;
+ obj_styleBox = Ref<StyleBoxTexture>(NULL);
+ atlas_tex = Ref<AtlasTexture>(NULL);
+ editor=p_editor;
+ undo_redo = editor->get_undo_redo();
+
+ snap_step=Vector2(10,10);
+ snap_separation = Vector2(0,0);
+ edited_margin = -1;
+ drag_index = -1;
+ drag=false;
+
+ VBoxContainer *main_vb = memnew( VBoxContainer );
+ add_child(main_vb);
+ main_vb->set_area_as_parent_rect(0);
+ HBoxContainer *hb_tools = memnew( HBoxContainer );
+ main_vb->add_child(hb_tools);
+
+ hb_tools->add_child(memnew( Label(TTR("Snap Mode:")) ));
+
+ snap_mode_button = memnew( MenuButton );
+ hb_tools->add_child(snap_mode_button);
+ snap_mode_button->set_text(TTR("<None>"));
+ PopupMenu *p = snap_mode_button->get_popup();
+ p->add_item(TTR("<None>"),0);
+ p->add_item(TTR("Pixel Snap"),1);
+ p->add_item(TTR("Grid Snap"),2);
+ p->add_item(TTR("Auto Slice"),3);
+ for (int i = 0; i < 4; i++)
+ p->set_item_as_checkable(i,true);
+ p->set_item_checked(0,true);
+ p->connect("id_pressed", this, "_set_snap_mode");
+ hb_grid = memnew( HBoxContainer );
+ hb_tools->add_child(hb_grid);
+ hb_grid->add_child( memnew( VSeparator ));
+
+ hb_grid->add_child( memnew( Label(TTR("Offset:")) ) );
+
+ sb_off_x = memnew( SpinBox );
+ sb_off_x->set_min(-256);
+ sb_off_x->set_max(256);
+ sb_off_x->set_step(1);
+ sb_off_x->set_value(snap_offset.x);
+ sb_off_x->set_suffix("px");
+ sb_off_x->connect("value_changed", this, "_set_snap_off_x");
+ hb_grid->add_child(sb_off_x);
+
+ sb_off_y = memnew( SpinBox );
+ sb_off_y->set_min(-256);
+ sb_off_y->set_max(256);
+ sb_off_y->set_step(1);
+ sb_off_y->set_value(snap_offset.y);
+ sb_off_y->set_suffix("px");
+ sb_off_y->connect("value_changed", this, "_set_snap_off_y");
+ hb_grid->add_child(sb_off_y);
+
+ hb_grid->add_child( memnew( VSeparator ));
+ hb_grid->add_child( memnew( Label(TTR("Step:")) ) );
+
+ sb_step_x = memnew( SpinBox );
+ sb_step_x->set_min(-256);
+ sb_step_x->set_max(256);
+ sb_step_x->set_step(1);
+ sb_step_x->set_value(snap_step.x);
+ sb_step_x->set_suffix("px");
+ sb_step_x->connect("value_changed", this, "_set_snap_step_x");
+ hb_grid->add_child(sb_step_x);
+
+ sb_step_y = memnew( SpinBox );
+ sb_step_y->set_min(-256);
+ sb_step_y->set_max(256);
+ sb_step_y->set_step(1);
+ sb_step_y->set_value(snap_step.y);
+ sb_step_y->set_suffix("px");
+ sb_step_y->connect("value_changed", this, "_set_snap_step_y");
+ hb_grid->add_child(sb_step_y);
+
+ hb_grid->add_child( memnew( VSeparator ));
+ hb_grid->add_child( memnew( Label(TTR("Separation:")) ) );
+
+ sb_sep_x = memnew( SpinBox );
+ sb_sep_x->set_min(0);
+ sb_sep_x->set_max(256);
+ sb_sep_x->set_step(1);
+ sb_sep_x->set_value(snap_separation.x);
+ sb_sep_x->set_suffix("px");
+ sb_sep_x->connect("value_changed", this, "_set_snap_sep_x");
+ hb_grid->add_child(sb_sep_x);
+
+ sb_sep_y = memnew( SpinBox );
+ sb_sep_y->set_min(0);
+ sb_sep_y->set_max(256);
+ sb_sep_y->set_step(1);
+ sb_sep_y->set_value(snap_separation.y);
+ sb_sep_y->set_suffix("px");
+ sb_sep_y->connect("value_changed", this, "_set_snap_sep_y");
+ hb_grid->add_child(sb_sep_y);
+
+ hb_grid->hide();
+
+ HBoxContainer *main_hb = memnew( HBoxContainer );
+ main_vb->add_child(main_hb);
+ edit_draw = memnew( Control );
+ main_hb->add_child(edit_draw);
+ main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ Control * separator = memnew( Control );
+ separator->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hb_tools->add_child(separator);
+
+ icon_zoom = memnew( TextureRect );
+ hb_tools->add_child(icon_zoom);
+
+ zoom_out = memnew( ToolButton );
+ zoom_out->connect("pressed", this, "_zoom_out");
+ hb_tools->add_child(zoom_out);
+
+ zoom_reset = memnew( ToolButton );
+ zoom_reset->connect("pressed", this, "_zoom_reset");
+ hb_tools->add_child(zoom_reset);
+
+ zoom_in = memnew( ToolButton );
+ zoom_in->connect("pressed", this, "_zoom_in");
+ hb_tools->add_child(zoom_in);
+
+ vscroll = memnew( VScrollBar);
+ main_hb->add_child(vscroll);
+ vscroll->connect("value_changed",this,"_scroll_changed");
+ hscroll = memnew( HScrollBar );
+ main_vb->add_child(hscroll);
+ hscroll->connect("value_changed",this,"_scroll_changed");
+
+ edit_draw->connect("draw",this,"_region_draw");
+ edit_draw->connect("gui_input",this,"_region_input");
+ draw_zoom=1.0;
+ updating_scroll=false;
+
+ edit_draw->set_clip_contents(true);
+
+}
+
+void TextureRegionEditorPlugin::edit(Object *p_node)
+{
+ region_editor->edit(p_node);
+}
+
+bool TextureRegionEditorPlugin::handles(Object *p_obj) const
+{
+ return p_obj->is_class("Sprite") || p_obj->is_class("Patch9Rect") || p_obj->is_class("StyleBoxTexture") || p_obj->is_class("AtlasTexture");
+}
+
+void TextureRegionEditorPlugin::make_visible(bool p_visible)
+{
+ if (p_visible) {
+ region_button->show();
+ if (region_button->is_pressed())
+ region_editor->show();
+ } else {
+ region_button->hide();
+ region_editor->edit(NULL);
+ region_editor->hide();
+ }
+}
+
+
+Dictionary TextureRegionEditorPlugin::get_state() const {
+
+ Dictionary state;
+ state["zoom"]=region_editor->draw_zoom;
+ state["snap_offset"]=region_editor->snap_offset;
+ state["snap_step"]=region_editor->snap_step;
+ state["snap_separation"]=region_editor->snap_separation;
+ state["snap_mode"]=region_editor->snap_mode;
+ return state;
+}
+
+void TextureRegionEditorPlugin::set_state(const Dictionary& p_state){
+
+ Dictionary state=p_state;
+ if (state.has("zoom")) {
+ region_editor->draw_zoom = p_state["zoom"];
+ }
+
+ if (state.has("snap_step")) {
+ Vector2 s = state["snap_step"];
+ region_editor->sb_step_x->set_value(s.x);
+ region_editor->sb_step_y->set_value(s.y);
+ region_editor->snap_step = s;
+ }
+
+ if (state.has("snap_offset")) {
+ Vector2 ofs = state["snap_offset"];
+ region_editor->sb_off_x->set_value(ofs.x);
+ region_editor->sb_off_y->set_value(ofs.y);
+ region_editor->snap_offset = ofs;
+ }
+
+ if (state.has("snap_separation")) {
+ Vector2 sep = state["snap_separation"];
+ region_editor->sb_sep_x->set_value(sep.x);
+ region_editor->sb_sep_y->set_value(sep.y);
+ region_editor->snap_separation = sep;
+ }
+
+ if (state.has("snap_mode")) {
+ region_editor->_set_snap_mode(state["snap_mode"]);
+ }
+
+}
+
+TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node)
+{
+ editor = p_node;
+ region_editor = memnew ( TextureRegionEditor(p_node) );
+
+ region_button = p_node->add_bottom_panel_item(TTR("Texture Region"), region_editor);
+ region_button->set_tooltip(TTR("Texture Region Editor"));
+
+ region_editor->set_custom_minimum_size(Size2(0,200));
+ region_editor->hide();
+ region_button->hide();
+}
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
new file mode 100644
index 0000000000..8e88f0b707
--- /dev/null
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -0,0 +1,153 @@
+/*************************************************************************/
+/* texture_region_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Author: Mariano Suligoy */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#ifndef TEXTURE_REGION_EDITOR_PLUGIN_H
+#define TEXTURE_REGION_EDITOR_PLUGIN_H
+
+#include "canvas_item_editor_plugin.h"
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+#include "scene/2d/sprite.h"
+#include "scene/gui/patch_9_rect.h"
+#include "scene/resources/style_box.h"
+#include "scene/resources/texture.h"
+
+class TextureRegionEditor : public Control {
+
+ GDCLASS(TextureRegionEditor, Control );
+
+ enum SnapMode {
+ SNAP_NONE,
+ SNAP_PIXEL,
+ SNAP_GRID,
+ SNAP_AUTOSLICE
+ };
+
+ friend class TextureRegionEditorPlugin;
+ MenuButton *snap_mode_button;
+ TextureRect *icon_zoom;
+ ToolButton *zoom_in;
+ ToolButton *zoom_reset;
+ ToolButton *zoom_out;
+ HBoxContainer * hb_grid; //For showing/hiding the grid controls when changing the SnapMode
+ SpinBox *sb_step_y;
+ SpinBox *sb_step_x;
+ SpinBox *sb_off_y;
+ SpinBox *sb_off_x;
+ SpinBox *sb_sep_y;
+ SpinBox *sb_sep_x;
+ Control *edit_draw;
+
+ VScrollBar *vscroll;
+ HScrollBar *hscroll;
+
+ EditorNode *editor;
+ UndoRedo* undo_redo;
+
+ Vector2 draw_ofs;
+ float draw_zoom;
+ bool updating_scroll;
+
+ int snap_mode;
+ Vector2 snap_offset;
+ Vector2 snap_step;
+ Vector2 snap_separation;
+
+ NinePatchRect *node_patch9;
+ Sprite *node_sprite;
+ Ref<StyleBoxTexture> obj_styleBox;
+ Ref<AtlasTexture> atlas_tex;
+
+ Rect2 rect;
+ Rect2 rect_prev;
+ float prev_margin;
+ int edited_margin;
+ List<Rect2> autoslice_cache;
+
+ bool drag;
+ bool creating;
+ Vector2 drag_from;
+ int drag_index;
+
+ void _set_snap_mode(int p_mode);
+ void _set_snap_off_x(float p_val);
+ void _set_snap_off_y(float p_val);
+ void _set_snap_step_x(float p_val);
+ void _set_snap_step_y(float p_val);
+ void _set_snap_sep_x(float p_val);
+ void _set_snap_sep_y(float p_val);
+ void _zoom_in();
+ void _zoom_reset();
+ void _zoom_out();
+ void apply_rect(const Rect2& rect);
+protected:
+
+ void _notification(int p_what);
+ void _node_removed(Object *p_obj);
+ static void _bind_methods();
+
+ Vector2 snap_point(Vector2 p_target) const;
+
+ virtual void _changed_callback(Object *p_changed, const char *p_prop);
+
+public:
+
+ void _edit_region();
+ void _region_draw();
+ void _region_input(const InputEvent &p_input);
+ void _scroll_changed(float);
+
+ void edit(Object *p_obj);
+ TextureRegionEditor(EditorNode* p_editor);
+
+};
+
+class TextureRegionEditorPlugin : public EditorPlugin
+{
+ GDCLASS( TextureRegionEditorPlugin, EditorPlugin );
+
+ Button *region_button;
+ TextureRegionEditor *region_editor;
+ EditorNode *editor;
+public:
+
+ virtual String get_name() const { return "TextureRegion"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+ void set_state(const Dictionary &p_state);
+ Dictionary get_state() const;
+
+ TextureRegionEditorPlugin(EditorNode *p_node);
+};
+
+#endif // TEXTURE_REGION_EDITOR_PLUGIN_H
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
new file mode 100644
index 0000000000..4b8fea5a45
--- /dev/null
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -0,0 +1,997 @@
+/*************************************************************************/
+/* theme_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "theme_editor_plugin.h"
+
+#include "version.h"
+#include "os/file_access.h"
+
+void ThemeEditor::edit(const Ref<Theme>& p_theme) {
+
+ theme=p_theme;
+ main_vb->set_theme(p_theme);
+
+}
+
+
+void ThemeEditor::_propagate_redraw(Control *p_at) {
+
+ p_at->notification(NOTIFICATION_THEME_CHANGED);
+ p_at->minimum_size_changed();
+ p_at->update();
+ for(int i=0;i<p_at->get_child_count();i++) {
+ Control *a = p_at->get_child(i)->cast_to<Control>();
+ if (a)
+ _propagate_redraw(a);
+
+ }
+}
+
+void ThemeEditor::_refresh_interval() {
+
+ _propagate_redraw(main_vb);
+
+}
+
+void ThemeEditor::_type_menu_cbk(int p_option) {
+
+
+ type_edit->set_text( type_menu->get_popup()->get_item_text(p_option) );
+}
+
+void ThemeEditor::_name_menu_about_to_show() {
+
+ String fromtype=type_edit->get_text();
+ List<StringName> names;
+
+ if (popup_mode==POPUP_ADD) {
+
+ switch(type_select->get_selected()) {
+
+ case 0: Theme::get_default()->get_icon_list(fromtype,&names); break;
+ case 1: Theme::get_default()->get_stylebox_list(fromtype,&names); break;
+ case 2: Theme::get_default()->get_font_list(fromtype,&names); break;
+ case 3: Theme::get_default()->get_color_list(fromtype,&names); break;
+ case 4: Theme::get_default()->get_constant_list(fromtype,&names); break;
+ }
+ } else if (popup_mode==POPUP_REMOVE) {
+
+ theme->get_icon_list(fromtype,&names);
+ theme->get_stylebox_list(fromtype,&names);
+ theme->get_font_list(fromtype,&names);
+ theme->get_color_list(fromtype,&names);
+ theme->get_constant_list(fromtype,&names);
+ }
+
+
+ name_menu->get_popup()->clear();
+
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+
+ name_menu->get_popup()->add_item(E->get());
+ }
+}
+
+void ThemeEditor::_name_menu_cbk(int p_option) {
+
+ name_edit->set_text( name_menu->get_popup()->get_item_text(p_option) );
+}
+
+struct _TECategory {
+
+ template<class T>
+ struct RefItem {
+
+ Ref<T> item;
+ StringName name;
+ bool operator<(const RefItem<T>& p) const { return item->get_instance_ID() < p.item->get_instance_ID(); }
+ };
+
+ template<class T>
+ struct Item {
+
+ T item;
+ String name;
+ bool operator<(const Item<T>& p) const { return name < p.name; }
+ };
+
+
+ Set<RefItem<StyleBox> > stylebox_items;
+ Set<RefItem<Font> > font_items;
+ Set<RefItem<Texture> > icon_items;
+
+ Set<Item<Color> > color_items;
+ Set<Item<int> > constant_items;
+
+};
+
+
+void ThemeEditor::_save_template_cbk(String fname) {
+
+ String filename = file_dialog->get_current_path();
+
+ Map<String,_TECategory> categories;
+
+ //fill types
+ List<StringName> type_list;
+ Theme::get_default()->get_type_list(&type_list);
+ for (List<StringName>::Element *E=type_list.front();E;E=E->next()) {
+ categories.insert(E->get(),_TECategory());
+ }
+
+ //fill default theme
+ for(Map<String,_TECategory>::Element *E=categories.front();E;E=E->next() ) {
+
+ _TECategory &tc = E->get();
+
+ List<StringName> stylebox_list;
+ Theme::get_default()->get_stylebox_list(E->key(),&stylebox_list);
+ for (List<StringName>::Element *F=stylebox_list.front();F;F=F->next()) {
+ _TECategory::RefItem<StyleBox> it;
+ it.name=F->get();
+ it.item=Theme::get_default()->get_stylebox(F->get(),E->key());
+ tc.stylebox_items.insert(it);
+ }
+
+ List<StringName> font_list;
+ Theme::get_default()->get_font_list(E->key(),&font_list);
+ for (List<StringName>::Element *F=font_list.front();F;F=F->next()) {
+ _TECategory::RefItem<Font> it;
+ it.name=F->get();
+ it.item=Theme::get_default()->get_font(F->get(),E->key());
+ tc.font_items.insert(it);
+ }
+
+ List<StringName> icon_list;
+ Theme::get_default()->get_icon_list(E->key(),&icon_list);
+ for (List<StringName>::Element *F=icon_list.front();F;F=F->next()) {
+ _TECategory::RefItem<Texture> it;
+ it.name=F->get();
+ it.item=Theme::get_default()->get_icon(F->get(),E->key());
+ tc.icon_items.insert(it);
+ }
+
+ List<StringName> color_list;
+ Theme::get_default()->get_color_list(E->key(),&color_list);
+ for (List<StringName>::Element *F=color_list.front();F;F=F->next()) {
+ _TECategory::Item<Color> it;
+ it.name=F->get();
+ it.item=Theme::get_default()->get_color(F->get(),E->key());
+ tc.color_items.insert(it);
+ }
+
+ List<StringName> constant_list;
+ Theme::get_default()->get_constant_list(E->key(),&constant_list);
+ for (List<StringName>::Element *F=constant_list.front();F;F=F->next()) {
+ _TECategory::Item<int> it;
+ it.name=F->get();
+ it.item=Theme::get_default()->get_constant(F->get(),E->key());
+ tc.constant_items.insert(it);
+ }
+
+ }
+
+ FileAccess *file = FileAccess::open(filename,FileAccess::WRITE);
+ if (!file) {
+
+
+ ERR_EXPLAIN(TTR("Can't save theme to file:")+" "+filename);
+ return;
+ }
+ file->store_line("; ******************* ");
+ file->store_line("; Template Theme File ");
+ file->store_line("; ******************* ");
+ file->store_line("; ");
+ file->store_line("; Theme Syntax: ");
+ file->store_line("; ------------- ");
+ file->store_line("; ");
+ file->store_line("; Must be placed in section [theme]");
+ file->store_line("; ");
+ file->store_line("; Type.item = [value] ");
+ file->store_line("; ");
+ file->store_line("; [value] examples:");
+ file->store_line("; ");
+ file->store_line("; Type.item = 6 ; numeric constant. ");
+ file->store_line("; Type.item = #FF00FF ; HTML color ");
+ file->store_line("; Type.item = #55FF00FF ; HTML color with alpha 55.");
+ file->store_line("; Type.item = icon(image.png) ; icon in a png file (relative to theme file).");
+ file->store_line("; Type.item = font(font.xres) ; font in a resource (relative to theme file).");
+ file->store_line("; Type.item = sbox(stylebox.xres) ; stylebox in a resource (relative to theme file).");
+ file->store_line("; Type.item = sboxf(2,#FF00FF) ; flat stylebox with margin 2.");
+ file->store_line("; Type.item = sboxf(2,#FF00FF,#FFFFFF) ; flat stylebox with margin 2 and border.");
+ file->store_line("; Type.item = sboxf(2,#FF00FF,#FFFFFF,#000000) ; flat stylebox with margin 2, light & dark borders.");
+ file->store_line("; Type.item = sboxt(base.png,2,2,2,2) ; textured stylebox with 3x3 stretch and stretch margins.");
+ file->store_line("; -Additionally, 4 extra integers can be added to sboxf and sboxt to specify custom padding of contents:");
+ file->store_line("; Type.item = sboxt(base.png,2,2,2,2,5,4,2,4) ;");
+ file->store_line("; -Order for all is always left, top, right, bottom.");
+ file->store_line("; ");
+ file->store_line("; Special values:");
+ file->store_line("; Type.item = default ; use the value in the default theme (must exist there).");
+ file->store_line("; Type.item = @somebutton_color ; reference to a library value previously defined.");
+ file->store_line("; ");
+ file->store_line("; Library Syntax: ");
+ file->store_line("; --------------- ");
+ file->store_line("; ");
+ file->store_line("; Must be placed in section [library], but usage is optional.");
+ file->store_line("; ");
+ file->store_line("; item = [value] ; same as Theme, but assign to library.");
+ file->store_line("; ");
+ file->store_line("; examples:");
+ file->store_line("; ");
+ file->store_line("; [library]");
+ file->store_line("; ");
+ file->store_line("; default_button_color = #FF00FF");
+ file->store_line("; ");
+ file->store_line("; [theme]");
+ file->store_line("; ");
+ file->store_line("; Button.color = @default_button_color ; used reference.");
+ file->store_line("; ");
+ file->store_line("; ******************* ");
+ file->store_line("; ");
+ file->store_line("; Template Generated Using: "+String(VERSION_MKSTRING));
+ file->store_line("; ");
+ file->store_line("; ");
+ file->store_line("");
+ file->store_line("[library]");
+ file->store_line("");
+ file->store_line("; place library stuff here");
+ file->store_line("");
+ file->store_line("[theme]");
+ file->store_line("");
+ file->store_line("");
+
+ //write default theme
+ for(Map<String,_TECategory>::Element *E=categories.front();E;E=E->next() ) {
+
+ _TECategory &tc = E->get();
+
+ String underline="; ";
+ for(int i=0;i<E->key().length();i++)
+ underline+="*";
+
+ file->store_line("");
+ file->store_line(underline);
+ file->store_line("; "+E->key());
+ file->store_line(underline);
+
+ if (tc.stylebox_items.size())
+ file->store_line("\n; StyleBox Items:\n");
+
+ for (Set<_TECategory::RefItem<StyleBox> >::Element *F=tc.stylebox_items.front();F;F=F->next()) {
+
+ file->store_line(E->key()+"."+F->get().name+" = default");
+ }
+
+ if (tc.font_items.size())
+ file->store_line("\n; Font Items:\n");
+
+ for (Set<_TECategory::RefItem<Font> >::Element *F=tc.font_items.front();F;F=F->next()) {
+
+ file->store_line(E->key()+"."+F->get().name+" = default");
+ }
+
+ if (tc.icon_items.size())
+ file->store_line("\n; Icon Items:\n");
+
+ for (Set<_TECategory::RefItem<Texture> >::Element *F=tc.icon_items.front();F;F=F->next()) {
+
+ file->store_line(E->key()+"."+F->get().name+" = default");
+ }
+
+ if (tc.color_items.size())
+ file->store_line("\n; Color Items:\n");
+
+ for (Set<_TECategory::Item<Color> >::Element *F=tc.color_items.front();F;F=F->next()) {
+
+ file->store_line(E->key()+"."+F->get().name+" = default");
+ }
+
+ if (tc.constant_items.size())
+ file->store_line("\n; Constant Items:\n");
+
+ for (Set<_TECategory::Item<int> >::Element *F=tc.constant_items.front();F;F=F->next()) {
+
+ file->store_line(E->key()+"."+F->get().name+" = default");
+ }
+
+ }
+
+ file->close();
+ memdelete(file);
+}
+
+void ThemeEditor::_dialog_cbk() {
+
+ switch(popup_mode) {
+ case POPUP_ADD: {
+
+ switch(type_select->get_selected()) {
+
+ case 0: theme->set_icon(name_edit->get_text(),type_edit->get_text(),Ref<Texture>()); break;
+ case 1: theme->set_stylebox(name_edit->get_text(),type_edit->get_text(),Ref<StyleBox>()); break;
+ case 2: theme->set_font(name_edit->get_text(),type_edit->get_text(),Ref<Font>()); break;
+ case 3: theme->set_color(name_edit->get_text(),type_edit->get_text(),Color()); break;
+ case 4: theme->set_constant(name_edit->get_text(),type_edit->get_text(),0); break;
+ }
+
+ } break;
+ case POPUP_CLASS_ADD: {
+
+ StringName fromtype = type_edit->get_text();
+ List<StringName> names;
+
+ {
+ names.clear();
+ Theme::get_default()->get_icon_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->set_icon(E->get(),fromtype,Ref<Texture>());
+
+ }
+
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_stylebox_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->set_stylebox(E->get(),fromtype,Ref<StyleBox>());
+
+ }
+
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_font_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->set_font(E->get(),fromtype,Ref<Font>());
+
+ }
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_color_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->set_color(E->get(),fromtype,Theme::get_default()->get_color(E->get(),fromtype));
+
+ }
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_constant_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->set_constant(E->get(),fromtype,Theme::get_default()->get_constant(E->get(),fromtype));
+
+ }
+ }
+ } break;
+ case POPUP_REMOVE: {
+ switch(type_select->get_selected()) {
+
+ case 0: theme->clear_icon(name_edit->get_text(),type_edit->get_text()); break;
+ case 1: theme->clear_stylebox(name_edit->get_text(),type_edit->get_text()); break;
+ case 2: theme->clear_font(name_edit->get_text(),type_edit->get_text()); break;
+ case 3: theme->clear_color(name_edit->get_text(),type_edit->get_text()); break;
+ case 4: theme->clear_constant(name_edit->get_text(),type_edit->get_text()); break;
+ }
+
+
+ } break;
+ case POPUP_CLASS_REMOVE: {
+ StringName fromtype = type_edit->get_text();
+ List<StringName> names;
+
+ {
+ names.clear();
+ Theme::get_default()->get_icon_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->clear_icon(E->get(),fromtype);
+
+ }
+
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_stylebox_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->clear_stylebox(E->get(),fromtype);
+
+ }
+
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_font_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->clear_font(E->get(),fromtype);
+
+ }
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_color_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->clear_color(E->get(),fromtype);
+
+ }
+ }
+ {
+ names.clear();
+ Theme::get_default()->get_constant_list(fromtype,&names);
+ for(List<StringName>::Element *E=names.front();E;E=E->next()) {
+ theme->clear_constant(E->get(),fromtype);
+
+ }
+ }
+
+ }break;
+ }
+
+}
+
+void ThemeEditor::_theme_menu_cbk(int p_option) {
+
+
+ if (p_option==POPUP_CREATE_EMPTY || p_option==POPUP_CREATE_EDITOR_EMPTY) {
+
+
+ Ref<Theme> base_theme;
+
+ if (p_option==POPUP_CREATE_EMPTY) {
+ base_theme = Theme::get_default();
+ } else {
+ base_theme = EditorNode::get_singleton()->get_theme_base()->get_theme();
+ }
+
+
+ {
+
+ List<StringName> types;
+ base_theme->get_type_list(&types);
+
+
+ for (List<StringName>::Element *T=types.front();T;T=T->next()) {
+ StringName type = T->get();
+
+ List<StringName> icons;
+ base_theme->get_icon_list(type,&icons);
+
+ for (List<StringName>::Element *E=icons.front();E;E=E->next()) {
+ theme->set_icon(E->get(),type,Ref<Texture>());
+ }
+
+ List<StringName> shaders;
+ base_theme->get_shader_list(type,&shaders);
+
+ for (List<StringName>::Element *E=shaders.front();E;E=E->next()) {
+ theme->set_shader(E->get(),type,Ref<Shader>());
+ }
+
+ List<StringName> styleboxs;
+ base_theme->get_stylebox_list(type,&styleboxs);
+
+ for (List<StringName>::Element *E=styleboxs.front();E;E=E->next()) {
+ theme->set_stylebox(E->get(),type,Ref<StyleBox>());
+ }
+
+ List<StringName> fonts;
+ base_theme->get_font_list(type,&fonts);
+
+ for (List<StringName>::Element *E=fonts.front();E;E=E->next()) {
+ theme->set_font(E->get(),type,Ref<Font>());
+ }
+
+ List<StringName> colors;
+ base_theme->get_color_list(type,&colors);
+
+ for (List<StringName>::Element *E=colors.front();E;E=E->next()) {
+ theme->set_color(E->get(),type,Color());
+ }
+
+
+ List<StringName> constants;
+ base_theme->get_constant_list(type,&constants);
+
+ for (List<StringName>::Element *E=constants.front();E;E=E->next()) {
+ theme->set_constant(E->get(),type,base_theme->get_constant(type,E->get()));
+ }
+
+ }
+
+ }
+ return;
+ }
+
+ Ref<Theme> base_theme;
+
+ type_select->show();
+ type_select_label->show();
+ name_select_label->show();
+ name_edit->show();
+ name_menu->show();
+
+
+ if (p_option==POPUP_ADD) {//add
+
+ add_del_dialog->set_title(TTR("Add Item"));
+ add_del_dialog->get_ok()->set_text(TTR("Add"));
+ add_del_dialog->popup_centered(Size2(490,85)*EDSCALE);
+
+ base_theme=Theme::get_default();
+
+ } else if (p_option==POPUP_CLASS_ADD) {//add
+
+ add_del_dialog->set_title(TTR("Add All Items"));
+ add_del_dialog->get_ok()->set_text(TTR("Add All"));
+ add_del_dialog->popup_centered(Size2(240,85)*EDSCALE);
+
+ base_theme=Theme::get_default();
+
+ type_select->hide();
+ name_select_label->hide();
+ type_select_label->hide();
+ name_edit->hide();
+ name_menu->hide();
+
+ } else if (p_option==POPUP_REMOVE) {
+
+ add_del_dialog->set_title(TTR("Remove Item"));
+ add_del_dialog->get_ok()->set_text(TTR("Remove"));
+ add_del_dialog->popup_centered(Size2(490,85)*EDSCALE);
+
+ base_theme=theme;
+
+ } else if (p_option==POPUP_CLASS_REMOVE) {
+
+ add_del_dialog->set_title("Remove All Items");
+ add_del_dialog->get_ok()->set_text("Remove All");
+ add_del_dialog->popup_centered(Size2(240,85)*EDSCALE);
+
+ base_theme=Theme::get_default();
+
+ type_select->hide();
+ name_select_label->hide();
+ type_select_label->hide();
+ name_edit->hide();
+ name_menu->hide();
+ }
+ popup_mode=p_option;
+
+ ERR_FAIL_COND( theme.is_null() );
+
+ List<StringName> types;
+ base_theme->get_type_list(&types);
+
+ type_menu->get_popup()->clear();
+
+ if (p_option==0 || p_option==1) {//add
+
+ List<StringName> new_types;
+ theme->get_type_list(&new_types);
+
+ //uh kind of sucks
+ for(List<StringName>::Element *F=new_types.front();F;F=F->next()) {
+
+ bool found=false;
+ for(List<StringName>::Element *E=types.front();E;E=E->next()) {
+
+ if (E->get()==F->get()) {
+ found=true;
+ break;
+ }
+ }
+
+ if (!found)
+ types.push_back(F->get());
+ }
+ }
+
+ //types.sort();
+ types.sort_custom<StringName::AlphCompare>();
+ for(List<StringName>::Element *E=types.front();E;E=E->next()) {
+
+ type_menu->get_popup()->add_item( E->get() );
+ }
+
+}
+
+void ThemeEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_PROCESS) {
+
+ time_left-=get_process_delta_time();
+ if (time_left<0) {
+ time_left=1.5;
+ _refresh_interval();
+ }
+ }
+}
+
+void ThemeEditor::_bind_methods() {
+
+ ClassDB::bind_method("_type_menu_cbk",&ThemeEditor::_type_menu_cbk);
+ ClassDB::bind_method("_name_menu_about_to_show",&ThemeEditor::_name_menu_about_to_show);
+ ClassDB::bind_method("_name_menu_cbk",&ThemeEditor::_name_menu_cbk);
+ ClassDB::bind_method("_theme_menu_cbk",&ThemeEditor::_theme_menu_cbk);
+ ClassDB::bind_method("_dialog_cbk",&ThemeEditor::_dialog_cbk);
+ ClassDB::bind_method("_save_template_cbk",&ThemeEditor::_save_template_cbk);
+}
+
+ThemeEditor::ThemeEditor() {
+
+ time_left=0;
+
+ scroll = memnew( ScrollContainer );
+ add_child(scroll);
+ scroll->set_area_as_parent_rect(3);
+ scroll->set_margin(MARGIN_TOP,30*EDSCALE);
+ //scroll->set_enable_h_scroll(true);
+ scroll->set_enable_v_scroll(true);
+ scroll->set_enable_h_scroll(false);
+
+ Panel * panel = memnew( Panel );
+ scroll->add_child(panel);
+ panel->set_custom_minimum_size(Size2(500,800)*EDSCALE);
+ panel->set_theme(Theme::get_default());
+ panel->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ main_vb= memnew( VBoxContainer );
+ panel->add_child(main_vb);
+ main_vb->set_area_as_parent_rect(4*EDSCALE);
+
+
+ HBoxContainer *hb_menu = memnew(HBoxContainer);
+ main_vb->add_child(hb_menu);
+
+
+
+ theme_menu = memnew( MenuButton );
+ theme_menu->set_text(TTR("Theme"));
+ theme_menu->get_popup()->add_item(TTR("Add Item"),POPUP_ADD);
+ theme_menu->get_popup()->add_item(TTR("Add Class Items"),POPUP_CLASS_ADD);
+ theme_menu->get_popup()->add_item(TTR("Remove Item"),POPUP_REMOVE);
+ theme_menu->get_popup()->add_item(TTR("Remove Class Items"),POPUP_CLASS_REMOVE);
+ theme_menu->get_popup()->add_separator();
+ theme_menu->get_popup()->add_item(TTR("Create Empty Template"),POPUP_CREATE_EMPTY);
+ theme_menu->get_popup()->add_item(TTR("Create Empty Editor Template"),POPUP_CREATE_EDITOR_EMPTY);
+
+ add_child(theme_menu);
+ theme_menu->set_pos(Vector2(3,3)*EDSCALE);
+ theme_menu->get_popup()->connect("id_pressed", this,"_theme_menu_cbk");
+
+
+ HBoxContainer *main_hb = memnew( HBoxContainer );
+ main_vb->add_child(main_hb);
+
+
+
+ VBoxContainer *first_vb = memnew( VBoxContainer);
+ first_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ main_hb->add_child(first_vb);
+
+
+
+ //main_panel->add_child(panel);
+ //panel->set_area_as_parent_rect();
+ //panel->set_margin( MARGIN_TOP,20 );
+
+ first_vb->add_child(memnew( Label("Label") ));
+
+ first_vb->add_child(memnew( Button("Button")) );
+ ToolButton *tb = memnew( ToolButton );
+ tb->set_text("ToolButton");
+ first_vb->add_child(tb );
+ CheckButton *cb = memnew( CheckButton );
+ cb->set_text("CheckButton");
+ first_vb->add_child(cb );
+ CheckBox *cbx = memnew( CheckBox );
+ cbx->set_text("CheckBox");
+ first_vb->add_child(cbx );
+
+
+ VBoxContainer *bg = memnew( VBoxContainer );
+ bg->set_v_size_flags(SIZE_EXPAND_FILL);
+ VBoxContainer *gbvb = memnew( VBoxContainer );
+ gbvb->set_v_size_flags(SIZE_EXPAND_FILL);
+ CheckBox *rbx1 = memnew( CheckBox );
+ rbx1->set_text(TTR("CheckBox Radio1"));
+ rbx1->set_pressed(true);
+ gbvb->add_child(rbx1);
+ CheckBox *rbx2 = memnew( CheckBox );
+ rbx2->set_text(TTR("CheckBox Radio2"));
+ gbvb->add_child(rbx2);
+ bg->add_child(gbvb);
+ first_vb->add_child(bg);
+
+ MenuButton* test_menu_button = memnew( MenuButton );
+ test_menu_button->set_text("MenuButton");
+ test_menu_button->get_popup()->add_item(TTR("Item"));
+ test_menu_button->get_popup()->add_separator();
+ test_menu_button->get_popup()->add_check_item(TTR("Check Item"));
+ test_menu_button->get_popup()->add_check_item(TTR("Checked Item"));
+ test_menu_button->get_popup()->set_item_checked(2,true);
+ first_vb->add_child(test_menu_button);
+
+ OptionButton *test_option_button = memnew( OptionButton );
+ test_option_button->add_item("OptionButton");
+ test_option_button->add_separator();
+ test_option_button->add_item(TTR("Has"));
+ test_option_button->add_item(TTR("Many"));
+ test_option_button->add_item(TTR("Options"));
+ first_vb->add_child(test_option_button);
+
+ ColorPickerButton *cpb = memnew( ColorPickerButton );
+ first_vb->add_child(cpb );
+
+ first_vb->add_child( memnew( HSeparator ));
+ first_vb->add_child( memnew( HSlider ));
+ first_vb->add_child( memnew( HScrollBar ));
+ first_vb->add_child( memnew( SpinBox ));
+ ProgressBar *pb=memnew( ProgressBar );
+ pb->set_value(50);
+ first_vb->add_child( pb);
+ Panel *pn=memnew( Panel );
+ pn->set_custom_minimum_size(Size2(40,40)*EDSCALE);
+ first_vb->add_child( pn);
+ first_vb->add_constant_override("separation",10*EDSCALE);
+
+ VBoxContainer *second_vb = memnew( VBoxContainer );
+ second_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ main_hb->add_child(second_vb);
+ second_vb->add_constant_override("separation",10*EDSCALE);
+ LineEdit *le = memnew( LineEdit );
+ le->set_text("LineEdit");
+ second_vb->add_child(le);
+ TextEdit *te = memnew( TextEdit );
+ te->set_text("TextEdit");
+ //te->set_v_size_flags(SIZE_EXPAND_FILL);
+ te->set_custom_minimum_size(Size2(0,160)*EDSCALE);
+ second_vb->add_child(te);
+
+ Tree *test_tree = memnew(Tree);
+ second_vb->add_child(test_tree);
+ test_tree->set_custom_minimum_size(Size2(0,160)*EDSCALE);
+
+
+ TreeItem *item = test_tree->create_item();
+ item->set_editable(0,true);
+ item->set_text(0,"Tree");
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0,true);
+ item->set_text(0,"check");
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+ item->set_editable(0,true);
+ item->set_range_config(0,0,20,0.1);
+ item->set_range(0,2);
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+ item->set_editable(0,true);
+ item->set_text(0,TTR("Have,Many,Several,Options!"));
+ item->set_range(0,2);
+
+ VBoxContainer *third_vb = memnew( VBoxContainer );
+ third_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ third_vb->add_constant_override("separation",10);
+
+ main_hb->add_child(third_vb);
+
+ HBoxContainer *vhb = memnew( HBoxContainer );
+ vhb->set_custom_minimum_size(Size2(0,160)*EDSCALE);
+ vhb->add_child(memnew(VSeparator));
+ vhb->add_child(memnew(VSlider));
+ vhb->add_child(memnew(VScrollBar));
+ third_vb->add_child(vhb);
+
+ TabContainer *tc = memnew( TabContainer );
+ third_vb->add_child(tc);
+ tc->set_custom_minimum_size(Size2(0,160)*EDSCALE);
+ Control *tcc = memnew( Control );
+ tcc->set_name(TTR("Tab 1"));
+ tc->add_child(tcc);
+ tcc = memnew( Control );
+ tcc->set_name(TTR("Tab 2"));
+ tc->add_child(tcc);
+ tcc = memnew( Control );
+ tcc->set_name(TTR("Tab 3"));
+ tc->add_child(tcc);
+
+ main_hb->add_constant_override("separation",20*EDSCALE);
+
+
+
+
+/*
+ test_h_scroll = memnew( HScrollBar );
+ test_h_scroll->set_pos( Point2( 25, 225 ) );
+ test_h_scroll->set_size( Point2( 150, 5 ) );
+ panel->add_child(test_h_scroll);
+
+ line_edit = memnew( LineEdit );
+ line_edit->set_pos( Point2( 25, 275 ) );
+ line_edit->set_size( Point2( 150, 5 ) );
+ line_edit->set_text("Line Edit");
+ panel->add_child(line_edit);
+
+ test_v_scroll = memnew( VScrollBar );
+ test_v_scroll->set_pos( Point2( 200, 25 ) );
+ test_v_scroll->set_size( Point2( 5, 150 ) );
+ panel->add_child(test_v_scroll);
+
+ test_tree = memnew(Tree);
+ test_tree->set_pos( Point2( 300, 25 ) );
+ test_tree->set_size( Point2( 200, 200 ) );
+ panel->add_child(test_tree);
+
+
+ TreeItem *item = test_tree->create_item();
+ item->set_editable(0,true);
+ item->set_text(0,"root");
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0,true);
+ item->set_text(0,"check");
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+ item->set_editable(0,true);
+ item->set_range_config(0,0,20,0.1);
+ item->set_range(0,2);
+ item = test_tree->create_item( test_tree->get_root() );
+ item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+ item->set_editable(0,true);
+ item->set_text(0,"Have,Many,Several,Options!"));
+ item->set_range(0,2);
+
+ Button *fd_button= memnew( Button );
+ fd_button->set_pos(Point2(300,275));
+ fd_button->set_text("Open File Dialog");
+ panel->add_child(fd_button);
+
+ test_file_dialog = memnew( EditorFileDialog );
+ panel->add_child(test_file_dialog);
+
+ fd_button->connect("pressed", this,"_open_file_dialog");
+*/
+
+ add_del_dialog = memnew(ConfirmationDialog);
+ add_del_dialog->hide();
+ add_child(add_del_dialog);
+
+
+ Label *l = memnew( Label );
+ l->set_pos( Point2(5,5)*EDSCALE );
+ l->set_text(TTR("Type:"));
+ add_del_dialog->add_child(l);
+ dtype_select_label=l;
+
+
+ type_edit = memnew( LineEdit );
+ type_edit->set_pos(Point2(5,25)*EDSCALE);
+ type_edit->set_size(Point2(150,5)*EDSCALE);
+ add_del_dialog->add_child(type_edit);
+ type_menu = memnew( MenuButton );
+ type_menu->set_pos(Point2(160,25)*EDSCALE);
+ type_menu->set_size(Point2(30,5)*EDSCALE);
+ type_menu->set_text("..");
+ add_del_dialog->add_child(type_menu);
+
+ type_menu->get_popup()->connect("id_pressed", this,"_type_menu_cbk");
+
+ l = memnew( Label );
+ l->set_pos( Point2(200,5)*EDSCALE );
+ l->set_text(TTR("Name:"));
+ add_del_dialog->add_child(l);
+ name_select_label=l;
+
+ name_edit = memnew( LineEdit );
+ name_edit->set_pos(Point2(200,25)*EDSCALE);
+ name_edit->set_size(Point2(150,5)*EDSCALE);
+ add_del_dialog->add_child(name_edit);
+ name_menu = memnew( MenuButton );
+ name_menu->set_pos(Point2(360,25)*EDSCALE);
+ name_menu->set_size(Point2(30,5)*EDSCALE);
+ name_menu->set_text("..");
+
+ add_del_dialog->add_child(name_menu);
+
+ name_menu->get_popup()->connect("about_to_show", this,"_name_menu_about_to_show");
+ name_menu->get_popup()->connect("id_pressed", this,"_name_menu_cbk");
+
+ type_select_label= memnew( Label );
+ type_select_label->set_pos( Point2(400,5)*EDSCALE );
+ type_select_label->set_text(TTR("Data Type:"));
+ add_del_dialog->add_child(type_select_label);
+
+ type_select = memnew( OptionButton );
+ type_select->add_item(TTR("Icon"));
+ type_select->add_item(TTR("Style"));
+ type_select->add_item(TTR("Font"));
+ type_select->add_item(TTR("Color"));
+ type_select->add_item(TTR("Constant"));
+ type_select->set_pos( Point2( 400,25 )*EDSCALE );
+ type_select->set_size( Point2( 80,5 )*EDSCALE );
+
+
+ add_del_dialog->add_child(type_select);
+
+ add_del_dialog->get_ok()->connect("pressed", this,"_dialog_cbk");
+
+
+ file_dialog = memnew( EditorFileDialog );
+ file_dialog->add_filter("*.theme ; Theme File");
+ add_child(file_dialog);
+ file_dialog->connect("file_selected",this,"_save_template_cbk");
+
+ //MenuButton *name_menu;
+ //LineEdit *name_edit;
+
+}
+
+void ThemeEditorPlugin::edit(Object *p_node) {
+
+ if (p_node && p_node->cast_to<Theme>()) {
+ theme_editor->show();
+ theme_editor->edit( p_node->cast_to<Theme>() );
+ } else {
+ theme_editor->edit( Ref<Theme>() );
+ theme_editor->hide();
+ }
+}
+
+bool ThemeEditorPlugin::handles(Object *p_node) const{
+
+ return p_node->is_class("Theme");
+}
+
+void ThemeEditorPlugin::make_visible(bool p_visible){
+
+ if (p_visible) {
+ theme_editor->set_process(true);
+ button->show();
+ editor->make_bottom_panel_item_visible(theme_editor);
+
+ } else {
+ theme_editor->set_process(false);
+ if (theme_editor->is_visible_in_tree())
+ editor->hide_bottom_panel();
+ button->hide();
+ }
+}
+
+ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) {
+
+ editor=p_node;
+ theme_editor = memnew( ThemeEditor );
+ theme_editor->set_custom_minimum_size(Size2(0,200));
+
+ //p_node->get_viewport()->add_child(theme_editor);
+ button=editor->add_bottom_panel_item("Theme",theme_editor);
+ button->hide();
+
+
+}
+
diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h
new file mode 100644
index 0000000000..f661da4cd5
--- /dev/null
+++ b/editor/plugins/theme_editor_plugin.h
@@ -0,0 +1,125 @@
+/*************************************************************************/
+/* theme_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef THEME_EDITOR_PLUGIN_H
+#define THEME_EDITOR_PLUGIN_H
+
+#include "scene/resources/theme.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/button_group.h"
+#include "scene/gui/scroll_container.h"
+
+#include "editor/editor_node.h"
+
+
+
+
+class ThemeEditor : public Control {
+
+ GDCLASS( ThemeEditor, Control );
+
+
+ ScrollContainer *scroll;
+ VBoxContainer *main_vb;
+ Ref<Theme> theme;
+
+ EditorFileDialog *file_dialog;
+
+ double time_left;
+
+ MenuButton *theme_menu;
+ ConfirmationDialog *add_del_dialog;
+ MenuButton *type_menu;
+ LineEdit *type_edit;
+ MenuButton *name_menu;
+ LineEdit *name_edit;
+ OptionButton *type_select;
+ Label * type_select_label;
+ Label * name_select_label;
+ Label * dtype_select_label;
+
+ enum PopupMode {
+ POPUP_ADD,
+ POPUP_CLASS_ADD,
+ POPUP_REMOVE,
+ POPUP_CLASS_REMOVE,
+ POPUP_CREATE_EMPTY,
+ POPUP_CREATE_EDITOR_EMPTY
+ };
+
+ int popup_mode;
+
+ Tree *test_tree;
+
+ void _save_template_cbk(String fname);
+ void _dialog_cbk();
+ void _type_menu_cbk(int p_option);
+ void _name_menu_about_to_show();
+ void _name_menu_cbk(int p_option);
+ void _theme_menu_cbk(int p_option);
+ void _propagate_redraw(Control *p_at);
+ void _refresh_interval();
+
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void edit(const Ref<Theme>& p_theme);
+
+ ThemeEditor();
+};
+
+
+
+class ThemeEditorPlugin : public EditorPlugin {
+
+ GDCLASS( ThemeEditorPlugin, EditorPlugin );
+
+ ThemeEditor *theme_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+
+ virtual String get_name() const { return "Theme"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ ThemeEditorPlugin(EditorNode *p_node);
+
+};
+
+
+#endif // THEME_EDITOR_PLUGIN_H
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
new file mode 100644
index 0000000000..fb6d5a786a
--- /dev/null
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -0,0 +1,1593 @@
+/*************************************************************************/
+/* tile_map_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "tile_map_editor_plugin.h"
+
+#include "os/keyboard.h"
+#include "os/input.h"
+#include "canvas_item_editor_plugin.h"
+#include "editor/editor_settings.h"
+#include "editor/editor_scale.h"
+
+void TileMapEditor::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_ENTER_TREE: {
+
+ transp->set_icon(get_icon("Transpose","EditorIcons"));
+ mirror_x->set_icon(get_icon("MirrorX","EditorIcons"));
+ mirror_y->set_icon(get_icon("MirrorY","EditorIcons"));
+ rotate_0->set_icon(get_icon("Rotate0","EditorIcons"));
+ rotate_90->set_icon(get_icon("Rotate90","EditorIcons"));
+ rotate_180->set_icon(get_icon("Rotate180","EditorIcons"));
+ rotate_270->set_icon(get_icon("Rotate270","EditorIcons"));
+
+ } break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+
+ if (is_visible_in_tree()) {
+ _update_palette();
+ }
+ } break;
+ }
+}
+
+void TileMapEditor::_menu_option(int p_option) {
+
+ switch(p_option) {
+
+ case OPTION_BUCKET: {
+
+ tool=TOOL_BUCKET;
+
+ canvas_item_editor->update();
+ } break;
+ case OPTION_PICK_TILE: {
+
+ tool=TOOL_PICKING;
+
+ canvas_item_editor->update();
+ } break;
+ case OPTION_SELECT: {
+
+ tool=TOOL_SELECTING;
+ selection_active=false;
+
+ canvas_item_editor->update();
+ } break;
+ case OPTION_DUPLICATE: {
+
+ _update_copydata();
+
+ if (selection_active) {
+ tool=TOOL_DUPLICATING;
+
+ canvas_item_editor->update();
+ }
+ } break;
+ case OPTION_ERASE_SELECTION: {
+
+ if (!selection_active)
+ return;
+
+ undo_redo->create_action("Erase Selection");
+ for (int i=rectangle.pos.y;i<=rectangle.pos.y+rectangle.size.y;i++) {
+ for (int j=rectangle.pos.x;j<=rectangle.pos.x+rectangle.size.x;j++) {
+
+ _set_cell(Point2i(j, i), TileMap::INVALID_CELL, false, false, false, true);
+ }
+ }
+ undo_redo->commit_action();
+
+ selection_active=false;
+ copydata.clear();
+
+ canvas_item_editor->update();
+ } break;
+ }
+}
+
+void TileMapEditor::_canvas_mouse_enter() {
+
+ mouse_over=true;
+ canvas_item_editor->update();
+}
+
+void TileMapEditor::_canvas_mouse_exit() {
+
+ mouse_over=false;
+ canvas_item_editor->update();
+}
+
+int TileMapEditor::get_selected_tile() const {
+
+ int item = palette->get_current();
+
+ if (item==-1)
+ return TileMap::INVALID_CELL;
+
+ return palette->get_item_metadata(item);
+}
+
+void TileMapEditor::set_selected_tile(int p_tile) {
+
+ int idx = palette->find_metadata(p_tile);
+
+ if (idx >= 0) {
+ palette->select(idx, true);
+ palette->ensure_current_is_visible();
+ }
+}
+
+void TileMapEditor::_set_cell(const Point2i& p_pos,int p_value,bool p_flip_h, bool p_flip_v, bool p_transpose,bool p_with_undo) {
+
+ ERR_FAIL_COND(!node);
+
+ int prev_val=node->get_cell(p_pos.x,p_pos.y);
+
+ bool prev_flip_h=node->is_cell_x_flipped(p_pos.x,p_pos.y);
+ bool prev_flip_v=node->is_cell_y_flipped(p_pos.x,p_pos.y);
+ bool prev_transpose=node->is_cell_transposed(p_pos.x,p_pos.y);
+
+ if (p_value==prev_val && p_flip_h==prev_flip_h && p_flip_v==prev_flip_v && p_transpose==prev_transpose)
+ return; //check that it's actually different
+
+ if (p_with_undo) {
+
+ undo_redo->add_do_method(node,"set_cellv",Point2(p_pos),p_value,p_flip_h,p_flip_v,p_transpose);
+ undo_redo->add_undo_method(node,"set_cellv",Point2(p_pos),prev_val,prev_flip_h,prev_flip_v,prev_transpose);
+ } else {
+
+ node->set_cell(p_pos.x,p_pos.y,p_value,p_flip_h,p_flip_v,p_transpose);
+ }
+
+}
+
+void TileMapEditor::_text_entered(const String& p_text) {
+
+ canvas_item_editor->grab_focus();
+}
+
+void TileMapEditor::_text_changed(const String& p_text) {
+
+ _update_palette();
+}
+
+void TileMapEditor::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ palette->call("_gui_input", p_ie);
+ search_box->accept_event();
+ }
+}
+
+void TileMapEditor::_update_palette() {
+
+ if (!node)
+ return;
+
+ int selected = get_selected_tile();
+ palette->clear();
+
+ Ref<TileSet> tileset=node->get_tileset();
+ if (tileset.is_null())
+ return;
+
+ List<int> tiles;
+ tileset->get_tile_list(&tiles);
+
+ if (tiles.empty())
+ return;
+
+ float min_size = EDITOR_DEF("editors/tile_map/preview_size", 64);
+ min_size *= EDSCALE;
+ int hseparation = EDITOR_DEF("editors/tile_map/palette_item_hseparation",8);
+ bool show_tile_names = bool(EDITOR_DEF("editors/tile_map/show_tile_names", true));
+
+ palette->add_constant_override("hseparation", hseparation*EDSCALE);
+ palette->add_constant_override("vseparation", 8*EDSCALE);
+
+ palette->set_fixed_icon_size(Size2(min_size, min_size));
+ palette->set_fixed_column_width(min_size * MAX(size_slider->get_value(), 1));
+
+ String filter = search_box->get_text().strip_edges();
+
+ for (List<int>::Element *E=tiles.front();E;E=E->next()) {
+
+ String name;
+
+ if (tileset->tile_get_name(E->get())!="") {
+ name = itos(E->get())+" - "+tileset->tile_get_name(E->get());
+ } else {
+ name = "#"+itos(E->get());
+ }
+
+ if (filter != "" && !filter.is_subsequence_ofi(name))
+ continue;
+
+ if (show_tile_names) {
+ palette->add_item(name);
+ } else {
+ palette->add_item(String());
+ }
+
+ Ref<Texture> tex = tileset->tile_get_texture(E->get());
+
+ if (tex.is_valid()) {
+ Rect2 region = tileset->tile_get_region(E->get());
+
+ if (!region.has_no_area())
+ palette->set_item_icon_region(palette->get_item_count()-1, region);
+
+ palette->set_item_icon(palette->get_item_count()-1, tex);
+ }
+
+ palette->set_item_metadata(palette->get_item_count()-1, E->get());
+ }
+
+ palette->set_same_column_width(true);
+
+ if (selected != -1)
+ set_selected_tile(selected);
+ else
+ palette->select(0);
+}
+
+void TileMapEditor::_pick_tile(const Point2& p_pos) {
+
+ int id = node->get_cell(p_pos.x, p_pos.y);
+
+ if (id==TileMap::INVALID_CELL)
+ return;
+
+ if (search_box->get_text().strip_edges() != "") {
+
+ search_box->set_text("");
+ _update_palette();
+ }
+
+ set_selected_tile(id);
+
+ mirror_x->set_pressed(node->is_cell_x_flipped(p_pos.x, p_pos.y));
+ mirror_y->set_pressed(node->is_cell_y_flipped(p_pos.x, p_pos.y));
+ transp->set_pressed(node->is_cell_transposed(p_pos.x, p_pos.y));
+
+ _update_transform_buttons();
+ canvas_item_editor->update();
+}
+
+PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i& p_start, bool erase, bool preview) {
+
+ int prev_id = node->get_cell(p_start.x, p_start.y);
+ int id = TileMap::INVALID_CELL;
+ if (!erase) {
+ id = get_selected_tile();
+
+ if (id == TileMap::INVALID_CELL)
+ return PoolVector<Vector2>();
+ }
+
+ Rect2i r = node->get_item_rect();
+ r.pos = r.pos/node->get_cell_size();
+ r.size = r.size/node->get_cell_size();
+
+ int area = r.get_area();
+ if(preview) {
+ // Test if we can re-use the result from preview bucket fill
+ bool invalidate_cache = false;
+ // Area changed
+ if(r != bucket_cache_rect)
+ _clear_bucket_cache();
+ // Cache grid is not initialized
+ if(bucket_cache_visited == 0) {
+ bucket_cache_visited = new bool[area];
+ invalidate_cache = true;
+ }
+ // Tile ID changed or position wasn't visited by the previous fill
+ int loc = (p_start.x - r.get_pos().x) + (p_start.y - r.get_pos().y) * r.get_size().x;
+ if(prev_id != bucket_cache_tile || !bucket_cache_visited[loc]) {
+ invalidate_cache = true;
+ }
+ if(invalidate_cache) {
+ for(int i = 0; i < area; ++i)
+ bucket_cache_visited[i] = false;
+ bucket_cache = PoolVector<Vector2>();
+ bucket_cache_tile = prev_id;
+ bucket_cache_rect = r;
+ }
+ else {
+ return bucket_cache;
+ }
+ }
+
+ PoolVector<Vector2> points;
+
+ List<Point2i> queue;
+ queue.push_back(p_start);
+
+ while (queue.size()) {
+
+ Point2i n = queue.front()->get();
+ queue.pop_front();
+
+ if (!r.has_point(n))
+ continue;
+
+ if (node->get_cell(n.x, n.y) == prev_id) {
+
+ if(preview) {
+ int loc = (n.x - r.get_pos().x) + (n.y - r.get_pos().y) * r.get_size().x;
+ if(bucket_cache_visited[loc])
+ continue;
+ bucket_cache_visited[loc] = true;
+ bucket_cache.push_back(n);
+ }
+ else {
+ node->set_cellv(n, id, flip_h, flip_v, transpose);
+ points.push_back(n);
+ }
+
+ queue.push_back(n + Point2i(0, 1));
+ queue.push_back(n + Point2i(0, -1));
+ queue.push_back(n + Point2i(1, 0));
+ queue.push_back(n + Point2i(-1, 0));
+ }
+ }
+
+ return preview ? bucket_cache : points;
+}
+
+void TileMapEditor::_fill_points(const PoolVector<Vector2> p_points, const Dictionary& p_op) {
+
+ int len = p_points.size();
+ PoolVector<Vector2>::Read pr = p_points.read();
+
+ int id = p_op["id"];
+ bool xf = p_op["flip_h"];
+ bool yf = p_op["flip_v"];
+ bool tr = p_op["transpose"];
+
+ for (int i=0;i<len;i++) {
+
+ _set_cell(pr[i], id, xf, yf, tr);
+ }
+}
+
+void TileMapEditor::_erase_points(const PoolVector<Vector2> p_points) {
+
+ int len = p_points.size();
+ PoolVector<Vector2>::Read pr = p_points.read();
+
+ for (int i=0;i<len;i++) {
+
+ _set_cell(pr[i], TileMap::INVALID_CELL);
+ }
+}
+
+void TileMapEditor::_select(const Point2i& p_from, const Point2i& p_to) {
+
+ Point2i begin=p_from;
+ Point2i end=p_to;
+
+ if (begin.x > end.x) {
+
+ SWAP( begin.x, end.x);
+ }
+ if (begin.y > end.y) {
+
+ SWAP( begin.y, end.y);
+ }
+
+ rectangle.pos=begin;
+ rectangle.size=end-begin;
+
+ canvas_item_editor->update();
+}
+
+void TileMapEditor::_draw_cell(int p_cell, const Point2i& p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D& p_xform) {
+
+ Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell);
+
+ if (t.is_null())
+ return;
+
+ Vector2 tile_ofs = node->get_tileset()->tile_get_texture_offset(p_cell);
+
+ Rect2 r = node->get_tileset()->tile_get_region(p_cell);
+ Size2 sc = p_xform.get_scale();
+
+ Rect2 rect = Rect2();
+ rect.pos = node->map_to_world(p_point) + node->get_cell_draw_offset();
+
+ if (r.has_no_area()) {
+ rect.size = t->get_size();
+ } else {
+ rect.size = r.size;
+ }
+
+ if (rect.size.y > rect.size.x) {
+ if ((p_flip_h && (p_flip_v || p_transpose)) || (p_flip_v && !p_transpose))
+ tile_ofs.y += rect.size.y - rect.size.x;
+ } else if (rect.size.y < rect.size.x) {
+ if ((p_flip_v && (p_flip_h || p_transpose)) || (p_flip_h && !p_transpose))
+ tile_ofs.x += rect.size.x - rect.size.y;
+ }
+
+ if (p_transpose) {
+ SWAP(tile_ofs.x, tile_ofs.y);
+ }
+ if (p_flip_h) {
+ sc.x*=-1.0;
+ tile_ofs.x*=-1.0;
+ }
+ if (p_flip_v) {
+ sc.y*=-1.0;
+ tile_ofs.y*=-1.0;
+ }
+
+ if (node->get_tile_origin()==TileMap::TILE_ORIGIN_TOP_LEFT) {
+
+ rect.pos+=tile_ofs;
+ } else if (node->get_tile_origin()==TileMap::TILE_ORIGIN_BOTTOM_LEFT) {
+ Size2 cell_size = node->get_cell_size();
+
+ rect.pos+=tile_ofs;
+
+ if(p_transpose)
+ {
+ if(p_flip_h)
+ rect.pos.x-=cell_size.x;
+ else
+ rect.pos.x+=cell_size.x;
+ } else {
+ if(p_flip_v)
+ rect.pos.y-=cell_size.y;
+ else
+ rect.pos.y+=cell_size.y;
+ }
+
+ } else if (node->get_tile_origin()==TileMap::TILE_ORIGIN_CENTER) {
+ rect.pos+=node->get_cell_size()/2;
+ Vector2 s = r.size;
+
+ Vector2 center = (s/2) - tile_ofs;
+
+ if (p_flip_h)
+ rect.pos.x-=s.x-center.x;
+ else
+ rect.pos.x-=center.x;
+
+ if (p_flip_v)
+ rect.pos.y-=s.y-center.y;
+ else
+ rect.pos.y-=center.y;
+ }
+
+ rect.pos=p_xform.xform(rect.pos);
+ rect.size*=sc;
+
+ if (r.has_no_area())
+ canvas_item_editor->draw_texture_rect(t, rect, false, Color(1,1,1,0.5), p_transpose);
+ else
+ canvas_item_editor->draw_texture_rect_region(t, rect, r, Color(1,1,1,0.5), p_transpose);
+}
+
+void TileMapEditor::_draw_fill_preview(int p_cell, const Point2i& p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D& p_xform) {
+
+ PoolVector<Vector2> points = _bucket_fill(p_point, false, true);
+ PoolVector<Vector2>::Read pr = points.read();
+ int len = points.size();
+ int time_after = OS::get_singleton()->get_ticks_msec();
+
+ for(int i = 0; i < len; ++i) {
+ _draw_cell(p_cell, pr[i], p_flip_h, p_flip_v, p_transpose, p_xform);
+ }
+}
+
+void TileMapEditor::_clear_bucket_cache() {
+ if(bucket_cache_visited) {
+ delete[] bucket_cache_visited;
+ bucket_cache_visited = 0;
+ }
+}
+
+void TileMapEditor::_update_copydata() {
+
+ copydata.clear();
+
+ if (!selection_active)
+ return;
+
+ for (int i=rectangle.pos.y;i<=rectangle.pos.y+rectangle.size.y;i++) {
+
+ for (int j=rectangle.pos.x;j<=rectangle.pos.x+rectangle.size.x;j++) {
+
+ TileData tcd;
+
+ tcd.cell=node->get_cell(j, i);
+
+ if (tcd.cell!=TileMap::INVALID_CELL) {
+ tcd.pos=Point2i(j, i);
+ tcd.flip_h=node->is_cell_x_flipped(j,i);
+ tcd.flip_v=node->is_cell_y_flipped(j,i);
+ tcd.transpose=node->is_cell_transposed(j,i);
+ }
+
+ copydata.push_back(tcd);
+ }
+ }
+}
+
+static inline Vector<Point2i> line(int x0, int x1, int y0, int y1) {
+
+ Vector<Point2i> points;
+
+ float dx = ABS(x1 - x0);
+ float dy = ABS(y1 - y0);
+
+ int x = x0;
+ int y = y0;
+
+ int sx = x0 > x1 ? -1 : 1;
+ int sy = y0 > y1 ? -1 : 1;
+
+ if (dx > dy) {
+ float err = dx/2;
+
+ for (; x != x1; x += sx) {
+ points.push_back(Vector2(x, y));
+
+ err -= dy;
+ if (err < 0) {
+ y += sy;
+ err += dx;
+ }
+ }
+ } else {
+ float err = dy/2;
+
+ for (; y != y1; y += sy) {
+ points.push_back(Vector2(x, y));
+
+ err -= dx;
+ if (err < 0) {
+ x += sx;
+ err += dy;
+ }
+ }
+ }
+
+ points.push_back(Vector2(x, y));
+
+ return points;
+}
+
+bool TileMapEditor::forward_gui_input(const InputEvent& p_event) {
+
+ if (!node || !node->get_tileset().is_valid() || !node->is_visible_in_tree())
+ return false;
+
+ Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
+ Transform2D xform_inv = xform.affine_inverse();
+
+ switch(p_event.type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+ const InputEventMouseButton &mb=p_event.mouse_button;
+
+ if (mb.button_index==BUTTON_LEFT) {
+
+ if (mb.pressed) {
+
+ if (Input::get_singleton()->is_key_pressed(KEY_SPACE))
+ return false; //drag
+
+ if (tool==TOOL_NONE) {
+
+ if (mb.mod.shift) {
+
+ if (mb.mod.control)
+ tool=TOOL_RECTANGLE_PAINT;
+ else
+ tool=TOOL_LINE_PAINT;
+
+ selection_active=false;
+ rectangle_begin=over_tile;
+
+ return true;
+ }
+
+ if (mb.mod.control) {
+
+ tool=TOOL_PICKING;
+ _pick_tile(over_tile);
+
+ return true;
+ }
+
+ tool=TOOL_PAINTING;
+ }
+
+ if (tool==TOOL_PAINTING) {
+
+ int id = get_selected_tile();
+
+ if (id!=TileMap::INVALID_CELL) {
+
+ tool=TOOL_PAINTING;
+
+ paint_undo.clear();
+ paint_undo[over_tile]=_get_op_from_cell(over_tile);
+
+ _set_cell(over_tile, id, flip_h, flip_v, transpose);
+ }
+ } else if (tool==TOOL_PICKING) {
+
+ _pick_tile(over_tile);
+ } else if (tool==TOOL_SELECTING) {
+
+ selection_active=true;
+ rectangle_begin=over_tile;
+ }
+
+ return true;
+
+ } else {
+
+ if (tool!=TOOL_NONE) {
+
+ if (tool==TOOL_PAINTING) {
+
+ int id=get_selected_tile();
+
+ if (id!=TileMap::INVALID_CELL && paint_undo.size()) {
+
+ undo_redo->create_action(TTR("Paint TileMap"));
+ for (Map<Point2i,CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ Point2 p=E->key();
+ undo_redo->add_do_method(node,"set_cellv",p,id,flip_h,flip_v,transpose);
+ undo_redo->add_undo_method(node,"set_cellv",p,E->get().idx,E->get().xf,E->get().yf,E->get().tr);
+ }
+ undo_redo->commit_action();
+
+ paint_undo.clear();
+ }
+ } else if (tool==TOOL_LINE_PAINT) {
+
+ int id=get_selected_tile();
+
+ if (id!=TileMap::INVALID_CELL) {
+
+ undo_redo->create_action("Line Draw");
+ for (Map<Point2i,CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ _set_cell(E->key(), id, flip_h, flip_v, transpose, true);
+ }
+ undo_redo->commit_action();
+
+ paint_undo.clear();
+
+ canvas_item_editor->update();
+ }
+ } else if (tool==TOOL_RECTANGLE_PAINT) {
+
+ int id=get_selected_tile();
+
+ if (id!=TileMap::INVALID_CELL) {
+
+ undo_redo->create_action("Rectangle Paint");
+ for (int i=rectangle.pos.y;i<=rectangle.pos.y+rectangle.size.y;i++) {
+ for (int j=rectangle.pos.x;j<=rectangle.pos.x+rectangle.size.x;j++) {
+
+ _set_cell(Point2i(j, i), id, flip_h, flip_v, transpose, true);
+ }
+ }
+ undo_redo->commit_action();
+
+ canvas_item_editor->update();
+ }
+ } else if (tool==TOOL_DUPLICATING) {
+
+ Point2 ofs = over_tile-rectangle.pos;
+
+ undo_redo->create_action(TTR("Duplicate"));
+ for (List<TileData>::Element *E=copydata.front();E;E=E->next()) {
+
+ _set_cell(E->get().pos+ofs,E->get().cell,E->get().flip_h,E->get().flip_v,E->get().transpose,true);
+ }
+ undo_redo->commit_action();
+
+ copydata.clear();
+
+ canvas_item_editor->update();
+
+ } else if (tool==TOOL_SELECTING) {
+
+ canvas_item_editor->update();
+
+ } else if (tool==TOOL_BUCKET) {
+
+ Dictionary pop;
+ pop["id"] = node->get_cell(over_tile.x, over_tile.y);
+ pop["flip_h"] = node->is_cell_x_flipped(over_tile.x, over_tile.y);
+ pop["flip_v"] = node->is_cell_y_flipped(over_tile.x, over_tile.y);
+ pop["transpose"] = node->is_cell_transposed(over_tile.x, over_tile.y);
+
+ PoolVector<Vector2> points = _bucket_fill(over_tile);
+
+ if (points.size() == 0)
+ return false;
+
+ Dictionary op;
+ op["id"] = get_selected_tile();
+ op["flip_h"] = flip_h;
+ op["flip_v"] = flip_v;
+ op["transpose"] = transpose;
+
+ undo_redo->create_action("Bucket Fill");
+
+ undo_redo->add_do_method(this, "_fill_points", points, op);
+ undo_redo->add_undo_method(this, "_fill_points", points, pop);
+
+ undo_redo->commit_action();
+ }
+
+ tool=TOOL_NONE;
+
+ return true;
+ }
+ }
+ } else if (mb.button_index==BUTTON_RIGHT) {
+
+ if (mb.pressed) {
+
+ if (tool==TOOL_SELECTING || selection_active) {
+
+ tool=TOOL_NONE;
+ selection_active=false;
+
+ canvas_item_editor->update();
+
+ return true;
+ }
+
+ if (tool==TOOL_DUPLICATING) {
+
+ tool=TOOL_NONE;
+ copydata.clear();
+
+ canvas_item_editor->update();
+
+ return true;
+ }
+
+ if (tool==TOOL_NONE) {
+
+ paint_undo.clear();
+
+ Point2 local = node->world_to_map(xform_inv.xform(Point2(mb.x, mb.y)));
+
+ if (mb.mod.shift) {
+
+ if (mb.mod.control)
+ tool=TOOL_RECTANGLE_ERASE;
+ else
+ tool=TOOL_LINE_ERASE;
+
+ selection_active=false;
+ rectangle_begin=local;
+ } else {
+
+ tool=TOOL_ERASING;
+
+ paint_undo[local]=_get_op_from_cell(local);
+ _set_cell(local, TileMap::INVALID_CELL);
+ }
+
+ return true;
+ }
+
+ } else {
+ if (tool==TOOL_ERASING || tool==TOOL_RECTANGLE_ERASE || tool==TOOL_LINE_ERASE) {
+
+ if (paint_undo.size()) {
+ undo_redo->create_action(TTR("Erase TileMap"));
+ for (Map<Point2i,CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ Point2 p=E->key();
+ undo_redo->add_do_method(node,"set_cellv",p,TileMap::INVALID_CELL,false,false,false);
+ undo_redo->add_undo_method(node,"set_cellv",p,E->get().idx,E->get().xf,E->get().yf,E->get().tr);
+ }
+
+ undo_redo->commit_action();
+ paint_undo.clear();
+ }
+
+ if (tool==TOOL_RECTANGLE_ERASE || tool==TOOL_LINE_ERASE) {
+ canvas_item_editor->update();
+ }
+
+ tool=TOOL_NONE;
+
+ return true;
+
+ } else if (tool==TOOL_BUCKET) {
+
+ Dictionary pop;
+ pop["id"] = node->get_cell(over_tile.x, over_tile.y);
+ pop["flip_h"] = node->is_cell_x_flipped(over_tile.x, over_tile.y);
+ pop["flip_v"] = node->is_cell_y_flipped(over_tile.x, over_tile.y);
+ pop["transpose"] = node->is_cell_transposed(over_tile.x, over_tile.y);
+
+ PoolVector<Vector2> points = _bucket_fill(over_tile, true);
+
+ if (points.size() == 0)
+ return false;
+
+ undo_redo->create_action("Bucket Fill");
+
+ undo_redo->add_do_method(this, "_erase_points", points);
+ undo_redo->add_undo_method(this, "_fill_points", points, pop);
+
+ undo_redo->commit_action();
+ }
+ }
+ }
+ } break;
+ case InputEvent::MOUSE_MOTION: {
+
+ const InputEventMouseMotion &mm=p_event.mouse_motion;
+
+ Point2i new_over_tile = node->world_to_map(xform_inv.xform(Point2(mm.x,mm.y)));
+
+ if (new_over_tile!=over_tile) {
+
+ over_tile=new_over_tile;
+ canvas_item_editor->update();
+ }
+
+ int tile_under = node->get_cell(over_tile.x, over_tile.y);
+ String tile_name = "none";
+
+ if (node->get_tileset()->has_tile(tile_under))
+ tile_name = node->get_tileset()->tile_get_name(tile_under);
+ tile_info->set_text(String::num(over_tile.x)+", "+String::num(over_tile.y)+" ["+tile_name+"]");
+
+ if (tool==TOOL_PAINTING) {
+
+ int id = get_selected_tile();
+ if (id!=TileMap::INVALID_CELL) {
+
+ if (!paint_undo.has(over_tile)) {
+ paint_undo[over_tile]=_get_op_from_cell(over_tile);
+ }
+
+ _set_cell(over_tile, id, flip_h, flip_v, transpose);
+
+ return true;
+ }
+ }
+
+ if (tool==TOOL_SELECTING) {
+
+ _select(rectangle_begin, over_tile);
+
+ return true;
+ }
+
+ if (tool==TOOL_LINE_PAINT || tool==TOOL_LINE_ERASE) {
+
+ int id = get_selected_tile();
+ bool erasing = (tool==TOOL_LINE_ERASE);
+
+ if (erasing && paint_undo.size()) {
+
+ for (Map<Point2i, CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ _set_cell(E->key(), E->get().idx, E->get().xf, E->get().yf, E->get().tr);
+ }
+ }
+
+ paint_undo.clear();
+
+ if (id!=TileMap::INVALID_CELL) {
+
+ Vector<Point2i> points = line(rectangle_begin.x, over_tile.x, rectangle_begin.y, over_tile.y);
+
+ for (int i=0;i<points.size();i++) {
+
+ paint_undo[points[i]]=_get_op_from_cell(points[i]);
+
+ if (erasing)
+ _set_cell(points[i], TileMap::INVALID_CELL);
+ }
+
+ canvas_item_editor->update();
+ }
+
+ return true;
+ }
+ if (tool==TOOL_RECTANGLE_PAINT || tool==TOOL_RECTANGLE_ERASE) {
+
+ _select(rectangle_begin, over_tile);
+
+ if (tool==TOOL_RECTANGLE_ERASE) {
+
+ if (paint_undo.size()) {
+
+ for (Map<Point2i, CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ _set_cell(E->key(), E->get().idx, E->get().xf, E->get().yf, E->get().tr);
+ }
+ }
+
+ paint_undo.clear();
+
+ for (int i=rectangle.pos.y;i<=rectangle.pos.y+rectangle.size.y;i++) {
+ for (int j=rectangle.pos.x;j<=rectangle.pos.x+rectangle.size.x;j++) {
+
+ Point2i tile = Point2i(j, i);
+ paint_undo[tile]=_get_op_from_cell(tile);
+
+ _set_cell(tile, TileMap::INVALID_CELL);
+ }
+ }
+ }
+
+ return true;
+ }
+ if (tool==TOOL_ERASING) {
+
+ if (!paint_undo.has(over_tile)) {
+ paint_undo[over_tile]=_get_op_from_cell(over_tile);
+ }
+
+ _set_cell(over_tile, TileMap::INVALID_CELL);
+
+ return true;
+ }
+ if (tool==TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) {
+
+ _pick_tile(over_tile);
+
+ return true;
+ }
+ } break;
+ case InputEvent::KEY: {
+
+ const InputEventKey &k = p_event.key;
+
+ if (!k.pressed)
+ break;
+
+ if (k.scancode==KEY_ESCAPE) {
+
+ if (tool==TOOL_DUPLICATING)
+ copydata.clear();
+ else if (tool==TOOL_SELECTING || selection_active)
+ selection_active=false;
+
+ tool=TOOL_NONE;
+
+ canvas_item_editor->update();
+
+ return true;
+ }
+
+ if (tool!=TOOL_NONE || !mouse_over)
+ return false;
+
+ if (ED_IS_SHORTCUT("tile_map_editor/erase_selection", p_event)) {
+ _menu_option(OPTION_ERASE_SELECTION);
+
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/select", p_event)) {
+ tool=TOOL_SELECTING;
+ selection_active=false;
+
+ canvas_item_editor->update();
+
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/duplicate_selection", p_event)) {
+ _update_copydata();
+
+ if (selection_active) {
+ tool=TOOL_DUPLICATING;
+
+ canvas_item_editor->update();
+
+ return true;
+ }
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/find_tile", p_event)) {
+ search_box->select_all();
+ search_box->grab_focus();
+
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/mirror_x", p_event)) {
+ flip_h=!flip_h;
+ mirror_x->set_pressed(flip_h);
+ canvas_item_editor->update();
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/mirror_y", p_event)) {
+ flip_v=!flip_v;
+ mirror_y->set_pressed(flip_v);
+ canvas_item_editor->update();
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/transpose", p_event)) {
+ transpose = !transpose;
+ transp->set_pressed(transpose);
+ canvas_item_editor->update();
+ return true;
+ }
+ } break;
+ }
+
+ return false;
+}
+
+void TileMapEditor::_canvas_draw() {
+
+ if (!node)
+ return;
+
+ Transform2D cell_xf = node->get_cell_transform();
+
+ Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
+ Transform2D xform_inv = xform.affine_inverse();
+
+
+ Size2 screen_size=canvas_item_editor->get_size();
+ {
+ Rect2 aabb;
+ aabb.pos=node->world_to_map(xform_inv.xform(Vector2()));
+ aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(0,screen_size.height))));
+ aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(screen_size.width,0))));
+ aabb.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
+ Rect2i si=aabb.grow(1.0);
+
+ if (node->get_half_offset()!=TileMap::HALF_OFFSET_X) {
+
+ int max_lines=2000; //avoid crash if size too smal
+
+ for (int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
+
+ Vector2 from = xform.xform(node->map_to_world(Vector2(i,si.pos.y)));
+ Vector2 to = xform.xform(node->map_to_world(Vector2(i,si.pos.y+si.size.y+1)));
+
+ Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
+ canvas_item_editor->draw_line(from,to,col,1);
+ if (max_lines--==0)
+ break;
+ }
+ } else {
+
+ int max_lines=10000; //avoid crash if size too smal
+
+ for (int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
+
+ for (int j=(si.pos.y)-1;j<=(si.pos.y+si.size.y);j++) {
+
+ Vector2 ofs;
+ if (ABS(j)&1) {
+ ofs=cell_xf[0]*0.5;
+ }
+
+ Vector2 from = xform.xform(node->map_to_world(Vector2(i,j),true)+ofs);
+ Vector2 to = xform.xform(node->map_to_world(Vector2(i,j+1),true)+ofs);
+ Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
+ canvas_item_editor->draw_line(from,to,col,1);
+
+ if (max_lines--==0)
+ break;
+
+ }
+
+ }
+ }
+
+ int max_lines=10000; //avoid crash if size too smal
+
+ if (node->get_half_offset()!=TileMap::HALF_OFFSET_Y) {
+
+ for (int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
+
+ Vector2 from = xform.xform(node->map_to_world(Vector2(si.pos.x,i)));
+ Vector2 to = xform.xform(node->map_to_world(Vector2(si.pos.x+si.size.x+1,i)));
+
+ Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
+ canvas_item_editor->draw_line(from,to,col,1);
+
+ if (max_lines--==0)
+ break;
+
+ }
+ } else {
+
+
+ for (int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
+
+ for (int j=(si.pos.x)-1;j<=(si.pos.x+si.size.x);j++) {
+
+ Vector2 ofs;
+ if (ABS(j)&1) {
+ ofs=cell_xf[1]*0.5;
+ }
+
+ Vector2 from = xform.xform(node->map_to_world(Vector2(j,i),true)+ofs);
+ Vector2 to = xform.xform(node->map_to_world(Vector2(j+1,i),true)+ofs);
+ Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
+ canvas_item_editor->draw_line(from,to,col,1);
+
+ if (max_lines--==0)
+ break;
+
+ }
+ }
+ }
+ }
+
+ if (selection_active) {
+
+ Vector<Vector2> points;
+ points.push_back( xform.xform( node->map_to_world(( rectangle.pos ) )));
+ points.push_back( xform.xform( node->map_to_world((rectangle.pos+Point2(rectangle.size.x+1,0)) ) ));
+ points.push_back( xform.xform( node->map_to_world((rectangle.pos+Point2(rectangle.size.x+1,rectangle.size.y+1)) ) ));
+ points.push_back( xform.xform( node->map_to_world((rectangle.pos+Point2(0,rectangle.size.y+1)) ) ));
+
+ canvas_item_editor->draw_colored_polygon(points, Color(0.2,0.8,1,0.4));
+ }
+
+ if (mouse_over){
+
+ Vector2 endpoints[4]={
+ node->map_to_world(over_tile, true),
+ node->map_to_world((over_tile+Point2(1,0)), true),
+ node->map_to_world((over_tile+Point2(1,1)), true),
+ node->map_to_world((over_tile+Point2(0,1)), true)
+ };
+
+ for (int i=0;i<4;i++) {
+ if (node->get_half_offset()==TileMap::HALF_OFFSET_X && ABS(over_tile.y)&1)
+ endpoints[i]+=cell_xf[0]*0.5;
+ if (node->get_half_offset()==TileMap::HALF_OFFSET_Y && ABS(over_tile.x)&1)
+ endpoints[i]+=cell_xf[1]*0.5;
+ endpoints[i]=xform.xform(endpoints[i]);
+ }
+ Color col;
+ if (node->get_cell(over_tile.x,over_tile.y)!=TileMap::INVALID_CELL)
+ col=Color(0.2,0.8,1.0,0.8);
+ else
+ col=Color(1.0,0.4,0.2,0.8);
+
+ for (int i=0;i<4;i++)
+ canvas_item_editor->draw_line(endpoints[i],endpoints[(i+1)%4],col,2);
+
+
+ bool bucket_preview = EditorSettings::get_singleton()->get("editors/tile_map/bucket_fill_preview");
+ if (tool==TOOL_SELECTING || tool==TOOL_PICKING || !bucket_preview) {
+ return;
+ }
+
+ if (tool==TOOL_LINE_PAINT) {
+
+ if (paint_undo.empty())
+ return;
+
+ int id = get_selected_tile();
+
+ if (id==TileMap::INVALID_CELL)
+ return;
+
+ for (Map<Point2i, CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
+
+ _draw_cell(id, E->key(), flip_h, flip_v, transpose, xform);
+ }
+
+ } else if (tool==TOOL_RECTANGLE_PAINT) {
+
+ int id = get_selected_tile();
+
+ if (id==TileMap::INVALID_CELL)
+ return;
+
+ for (int i=rectangle.pos.y;i<=rectangle.pos.y+rectangle.size.y;i++) {
+ for (int j=rectangle.pos.x;j<=rectangle.pos.x+rectangle.size.x;j++) {
+
+ _draw_cell(id, Point2i(j, i), flip_h, flip_v, transpose, xform);
+ }
+ }
+ } else if (tool==TOOL_DUPLICATING) {
+
+ if (copydata.empty())
+ return;
+
+ Ref<TileSet> ts = node->get_tileset();
+
+ if (ts.is_null())
+ return;
+
+ Point2 ofs = over_tile-rectangle.pos;
+
+ for (List<TileData>::Element *E=copydata.front();E;E=E->next()) {
+
+ if (!ts->has_tile(E->get().cell))
+ continue;
+
+ TileData tcd = E->get();
+
+ _draw_cell(tcd.cell, tcd.pos+ofs, tcd.flip_h, tcd.flip_v, tcd.transpose, xform);
+ }
+
+ Rect2i duplicate=rectangle;
+ duplicate.pos=over_tile;
+
+ Vector<Vector2> points;
+ points.push_back( xform.xform( node->map_to_world(duplicate.pos ) ));
+ points.push_back( xform.xform( node->map_to_world((duplicate.pos+Point2(duplicate.size.x+1,0)) ) ));
+ points.push_back( xform.xform( node->map_to_world((duplicate.pos+Point2(duplicate.size.x+1,duplicate.size.y+1))) ));
+ points.push_back( xform.xform( node->map_to_world((duplicate.pos+Point2(0,duplicate.size.y+1))) ));
+
+ canvas_item_editor->draw_colored_polygon(points, Color(0.2,1.0,0.8,0.2));
+
+ } else if(tool == TOOL_BUCKET) {
+
+ int tile = get_selected_tile();
+ _draw_fill_preview(tile, over_tile, flip_h, flip_v, transpose, xform);
+
+ } else {
+
+ int st = get_selected_tile();
+
+ if (st==TileMap::INVALID_CELL)
+ return;
+
+ _draw_cell(st, over_tile, flip_h, flip_v, transpose, xform);
+ }
+ }
+}
+
+void TileMapEditor::edit(Node *p_tile_map) {
+
+ search_box->set_text("");
+
+ if (!canvas_item_editor) {
+ canvas_item_editor=CanvasItemEditor::get_singleton()->get_viewport_control();
+ }
+
+ if (node)
+ node->disconnect("settings_changed",this,"_tileset_settings_changed");
+ if (p_tile_map) {
+
+ node=p_tile_map->cast_to<TileMap>();
+ if (!canvas_item_editor->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->connect("draw",this,"_canvas_draw");
+ if (!canvas_item_editor->is_connected("mouse_entered",this,"_canvas_mouse_enter"))
+ canvas_item_editor->connect("mouse_entered",this,"_canvas_mouse_enter");
+ if (!canvas_item_editor->is_connected("mouse_exited",this,"_canvas_mouse_exit"))
+ canvas_item_editor->connect("mouse_exited",this,"_canvas_mouse_exit");
+
+ _update_palette();
+
+ } else {
+ node=NULL;
+
+ if (canvas_item_editor->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->disconnect("draw",this,"_canvas_draw");
+ if (canvas_item_editor->is_connected("mouse_entered",this,"_canvas_mouse_enter"))
+ canvas_item_editor->disconnect("mouse_entered",this,"_canvas_mouse_enter");
+ if (canvas_item_editor->is_connected("mouse_exited",this,"_canvas_mouse_exit"))
+ canvas_item_editor->disconnect("mouse_exited",this,"_canvas_mouse_exit");
+
+ _update_palette();
+ }
+
+ if (node)
+ node->connect("settings_changed",this,"_tileset_settings_changed");
+
+ _clear_bucket_cache();
+
+}
+
+void TileMapEditor::_tileset_settings_changed() {
+
+ _update_palette();
+
+ if (canvas_item_editor)
+ canvas_item_editor->update();
+}
+
+void TileMapEditor::_icon_size_changed(float p_value) {
+ if (node) {
+ palette->set_icon_scale(p_value);
+ _update_palette();
+ }
+}
+
+void TileMapEditor::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_entered"),&TileMapEditor::_text_entered);
+ ClassDB::bind_method(D_METHOD("_text_changed"),&TileMapEditor::_text_changed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&TileMapEditor::_sbox_input);
+ ClassDB::bind_method(D_METHOD("_menu_option"),&TileMapEditor::_menu_option);
+ ClassDB::bind_method(D_METHOD("_canvas_draw"),&TileMapEditor::_canvas_draw);
+ ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"),&TileMapEditor::_canvas_mouse_enter);
+ ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"),&TileMapEditor::_canvas_mouse_exit);
+ ClassDB::bind_method(D_METHOD("_tileset_settings_changed"),&TileMapEditor::_tileset_settings_changed);
+ ClassDB::bind_method(D_METHOD("_update_transform_buttons"),&TileMapEditor::_update_transform_buttons);
+
+ ClassDB::bind_method(D_METHOD("_fill_points"),&TileMapEditor::_fill_points);
+ ClassDB::bind_method(D_METHOD("_erase_points"),&TileMapEditor::_erase_points);
+
+ ClassDB::bind_method(D_METHOD("_icon_size_changed"), &TileMapEditor::_icon_size_changed);
+}
+
+TileMapEditor::CellOp TileMapEditor::_get_op_from_cell(const Point2i& p_pos)
+{
+ CellOp op;
+ op.idx = node->get_cell(p_pos.x,p_pos.y);
+ if (op.idx!=TileMap::INVALID_CELL) {
+ if (node->is_cell_x_flipped(p_pos.x,p_pos.y))
+ op.xf=true;
+ if (node->is_cell_y_flipped(p_pos.x,p_pos.y))
+ op.yf=true;
+ if (node->is_cell_transposed(p_pos.x,p_pos.y))
+ op.tr=true;
+ }
+ return op;
+}
+
+void TileMapEditor::_update_transform_buttons(Object *p_button) {
+ //ERR_FAIL_NULL(p_button);
+ ToolButton *b=p_button->cast_to<ToolButton>();
+ //ERR_FAIL_COND(!b);
+
+ if (b == rotate_0) {
+ mirror_x->set_pressed(false);
+ mirror_y->set_pressed(false);
+ transp->set_pressed(false);
+ }
+ else if (b == rotate_90) {
+ mirror_x->set_pressed(true);
+ mirror_y->set_pressed(false);
+ transp->set_pressed(true);
+ }
+ else if (b == rotate_180) {
+ mirror_x->set_pressed(true);
+ mirror_y->set_pressed(true);
+ transp->set_pressed(false);
+ }
+ else if (b == rotate_270) {
+ mirror_x->set_pressed(false);
+ mirror_y->set_pressed(true);
+ transp->set_pressed(true);
+ }
+
+ flip_h=mirror_x->is_pressed();
+ flip_v=mirror_y->is_pressed();
+ transpose=transp->is_pressed();
+
+ rotate_0->set_pressed(!flip_h && !flip_v && !transpose);
+ rotate_90->set_pressed(flip_h && !flip_v && transpose);
+ rotate_180->set_pressed(flip_h && flip_v && !transpose);
+ rotate_270->set_pressed(!flip_h && flip_v && transpose);
+}
+
+TileMapEditor::TileMapEditor(EditorNode *p_editor) {
+
+ node=NULL;
+ canvas_item_editor=NULL;
+ editor=p_editor;
+ undo_redo=editor->get_undo_redo();
+
+ tool=TOOL_NONE;
+ selection_active=false;
+ mouse_over=false;
+
+ flip_h=false;
+ flip_v=false;
+ transpose=false;
+
+ bucket_cache_tile = -1;
+ bucket_cache_visited = 0;
+
+ ED_SHORTCUT("tile_map_editor/erase_selection", TTR("Erase selection"), KEY_DELETE);
+ ED_SHORTCUT("tile_map_editor/find_tile", TTR("Find tile"), KEY_MASK_CMD+KEY_F);
+ ED_SHORTCUT("tile_map_editor/transpose", TTR("Transpose"));
+ ED_SHORTCUT("tile_map_editor/mirror_x", TTR("Mirror X"), KEY_A);
+ ED_SHORTCUT("tile_map_editor/mirror_y", TTR("Mirror Y"), KEY_S);
+
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ search_box->connect("text_entered", this, "_text_entered");
+ search_box->connect("text_changed", this, "_text_changed");
+ search_box->connect("gui_input", this, "_sbox_input");
+ add_child(search_box);
+
+ size_slider = memnew( HSlider );
+ size_slider->set_h_size_flags(SIZE_EXPAND_FILL);
+ size_slider->set_min(0.1f);
+ size_slider->set_max(4.0f);
+ size_slider->set_step(0.1f);
+ size_slider->set_value(1.0f);
+ size_slider->connect("value_changed", this, "_icon_size_changed");
+ add_child(size_slider);
+
+ int mw = EDITOR_DEF("editors/tile_map/palette_min_width", 80);
+
+ // Add tile palette
+ palette = memnew( ItemList );
+ palette->set_v_size_flags(SIZE_EXPAND_FILL);
+ palette->set_custom_minimum_size(Size2(mw,0));
+ palette->set_max_columns(0);
+ palette->set_icon_mode(ItemList::ICON_MODE_TOP);
+ palette->set_max_text_lines(2);
+ add_child(palette);
+
+ // Add menu items
+ toolbar = memnew( HBoxContainer );
+ toolbar->set_h_size_flags(SIZE_EXPAND_FILL);
+ toolbar->set_alignment(BoxContainer::ALIGN_END);
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(toolbar);
+
+ // Tile position
+ tile_info = memnew( Label );
+ toolbar->add_child(tile_info);
+
+ options = memnew( MenuButton );
+ options->set_text("Tile Map");
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("TileMap", "EditorIcons"));
+ options->set_process_unhandled_key_input(false);
+
+ PopupMenu *p = options->get_popup();
+
+ p->add_item(TTR("Bucket"), OPTION_BUCKET);
+ p->add_separator();
+ p->add_item(TTR("Pick Tile"), OPTION_PICK_TILE, KEY_CONTROL);
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_MASK_CMD+KEY_B), OPTION_SELECT);
+ p->add_shortcut(ED_SHORTCUT("tile_map_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_CMD+KEY_D), OPTION_DUPLICATE);
+ p->add_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION);
+
+ p->connect("id_pressed", this, "_menu_option");
+
+ toolbar->add_child(options);
+
+ toolbar->add_child( memnew( VSeparator ) );
+
+ transp = memnew( ToolButton );
+ transp->set_toggle_mode(true);
+ transp->set_tooltip(TTR("Transpose") + " ("+ED_GET_SHORTCUT("tile_map_editor/transpose")->get_as_text()+")");
+ transp->set_focus_mode(FOCUS_NONE);
+ transp->connect("pressed", this, "_update_transform_buttons", make_binds(transp));
+ toolbar->add_child(transp);
+ mirror_x = memnew( ToolButton );
+ mirror_x->set_toggle_mode(true);
+ mirror_x->set_tooltip(TTR("Mirror X") + " ("+ED_GET_SHORTCUT("tile_map_editor/mirror_x")->get_as_text()+")");
+ mirror_x->set_focus_mode(FOCUS_NONE);
+ mirror_x->connect("pressed", this, "_update_transform_buttons", make_binds(mirror_x));
+ toolbar->add_child(mirror_x);
+ mirror_y = memnew( ToolButton );
+ mirror_y->set_toggle_mode(true);
+ mirror_y->set_tooltip(TTR("Mirror Y") + " ("+ED_GET_SHORTCUT("tile_map_editor/mirror_y")->get_as_text()+")");
+ mirror_y->set_focus_mode(FOCUS_NONE);
+ mirror_y->connect("pressed", this, "_update_transform_buttons", make_binds(mirror_y));
+ toolbar->add_child(mirror_y);
+
+ toolbar->add_child( memnew( VSeparator ) );
+
+ rotate_0 = memnew( ToolButton );
+ rotate_0->set_toggle_mode(true);
+ rotate_0->set_tooltip(TTR("Rotate 0 degrees"));
+ rotate_0->set_focus_mode(FOCUS_NONE);
+ rotate_0->connect("pressed", this, "_update_transform_buttons", make_binds(rotate_0));
+ toolbar->add_child(rotate_0);
+ rotate_90 = memnew( ToolButton );
+ rotate_90->set_toggle_mode(true);
+ rotate_90->set_tooltip(TTR("Rotate 90 degrees"));
+ rotate_90->set_focus_mode(FOCUS_NONE);
+ rotate_90->connect("pressed", this, "_update_transform_buttons", make_binds(rotate_90));
+ toolbar->add_child(rotate_90);
+ rotate_180 = memnew( ToolButton );
+ rotate_180->set_toggle_mode(true);
+ rotate_180->set_tooltip(TTR("Rotate 180 degrees"));
+ rotate_180->set_focus_mode(FOCUS_NONE);
+ rotate_180->connect("pressed", this, "_update_transform_buttons", make_binds(rotate_180));
+ toolbar->add_child(rotate_180);
+ rotate_270 = memnew( ToolButton );
+ rotate_270->set_toggle_mode(true);
+ rotate_270->set_tooltip(TTR("Rotate 270 degrees"));
+ rotate_270->set_focus_mode(FOCUS_NONE);
+ rotate_270->connect("pressed", this, "_update_transform_buttons", make_binds(rotate_270));
+ toolbar->add_child(rotate_270);
+ toolbar->hide();
+
+ rotate_0->set_pressed(true);
+}
+
+TileMapEditor::~TileMapEditor() {
+ _clear_bucket_cache();
+}
+
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+
+void TileMapEditorPlugin::edit(Object *p_object) {
+
+ tile_map_editor->edit(p_object->cast_to<Node>());
+}
+
+bool TileMapEditorPlugin::handles(Object *p_object) const {
+
+ return p_object->is_class("TileMap");
+}
+
+void TileMapEditorPlugin::make_visible(bool p_visible) {
+
+ if (p_visible) {
+
+ tile_map_editor->show();
+ tile_map_editor->get_toolbar()->show();
+ } else {
+
+ tile_map_editor->hide();
+ tile_map_editor->get_toolbar()->hide();
+ tile_map_editor->edit(NULL);
+ }
+}
+
+TileMapEditorPlugin::TileMapEditorPlugin(EditorNode *p_node) {
+
+ EDITOR_DEF("editors/tile_map/preview_size",64);
+ EDITOR_DEF("editors/tile_map/palette_item_hseparation",8);
+ EDITOR_DEF("editors/tile_map/show_tile_names", true);
+ EDITOR_DEF("editors/tile_map/bucket_fill_preview", true);
+
+ tile_map_editor = memnew( TileMapEditor(p_node) );
+ add_control_to_container(CONTAINER_CANVAS_EDITOR_SIDE, tile_map_editor);
+ tile_map_editor->hide();
+}
+
+TileMapEditorPlugin::~TileMapEditorPlugin()
+{
+}
+
diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h
new file mode 100644
index 0000000000..82e2a396d1
--- /dev/null
+++ b/editor/plugins/tile_map_editor_plugin.h
@@ -0,0 +1,207 @@
+/*************************************************************************/
+/* tile_map_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef TILE_MAP_EDITOR_PLUGIN_H
+#define TILE_MAP_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+#include "editor/editor_node.h"
+
+#include "scene/2d/tile_map.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/label.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class TileMapEditor : public VBoxContainer {
+
+ GDCLASS(TileMapEditor, VBoxContainer );
+
+ enum Tool {
+
+ TOOL_NONE,
+ TOOL_PAINTING,
+ TOOL_ERASING,
+ TOOL_RECTANGLE_PAINT,
+ TOOL_RECTANGLE_ERASE,
+ TOOL_LINE_PAINT,
+ TOOL_LINE_ERASE,
+ TOOL_SELECTING,
+ TOOL_BUCKET,
+ TOOL_PICKING,
+ TOOL_DUPLICATING,
+ };
+
+ enum Options {
+
+ OPTION_BUCKET,
+ OPTION_PICK_TILE,
+ OPTION_SELECT,
+ OPTION_DUPLICATE,
+ OPTION_ERASE_SELECTION
+ };
+
+ TileMap *node;
+
+ EditorNode *editor;
+ UndoRedo *undo_redo;
+ Control *canvas_item_editor;
+
+ LineEdit *search_box;
+ HSlider *size_slider;
+ ItemList *palette;
+
+ HBoxContainer *toolbar;
+
+ Label *tile_info;
+ MenuButton *options;
+ ToolButton *transp;
+ ToolButton *mirror_x;
+ ToolButton *mirror_y;
+ ToolButton *rotate_0;
+ ToolButton *rotate_90;
+ ToolButton *rotate_180;
+ ToolButton *rotate_270;
+
+ Tool tool;
+
+ bool selection_active;
+ bool mouse_over;
+
+ bool flip_h;
+ bool flip_v;
+ bool transpose;
+
+ Point2i rectangle_begin;
+ Rect2i rectangle;
+
+ Point2i over_tile;
+
+ bool * bucket_cache_visited;
+ Rect2i bucket_cache_rect;
+ int bucket_cache_tile;
+ PoolVector<Vector2> bucket_cache;
+
+ struct CellOp {
+ int idx;
+ bool xf;
+ bool yf;
+ bool tr;
+
+ CellOp() { idx=-1; xf=false; yf=false; tr=false; }
+ };
+
+ Map<Point2i, CellOp> paint_undo;
+
+ struct TileData {
+ Point2i pos;
+ int cell;
+ bool flip_h;
+ bool flip_v;
+ bool transpose;
+ };
+
+ List<TileData> copydata;
+
+ void _pick_tile(const Point2& p_pos);
+
+ PoolVector<Vector2> _bucket_fill(const Point2i& p_start, bool erase=false, bool preview=false);
+
+ void _fill_points(const PoolVector<Vector2> p_points, const Dictionary& p_op);
+ void _erase_points(const PoolVector<Vector2> p_points);
+
+ void _select(const Point2i& p_from, const Point2i& p_to);
+
+ void _draw_cell(int p_cell, const Point2i& p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D& p_xform);
+ void _draw_fill_preview(int p_cell, const Point2i& p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D& p_xform);
+ void _clear_bucket_cache();
+
+ void _update_copydata();
+
+ int get_selected_tile() const;
+ void set_selected_tile(int p_tile);
+
+ void _text_entered(const String& p_text);
+ void _text_changed(const String& p_text);
+ void _sbox_input(const InputEvent& p_ie);
+ void _update_palette();
+ void _canvas_draw();
+ void _menu_option(int p_option);
+
+ void _set_cell(const Point2i& p_pos, int p_value, bool p_flip_h=false, bool p_flip_v=false, bool p_transpose=false, bool p_with_undo=false);
+
+ void _canvas_mouse_enter();
+ void _canvas_mouse_exit();
+ void _tileset_settings_changed();
+ void _icon_size_changed(float p_value);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+ CellOp _get_op_from_cell(const Point2i& p_pos);
+ void _update_transform_buttons(Object *p_button=NULL);
+
+public:
+
+ HBoxContainer *get_toolbar() const { return toolbar; }
+
+ bool forward_gui_input(const InputEvent& p_event);
+ void edit(Node *p_tile_map);
+
+ TileMapEditor(EditorNode *p_editor);
+ ~TileMapEditor();
+};
+
+class TileMapEditorPlugin : public EditorPlugin {
+
+ GDCLASS( TileMapEditorPlugin, EditorPlugin );
+
+ TileMapEditor *tile_map_editor;
+
+public:
+
+ virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform,const InputEvent& p_event) { return tile_map_editor->forward_gui_input(p_event); }
+
+ virtual String get_name() const { return "TileMap"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+ TileMapEditorPlugin(EditorNode *p_node);
+ ~TileMapEditorPlugin();
+
+};
+
+
+#endif // TILE_MAP_EDITOR_PLUGIN_H
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
new file mode 100644
index 0000000000..3db6c94917
--- /dev/null
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -0,0 +1,297 @@
+/*************************************************************************/
+/* tile_set_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "tile_set_editor_plugin.h"
+
+#include "scene/2d/sprite.h"
+#include "scene/2d/physics_body_2d.h"
+
+void TileSetEditor::edit(const Ref<TileSet>& p_tileset) {
+
+ tileset=p_tileset;
+}
+
+void TileSetEditor::_import_scene(Node *scene, Ref<TileSet> p_library, bool p_merge) {
+
+ if (!p_merge)
+ p_library->clear();
+
+ for(int i=0;i<scene->get_child_count();i++) {
+
+
+ Node *child = scene->get_child(i);
+
+
+ if (!child->cast_to<Sprite>()) {
+ if (child->get_child_count()>0) {
+ child=child->get_child(0);
+ if (!child->cast_to<Sprite>()) {
+ continue;
+ }
+
+ } else
+ continue;
+
+
+ }
+
+ Sprite *mi = child->cast_to<Sprite>();
+ Ref<Texture> texture=mi->get_texture();
+ Ref<CanvasItemMaterial> material=mi->get_material();
+
+ if (texture.is_null())
+ continue;
+
+ int id = p_library->find_tile_by_name(mi->get_name());
+ if (id<0) {
+
+ id=p_library->get_last_unused_tile_id();
+ p_library->create_tile(id);
+ p_library->tile_set_name(id,mi->get_name());
+ }
+
+ p_library->tile_set_texture(id,texture);
+ p_library->tile_set_material(id,material);
+
+ p_library->tile_set_modulate(id,mi->get_modulate());
+
+ Vector2 phys_offset;
+ Size2 s;
+
+ if (mi->is_region()) {
+ s=mi->get_region_rect().size;
+ p_library->tile_set_region(id,mi->get_region_rect());
+ } else {
+ const int frame = mi->get_frame();
+ const int hframes = mi->get_hframes();
+ s=texture->get_size()/Size2(hframes,mi->get_vframes());
+ p_library->tile_set_region(id,Rect2(Vector2(frame%hframes,frame/hframes)*s,s));
+ }
+
+ if (mi->is_centered()) {
+ phys_offset+=-s/2;
+ }
+
+ Vector<Ref<Shape2D> >collisions;
+ Ref<NavigationPolygon> nav_poly;
+ Ref<OccluderPolygon2D> occluder;
+
+ for(int j=0;j<mi->get_child_count();j++) {
+
+ Node *child2 = mi->get_child(j);
+
+ if (child2->cast_to<NavigationPolygonInstance>())
+ nav_poly=child2->cast_to<NavigationPolygonInstance>()->get_navigation_polygon();
+
+ if (child2->cast_to<LightOccluder2D>())
+ occluder=child2->cast_to<LightOccluder2D>()->get_occluder_polygon();
+
+ if (!child2->cast_to<StaticBody2D>())
+ continue;
+ StaticBody2D *sb = child2->cast_to<StaticBody2D>();
+ int shape_count = sb->get_shape_count();
+ if (shape_count==0)
+ continue;
+ for (int shape_index=0; shape_index<shape_count; ++shape_index)
+ {
+ Ref<Shape2D> collision=sb->get_shape(shape_index);
+ if (collision.is_valid()) {
+ collisions.push_back(collision);
+ }
+ }
+ }
+
+ if (collisions.size()) {
+
+ p_library->tile_set_shapes(id,collisions);
+ p_library->tile_set_shape_offset(id,-phys_offset);
+ } else {
+ p_library->tile_set_shape_offset(id,Vector2());
+
+ }
+
+ 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);
+
+
+ }
+}
+
+void TileSetEditor::_menu_confirm() {
+
+ switch(option) {
+
+ case MENU_OPTION_MERGE_FROM_SCENE:
+ case MENU_OPTION_CREATE_FROM_SCENE: {
+
+
+ EditorNode *en = editor;
+ Node * scene = en->get_edited_scene();
+ if (!scene)
+ break;
+
+ _import_scene(scene,tileset,option==MENU_OPTION_MERGE_FROM_SCENE);
+
+
+ } break;
+ }
+}
+
+void TileSetEditor::_name_dialog_confirm(const String& name) {
+
+ switch (option) {
+
+ case MENU_OPTION_REMOVE_ITEM: {
+
+ int id=tileset->find_tile_by_name(name);
+
+ if (id<0 && name.is_valid_integer())
+ id=name.to_int();
+
+ if (tileset->has_tile(id)) {
+ tileset->remove_tile(id);
+ } else {
+ err_dialog->set_text(TTR("Could not find tile:")+" " + name);
+ err_dialog->popup_centered(Size2(300, 60));
+ }
+ } break;
+ }
+}
+
+void TileSetEditor::_menu_cbk(int p_option) {
+
+ option=p_option;
+ switch(p_option) {
+
+ case MENU_OPTION_ADD_ITEM: {
+
+ tileset->create_tile(tileset->get_last_unused_tile_id());
+ } break;
+ case MENU_OPTION_REMOVE_ITEM: {
+
+ nd->set_title(TTR("Remove Item"));
+ nd->set_text(TTR("Item name or ID:"));
+ nd->popup_centered(Size2(300, 95));
+ } break;
+ case MENU_OPTION_CREATE_FROM_SCENE: {
+
+ cd->set_text(TTR("Create from scene?"));
+ cd->popup_centered(Size2(300,60));
+ } break;
+ case MENU_OPTION_MERGE_FROM_SCENE: {
+
+ cd->set_text(TTR("Merge from scene?"));
+ cd->popup_centered(Size2(300,60));
+ } break;
+ }
+}
+
+
+
+Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml,bool p_merge) {
+
+ _import_scene(p_base_scene,ml,p_merge);
+ return OK;
+
+}
+
+void TileSetEditor::_bind_methods() {
+
+ ClassDB::bind_method("_menu_cbk",&TileSetEditor::_menu_cbk);
+ ClassDB::bind_method("_menu_confirm",&TileSetEditor::_menu_confirm);
+ ClassDB::bind_method("_name_dialog_confirm",&TileSetEditor::_name_dialog_confirm);
+}
+
+TileSetEditor::TileSetEditor(EditorNode *p_editor) {
+
+ Panel *panel = memnew( Panel );
+ panel->set_area_as_parent_rect();
+ add_child(panel);
+ MenuButton * options = memnew( MenuButton );
+ panel->add_child(options);
+ options->set_pos(Point2(1,1));
+ options->set_text("Theme");
+ options->get_popup()->add_item(TTR("Add Item"),MENU_OPTION_ADD_ITEM);
+ options->get_popup()->add_item(TTR("Remove Item"),MENU_OPTION_REMOVE_ITEM);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create from Scene"),MENU_OPTION_CREATE_FROM_SCENE);
+ options->get_popup()->add_item(TTR("Merge from Scene"),MENU_OPTION_MERGE_FROM_SCENE);
+ options->get_popup()->connect("id_pressed", this,"_menu_cbk");
+ editor=p_editor;
+ cd = memnew(ConfirmationDialog);
+ add_child(cd);
+ cd->get_ok()->connect("pressed", this,"_menu_confirm");
+
+ nd = memnew(EditorNameDialog);
+ add_child(nd);
+ nd->set_hide_on_ok(true);
+ nd->get_line_edit()->set_margin(MARGIN_TOP,28);
+ nd->connect("name_confirmed", this,"_name_dialog_confirm");
+
+ err_dialog = memnew(AcceptDialog);
+ add_child(err_dialog);
+ err_dialog->set_title(TTR("Error"));
+}
+
+void TileSetEditorPlugin::edit(Object *p_node) {
+
+ if (p_node && p_node->cast_to<TileSet>()) {
+ tileset_editor->edit( p_node->cast_to<TileSet>() );
+ tileset_editor->show();
+ } else
+ tileset_editor->hide();
+}
+
+bool TileSetEditorPlugin::handles(Object *p_node) const{
+
+ return p_node->is_class("TileSet");
+}
+
+void TileSetEditorPlugin::make_visible(bool p_visible){
+
+ if (p_visible)
+ tileset_editor->show();
+ else
+ tileset_editor->hide();
+}
+
+TileSetEditorPlugin::TileSetEditorPlugin(EditorNode *p_node) {
+
+ tileset_editor = memnew( TileSetEditor(p_node) );
+
+ p_node->get_viewport()->add_child(tileset_editor);
+ tileset_editor->set_area_as_parent_rect();
+ tileset_editor->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
+ tileset_editor->set_anchor( MARGIN_BOTTOM, Control::ANCHOR_BEGIN );
+ tileset_editor->set_end( Point2(0,22) );
+ tileset_editor->hide();
+
+}
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
new file mode 100644
index 0000000000..02a82ebd6b
--- /dev/null
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -0,0 +1,101 @@
+/*************************************************************************/
+/* tile_set_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef TILE_SET_EDITOR_PLUGIN_H
+#define TILE_SET_EDITOR_PLUGIN_H
+
+
+
+#include "scene/resources/tile_set.h"
+#include "editor/editor_node.h"
+#include "editor/editor_name_dialog.h"
+
+
+class TileSetEditor : public Control {
+
+ GDCLASS( TileSetEditor, Control );
+
+ Ref<TileSet> tileset;
+
+ EditorNode *editor;
+ MenuButton *menu;
+ ConfirmationDialog *cd;
+ EditorNameDialog *nd;
+ AcceptDialog *err_dialog;
+
+ enum {
+
+ MENU_OPTION_ADD_ITEM,
+ MENU_OPTION_REMOVE_ITEM,
+ MENU_OPTION_CREATE_FROM_SCENE,
+ MENU_OPTION_MERGE_FROM_SCENE
+ };
+
+ int option;
+ void _menu_cbk(int p_option);
+ void _menu_confirm();
+ void _name_dialog_confirm(const String& name);
+
+ static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
+
+
+protected:
+ static void _bind_methods();
+public:
+
+ void edit(const Ref<TileSet>& p_tileset);
+ static Error update_library_file(Node *p_base_scene, Ref<TileSet> ml,bool p_merge=true);
+
+ TileSetEditor(EditorNode *p_editor);
+};
+
+
+
+class TileSetEditorPlugin : public EditorPlugin {
+
+ GDCLASS( TileSetEditorPlugin, EditorPlugin );
+
+ TileSetEditor *tileset_editor;
+ EditorNode *editor;
+
+public:
+
+ virtual String get_name() const { return "TileSet"; }
+ bool has_main_screen() const { return false; }
+ virtual void edit(Object *p_node);
+ virtual bool handles(Object *p_node) const;
+ virtual void make_visible(bool p_visible);
+
+
+
+ TileSetEditorPlugin(EditorNode *p_node);
+
+};
+
+
+#endif // TILE_SET_EDITOR_PLUGIN_H
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
new file mode 100644
index 0000000000..76626c4556
--- /dev/null
+++ b/editor/progress_dialog.cpp
@@ -0,0 +1,246 @@
+/*************************************************************************/
+/* progress_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "progress_dialog.h"
+
+#include "main/main.h"
+#include "message_queue.h"
+#include "os/os.h"
+#include "editor_scale.h"
+
+void BackgroundProgress::_add_task(const String& p_task,const String& p_label, int p_steps) {
+
+ _THREAD_SAFE_METHOD_
+ ERR_FAIL_COND(tasks.has(p_task));
+ Task t;
+ t.hb = memnew( HBoxContainer );
+ Label *l=memnew( Label );
+ l->set_text(p_label+" ");
+ t.hb->add_child(l);
+ t.progress = memnew( ProgressBar );
+ t.progress->set_max(p_steps);
+ t.progress->set_value(p_steps);
+ Control *ec = memnew( Control );
+ ec->set_h_size_flags(SIZE_EXPAND_FILL);
+ ec->set_v_size_flags(SIZE_EXPAND_FILL);
+ t.progress->set_area_as_parent_rect();
+ ec->add_child(t.progress);
+ ec->set_custom_minimum_size(Size2(80,5)*EDSCALE);
+ t.hb->add_child(ec);
+
+ add_child(t.hb);
+
+ tasks[p_task]=t;
+
+}
+
+void BackgroundProgress::_update() {
+
+ _THREAD_SAFE_METHOD_
+
+ for (Map<String,int>::Element *E=updates.front();E;E=E->next()) {
+
+ if (tasks.has(E->key())) {
+ _task_step(E->key(),E->get());
+ }
+ }
+
+ updates.clear();
+
+
+
+}
+
+
+void BackgroundProgress::_task_step(const String& p_task, int p_step){
+
+ _THREAD_SAFE_METHOD_
+
+ ERR_FAIL_COND(!tasks.has(p_task));
+
+ Task &t=tasks[p_task];
+ if (p_step<0)
+ t.progress->set_value(t.progress->get_value()+1);
+ else
+ t.progress->set_value(p_step);
+
+}
+void BackgroundProgress::_end_task(const String& p_task){
+
+ _THREAD_SAFE_METHOD_
+
+ ERR_FAIL_COND(!tasks.has(p_task));
+ Task &t=tasks[p_task];
+
+ memdelete(t.hb);
+ tasks.erase(p_task);
+}
+
+void BackgroundProgress::_bind_methods(){
+
+ ClassDB::bind_method("_add_task",&BackgroundProgress::_add_task);
+ ClassDB::bind_method("_task_step",&BackgroundProgress::_task_step);
+ ClassDB::bind_method("_end_task",&BackgroundProgress::_end_task);
+ ClassDB::bind_method("_update",&BackgroundProgress::_update);
+
+}
+
+void BackgroundProgress::add_task(const String& p_task,const String& p_label, int p_steps){
+
+ MessageQueue::get_singleton()->push_call(this,"_add_task",p_task,p_label,p_steps);
+}
+void BackgroundProgress::task_step(const String& p_task, int p_step){
+
+ //this code is weird, but it prevents deadlock.
+ bool no_updates;
+ {
+ _THREAD_SAFE_METHOD_
+ no_updates=updates.empty();
+ }
+
+ if (no_updates)
+ MessageQueue::get_singleton()->push_call(this,"_update");
+
+ {
+ _THREAD_SAFE_METHOD_
+ updates[p_task]=p_step;
+ }
+
+}
+
+void BackgroundProgress::end_task(const String& p_task){
+
+ MessageQueue::get_singleton()->push_call(this,"_end_task",p_task);
+
+}
+
+
+////////////////////////////////////////////////
+
+
+ProgressDialog *ProgressDialog::singleton=NULL;
+
+void ProgressDialog::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_DRAW: {
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ draw_style_box(style,Rect2(Point2(),get_size()));
+
+ } break;
+ }
+}
+
+
+void ProgressDialog::_popup() {
+
+ Size2 ms = main->get_combined_minimum_size();
+ ms.width = MAX(500*EDSCALE,ms.width);
+
+
+ Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
+ ms+=style->get_minimum_size();
+ for(int i=0;i<4;i++) {
+ main->set_margin(Margin(i),style->get_margin(Margin(i)));
+ }
+
+ popup_centered(ms);
+
+}
+
+void ProgressDialog::add_task(const String& p_task,const String& p_label,int p_steps) {
+
+ ERR_FAIL_COND(tasks.has(p_task));
+ Task t;
+ t.vb = memnew( VBoxContainer );
+ VBoxContainer *vb2 = memnew( VBoxContainer );
+ t.vb->add_margin_child(p_label,vb2);
+ t.progress = memnew( ProgressBar );
+ t.progress->set_max(p_steps);
+ t.progress->set_value(p_steps);
+ vb2->add_child(t.progress);
+ t.state=memnew( Label );
+ t.state->set_clip_text(true);
+ vb2->add_child(t.state);
+ main->add_child(t.vb);
+
+ tasks[p_task]=t;
+ _popup();
+
+}
+
+void ProgressDialog::task_step(const String& p_task, const String& p_state, int p_step,bool p_force_redraw){
+
+ ERR_FAIL_COND(!tasks.has(p_task));
+
+ if (!p_force_redraw) {
+ uint64_t tus = OS::get_singleton()->get_ticks_usec();
+ if (tus-last_progress_tick < 50000) //50ms
+ return;
+ }
+
+ Task &t=tasks[p_task];
+ if (p_step<0)
+ t.progress->set_value(t.progress->get_value()+1);
+ else
+ t.progress->set_value(p_step);
+
+ t.state->set_text(p_state);
+ last_progress_tick=OS::get_singleton()->get_ticks_usec();
+ Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor
+
+}
+
+
+void ProgressDialog::end_task(const String& p_task){
+
+ ERR_FAIL_COND(!tasks.has(p_task));
+ Task &t=tasks[p_task];
+
+ memdelete(t.vb);
+ tasks.erase(p_task);
+
+ if (tasks.empty())
+ hide();
+ else
+ _popup();
+}
+
+
+
+ProgressDialog::ProgressDialog() {
+
+ main = memnew( VBoxContainer );
+ add_child(main);
+ main->set_area_as_parent_rect();
+ set_exclusive(true);
+ last_progress_tick=0;
+ singleton=this;
+}
diff --git a/editor/progress_dialog.h b/editor/progress_dialog.h
new file mode 100644
index 0000000000..60acf825a9
--- /dev/null
+++ b/editor/progress_dialog.h
@@ -0,0 +1,105 @@
+/*************************************************************************/
+/* progress_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROGRESS_DIALOG_H
+#define PROGRESS_DIALOG_H
+
+#include "scene/gui/popup.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/progress_bar.h"
+#include "scene/gui/label.h"
+
+
+class BackgroundProgress : public HBoxContainer {
+
+ GDCLASS(BackgroundProgress,HBoxContainer);
+
+ _THREAD_SAFE_CLASS_
+
+ struct Task {
+
+ HBoxContainer *hb;
+ ProgressBar *progress;
+
+ };
+
+ Map<String,Task> tasks;
+ Map<String,int> updates;
+ void _update();
+
+protected:
+
+ void _add_task(const String& p_task,const String& p_label, int p_steps);
+ void _task_step(const String& p_task, int p_step=-1);
+ void _end_task(const String& p_task);
+
+ static void _bind_methods();
+
+public:
+ void add_task(const String& p_task,const String& p_label, int p_steps);
+ void task_step(const String& p_task, int p_step=-1);
+ void end_task(const String& p_task);
+
+ BackgroundProgress() {}
+};
+
+
+
+class ProgressDialog : public Popup {
+
+ GDCLASS( ProgressDialog, Popup );
+ struct Task {
+
+ String task;
+ VBoxContainer *vb;
+ ProgressBar *progress;
+ Label *state;
+
+ };
+
+ Map<String,Task> tasks;
+ VBoxContainer *main;
+ uint64_t last_progress_tick;
+
+ static ProgressDialog *singleton;
+ void _popup();
+protected:
+
+ void _notification(int p_what);
+public:
+
+ static ProgressDialog *get_singleton() { return singleton; }
+ void add_task(const String& p_task,const String& p_label, int p_steps);
+ void task_step(const String& p_task, const String& p_state, int p_step=-1, bool p_force_redraw=true);
+ void end_task(const String& p_task);
+
+
+ ProgressDialog();
+};
+
+#endif // PROGRESS_DIALOG_H
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
new file mode 100644
index 0000000000..fc6d8793d8
--- /dev/null
+++ b/editor/project_export.cpp
@@ -0,0 +1,828 @@
+/*************************************************************************/
+/* project_export.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "project_export.h"
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "global_config.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "os/os.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/scroll_container.h"
+#include "scene/gui/margin_container.h"
+#include "editor_data.h"
+#include "io/image_loader.h"
+#include "compressed_translation.h"
+#include "editor_node.h"
+#include "io_plugins/editor_texture_import_plugin.h"
+#include "editor_settings.h"
+
+void ProjectExportDialog::_notification(int p_what) {
+
+ switch (p_what) {
+ case NOTIFICATION_READY: {
+ delete_preset->set_icon(get_icon("Del","EditorIcons"));
+ connect("confirmed",this,"_export_pck_zip");
+ } break;
+ case NOTIFICATION_POPUP_HIDE: {
+ EditorSettings::get_singleton()->set("interface/dialogs/export_bounds", get_rect());
+ } break;
+ }
+}
+
+
+void ProjectExportDialog::popup_export() {
+
+ add_preset->get_popup()->clear();
+ for(int i=0;i<EditorExport::get_singleton()->get_export_platform_count();i++) {
+
+ Ref<EditorExportPlatform> plat = EditorExport::get_singleton()->get_export_platform(i);
+
+ add_preset->get_popup()->add_icon_item(plat->get_logo(),plat->get_name());
+
+ }
+
+ _update_presets();
+
+ // Restore valid window bounds or pop up at default size.
+ if (EditorSettings::get_singleton()->has("interface/dialogs/export_bounds")) {
+ popup(EditorSettings::get_singleton()->get("interface/dialogs/export_bounds"));
+ } else {
+ popup_centered_ratio();
+ }
+}
+
+void ProjectExportDialog::_add_preset(int p_platform) {
+
+ Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_platform(p_platform)->create_preset();
+ ERR_FAIL_COND(!preset.is_valid());
+
+ String name = EditorExport::get_singleton()->get_export_platform(p_platform)->get_name();
+ bool make_runnable=true;
+ int attempt=1;
+ while(true) {
+
+ bool valid=true;
+
+ for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+ Ref<EditorExportPreset> p = EditorExport::get_singleton()->get_export_preset(i);
+ if (p->get_platform()==preset->get_platform() && p->is_runnable()) {
+ make_runnable=false;
+ }
+ if (p->get_name()==name) {
+ valid=false;
+ break;
+ }
+
+ }
+
+ if (valid)
+ break;
+
+ attempt++;
+ name = EditorExport::get_singleton()->get_export_platform(p_platform)->get_name()+" "+itos(attempt);
+
+ }
+
+ preset->set_name(name);
+ if (make_runnable)
+ preset->set_runnable(make_runnable);
+ EditorExport::get_singleton()->add_export_preset(preset);
+ _update_presets();
+ _edit_preset(EditorExport::get_singleton()->get_export_preset_count()-1);
+
+}
+
+
+void ProjectExportDialog::_update_presets() {
+
+ updating=true;
+
+ Ref<EditorExportPreset> current;
+ if (presets->get_current()>=0 && presets->get_current()<presets->get_item_count())
+ current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+
+ int current_idx=-1;
+ presets->clear();
+ for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+ Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(i);
+ if (preset==current) {
+ current_idx=i;
+ }
+
+ String name = preset->get_name();
+ if (preset->is_runnable())
+ name+=" ("+TTR("Runnable")+")";
+ presets->add_item(name,preset->get_platform()->get_logo());
+ }
+
+ if (current_idx!=-1) {
+ presets->select(current_idx);
+ //_edit_preset(current_idx);
+ }
+
+ updating=false;
+
+}
+
+void ProjectExportDialog::_edit_preset(int p_index) {
+
+ if (p_index<0 || p_index>=presets->get_item_count()) {
+ name->set_text("");
+ name->set_editable(false);
+ runnable->set_disabled(true);
+ parameters->edit(NULL);
+ delete_preset->set_disabled(true);
+ sections->hide();
+ patches->clear();
+ return;
+ }
+
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(p_index);
+ ERR_FAIL_COND(current.is_null());
+
+
+ updating=true;
+
+ presets->select(p_index);
+ sections->show();
+
+ name->set_editable(true);
+ delete_preset->set_disabled(false);
+ name->set_text(current->get_name());
+ runnable->set_disabled(false);
+ runnable->set_pressed(current->is_runnable());
+ parameters->edit(current.ptr());
+
+ export_filter->select(current->get_export_filter());
+ include_filters->set_text(current->get_include_filter());
+ exclude_filters->set_text(current->get_exclude_filter());
+
+
+ patches->clear();
+ TreeItem *patch_root = patches->create_item();
+ Vector<String> patchlist = current->get_patches();
+ for(int i=0;i<patchlist.size();i++) {
+ TreeItem *patch = patches->create_item(patch_root);
+ patch->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ String file = patchlist[i].get_file();
+ patch->set_editable(0,true);
+ patch->set_text(0,file.get_file().replace("*",""));
+ if (file.ends_with("*"))
+ patch->set_checked(0,true);
+ patch->set_tooltip(0,patchlist[i]);
+ patch->set_metadata(0,i);
+ patch->add_button(0,get_icon("Del","EditorIcons"),0);
+ patch->add_button(0,get_icon("folder","FileDialog"),1);
+ }
+
+ TreeItem *patch_add = patches->create_item(patch_root);
+ patch_add->set_metadata(0,patchlist.size());
+ if (patchlist.size()==0)
+ patch_add->set_text(0,"Add initial export..");
+ else
+ patch_add->set_text(0,"Add previous patches..");
+
+ patch_add->add_button(0,get_icon("folder","FileDialog"),1);
+
+ _fill_resource_tree();
+
+ updating=false;
+
+}
+
+void ProjectExportDialog::_patch_button_pressed(Object* p_item,int p_column,int p_id) {
+
+
+ TreeItem *ti = (TreeItem*)p_item;
+
+ patch_index=ti->get_metadata(0);
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ if (p_id==0) {
+ Vector<String> patches = current->get_patches();
+ ERR_FAIL_INDEX(patch_index,patches.size());
+ patch_erase->set_text(vformat(TTR("Delete patch '"+patches[patch_index].get_file()+"' from list?")));
+ patch_erase->popup_centered_minsize();
+ } else {
+ patch_dialog->popup_centered_ratio();
+ }
+}
+
+void ProjectExportDialog::_patch_edited() {
+
+ TreeItem *item = patches->get_edited();
+ if (!item)
+ return;
+ int index = item->get_metadata(0);
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ Vector<String> patches = current->get_patches();
+
+ ERR_FAIL_INDEX(index,patches.size());
+
+ String patch = patches[index].replace("*","");
+
+ if (item->is_checked(0)) {
+ patch+="*";
+ }
+
+ current->set_patch(index,patch);
+
+
+
+}
+
+void ProjectExportDialog::_patch_selected(const String& p_path) {
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ Vector<String> patches = current->get_patches();
+
+ if (patch_index >=patches.size()) {
+
+ current->add_patch(GlobalConfig::get_singleton()->get_resource_path().path_to(p_path)+"*");
+ } else {
+ String enabled = patches[patch_index].ends_with("*") ? String("*") : String();
+ current->set_patch(patch_index,GlobalConfig::get_singleton()->get_resource_path().path_to(p_path)+enabled);
+
+ }
+
+ _edit_preset(presets->get_current());
+
+}
+
+void ProjectExportDialog::_patch_deleted() {
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ Vector<String> patches = current->get_patches();
+ if (patch_index <patches.size()) {
+
+ current->remove_patch(patch_index);
+ _edit_preset(presets->get_current());
+ }
+
+}
+
+void ProjectExportDialog::_runnable_pressed() {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ if (runnable->is_pressed()) {
+
+ for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+ Ref<EditorExportPreset> p = EditorExport::get_singleton()->get_export_preset(i);
+ if (p->get_platform()==current->get_platform()) {
+ p->set_runnable(current==p);
+ }
+ }
+ } else {
+
+ current->set_runnable(false);
+ }
+
+ _update_presets();
+}
+
+void ProjectExportDialog::_name_changed(const String& p_string) {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_name(p_string);
+ _update_presets();
+
+
+}
+
+void ProjectExportDialog::_delete_preset() {
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ if (current.is_null())
+ return;
+
+ delete_confirm->set_text(vformat(TTR("Delete preset '%s'?"),current->get_name()));
+ delete_confirm->popup_centered_minsize();
+
+}
+
+void ProjectExportDialog::_delete_preset_confirm() {
+
+ int idx = presets->get_current();
+ parameters->edit(NULL);//to avoid crash
+ EditorExport::get_singleton()->remove_export_preset(idx);
+ _update_presets();
+ _edit_preset(-1);
+}
+
+
+Variant ProjectExportDialog::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ if (p_from==presets) {
+ int pos = presets->get_item_at_pos(p_point,true);
+
+ if (pos>=0) {
+ Dictionary d;
+ d["type"]="export_preset";
+ d["preset"]=pos;
+
+ HBoxContainer *drag = memnew( HBoxContainer);
+ TextureRect *tr = memnew(TextureRect);
+ tr->set_texture(presets->get_item_icon(pos));
+ drag->add_child(tr);
+ Label *label = memnew( Label );
+ label->set_text(presets->get_item_text(pos));
+ drag->add_child(label);
+
+ set_drag_preview(drag);
+
+ return d;
+
+ }
+ } else if (p_from==patches) {
+
+ TreeItem *item = patches->get_item_at_pos(p_point);
+
+ if (item && item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK) {
+
+ int metadata = item->get_metadata(0);
+ Dictionary d;
+ d["type"]="export_patch";
+ d["patch"]=metadata;
+
+ Label *label = memnew( Label );
+ label->set_text(item->get_text(0));
+ set_drag_preview(label);
+
+ return d;
+ }
+
+ }
+
+ return Variant();
+}
+
+bool ProjectExportDialog::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ if (p_from==presets) {
+ Dictionary d = p_data;
+ if (!d.has("type") || String(d["type"])!="export_preset")
+ return false;
+
+
+ if (presets->get_item_at_pos(p_point,true)<0 && !presets->is_pos_at_end_of_items(p_point))
+ return false;
+ } else if (p_from==patches) {
+
+ Dictionary d = p_data;
+ if (!d.has("type") || String(d["type"])!="export_patch")
+ return false;
+
+ patches->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
+
+ TreeItem *item = patches->get_item_at_pos(p_point);
+
+ if (!item) {
+
+ return false;
+ }
+
+ }
+
+ return true;
+}
+
+void ProjectExportDialog::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ if (p_from==presets) {
+ Dictionary d=p_data;
+ int from_pos = d["preset"];
+
+ int to_pos=-1;
+
+ if (presets->get_item_at_pos(p_point,true)>=0) {
+ to_pos = presets->get_item_at_pos(p_point,true);
+ }
+
+ if (to_pos==-1 && !presets->is_pos_at_end_of_items(p_point))
+ return;
+
+ if (to_pos==from_pos)
+ return;
+ else if (to_pos>from_pos) {
+ to_pos--;
+ }
+
+
+ Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(from_pos);
+ EditorExport::get_singleton()->remove_export_preset(from_pos);
+ EditorExport::get_singleton()->add_export_preset(preset,to_pos);
+
+ _update_presets();
+ if (to_pos>=0)
+ _edit_preset(to_pos);
+ else
+ _edit_preset(presets->get_item_count()-1);
+ } else if (p_from==patches) {
+
+ Dictionary d = p_data;
+ if (!d.has("type") || String(d["type"])!="export_patch")
+ return;
+
+ int from_pos = d["patch"];
+
+ TreeItem *item = patches->get_item_at_pos(p_point);
+ if (!item)
+ return;
+
+ int to_pos = item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK ? int(item->get_metadata(0)) : -1;
+
+ if (to_pos==from_pos)
+ return;
+ else if (to_pos>from_pos) {
+ to_pos--;
+ }
+
+ Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ String patch = preset->get_patch(from_pos);
+ preset->remove_patch(from_pos);
+ preset->add_patch(patch,to_pos);
+
+ _edit_preset(presets->get_current());
+
+ }
+
+}
+
+void ProjectExportDialog::_export_type_changed(int p_which) {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ if (current.is_null())
+ return;
+
+ current->set_export_filter(EditorExportPreset::ExportFilter(p_which));
+ updating=true;
+ _fill_resource_tree();
+ updating=false;
+
+}
+
+void ProjectExportDialog::_filter_changed(const String& p_filter) {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ if (current.is_null())
+ return;
+
+ current->set_include_filter(include_filters->get_text());
+ current->set_exclude_filter(exclude_filters->get_text());
+
+
+
+}
+
+void ProjectExportDialog::_fill_resource_tree() {
+
+ include_files->clear();
+ include_label->hide();
+ include_margin->hide();
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ if (current.is_null())
+ return;
+
+ EditorExportPreset::ExportFilter f = current->get_export_filter();
+
+ if (f==EditorExportPreset::EXPORT_ALL_RESOURCES) {
+ return;
+ }
+
+ include_label->show();
+ include_margin->show();
+
+ TreeItem *root = include_files->create_item();
+
+
+ _fill_tree(EditorFileSystem::get_singleton()->get_filesystem(),root,current,f==EditorExportPreset::EXPORT_SELECTED_SCENES);
+
+}
+
+
+bool ProjectExportDialog::_fill_tree(EditorFileSystemDirectory *p_dir,TreeItem *p_item,Ref<EditorExportPreset> &current,bool p_only_scenes) {
+
+ p_item->set_icon(0,get_icon("folder","FileDialog"));
+ p_item->set_text(0,p_dir->get_name()+"/");
+
+ bool used=false;
+ for(int i=0;i<p_dir->get_subdir_count();i++) {
+
+ TreeItem *subdir = include_files->create_item(p_item);
+ if (_fill_tree(p_dir->get_subdir(i),subdir,current,p_only_scenes)==false) {
+ memdelete(subdir);
+ } else {
+ used=true;
+ }
+ }
+
+
+
+ for(int i=0;i<p_dir->get_file_count();i++) {
+
+ String type = p_dir->get_file_type(i);
+ if (p_only_scenes && type!="PackedScene")
+ continue;
+
+ TreeItem *file = include_files->create_item(p_item);
+ file->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ file->set_text(0,p_dir->get_file(i));
+
+ Ref<Texture> tex;
+ if (has_icon(type,editor_icons)) {
+ tex = get_icon(type,editor_icons);
+ } else {
+ tex = get_icon("Object",editor_icons);
+ }
+
+ String path = p_dir->get_file_path(i);
+
+ file->set_icon(0,tex);
+ file->set_editable(0,true);
+ file->set_checked(0,current->has_export_file(path));
+ file->set_metadata(0,path);
+
+ used=true;
+
+ }
+
+ return used;
+}
+
+void ProjectExportDialog::_tree_changed() {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ if (current.is_null())
+ return;
+
+ TreeItem *item = include_files->get_edited();
+ if (!item)
+ return;
+
+ String path = item->get_metadata(0);
+ bool added = item->is_checked(0);
+
+ if (added) {
+ current->add_export_file(path);
+ } else {
+ current->remove_export_file(path);
+
+ }
+}
+
+
+void ProjectExportDialog::_export_pck_zip() {
+
+ export_pck_zip->popup_centered_ratio();
+}
+
+void ProjectExportDialog::_export_pck_zip_selected(const String& p_path) {
+
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND (current.is_null());
+ Ref<EditorExportPlatform> platform = current->get_platform();
+ ERR_FAIL_COND( platform.is_null() );
+
+ if (p_path.ends_with(".zip")) {
+ platform->save_zip(current,p_path);
+ } else if (p_path.ends_with(".pck")) {
+ platform->save_pack(current,p_path);
+ }
+}
+
+
+void ProjectExportDialog::_bind_methods() {
+
+ ClassDB::bind_method("_add_preset",&ProjectExportDialog::_add_preset);
+ ClassDB::bind_method("_edit_preset",&ProjectExportDialog::_edit_preset);
+ ClassDB::bind_method("_runnable_pressed",&ProjectExportDialog::_runnable_pressed);
+ ClassDB::bind_method("_name_changed",&ProjectExportDialog::_name_changed);
+ ClassDB::bind_method("_delete_preset",&ProjectExportDialog::_delete_preset);
+ ClassDB::bind_method("_delete_preset_confirm",&ProjectExportDialog::_delete_preset_confirm);
+ ClassDB::bind_method("get_drag_data_fw",&ProjectExportDialog::get_drag_data_fw);
+ ClassDB::bind_method("can_drop_data_fw",&ProjectExportDialog::can_drop_data_fw);
+ ClassDB::bind_method("drop_data_fw",&ProjectExportDialog::drop_data_fw);
+ ClassDB::bind_method("_export_type_changed",&ProjectExportDialog::_export_type_changed);
+ ClassDB::bind_method("_filter_changed",&ProjectExportDialog::_filter_changed);
+ ClassDB::bind_method("_tree_changed",&ProjectExportDialog::_tree_changed);
+ ClassDB::bind_method("_patch_button_pressed",&ProjectExportDialog::_patch_button_pressed);
+ ClassDB::bind_method("_patch_selected",&ProjectExportDialog::_patch_selected);
+ ClassDB::bind_method("_patch_deleted",&ProjectExportDialog::_patch_deleted);
+ ClassDB::bind_method("_patch_edited",&ProjectExportDialog::_patch_edited);
+ ClassDB::bind_method("_export_pck_zip",&ProjectExportDialog::_export_pck_zip);
+ ClassDB::bind_method("_export_pck_zip_selected",&ProjectExportDialog::_export_pck_zip_selected);
+
+
+}
+ProjectExportDialog::ProjectExportDialog() {
+
+ set_title(TTR("Export"));
+ set_resizable(true);
+
+ HBoxContainer *hbox = memnew( HBoxContainer );
+ add_child(hbox);
+
+ VBoxContainer *preset_vb = memnew( VBoxContainer );
+ preset_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbox->add_child(preset_vb);
+
+ HBoxContainer *preset_hb = memnew( HBoxContainer );
+ preset_hb->add_child(memnew(Label(TTR("Presets"))));
+ preset_hb->add_spacer();
+ preset_vb->add_child(preset_hb);
+
+ add_preset = memnew( MenuButton );
+ add_preset->set_text(TTR("Add.."));
+ add_preset->get_popup()->connect("index_pressed",this,"_add_preset");
+ preset_hb->add_child(add_preset);
+ MarginContainer *mc = memnew( MarginContainer );
+ preset_vb->add_child(mc);
+ mc->set_v_size_flags(SIZE_EXPAND_FILL);
+ presets = memnew( ItemList );
+ presets->set_drag_forwarding(this);
+ mc->add_child(presets);
+ presets->connect("item_selected",this,"_edit_preset");
+ delete_preset = memnew( ToolButton );
+ preset_hb->add_child(delete_preset);
+ delete_preset->connect("pressed",this,"_delete_preset");
+
+ VBoxContainer *settings_vb = memnew( VBoxContainer );
+ settings_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbox->add_child(settings_vb);
+
+ name = memnew(LineEdit);
+ settings_vb->add_margin_child(TTR("Name:"),name);
+ name->connect("text_changed",this,"_name_changed");
+ runnable = memnew(CheckButton);
+ runnable->set_text(TTR("Runnable"));
+ runnable->connect("pressed",this,"_runnable_pressed");
+ settings_vb->add_child(runnable);
+
+ sections = memnew (TabContainer );
+ settings_vb->add_child(sections);
+ sections->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ parameters = memnew (PropertyEditor );
+ sections->add_child(parameters);
+ parameters->set_name(TTR("Options"));
+ parameters->hide_top_label();
+ parameters->set_v_size_flags(SIZE_EXPAND_FILL);
+ parameters->set_hide_script(true);
+
+ VBoxContainer *resources_vb = memnew( VBoxContainer );
+ sections->add_child(resources_vb);
+ resources_vb->set_name(TTR("Resources"));
+
+ export_filter = memnew( OptionButton );
+ export_filter->add_item(TTR("Export all resources in the project"));
+ export_filter->add_item(TTR("Export selected scenes (and dependencies)"));
+ export_filter->add_item(TTR("Export selected resources (and dependencies)"));
+ resources_vb->add_margin_child(TTR("Export Mode:"),export_filter);
+ export_filter->connect("item_selected",this,"_export_type_changed");
+
+ include_label = memnew( Label );
+ include_label->set_text(TTR("Resources to export:"));
+ resources_vb->add_child(include_label);
+ include_margin = memnew( MarginContainer );
+ include_margin->set_v_size_flags(SIZE_EXPAND_FILL);
+ resources_vb->add_child(include_margin);
+
+ include_files = memnew(Tree);
+ include_margin->add_child(include_files);
+ include_files->connect("item_edited",this,"_tree_changed");
+
+ include_filters = memnew( LineEdit );
+ resources_vb->add_margin_child(TTR("Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"),include_filters);
+ include_filters->connect("text_changed",this,"_filter_changed");
+
+ exclude_filters = memnew( LineEdit );
+ resources_vb->add_margin_child(TTR("Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"),exclude_filters);
+ exclude_filters->connect("text_changed",this,"_filter_changed");
+
+ VBoxContainer *patch_vb = memnew( VBoxContainer );
+ sections->add_child(patch_vb);
+ patch_vb->set_name(TTR("Patches"));
+
+ patches = memnew( Tree );
+ patch_vb->add_child(patches);
+ patches->set_v_size_flags(SIZE_EXPAND_FILL);
+ patches->set_hide_root(true);
+ patches->connect("button_pressed",this,"_patch_button_pressed");
+ patches->connect("item_edited",this,"_patch_edited");
+ patches->set_drag_forwarding(this);
+ patches->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
+
+ HBoxContainer *patches_hb = memnew( HBoxContainer );
+ patch_vb->add_child(patches_hb);
+ patches_hb->add_spacer();
+ patch_export = memnew( Button );
+ patch_export->set_text(TTR("Make Patch"));
+ patches_hb->add_child(patch_export);
+ patches_hb->add_spacer();
+
+ patch_dialog = memnew( FileDialog );
+ patch_dialog->add_filter("*.pck ; Pack File");
+ patch_dialog->set_mode(FileDialog::MODE_OPEN_FILE);
+ patch_dialog->connect("file_selected",this,"_patch_selected");
+ add_child(patch_dialog);
+
+ patch_erase = memnew( ConfirmationDialog );
+ patch_erase->get_ok()->set_text(TTR("Delete"));
+ patch_erase->connect("confirmed",this,"_patch_deleted");
+ add_child(patch_erase);
+
+
+ //disable by default
+ name->set_editable(false);
+ runnable->set_disabled(true);
+ delete_preset->set_disabled(true);
+ sections->hide();
+ parameters->edit(NULL);
+
+ delete_confirm = memnew( ConfirmationDialog );
+ add_child(delete_confirm);
+ delete_confirm->get_ok()->set_text(TTR("Delete"));
+ delete_confirm->connect("confirmed",this,"_delete_preset_confirm");
+
+ updating=false;
+
+ get_ok()->set_text("Export PCK/Zip");
+ export_button = add_button("Export Project",!OS::get_singleton()->get_swap_ok_cancel(),"export");
+
+ export_pck_zip = memnew( FileDialog );
+ export_pck_zip->add_filter("*.zip ; ZIP File");
+ export_pck_zip->add_filter("*.pck ; Godot Game Pack");
+ export_pck_zip->set_access(FileDialog::ACCESS_FILESYSTEM);
+ export_pck_zip->set_mode(FileDialog::MODE_SAVE_FILE);
+ add_child(export_pck_zip);
+ export_pck_zip->connect("file_selected",this,"_export_pck_zip_selected");
+
+ set_hide_on_ok(false);
+
+
+
+ editor_icons = "EditorIcons";
+}
+
+ProjectExportDialog::~ProjectExportDialog() {
+
+
+}
diff --git a/editor/project_export.h b/editor/project_export.h
new file mode 100644
index 0000000000..b58ce2dc9d
--- /dev/null
+++ b/editor/project_export.h
@@ -0,0 +1,142 @@
+/*************************************************************************/
+/* project_export.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROJECT_EXPORT_SETTINGS_H
+#define PROJECT_EXPORT_SETTINGS_H
+
+#include "scene/main/timer.h"
+#include "scene/gui/control.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "editor/editor_file_dialog.h"
+#include "scene/gui/button.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tab_container.h"
+#include "os/dir_access.h"
+#include "os/thread.h"
+#include "scene/gui/option_button.h"
+
+#include "scene/gui/slider.h"
+#include "editor/editor_file_system.h"
+#include "property_editor.h"
+#include "editor_export.h"
+
+
+class EditorNode;
+
+class ProjectExportDialog : public ConfirmationDialog {
+ GDCLASS( ProjectExportDialog, ConfirmationDialog );
+
+private:
+
+
+ TabContainer *sections;
+
+ MenuButton *add_preset;
+ Button *delete_preset;
+ ItemList *presets;
+
+ LineEdit *name;
+ PropertyEditor *parameters;
+ CheckButton *runnable;
+
+
+ EditorFileDialog *pck_export;
+ EditorFileDialog *file_export;
+
+ Button *button_export;
+ bool updating;
+
+ ConfirmationDialog *delete_confirm;
+
+ OptionButton *export_filter;
+ LineEdit *include_filters;
+ LineEdit *exclude_filters;
+ Tree *include_files;
+
+ Label* include_label;
+ MarginContainer *include_margin;
+
+ StringName editor_icons;
+
+ Tree *patches;
+ Button *patch_export;
+ int patch_index;
+ FileDialog *patch_dialog;
+ ConfirmationDialog *patch_erase;
+
+ Button *export_button;
+
+ void _patch_selected(const String& p_path);
+ void _patch_deleted();
+
+ void _runnable_pressed();
+ void _name_changed(const String& p_string);
+ void _add_preset(int p_platform);
+ void _edit_preset(int p_index);
+ void _delete_preset();
+ void _delete_preset_confirm();
+
+ void _update_presets();
+
+ void _export_type_changed(int p_which);
+ void _filter_changed(const String& p_filter);
+ void _fill_resource_tree();
+ bool _fill_tree(EditorFileSystemDirectory *p_dir,TreeItem *p_item,Ref<EditorExportPreset> &current,bool p_only_scenes);
+ void _tree_changed();
+
+ void _patch_button_pressed(Object* p_item,int p_column,int p_id);
+ void _patch_edited();
+
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+ FileDialog *export_pck_zip;
+
+ void _export_pck_zip();
+ void _export_pck_zip_selected(const String& p_path);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void popup_export();
+
+ ProjectExportDialog();
+ ~ProjectExportDialog();
+};
+
+
+
+
+#endif // PROJECT_EXPORT_SETTINGS_H
+
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
new file mode 100644
index 0000000000..34b2d3e82c
--- /dev/null
+++ b/editor/project_manager.cpp
@@ -0,0 +1,1516 @@
+/*************************************************************************/
+/* project_manager.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "project_manager.h"
+
+#include "version.h"
+#include "os/os.h"
+#include "os/dir_access.h"
+#include "os/file_access.h"
+#include "os/keyboard.h"
+#include "editor_settings.h"
+#include "scene/gui/separator.h"
+#include "scene/gui/tool_button.h"
+#include "io/config_file.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/center_container.h"
+#include "io/stream_peer_ssl.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/margin_container.h"
+#include "io/resource_saver.h"
+#include "editor_themes.h"
+#include "editor_initialize_ssl.h"
+#include "editor_scale.h"
+#include "io/zip_io.h"
+
+class NewProjectDialog : public ConfirmationDialog {
+
+ GDCLASS(NewProjectDialog,ConfirmationDialog);
+
+public:
+
+ enum Mode {
+ MODE_NEW,
+ MODE_IMPORT,
+ MODE_INSTALL
+ };
+private:
+
+ Mode mode;
+ Label *pp,*pn;
+ Label *error;
+ LineEdit *project_path;
+ LineEdit *project_name;
+ FileDialog *fdialog;
+ String zip_path;
+ String zip_title;
+ AcceptDialog *dialog_error;
+
+ String _test_path() {
+
+ error->set_text("");
+ get_ok()->set_disabled(true);
+ DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ String valid_path;
+ if (d->change_dir(project_path->get_text())==OK){
+ valid_path=project_path->get_text();
+ } else if (d->change_dir(project_path->get_text().strip_edges())==OK) {
+ valid_path=project_path->get_text().strip_edges();
+ }
+
+ if (valid_path == "") {
+ error->set_text(TTR("Invalid project path, the path must exist!"));
+ memdelete(d);
+ return "";
+ }
+
+ if (mode!=MODE_IMPORT) {
+
+ if (d->file_exists("godot.cfg")) {
+
+ error->set_text(TTR("Invalid project path, godot.cfg must not exist."));
+ memdelete(d);
+ return "";
+ }
+
+ } else {
+
+ if (valid_path != "" && !d->file_exists("godot.cfg")) {
+
+ error->set_text(TTR("Invalid project path, godot.cfg must exist."));
+ memdelete(d);
+ return "";
+ }
+ }
+
+ memdelete(d);
+ get_ok()->set_disabled(false);
+ return valid_path;
+
+ }
+
+ void _path_text_changed(const String& p_path) {
+
+ String sp=_test_path();
+ if ( sp!="" ) {
+
+ sp=sp.replace("\\","/");
+ int lidx=sp.find_last("/");
+
+ if (lidx!=-1) {
+ sp=sp.substr(lidx+1,sp.length());
+ }
+ if (sp=="" && mode==MODE_IMPORT )
+ sp=TTR("Imported Project");
+
+ project_name->set_text(sp);
+ }
+ }
+
+ void _file_selected(const String& p_path) {
+
+ String p = p_path;
+ if (mode==MODE_IMPORT) {
+ if (p.ends_with("godot.cfg")) {
+
+ p=p.get_base_dir();
+ }
+ }
+ String sp = p.simplify_path();
+ project_path->set_text(sp);
+ _path_text_changed(sp);
+ get_ok()->call_deferred("grab_focus");
+ }
+
+ void _path_selected(const String& p_path) {
+
+ String p = p_path;
+ String sp = p.simplify_path();
+ project_path->set_text(sp);
+ _path_text_changed(sp);
+ get_ok()->call_deferred("grab_focus");
+ }
+
+ void _browse_path() {
+
+ if (mode==MODE_IMPORT) {
+
+ fdialog->set_mode(FileDialog::MODE_OPEN_FILE);
+ fdialog->clear_filters();
+ fdialog->add_filter("godot.cfg ; " _MKSTR(VERSION_NAME) " Project");
+ } else {
+ fdialog->set_mode(FileDialog::MODE_OPEN_DIR);
+ }
+ fdialog->popup_centered_ratio();
+ }
+
+ void _text_changed(const String& p_text) {
+ _test_path();
+ }
+
+ void ok_pressed() {
+
+ String dir=_test_path();
+ if (dir=="") {
+ error->set_text(TTR("Invalid project path (changed anything?)."));
+ return;
+ }
+
+ if (mode==MODE_IMPORT) {
+ // nothing to do
+ } else {
+ if (mode==MODE_NEW) {
+
+
+
+
+ FileAccess *f = FileAccess::open(dir.plus_file("/godot.cfg"),FileAccess::WRITE);
+ if (!f) {
+ error->set_text(TTR("Couldn't create godot.cfg in project path."));
+ } else {
+
+ f->store_line("; Engine configuration file.");
+ f->store_line("; It's best edited using the editor UI and not directly,");
+ f->store_line("; since the parameters that go here are not all obvious.");
+ f->store_line("; ");
+ f->store_line("; Format: ");
+ f->store_line("; [section] ; section goes between []");
+ f->store_line("; param=value ; assign values to parameters");
+ f->store_line("\n");
+ f->store_line("[application]");
+ f->store_line("\n");
+ f->store_line("name=\""+project_name->get_text()+"\"");
+ f->store_line("icon=\"res://icon.png\"");
+
+ memdelete(f);
+
+ ResourceSaver::save(dir.plus_file("/icon.png"),get_icon("DefaultProjectIcon","EditorIcons"));
+ }
+
+ } else if (mode==MODE_INSTALL) {
+
+
+ FileAccess *src_f=NULL;
+ zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
+
+ unzFile pkg = unzOpen2(zip_path.utf8().get_data(), &io);
+ if (!pkg) {
+
+ dialog_error->set_text("Error opening package file, not in zip format.");
+ return;
+ }
+
+ int ret = unzGoToFirstFile(pkg);
+
+ Vector<String> failed_files;
+
+ int idx=0;
+ while(ret==UNZ_OK) {
+
+ //get filename
+ unz_file_info info;
+ char fname[16384];
+ ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0);
+
+ String path=fname;
+
+ int depth=1; //stuff from github comes with tag
+ bool skip=false;
+ while(depth>0) {
+ int pp = path.find("/");
+ if (pp==-1) {
+ skip=true;
+ break;
+ }
+ path=path.substr(pp+1,path.length());
+ depth--;
+ }
+
+
+ if (skip || path==String()) {
+ //
+ } else if (path.ends_with("/")) { // a dir
+
+ path=path.substr(0,path.length()-1);
+
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ da->make_dir(dir.plus_file(path));
+ memdelete(da);
+
+ } else {
+
+ Vector<uint8_t> data;
+ data.resize(info.uncompressed_size);
+
+ //read
+ unzOpenCurrentFile(pkg);
+ unzReadCurrentFile(pkg,data.ptr(),data.size());
+ unzCloseCurrentFile(pkg);
+
+ FileAccess *f=FileAccess::open(dir.plus_file(path),FileAccess::WRITE);
+
+ if (f) {
+ f->store_buffer(data.ptr(),data.size());
+ memdelete(f);
+ } else {
+ failed_files.push_back(path);
+ }
+
+
+ }
+
+ idx++;
+ ret = unzGoToNextFile(pkg);
+ }
+
+ unzClose(pkg);
+
+ if (failed_files.size()) {
+ String msg=TTR("The following files failed extraction from package:")+"\n\n";
+ for(int i=0;i<failed_files.size();i++) {
+
+ if (i>15) {
+ msg+="\nAnd "+itos(failed_files.size()-i)+" more files.";
+ break;
+ }
+ msg+=failed_files[i]+"\n";
+ }
+
+ dialog_error->set_text(msg);
+ dialog_error->popup_centered_minsize();
+
+ } else {
+ dialog_error->set_text(TTR("Package Installed Successfully!"));
+ dialog_error->popup_centered_minsize();
+ }
+
+ }
+
+ }
+
+ dir=dir.replace("\\","/");
+ if (dir.ends_with("/"))
+ dir=dir.substr(0,dir.length()-1);
+ String proj=dir.replace("/","::");
+ EditorSettings::get_singleton()->set("projects/"+proj,dir);
+ EditorSettings::get_singleton()->save();
+
+
+
+ hide();
+ emit_signal("project_created", dir);
+
+ }
+
+protected:
+
+ static void _bind_methods() {
+
+ ClassDB::bind_method("_browse_path",&NewProjectDialog::_browse_path);
+ ClassDB::bind_method("_text_changed",&NewProjectDialog::_text_changed);
+ ClassDB::bind_method("_path_text_changed",&NewProjectDialog::_path_text_changed);
+ ClassDB::bind_method("_path_selected",&NewProjectDialog::_path_selected);
+ ClassDB::bind_method("_file_selected",&NewProjectDialog::_file_selected);
+ ADD_SIGNAL( MethodInfo("project_created") );
+ }
+
+public:
+
+ void set_zip_path(const String& p_path) {
+ zip_path=p_path;
+ }
+ void set_zip_title(const String& p_title) {
+ zip_title=p_title;
+ }
+
+ void set_mode(Mode p_mode) {
+
+ mode=p_mode;
+ }
+
+ void show_dialog() {
+
+
+ project_path->clear();
+ project_name->clear();
+
+ if (mode==MODE_IMPORT) {
+ set_title(TTR("Import Existing Project"));
+ get_ok()->set_text(TTR("Import"));
+ pp->set_text(TTR("Project Path (Must Exist):"));
+ pn->set_text(TTR("Project Name:"));
+ pn->hide();
+ project_name->hide();
+
+ popup_centered(Size2(500,125)*EDSCALE);
+
+ } else if (mode==MODE_NEW){
+
+ set_title(TTR("Create New Project"));
+ get_ok()->set_text(TTR("Create"));
+ pp->set_text(TTR("Project Path:"));
+ pn->set_text(TTR("Project Name:"));
+ pn->show();
+ project_name->show();
+
+ popup_centered(Size2(500,145)*EDSCALE);
+ } else if (mode==MODE_INSTALL){
+
+ set_title(TTR("Install Project:")+" "+zip_title);
+ get_ok()->set_text(TTR("Install"));
+ pp->set_text(TTR("Project Path:"));
+ pn->hide();
+ project_name->hide();
+
+ popup_centered(Size2(500,125)*EDSCALE);
+
+ }
+ project_path->grab_focus();
+
+ _test_path();
+ }
+
+ NewProjectDialog() {
+
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+ //set_child_rect(vb);
+
+ Label* l = memnew(Label);
+ l->set_text(TTR("Project Path:"));
+ vb->add_child(l);
+ pp=l;
+
+ project_path = memnew( LineEdit );
+ MarginContainer *mc = memnew( MarginContainer );
+ vb->add_child(mc);
+ HBoxContainer *pphb = memnew( HBoxContainer );
+ mc->add_child(pphb);
+ pphb->add_child(project_path);
+ project_path->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ Button* browse = memnew( Button );
+ pphb->add_child(browse);
+ browse->set_text(TTR("Browse"));
+ browse->connect("pressed", this,"_browse_path");
+
+ l = memnew(Label);
+ l->set_text(TTR("Project Name:"));
+ l->set_pos(Point2(5,50));
+ vb->add_child(l);
+ pn=l;
+
+ project_name = memnew( LineEdit );
+ mc = memnew( MarginContainer );
+ vb->add_child(mc);
+ mc->add_child(project_name);
+ project_name->set_text(TTR("New Game Project"));
+
+
+ l = memnew(Label);
+ l->set_text(TTR("That's a BINGO!"));
+ vb->add_child(l);
+ error=l;
+ l->add_color_override("font_color",Color(1,0.4,0.3,0.8));
+ l->set_align(Label::ALIGN_CENTER);
+
+ DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ project_path->set_text(d->get_current_dir());
+ memdelete(d);
+
+ fdialog = memnew( FileDialog );
+ add_child(fdialog);
+ fdialog->set_access(FileDialog::ACCESS_FILESYSTEM);
+ fdialog->set_current_dir( EditorSettings::get_singleton()->get("filesystem/directories/default_project_path") );
+ project_name->connect("text_changed", this,"_text_changed");
+ project_path->connect("text_changed", this,"_path_text_changed");
+ fdialog->connect("dir_selected", this,"_path_selected");
+ fdialog->connect("file_selected", this,"_file_selected");
+ set_hide_on_ok(false);
+ mode=MODE_NEW;
+
+ dialog_error = memnew( AcceptDialog );
+ add_child(dialog_error);
+ }
+
+
+};
+
+struct ProjectItem {
+ String project;
+ String path;
+ String conf;
+ uint64_t last_modified;
+ bool favorite;
+ ProjectItem() {}
+ ProjectItem(const String &p_project, const String &p_path, const String &p_conf, uint64_t p_last_modified, bool p_favorite=false) {
+ project = p_project; path = p_path; conf = p_conf; last_modified = p_last_modified; favorite=p_favorite;
+ }
+ _FORCE_INLINE_ bool operator <(const ProjectItem& l) const { return last_modified > l.last_modified; }
+ _FORCE_INLINE_ bool operator ==(const ProjectItem& l) const { return project==l.project; }
+};
+
+void ProjectManager::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ get_tree()->set_editor_hint(true);
+
+ } else if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ set_process_unhandled_input(is_visible_in_tree());
+ }
+}
+
+void ProjectManager::_panel_draw(Node *p_hb) {
+
+ HBoxContainer *hb = p_hb->cast_to<HBoxContainer>();
+
+ hb->draw_line(Point2(0,hb->get_size().y+1),Point2(hb->get_size().x-10,hb->get_size().y+1),get_color("guide_color","Tree"));
+
+ if (selected_list.has(hb->get_meta("name"))) {
+ hb->draw_style_box( gui_base->get_stylebox("selected","Tree"),Rect2(Point2(),hb->get_size()-Size2(10,0)));
+ }
+}
+
+void ProjectManager::_update_project_buttons()
+{
+ for(int i=0;i<scroll_childs->get_child_count();i++) {
+
+ CanvasItem *item = scroll_childs->get_child(i)->cast_to<CanvasItem>();
+ item->update();
+ }
+
+ bool has_runnable_scene = false;
+ for (Map<String,String>::Element *E=selected_list.front(); E; E=E->next()) {
+ const String &selected_main = E->get();
+ if (selected_main == "") continue;
+ has_runnable_scene = true;
+ break;
+ }
+
+ erase_btn->set_disabled(selected_list.size()<1);
+ open_btn->set_disabled(selected_list.size()<1);
+ run_btn->set_disabled(!has_runnable_scene);
+}
+
+void ProjectManager::_panel_input(const InputEvent& p_ev,Node *p_hb) {
+
+ if (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.pressed && p_ev.mouse_button.button_index==BUTTON_LEFT) {
+
+ String clicked = p_hb->get_meta("name");
+ String clicked_main_scene = p_hb->get_meta("main_scene");
+
+ if (p_ev.key.mod.shift && selected_list.size()>0 && last_clicked!="" && clicked != last_clicked) {
+
+ int clicked_id = -1;
+ int last_clicked_id = -1;
+ for(int i=0;i<scroll_childs->get_child_count();i++) {
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (!hb) continue;
+ if (hb->get_meta("name") == clicked) clicked_id = i;
+ if (hb->get_meta("name") == last_clicked) last_clicked_id = i;
+ }
+
+ if (last_clicked_id!=-1 && clicked_id!=-1) {
+ int min = clicked_id < last_clicked_id? clicked_id : last_clicked_id;
+ int max = clicked_id > last_clicked_id? clicked_id : last_clicked_id;
+ for(int i=0; i<scroll_childs->get_child_count(); ++i) {
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (!hb) continue;
+ if (i!=clicked_id && (i<min || i>max) && !p_ev.key.mod.control) {
+ selected_list.erase(hb->get_meta("name"));
+ } else if (i>=min && i<=max) {
+ selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
+ }
+ }
+ }
+
+ } else if (selected_list.has(clicked) && p_ev.key.mod.control) {
+
+ selected_list.erase(clicked);
+
+ } else {
+
+ last_clicked = clicked;
+ if (p_ev.key.mod.control || selected_list.size()==0) {
+ selected_list.insert(clicked, clicked_main_scene);
+ } else {
+ selected_list.clear();
+ selected_list.insert(clicked, clicked_main_scene);
+ }
+ }
+
+ _update_project_buttons();
+
+ if (p_ev.mouse_button.doubleclick)
+ _open_project(); //open if doubleclicked
+
+ }
+}
+
+void ProjectManager::_unhandled_input(const InputEvent& p_ev) {
+
+ if (p_ev.type==InputEvent::KEY) {
+
+ const InputEventKey &k = p_ev.key;
+
+ if (!k.pressed)
+ return;
+
+ bool scancode_handled = true;
+
+ switch (k.scancode) {
+
+ case KEY_RETURN: {
+
+ _open_project();
+ } break;
+ case KEY_HOME: {
+
+ for (int i=0; i<scroll_childs->get_child_count(); i++) {
+
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (hb) {
+ selected_list.clear();
+ selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
+ scroll->set_v_scroll(0);
+ _update_project_buttons();
+ break;
+ }
+ }
+
+ } break;
+ case KEY_END: {
+
+ for (int i=scroll_childs->get_child_count()-1; i>=0; i--) {
+
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (hb) {
+ selected_list.clear();
+ selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
+ scroll->set_v_scroll(scroll_childs->get_size().y);
+ _update_project_buttons();
+ break;
+ }
+ }
+
+ } break;
+ case KEY_UP: {
+
+ if (k.mod.shift)
+ break;
+
+ if (selected_list.size()) {
+
+ bool found = false;
+
+ for (int i=scroll_childs->get_child_count()-1; i>=0; i--) {
+
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (!hb) continue;
+
+ String current = hb->get_meta("name");
+
+ if (found) {
+ selected_list.clear();
+ selected_list.insert(current, hb->get_meta("main_scene"));
+
+ int offset_diff = scroll->get_v_scroll() - hb->get_pos().y;
+
+ if (offset_diff > 0)
+ scroll->set_v_scroll(scroll->get_v_scroll() - offset_diff);
+
+ _update_project_buttons();
+
+ break;
+
+ } else if (current==selected_list.back()->key()) {
+
+ found = true;
+ }
+ }
+
+ break;
+ }
+ // else fallthrough to key_down
+ }
+ case KEY_DOWN: {
+
+ if (k.mod.shift)
+ break;
+
+ bool found = selected_list.empty();
+
+ for (int i=0; i<scroll_childs->get_child_count(); i++) {
+
+ HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ if (!hb) continue;
+
+ String current = hb->get_meta("name");
+
+ if (found) {
+ selected_list.clear();
+ selected_list.insert(current, hb->get_meta("main_scene"));
+
+ int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y;
+ int offset_diff = (hb->get_pos().y + hb->get_size().y) - last_y_visible;
+
+ if (offset_diff > 0)
+ scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff);
+
+ _update_project_buttons();
+
+ break;
+
+ } else if (current==selected_list.back()->key()) {
+
+ found = true;
+ }
+ }
+
+ } break;
+ case KEY_F: {
+ if (k.mod.command) this->project_filter->search_box->grab_focus();
+ else scancode_handled = false;
+ } break;
+ default: {
+ scancode_handled = false;
+ } break;
+ }
+
+ if (scancode_handled) {
+ accept_event();
+ }
+ }
+}
+
+void ProjectManager::_favorite_pressed(Node *p_hb) {
+
+ String clicked = p_hb->get_meta("name");
+ bool favorite = !p_hb->get_meta("favorite");
+ String proj=clicked.replace(":::",":/");
+ proj=proj.replace("::","/");
+
+ if (favorite) {
+ EditorSettings::get_singleton()->set("favorite_projects/"+clicked,proj);
+ } else {
+ EditorSettings::get_singleton()->erase("favorite_projects/"+clicked);
+ }
+ EditorSettings::get_singleton()->save();
+ call_deferred("_load_recent_projects");
+}
+
+
+void ProjectManager::_load_recent_projects() {
+
+ ProjectListFilter::FilterOption filter_option = project_filter->get_filter_option();
+ String search_term = project_filter->get_search_term();
+
+ while(scroll_childs->get_child_count()>0) {
+ memdelete( scroll_childs->get_child(0));
+ }
+
+ Map<String, String> selected_list_copy = selected_list;
+
+ List<PropertyInfo> properties;
+ EditorSettings::get_singleton()->get_property_list(&properties);
+
+ Color font_color = gui_base->get_color("font_color","Tree");
+
+ List<ProjectItem> projects;
+ List<ProjectItem> favorite_projects;
+
+ for(List<PropertyInfo>::Element *E=properties.front();E;E=E->next()) {
+
+ String _name = E->get().name;
+ if (!_name.begins_with("projects/") && !_name.begins_with("favorite_projects/"))
+ continue;
+
+ String path = EditorSettings::get_singleton()->get(_name);
+ if (filter_option == ProjectListFilter::FILTER_PATH && search_term!="" && path.findn(search_term)==-1)
+ continue;
+
+ String project = _name.get_slice("/",1);
+ String conf=path.plus_file("godot.cfg");
+ bool favorite = (_name.begins_with("favorite_projects/"))?true:false;
+
+ uint64_t last_modified = 0;
+ if (FileAccess::exists(conf)) {
+ last_modified = FileAccess::get_modified_time(conf);
+
+ String fscache = path.plus_file(".fscache");
+ if (FileAccess::exists(fscache)) {
+ uint64_t cache_modified = FileAccess::get_modified_time(fscache);
+ if ( cache_modified > last_modified )
+ last_modified = cache_modified;
+ }
+
+ ProjectItem item(project, path, conf, last_modified, favorite);
+ if (favorite)
+ favorite_projects.push_back(item);
+ else
+ projects.push_back(item);
+ } else {
+ //project doesn't exist on disk but it's in the XML settings file
+ EditorSettings::get_singleton()->erase(_name); //remove it
+ }
+ }
+
+ projects.sort();
+ favorite_projects.sort();
+
+ for(List<ProjectItem>::Element *E=projects.front();E;) {
+ List<ProjectItem>::Element *next = E->next();
+ if (favorite_projects.find(E->get()) != NULL)
+ projects.erase(E->get());
+ E=next;
+ }
+ for(List<ProjectItem>::Element *E=favorite_projects.back();E;E=E->prev()) {
+ projects.push_front(E->get());
+ }
+
+ Ref<Texture> favorite_icon = get_icon("Favorites","EditorIcons");
+
+ for(List<ProjectItem>::Element *E=projects.front();E;E=E->next()) {
+
+ ProjectItem &item = E->get();
+ String project = item.project;
+ String path = item.path;
+ String conf = item.conf;
+ bool is_favorite = item.favorite;
+
+ Ref<ConfigFile> cf = memnew( ConfigFile );
+ Error err = cf->load(conf);
+ ERR_CONTINUE(err!=OK);
+
+
+ String project_name=TTR("Unnamed Project");
+
+ if (cf->has_section_key("application","name")) {
+ project_name = static_cast<String>(cf->get_value("application","name")).xml_unescape();
+ }
+
+ if (filter_option==ProjectListFilter::FILTER_NAME && search_term!="" && project_name.findn(search_term)==-1)
+ continue;
+
+ Ref<Texture> icon;
+ if (cf->has_section_key("application","icon")) {
+ String appicon = cf->get_value("application","icon");
+ if (appicon!="") {
+ Image img;
+ Error err = img.load(appicon.replace_first("res://",path+"/"));
+ if (err==OK) {
+
+ img.resize(64,64);
+ Ref<ImageTexture> it = memnew( ImageTexture );
+ it->create_from_image(img);
+ icon=it;
+ }
+ }
+ }
+
+ if (icon.is_null()) {
+ icon=get_icon("DefaultProjectIcon","EditorIcons");
+ }
+
+ String main_scene;
+ if (cf->has_section_key("application","main_scene")) {
+ main_scene = cf->get_value("application","main_scene");
+ }
+
+ selected_list_copy.erase(project);
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ hb->set_meta("name",project);
+ hb->set_meta("main_scene",main_scene);
+ hb->set_meta("favorite",is_favorite);
+ hb->connect("draw",this,"_panel_draw",varray(hb));
+ hb->connect("gui_input",this,"_panel_input",varray(hb));
+ hb->add_constant_override("separation",10*EDSCALE);
+
+ VBoxContainer *favorite_box = memnew( VBoxContainer );
+ TextureButton *favorite = memnew( TextureButton );
+ favorite->set_normal_texture(favorite_icon);
+ if (!is_favorite)
+ favorite->set_modulate(Color(1,1,1,0.2));
+ favorite->set_v_size_flags(SIZE_EXPAND);
+ favorite->connect("pressed",this,"_favorite_pressed",varray(hb));
+ favorite_box->add_child(favorite);
+ hb->add_child(favorite_box);
+
+ TextureRect *tf = memnew( TextureRect );
+ tf->set_texture(icon);
+ hb->add_child(tf);
+
+ VBoxContainer *vb = memnew(VBoxContainer);
+ vb->set_name("project");
+ hb->add_child(vb);
+ Control *ec = memnew( Control );
+ ec->set_custom_minimum_size(Size2(0,1));
+ vb->add_child(ec);
+ Label *title = memnew( Label(project_name) );
+ title->add_font_override("font", gui_base->get_font("large","Fonts"));
+ title->add_color_override("font_color",font_color);
+ vb->add_child(title);
+ Label *fpath = memnew( Label(path) );
+ fpath->set_name("path");
+ vb->add_child(fpath);
+ fpath->set_modulate(Color(1,1,1,0.5));
+ fpath->add_color_override("font_color",font_color);
+
+ scroll_childs->add_child(hb);
+ }
+
+ for (Map<String,String>::Element *E = selected_list_copy.front();E;E = E->next()) {
+ String key = E->key();
+ selected_list.erase(key);
+ }
+
+ scroll->set_v_scroll(0);
+
+ _update_project_buttons();
+
+ EditorSettings::get_singleton()->save();
+
+ tabs->set_current_tab(0);
+}
+
+void ProjectManager::_on_project_created(const String& dir) {
+ bool has_already=false;
+ for (int i=0;i<scroll_childs->get_child_count();i++) {
+ HBoxContainer *hb=scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ Label *fpath=hb->get_node(NodePath("project/path"))->cast_to<Label>();
+ if (fpath->get_text()==dir) {
+ has_already=true;
+ break;
+ }
+ }
+ if (has_already) {
+ _update_scroll_pos(dir);
+ } else {
+ _load_recent_projects();
+ scroll->connect("draw", this, "_update_scroll_pos", varray(dir), CONNECT_ONESHOT);
+ }
+}
+
+void ProjectManager::_update_scroll_pos(const String& dir) {
+ for (int i=0;i<scroll_childs->get_child_count();i++) {
+ HBoxContainer *hb=scroll_childs->get_child(i)->cast_to<HBoxContainer>();
+ Label *fpath=hb->get_node(NodePath("project/path"))->cast_to<Label>();
+ if (fpath->get_text()==dir) {
+ last_clicked=hb->get_meta("name");
+ selected_list.clear();
+ selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene"));
+ _update_project_buttons();
+ int last_y_visible=scroll->get_v_scroll()+scroll->get_size().y;
+ int offset_diff=(hb->get_pos().y + hb->get_size().y)-last_y_visible;
+
+ if (offset_diff>0)
+ scroll->set_v_scroll(scroll->get_v_scroll()+offset_diff);
+ break;
+ }
+ }
+}
+
+void ProjectManager::_open_project_confirm() {
+
+ for (Map<String,String>::Element *E=selected_list.front(); E; E=E->next()) {
+ const String &selected = E->key();
+ String path = EditorSettings::get_singleton()->get("projects/"+selected);
+ print_line("OPENING: "+path+" ("+selected+")");
+
+ List<String> args;
+
+ args.push_back("-path");
+ args.push_back(path);
+
+ args.push_back("-editor");
+
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid=0;
+ Error err = OS::get_singleton()->execute(exec,args,false,&pid);
+ ERR_FAIL_COND(err);
+ }
+
+ get_tree()->quit();
+}
+
+void ProjectManager::_open_project() {
+
+ if (selected_list.size()<1) {
+ return;
+ }
+
+ if (selected_list.size()>1) {
+ multi_open_ask->set_text(TTR("Are you sure to open more than one project?"));
+ multi_open_ask->popup_centered_minsize();
+ } else {
+ _open_project_confirm();
+ }
+}
+
+void ProjectManager::_run_project_confirm() {
+
+ for (Map<String,String>::Element *E=selected_list.front(); E; E=E->next()) {
+
+ const String &selected_main = E->get();
+ if (selected_main == "") continue;
+
+ const String &selected = E->key();
+ String path = EditorSettings::get_singleton()->get("projects/"+selected);
+ print_line("OPENING: "+path+" ("+selected+")");
+
+ List<String> args;
+
+ args.push_back("-path");
+ args.push_back(path);
+
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid=0;
+ Error err = OS::get_singleton()->execute(exec,args,false,&pid);
+ ERR_FAIL_COND(err);
+ }
+ //get_scene()->quit(); do not quit
+}
+
+void ProjectManager::_run_project() {
+
+
+ if (selected_list.size()<1) {
+ return;
+ }
+
+ if (selected_list.size()>1) {
+ multi_run_ask->set_text(TTR("Are you sure to run more than one project?"));
+ multi_run_ask->popup_centered_minsize();
+ } else {
+ _run_project_confirm();
+ }
+}
+
+void ProjectManager::_scan_dir(DirAccess *da,float pos, float total,List<String> *r_projects) {
+
+
+ List<String> subdirs;
+ da->list_dir_begin();
+ String n = da->get_next();
+ while(n!=String()) {
+ if (da->current_is_dir() && !n.begins_with(".")) {
+ subdirs.push_front(n);
+ } else if (n=="godot.cfg") {
+ r_projects->push_back(da->get_current_dir());
+ }
+ n=da->get_next();
+ }
+ da->list_dir_end();
+ int m=0;
+ for(List<String>::Element *E=subdirs.front();E;E=E->next()) {
+
+ da->change_dir(E->get());
+
+ float slice=total/subdirs.size();
+ _scan_dir(da,pos+slice*m,slice,r_projects);
+ da->change_dir("..");
+ m++;
+ }
+
+
+}
+
+
+void ProjectManager::_scan_begin(const String& p_base) {
+
+ print_line("SCAN PROJECTS AT: "+p_base);
+ List<String> projects;
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ da->change_dir(p_base);
+ _scan_dir(da,0,1,&projects);
+ memdelete(da);
+ print_line("found: "+itos(projects.size())+" projects.");
+
+ for(List<String>::Element *E=projects.front();E;E=E->next()) {
+ String proj=E->get().replace("/","::");
+ EditorSettings::get_singleton()->set("projects/"+proj,E->get());
+
+ }
+ EditorSettings::get_singleton()->save();
+ _load_recent_projects();
+
+}
+
+void ProjectManager::_scan_projects() {
+
+ scan_dir->popup_centered_ratio();
+
+}
+
+
+void ProjectManager::_new_project() {
+
+ npdialog->set_mode(NewProjectDialog::MODE_NEW);
+ npdialog->show_dialog();
+}
+
+
+void ProjectManager::_import_project() {
+
+ npdialog->set_mode(NewProjectDialog::MODE_IMPORT);
+ npdialog->show_dialog();
+}
+
+void ProjectManager::_erase_project_confirm() {
+
+ if (selected_list.size()==0) {
+ return;
+ }
+ for (Map<String,String>::Element *E=selected_list.front(); E; E=E->next()) {
+ EditorSettings::get_singleton()->erase("projects/"+E->key());
+ EditorSettings::get_singleton()->erase("favorite_projects/"+E->key());
+ }
+ EditorSettings::get_singleton()->save();
+ selected_list.clear();
+ last_clicked = "";
+ _load_recent_projects();
+
+}
+
+void ProjectManager::_erase_project() {
+
+ if (selected_list.size()==0)
+ return;
+
+
+ erase_ask->set_text(TTR("Remove project from the list? (Folder contents will not be modified)"));
+ erase_ask->popup_centered_minsize();
+
+}
+
+
+void ProjectManager::_exit_dialog() {
+
+ get_tree()->quit();
+}
+
+
+void ProjectManager::_install_project(const String& p_zip_path,const String& p_title) {
+
+ npdialog->set_mode(NewProjectDialog::MODE_INSTALL);
+ npdialog->set_zip_path(p_zip_path);
+ npdialog->set_zip_title(p_title);
+ npdialog->show_dialog();
+}
+
+void ProjectManager::_files_dropped(PoolStringArray p_files, int p_screen) {
+ Set<String> folders_set;
+ DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ for (int i = 0; i < p_files.size(); i++) {
+ String file = p_files[i];
+ folders_set.insert(da->dir_exists(file) ? file : file.get_base_dir());
+ }
+ memdelete(da);
+ if (folders_set.size()>0) {
+ PoolStringArray folders;
+ for (Set<String>::Element *E=folders_set.front();E;E=E->next()) {
+ folders.append(E->get());
+ }
+
+ bool confirm = true;
+ if (folders.size()==1) {
+ DirAccess *dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+ if (dir->change_dir(folders[0])==OK) {
+ dir->list_dir_begin();
+ String file = dir->get_next();
+ while(confirm && file!=String()) {
+ if (!dir->current_is_dir() && file.ends_with("godot.cfg")) {
+ confirm = false;
+ }
+ file = dir->get_next();
+ }
+ dir->list_dir_end();
+ }
+ memdelete(dir);
+ }
+ if (confirm) {
+ multi_scan_ask->get_ok()->disconnect("pressed", this, "_scan_multiple_folders");
+ multi_scan_ask->get_ok()->connect("pressed", this, "_scan_multiple_folders", varray(folders));
+ multi_scan_ask->set_text(vformat(TTR("You are about the scan %s folders for existing Godot projects. Do you confirm?"), folders.size()));
+ multi_scan_ask->popup_centered_minsize();
+ } else {
+ _scan_multiple_folders(folders);
+ }
+ }
+}
+
+void ProjectManager::_scan_multiple_folders(PoolStringArray p_files)
+{
+ for (int i = 0; i < p_files.size(); i++) {
+ _scan_begin(p_files.get(i));
+ }
+}
+
+void ProjectManager::_bind_methods() {
+
+ ClassDB::bind_method("_open_project",&ProjectManager::_open_project);
+ ClassDB::bind_method("_open_project_confirm",&ProjectManager::_open_project_confirm);
+ ClassDB::bind_method("_run_project",&ProjectManager::_run_project);
+ ClassDB::bind_method("_run_project_confirm",&ProjectManager::_run_project_confirm);
+ ClassDB::bind_method("_scan_projects",&ProjectManager::_scan_projects);
+ ClassDB::bind_method("_scan_begin",&ProjectManager::_scan_begin);
+ ClassDB::bind_method("_import_project",&ProjectManager::_import_project);
+ ClassDB::bind_method("_new_project",&ProjectManager::_new_project);
+ ClassDB::bind_method("_erase_project",&ProjectManager::_erase_project);
+ ClassDB::bind_method("_erase_project_confirm",&ProjectManager::_erase_project_confirm);
+ ClassDB::bind_method("_exit_dialog",&ProjectManager::_exit_dialog);
+ ClassDB::bind_method("_load_recent_projects",&ProjectManager::_load_recent_projects);
+ ClassDB::bind_method("_on_project_created",&ProjectManager::_on_project_created);
+ ClassDB::bind_method("_update_scroll_pos",&ProjectManager::_update_scroll_pos);
+ ClassDB::bind_method("_panel_draw",&ProjectManager::_panel_draw);
+ ClassDB::bind_method("_panel_input",&ProjectManager::_panel_input);
+ ClassDB::bind_method("_unhandled_input",&ProjectManager::_unhandled_input);
+ ClassDB::bind_method("_favorite_pressed",&ProjectManager::_favorite_pressed);
+ ClassDB::bind_method("_install_project",&ProjectManager::_install_project);
+ ClassDB::bind_method("_files_dropped",&ProjectManager::_files_dropped);
+ ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"),&ProjectManager::_scan_multiple_folders);
+
+
+}
+
+ProjectManager::ProjectManager() {
+
+ // load settings
+ if (!EditorSettings::get_singleton())
+ EditorSettings::create();
+
+
+ EditorSettings::get_singleton()->set_optimize_save(false); //just write settings as they came
+
+ {
+ int dpi_mode = EditorSettings::get_singleton()->get("interface/hidpi_mode");
+ if (dpi_mode==0) {
+ editor_set_scale( OS::get_singleton()->get_screen_dpi(0) > 150 && OS::get_singleton()->get_screen_size(OS::get_singleton()->get_current_screen()).x>2000 ? 2.0 : 1.0 );
+ } else if (dpi_mode==1) {
+ editor_set_scale(0.75);
+ } else if (dpi_mode==2) {
+ editor_set_scale(1.0);
+ } else if (dpi_mode==3) {
+ editor_set_scale(1.5);
+ } else if (dpi_mode==4) {
+ editor_set_scale(2.0);
+ }
+ }
+
+ FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesytem/file_dialog/show_hidden_files"));
+
+ set_area_as_parent_rect();
+ set_theme(create_editor_theme());
+
+ gui_base = memnew( Control );
+ add_child(gui_base);
+ gui_base->set_area_as_parent_rect();
+ gui_base->set_theme(create_custom_theme());
+
+ Panel *panel = memnew( Panel );
+ gui_base->add_child(panel);
+ panel->set_area_as_parent_rect();
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ panel->add_child(vb);
+ vb->set_area_as_parent_rect(20*EDSCALE);
+ vb->set_margin(MARGIN_TOP,4*EDSCALE);
+ vb->set_margin(MARGIN_BOTTOM,4*EDSCALE);
+ vb->add_constant_override("separation",15*EDSCALE);
+
+ String cp;
+ cp.push_back(0xA9);
+ cp.push_back(0);
+ OS::get_singleton()->set_window_title(_MKSTR(VERSION_NAME)+String(" - ")+TTR("Project Manager")+" - "+cp+" 2008-2017 Juan Linietsky, Ariel Manzur.");
+
+ HBoxContainer *top_hb = memnew( HBoxContainer);
+ vb->add_child(top_hb);
+ CenterContainer *ccl = memnew( CenterContainer );
+ Label *l = memnew( Label );
+ l->set_text(_MKSTR(VERSION_NAME)+String(" - ")+TTR("Project Manager"));
+ l->add_font_override("font", gui_base->get_font("doc","EditorFonts"));
+ ccl->add_child(l);
+ top_hb->add_child(ccl);
+ top_hb->add_spacer();
+ l = memnew( Label );
+ l->set_text("v" VERSION_MKSTRING);
+ //l->add_font_override("font",get_font("bold","Fonts"));
+ l->set_align(Label::ALIGN_CENTER);
+ top_hb->add_child(l);
+ //vb->add_child(memnew(HSeparator));
+ //vb->add_margin_child("\n",memnew(Control));
+
+ tabs = memnew( TabContainer );
+ vb->add_child(tabs);
+ tabs->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ HBoxContainer *tree_hb = memnew( HBoxContainer);
+ projects_hb = tree_hb;
+
+ projects_hb->set_name(TTR("Project List"));
+
+ tabs->add_child(tree_hb);
+
+ VBoxContainer *search_tree_vb = memnew(VBoxContainer);
+ search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ tree_hb->add_child(search_tree_vb);
+
+ HBoxContainer *search_box = memnew(HBoxContainer);
+ search_box->add_spacer(true);
+ project_filter = memnew(ProjectListFilter);
+ search_box->add_child(project_filter);
+ project_filter->connect("filter_changed", this, "_load_recent_projects");
+ project_filter->set_custom_minimum_size(Size2(250,10));
+ search_tree_vb->add_child(search_box);
+
+ PanelContainer *pc = memnew( PanelContainer);
+ pc->add_style_override("panel", gui_base->get_stylebox("bg","Tree"));
+ search_tree_vb->add_child(pc);
+ pc->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ scroll = memnew( ScrollContainer );
+ pc->add_child(scroll);
+ scroll->set_enable_h_scroll(false);
+
+ VBoxContainer *tree_vb = memnew( VBoxContainer);
+ tree_hb->add_child(tree_vb);
+ scroll_childs = memnew( VBoxContainer );
+ scroll_childs->set_h_size_flags(SIZE_EXPAND_FILL);
+ scroll->add_child(scroll_childs);
+
+ //HBoxContainer *hb = memnew( HBoxContainer );
+ //vb->add_child(hb);
+
+ Button *open = memnew( Button );
+ open->set_text(TTR("Edit"));
+ tree_vb->add_child(open);
+ open->connect("pressed", this,"_open_project");
+ open_btn=open;
+
+ Button *run = memnew( Button );
+ run->set_text(TTR("Run"));
+ tree_vb->add_child(run);
+ run->connect("pressed", this,"_run_project");
+ run_btn=run;
+
+ tree_vb->add_child(memnew( HSeparator ));
+
+ Button *scan = memnew( Button );
+ scan->set_text(TTR("Scan"));
+ tree_vb->add_child(scan);
+ scan->connect("pressed", this,"_scan_projects");
+
+ tree_vb->add_child(memnew( HSeparator ));
+
+ scan_dir = memnew( FileDialog );
+ scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM);
+ scan_dir->set_mode(FileDialog::MODE_OPEN_DIR);
+ scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden
+ scan_dir->set_current_dir( EditorSettings::get_singleton()->get("filesystem/directories/default_project_path") );
+ gui_base->add_child(scan_dir);
+ scan_dir->connect("dir_selected",this,"_scan_begin");
+
+
+ Button* create = memnew( Button );
+ create->set_text(TTR("New Project"));
+ tree_vb->add_child(create);
+ create->connect("pressed", this,"_new_project");
+
+ Button* import = memnew( Button );
+ import->set_text(TTR("Import"));
+ tree_vb->add_child(import);
+ import->connect("pressed", this,"_import_project");
+
+
+ Button* erase = memnew( Button );
+ erase->set_text(TTR("Remove"));
+ tree_vb->add_child(erase);
+ erase->connect("pressed", this,"_erase_project");
+ erase_btn=erase;
+
+
+ tree_vb->add_spacer();
+
+
+ if (StreamPeerSSL::is_available()) {
+ asset_library = memnew( EditorAssetLibrary(true) );
+ asset_library->set_name("Templates");
+ tabs->add_child(asset_library);
+ asset_library->connect("install_asset",this,"_install_project");
+ } else {
+ WARN_PRINT("Asset Library not available, as it requires SSL to work.");
+ }
+
+
+ CenterContainer *cc = memnew( CenterContainer );
+ Button * cancel = memnew( Button );
+ cancel->set_text(TTR("Exit"));
+ cancel->set_custom_minimum_size(Size2(100,1)*EDSCALE);
+ cc->add_child(cancel);
+ cancel->connect("pressed", this,"_exit_dialog");
+ vb->add_child(cc);
+
+ //
+
+ erase_ask = memnew( ConfirmationDialog );
+ erase_ask->get_ok()->set_text(TTR("Remove"));
+ erase_ask->get_ok()->connect("pressed", this,"_erase_project_confirm");
+
+ gui_base->add_child(erase_ask);
+
+ multi_open_ask = memnew( ConfirmationDialog );
+ multi_open_ask->get_ok()->set_text(TTR("Edit"));
+ multi_open_ask->get_ok()->connect("pressed", this, "_open_project_confirm");
+
+ gui_base->add_child(multi_open_ask);
+
+ multi_run_ask = memnew( ConfirmationDialog );
+ multi_run_ask->get_ok()->set_text(TTR("Run"));
+ multi_run_ask->get_ok()->connect("pressed", this, "_run_project_confirm");
+
+ gui_base->add_child(multi_run_ask);
+
+ multi_scan_ask = memnew( ConfirmationDialog );
+ multi_scan_ask->get_ok()->set_text(TTR("Scan"));
+
+ gui_base->add_child(multi_scan_ask);
+
+ OS::get_singleton()->set_low_processor_usage_mode(true);
+
+ npdialog = memnew( NewProjectDialog );
+ gui_base->add_child(npdialog);
+
+ npdialog->connect("project_created", this,"_on_project_created");
+ _load_recent_projects();
+
+ if ( EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path") ) {
+ _scan_begin( EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path") );
+ }
+
+ //get_ok()->set_text("Open");
+ //get_ok()->set_text("Exit");
+
+ last_clicked = "";
+
+ SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped");
+}
+
+
+ProjectManager::~ProjectManager() {
+
+ if (EditorSettings::get_singleton())
+ EditorSettings::destroy();
+}
+
+void ProjectListFilter::_setup_filters() {
+
+ filter_option->clear();
+ filter_option->add_item(TTR("Name"));
+ filter_option->add_item(TTR("Path"));
+}
+
+void ProjectListFilter::_command(int p_command) {
+ switch (p_command) {
+
+ case CMD_CLEAR_FILTER: {
+ if (search_box->get_text()!="") {
+ search_box->clear();
+ emit_signal("filter_changed");
+ }
+ }break;
+ }
+}
+
+void ProjectListFilter::_search_text_changed(const String &p_newtext) {
+ emit_signal("filter_changed");
+}
+
+String ProjectListFilter::get_search_term() {
+ return search_box->get_text().strip_edges();
+}
+
+ProjectListFilter::FilterOption ProjectListFilter::get_filter_option() {
+ return _current_filter;
+}
+
+void ProjectListFilter::_filter_option_selected(int p_idx) {
+ FilterOption selected = (FilterOption)(filter_option->get_selected());
+ if (_current_filter != selected ) {
+ _current_filter = selected;
+ emit_signal("filter_changed");
+ }
+}
+
+void ProjectListFilter::_notification(int p_what) {
+ switch(p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ clear_search_button->set_icon(get_icon("CloseHover","EditorIcons"));
+ } break;
+ }
+}
+
+void ProjectListFilter::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_command"),&ProjectListFilter::_command);
+ ClassDB::bind_method(D_METHOD("_search_text_changed"), &ProjectListFilter::_search_text_changed);
+ ClassDB::bind_method(D_METHOD("_filter_option_selected"), &ProjectListFilter::_filter_option_selected);
+
+ ADD_SIGNAL( MethodInfo("filter_changed") );
+}
+
+ProjectListFilter::ProjectListFilter() {
+
+ editor_initialize_certificates(); //for asset sharing
+
+ _current_filter = FILTER_NAME;
+
+ filter_option = memnew(OptionButton);
+ filter_option->set_custom_minimum_size(Size2(80,10));
+ filter_option->set_clip_text(true);
+ filter_option->connect("item_selected", this, "_filter_option_selected");
+ add_child(filter_option);
+
+ _setup_filters();
+
+ search_box = memnew( LineEdit );
+ search_box->connect("text_changed",this,"_search_text_changed");
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(search_box);
+
+ clear_search_button = memnew( ToolButton );
+ clear_search_button->connect("pressed",this,"_command",make_binds(CMD_CLEAR_FILTER));
+ add_child(clear_search_button);
+
+}
diff --git a/editor/project_manager.h b/editor/project_manager.h
new file mode 100644
index 0000000000..cb6c0b7f26
--- /dev/null
+++ b/editor/project_manager.h
@@ -0,0 +1,148 @@
+/*************************************************************************/
+/* project_manager.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROJECT_MANAGER_H
+#define PROJECT_MANAGER_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/scroll_container.h"
+#include "scene/gui/file_dialog.h"
+#include "scene/gui/tool_button.h"
+#include "editor/asset_library_editor_plugin.h"
+
+class NewProjectDialog;
+class ProjectListFilter;
+
+class ProjectManager : public Control {
+ GDCLASS( ProjectManager, Control );
+
+ Button *erase_btn;
+ Button *open_btn;
+ Button *run_btn;
+
+ FileDialog *scan_dir;
+
+ EditorAssetLibrary *asset_library;
+
+ ProjectListFilter *project_filter;
+
+ ConfirmationDialog *erase_ask;
+ ConfirmationDialog *multi_open_ask;
+ ConfirmationDialog *multi_run_ask;
+ ConfirmationDialog *multi_scan_ask;
+ NewProjectDialog *npdialog;
+ ScrollContainer *scroll;
+ VBoxContainer *scroll_childs;
+ Map<String, String> selected_list; // name -> main_scene
+ String last_clicked;
+ bool importing;
+
+ HBoxContainer *projects_hb;
+
+ TabContainer *tabs;
+
+ Control *gui_base;
+
+
+
+ void _scan_projects();
+ void _run_project();
+ void _run_project_confirm();
+ void _open_project();
+ void _open_project_confirm();
+ void _import_project();
+ void _new_project();
+ void _erase_project();
+ void _erase_project_confirm();
+ void _update_project_buttons();
+ void _exit_dialog();
+ void _scan_begin(const String& p_base);
+
+ void _load_recent_projects();
+ void _on_project_created(const String& dir);
+ void _update_scroll_pos(const String& dir);
+ void _scan_dir(DirAccess *da,float pos, float total,List<String> *r_projects);
+
+ void _install_project(const String& p_zip_path,const String& p_title);
+
+ void _panel_draw(Node *p_hb);
+ void _panel_input(const InputEvent& p_ev,Node *p_hb);
+ void _unhandled_input(const InputEvent& p_ev);
+ void _favorite_pressed(Node *p_hb);
+ void _files_dropped(PoolStringArray p_files, int p_screen);
+ void _scan_multiple_folders(PoolStringArray p_files);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+ ProjectManager();
+ ~ProjectManager();
+};
+
+class ProjectListFilter : public HBoxContainer {
+
+ GDCLASS( ProjectListFilter, HBoxContainer );
+
+private:
+
+ friend class ProjectManager;
+
+ enum Command {
+ CMD_CLEAR_FILTER,
+ };
+
+ OptionButton *filter_option;
+ LineEdit *search_box;
+ ToolButton *clear_search_button;
+
+ enum FilterOption {
+ FILTER_NAME,
+ FILTER_PATH,
+ };
+ FilterOption _current_filter;
+
+ void _command(int p_command);
+ void _search_text_changed(const String& p_newtext);
+ void _setup_filters();
+ void _filter_option_selected(int p_idx);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ String get_search_term();
+ FilterOption get_filter_option();
+ ProjectListFilter();
+};
+
+#endif // PROJECT_MANAGER_H
diff --git a/editor/project_settings.cpp b/editor/project_settings.cpp
new file mode 100644
index 0000000000..15019b8ca8
--- /dev/null
+++ b/editor/project_settings.cpp
@@ -0,0 +1,1603 @@
+/*************************************************************************/
+/* project_settings.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "project_settings.h"
+
+#include "scene/gui/tab_container.h"
+#include "global_config.h"
+#include "os/keyboard.h"
+#include "editor_node.h"
+#include "scene/gui/margin_container.h"
+#include "translation.h"
+#include "global_constants.h"
+
+ProjectSettings *ProjectSettings::singleton=NULL;
+
+static const char* _button_names[JOY_BUTTON_MAX]={
+"PS X, XBox A, Nintendo B",
+"PS Circle, XBox B, Nintendo A",
+"PS Square, XBox X, Nintendo Y",
+"PS Triangle, XBox Y, Nintendo X",
+"L, L1",
+"R, R1",
+"L2",
+"R2",
+"L3",
+"R3",
+"Select, Nintendo -",
+"Start, Nintendo +",
+"D-Pad Up",
+"D-Pad Down",
+"D-Pad Left",
+"D-Pad Right"
+};
+
+static const char* _axis_names[JOY_AXIS_MAX*2] = {
+ " (Left Stick Left)",
+ " (Left Stick Right)",
+ " (Left Stick Up)",
+ " (Left Stick Down)",
+ " (Right Stick Left)",
+ " (Right Stick Right)",
+ " (Right Stick Up)",
+ " (Right Stick Down)",
+ "","","","",
+ "", " (L2)",
+ "", " (R2)"
+};
+
+void ProjectSettings::_notification(int p_what) {
+
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ globals_editor->edit(GlobalConfig::get_singleton());
+
+ search_button->set_icon(get_icon("Zoom","EditorIcons"));
+ clear_button->set_icon(get_icon("Close","EditorIcons"));
+
+ translation_list->connect("button_pressed",this,"_translation_delete");
+ _update_actions();
+ popup_add->add_icon_item(get_icon("Keyboard","EditorIcons"),TTR("Key "),InputEvent::KEY);//"Key " - because the word 'key' has already been used as a key animation
+ popup_add->add_icon_item(get_icon("JoyButton","EditorIcons"),TTR("Joy Button"),InputEvent::JOYPAD_BUTTON);
+ popup_add->add_icon_item(get_icon("JoyAxis","EditorIcons"),TTR("Joy Axis"),InputEvent::JOYPAD_MOTION);
+ popup_add->add_icon_item(get_icon("Mouse","EditorIcons"),TTR("Mouse Button"),InputEvent::MOUSE_BUTTON);
+
+ List<String> tfn;
+ ResourceLoader::get_recognized_extensions_for_type("Translation",&tfn);
+ for (List<String>::Element *E=tfn.front();E;E=E->next()) {
+
+ translation_file_open->add_filter("*."+E->get());
+ }
+
+ List<String> rfn;
+ ResourceLoader::get_recognized_extensions_for_type("Resource",&rfn);
+ for (List<String>::Element *E=rfn.front();E;E=E->next()) {
+
+ translation_res_file_open->add_filter("*."+E->get());
+ translation_res_option_file_open->add_filter("*."+E->get());
+ }
+ } break;
+ case NOTIFICATION_POPUP_HIDE: {
+ EditorSettings::get_singleton()->set("interface/dialogs/project_settings_bounds", get_rect());
+ } break;
+ }
+}
+
+void ProjectSettings::_action_selected() {
+
+ TreeItem *ti=input_editor->get_selected();
+ if (!ti || !ti->is_editable(0))
+ return;
+
+ add_at="input/"+ti->get_text(0);
+}
+
+void ProjectSettings::_action_edited() {
+
+ TreeItem *ti=input_editor->get_selected();
+ if (!ti)
+ return;
+
+ String new_name=ti->get_text(0);
+ String old_name=add_at.substr(add_at.find("/")+1,add_at.length());
+
+ if (new_name==old_name)
+ return;
+
+ if (new_name.find("/")!=-1 || new_name.find(":")!=-1 || new_name=="") {
+
+ ti->set_text(0,old_name);
+ add_at="input/"+old_name;
+
+ message->set_text(TTR("Invalid action (anything goes but '/' or ':')."));
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+ String action_prop="input/"+new_name;
+
+ if (GlobalConfig::get_singleton()->has(action_prop)) {
+
+ ti->set_text(0,old_name);
+ add_at="input/"+old_name;
+
+ message->set_text(vformat(TTR("Action '%s' already exists!"),new_name));
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+ int order = GlobalConfig::get_singleton()->get_order(add_at);
+ Array va = GlobalConfig::get_singleton()->get(add_at);
+
+ setting=true;
+ undo_redo->create_action(TTR("Rename Input Action Event"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"clear",add_at);
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set",action_prop,va);
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set_order",action_prop,order);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"clear",action_prop);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set",add_at,va);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set_order",add_at,order);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+ setting=false;
+
+ add_at=action_prop;
+
+}
+
+
+void ProjectSettings::_device_input_add() {
+
+
+
+
+ InputEvent ie;
+ String name=add_at;
+ Variant old_val = GlobalConfig::get_singleton()->get(name);
+ Array arr=old_val;
+ ie.device=device_id->get_value();
+
+ ie.type=add_type;
+
+ switch(add_type) {
+
+ case InputEvent::MOUSE_BUTTON: {
+
+
+ ie.mouse_button.button_index=device_index->get_selected()+1;
+
+ for(int i=0;i<arr.size();i++) {
+
+ InputEvent aie=arr[i];
+ if (aie.device == ie.device && aie.type==InputEvent::MOUSE_BUTTON && aie.mouse_button.button_index==ie.mouse_button.button_index) {
+ return;
+ }
+ }
+
+ } break;
+ case InputEvent::JOYPAD_MOTION: {
+
+ ie.joy_motion.axis = device_index->get_selected()>>1;
+ ie.joy_motion.axis_value = device_index->get_selected()&1?1:-1;
+
+
+ for(int i=0;i<arr.size();i++) {
+
+ InputEvent aie=arr[i];
+ if (aie.device == ie.device && aie.type==InputEvent::JOYPAD_MOTION && aie.joy_motion.axis==ie.joy_motion.axis && aie.joy_motion.axis_value==ie.joy_motion.axis_value) {
+ return;
+ }
+ }
+
+ } break;
+ case InputEvent::JOYPAD_BUTTON: {
+
+ ie.joy_button.button_index=device_index->get_selected();
+
+ for(int i=0;i<arr.size();i++) {
+
+ InputEvent aie=arr[i];
+ if (aie.device == ie.device && aie.type==InputEvent::JOYPAD_BUTTON && aie.joy_button.button_index==ie.joy_button.button_index) {
+ return;
+ }
+ }
+
+ } break;
+ default:{}
+ }
+
+
+ arr.push_back(ie);
+
+ undo_redo->create_action(TTR("Add Input Action Event"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set",name,arr);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set",name,old_val);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+ _show_last_added(ie, name);
+}
+
+
+void ProjectSettings::_press_a_key_confirm() {
+
+ if (last_wait_for_key.type!=InputEvent::KEY)
+ return;
+
+ InputEvent ie;
+ ie.type=InputEvent::KEY;
+ ie.key.scancode=last_wait_for_key.key.scancode;
+ ie.key.mod=last_wait_for_key.key.mod;
+ String name=add_at;
+
+ Variant old_val = GlobalConfig::get_singleton()->get(name);
+ Array arr=old_val;
+
+ for(int i=0;i<arr.size();i++) {
+
+ InputEvent aie=arr[i];
+ if (aie.type==InputEvent::KEY && aie.key.scancode==ie.key.scancode && aie.key.mod==ie.key.mod) {
+ return;
+ }
+ }
+
+ arr.push_back(ie);
+
+ undo_redo->create_action(TTR("Add Input Action Event"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set",name,arr);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set",name,old_val);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+ _show_last_added(ie, name);
+}
+
+void ProjectSettings::_show_last_added(const InputEvent& p_event, const String &p_name) {
+ TreeItem *r = input_editor->get_root();
+
+ String name = p_name;
+ name.erase(0,6);
+ if (!r)
+ return;
+ r=r->get_children();
+ if (!r)
+ return;
+ bool found = false;
+ while(r){
+ if (r->get_text(0) != name) {
+ r=r->get_next();
+ continue;
+ }
+ TreeItem *child = r->get_children();
+ while(child){
+ Variant input = child->get_meta("__input");
+ if (p_event==input){
+ child->select(0);
+ found = true;
+ break;
+ }
+ child=child->get_next();
+ }
+ if (found) break;
+ r=r->get_next();
+ }
+
+ if (found) input_editor->ensure_cursor_is_visible();
+}
+
+void ProjectSettings::_wait_for_key(const InputEvent& p_event) {
+
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && p_event.key.scancode!=0) {
+
+ last_wait_for_key=p_event;
+ String str=keycode_get_string(p_event.key.scancode).capitalize();
+ if (p_event.key.mod.meta)
+ str=TTR("Meta+")+str;
+ if (p_event.key.mod.shift)
+ str=TTR("Shift+")+str;
+ if (p_event.key.mod.alt)
+ str=TTR("Alt+")+str;
+ if (p_event.key.mod.control)
+ str=TTR("Control+")+str;
+
+
+ press_a_key_label->set_text(str);
+ press_a_key->accept_event();
+
+ }
+}
+
+
+void ProjectSettings::_add_item(int p_item){
+
+ add_type=InputEvent::Type(p_item);
+
+ switch(add_type) {
+
+ case InputEvent::KEY: {
+
+ press_a_key_label->set_text(TTR("Press a Key.."));
+ last_wait_for_key=InputEvent();
+ press_a_key->popup_centered(Size2(250,80)*EDSCALE);
+ press_a_key->grab_focus();
+ } break;
+ case InputEvent::MOUSE_BUTTON: {
+
+ device_id->set_value(0);
+ device_index_label->set_text(TTR("Mouse Button Index:"));
+ device_index->clear();
+ device_index->add_item(TTR("Left Button"));
+ device_index->add_item(TTR("Right Button"));
+ device_index->add_item(TTR("Middle Button"));
+ device_index->add_item(TTR("Wheel Up Button"));
+ device_index->add_item(TTR("Wheel Down Button"));
+ device_index->add_item(TTR("Button 6"));
+ device_index->add_item(TTR("Button 7"));
+ device_index->add_item(TTR("Button 8"));
+ device_index->add_item(TTR("Button 9"));
+ device_input->popup_centered_minsize(Size2(350,95));
+ } break;
+ case InputEvent::JOYPAD_MOTION: {
+
+ device_id->set_value(0);
+ device_index_label->set_text(TTR("Joypad Axis Index:"));
+ device_index->clear();
+ for(int i=0;i<JOY_AXIS_MAX*2;i++) {
+
+ String desc = _axis_names[i];
+ device_index->add_item(TTR("Axis")+" "+itos(i/2)+" "+(i&1?"+":"-")+desc);
+ }
+ device_input->popup_centered_minsize(Size2(350,95));
+
+ } break;
+ case InputEvent::JOYPAD_BUTTON: {
+
+ device_id->set_value(0);
+ device_index_label->set_text(TTR("Joypad Button Index:"));
+ device_index->clear();
+
+ for(int i=0;i<JOY_BUTTON_MAX;i++) {
+
+ device_index->add_item(itos(i)+": "+String(_button_names[i]));
+ }
+ device_input->popup_centered_minsize(Size2(350,95));
+
+ } break;
+ default:{}
+ }
+}
+
+
+
+
+void ProjectSettings::_action_button_pressed(Object* p_obj, int p_column,int p_id) {
+
+ TreeItem *ti=p_obj->cast_to<TreeItem>();
+
+ ERR_FAIL_COND(!ti);
+
+ if (p_id==1) {
+ Point2 ofs = input_editor->get_global_pos();
+ Rect2 ir=input_editor->get_item_rect(ti);
+ ir.pos.y-=input_editor->get_scroll().y;
+ ofs+=ir.pos+ir.size;
+ ofs.x-=100;
+ popup_add->set_pos(ofs);
+ popup_add->popup();
+ add_at="input/"+ti->get_text(0);
+
+ } else if (p_id==2) {
+ //remove
+
+ if (ti->get_parent()==input_editor->get_root()) {
+
+ //remove main thing
+
+ String name="input/"+ti->get_text(0);
+ Variant old_val = GlobalConfig::get_singleton()->get(name);
+ int order=GlobalConfig::get_singleton()->get_order(name);
+
+ undo_redo->create_action(TTR("Add Input Action"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"clear",name);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set",name,old_val);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set_order",name,order);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+ } else {
+ //remove action
+ String name="input/"+ti->get_parent()->get_text(0);
+ Variant old_val = GlobalConfig::get_singleton()->get(name);
+ int idx = ti->get_metadata(0);
+
+ Array va = old_val;
+
+ ERR_FAIL_INDEX(idx,va.size());
+
+ for(int i=idx;i<va.size()-1;i++) {
+
+ va[i]=va[i+1];
+ }
+
+ va.resize(va.size()-1);
+
+
+ undo_redo->create_action(TTR("Erase Input Action Event"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set",name,va);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"set",name,old_val);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+ }
+ }
+
+}
+
+
+void ProjectSettings::_update_actions() {
+
+ if (setting)
+ return;
+
+ input_editor->clear();
+ TreeItem *root = input_editor->create_item();
+ input_editor->set_hide_root(true);
+
+ List<PropertyInfo> props;
+ GlobalConfig::get_singleton()->get_property_list(&props);
+
+ for(List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
+
+ const PropertyInfo &pi=E->get();
+ if (!pi.name.begins_with("input/"))
+ continue;
+
+ String name = pi.name.get_slice("/",1);
+ if (name=="")
+ continue;
+
+ TreeItem *item=input_editor->create_item(root);
+ //item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ item->set_text(0,name);
+ item->add_button(0,get_icon("Add","EditorIcons"),1);
+ if (!GlobalConfig::get_singleton()->get_input_presets().find(pi.name)) {
+ item->add_button(0,get_icon("Remove","EditorIcons"),2);
+ item->set_editable(0,true);
+ }
+ item->set_custom_bg_color(0,get_color("prop_subsection","Editor"));
+ //item->set_checked(0,pi.usage&PROPERTY_USAGE_CHECKED);
+
+
+ Array actions=GlobalConfig::get_singleton()->get(pi.name);
+
+ for(int i=0;i<actions.size();i++) {
+
+ if (actions[i].get_type()!=Variant::INPUT_EVENT)
+ continue;
+ InputEvent ie = actions[i];
+
+ TreeItem *action = input_editor->create_item(item);
+
+ switch(ie.type) {
+
+ case InputEvent::KEY: {
+
+ String str=keycode_get_string(ie.key.scancode).capitalize();
+ if (ie.key.mod.meta)
+ str=TTR("Meta+")+str;
+ if (ie.key.mod.shift)
+ str=TTR("Shift+")+str;
+ if (ie.key.mod.alt)
+ str=TTR("Alt+")+str;
+ if (ie.key.mod.control)
+ str=TTR("Control+")+str;
+
+ action->set_text(0,str);
+ action->set_icon(0,get_icon("Keyboard","EditorIcons"));
+
+ } break;
+ case InputEvent::JOYPAD_BUTTON: {
+
+ String str = TTR("Device")+" "+itos(ie.device)+", "+TTR("Button")+" "+itos(ie.joy_button.button_index);
+ if (ie.joy_button.button_index>=0 && ie.joy_button.button_index<JOY_BUTTON_MAX)
+ str+=String()+" ("+_button_names[ie.joy_button.button_index]+").";
+ else
+ str+=".";
+
+ action->set_text(0,str);
+ action->set_icon(0,get_icon("JoyButton","EditorIcons"));
+ } break;
+ case InputEvent::MOUSE_BUTTON: {
+
+ String str = TTR("Device")+" "+itos(ie.device)+", ";
+ switch (ie.mouse_button.button_index) {
+ case BUTTON_LEFT: str+=TTR("Left Button."); break;
+ case BUTTON_RIGHT: str+=TTR("Right Button."); break;
+ case BUTTON_MIDDLE: str+=TTR("Middle Button."); break;
+ case BUTTON_WHEEL_UP: str+=TTR("Wheel Up."); break;
+ case BUTTON_WHEEL_DOWN: str+=TTR("Wheel Down."); break;
+ default: str+=TTR("Button")+" "+itos(ie.mouse_button.button_index)+".";
+ }
+
+ action->set_text(0,str);
+ action->set_icon(0,get_icon("Mouse","EditorIcons"));
+ } break;
+ case InputEvent::JOYPAD_MOTION: {
+
+ int ax = ie.joy_motion.axis;
+ int n = 2*ax + (ie.joy_motion.axis_value<0 ? 0:1);
+ String desc = _axis_names[n];
+ String str = TTR("Device")+" "+itos(ie.device)+", "+TTR("Axis")+" "+itos(ax)+" "+(ie.joy_motion.axis_value<0?"-":"+")+desc +".";
+ action->set_text(0,str);
+ action->set_icon(0,get_icon("JoyAxis","EditorIcons"));
+ } break;
+ }
+ action->add_button(0,get_icon("Remove","EditorIcons"),2);
+ action->set_metadata(0,i);
+ action->set_meta("__input", ie);
+ }
+ }
+}
+
+
+void ProjectSettings::popup_project_settings() {
+
+ // Restore valid window bounds or pop up at default size.
+ if (EditorSettings::get_singleton()->has("interface/dialogs/project_settings_bounds")) {
+ popup(EditorSettings::get_singleton()->get("interface/dialogs/project_settings_bounds"));
+ } else {
+ popup_centered_ratio();
+ }
+ globals_editor->update_category_list();
+ _update_translations();
+ autoload_settings->update_autoload();
+ plugin_settings->update_plugins();
+}
+
+
+void ProjectSettings::_item_selected() {
+
+
+ TreeItem *ti = globals_editor->get_property_editor()->get_scene_tree()->get_selected();
+ if (!ti)
+ return;
+ if (!ti->get_parent())
+ return;
+ category->set_text(globals_editor->get_current_section());
+ property->set_text(ti->get_text(0));
+ popup_platform->set_disabled(false);
+
+
+}
+
+
+void ProjectSettings::_item_adds(String) {
+
+ _item_add();
+}
+
+void ProjectSettings::_item_add() {
+
+ Variant value;
+ switch(type->get_selected()) {
+ case 0: value=false; break;
+ case 1: value=0; break;
+ case 2: value=0.0; break;
+ case 3: value=""; break;
+ }
+
+ String catname = category->get_text().strip_edges();
+ /*if (!catname.is_valid_identifier()) {
+ message->set_text("Invalid Category.\nValid characters: a-z,A-Z,0-9 or _");
+ message->popup_centered(Size2(300,100));
+ return;
+ }*/
+
+ String propname = property->get_text().strip_edges();
+ /*if (!propname.is_valid_identifier()) {
+ message->set_text("Invalid Property.\nValid characters: a-z,A-Z,0-9 or _");
+ message->popup_centered(Size2(300,100));
+ return;
+ }*/
+
+ String name = catname!="" ? catname+"/"+propname : propname;
+
+ undo_redo->create_action("Add Global Property");
+
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), name, value);
+
+ if (GlobalConfig::get_singleton()->has(name)) {
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, GlobalConfig::get_singleton()->get(name));
+ } else {
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, Variant());
+ }
+
+ undo_redo->add_do_method(globals_editor, "update_category_list");
+ undo_redo->add_undo_method(globals_editor, "update_category_list");
+
+ undo_redo->add_do_method(this, "_settings_changed");
+ undo_redo->add_undo_method(this, "_settings_changed");
+
+ undo_redo->commit_action();
+
+ globals_editor->set_current_section(catname);
+
+ _settings_changed();
+}
+
+void ProjectSettings::_item_del() {
+
+ String catname = category->get_text().strip_edges();
+ //ERR_FAIL_COND(!catname.is_valid_identifier());
+ String propname = property->get_text().strip_edges();
+ //ERR_FAIL_COND(!propname.is_valid_identifier());
+
+ String name = catname!="" ? catname+"/"+propname : propname;
+
+ undo_redo->create_action("Delete Global Property");
+
+ undo_redo->add_do_property(GlobalConfig::get_singleton(), name, Variant());
+
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(), name, GlobalConfig::get_singleton()->get(name));
+
+ undo_redo->add_do_method(globals_editor, "update_category_list");
+ undo_redo->add_undo_method(globals_editor, "update_category_list");
+
+ undo_redo->add_do_method(this, "_settings_changed");
+ undo_redo->add_undo_method(this, "_settings_changed");
+
+ undo_redo->commit_action();
+
+ _settings_changed();
+}
+
+void ProjectSettings::_action_adds(String) {
+
+ _action_add();
+}
+
+void ProjectSettings::_action_add() {
+
+ String action = action_name->get_text();
+ if (action.find("/")!=-1 || action.find(":")!=-1 || action=="") {
+ message->set_text(TTR("Invalid action (anything goes but '/' or ':')."));
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+ if (GlobalConfig::get_singleton()->has("input/"+action)) {
+ message->set_text(vformat(TTR("Action '%s' already exists!"),action));
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+ Array va;
+ String name = "input/"+action;
+ undo_redo->create_action(TTR("Add Input Action Event"));
+ undo_redo->add_do_method(GlobalConfig::get_singleton(),"set",name,va);
+ undo_redo->add_undo_method(GlobalConfig::get_singleton(),"clear",name);
+ undo_redo->add_do_method(this,"_update_actions");
+ undo_redo->add_undo_method(this,"_update_actions");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+ TreeItem *r = input_editor->get_root();
+
+ if (!r)
+ return;
+ r=r->get_children();
+ if (!r)
+ return;
+ while(r->get_next())
+ r=r->get_next();
+
+ if (!r)
+ return;
+ r->select(0);
+ input_editor->ensure_cursor_is_visible();
+
+}
+
+
+void ProjectSettings::_item_checked(const String& p_item, bool p_check) {
+
+
+
+}
+
+
+void ProjectSettings::_save() {
+
+ Error err = GlobalConfig::get_singleton()->save();
+ message->set_text(err!=OK?TTR("Error saving settings."):TTR("Settings saved OK."));
+ message->popup_centered(Size2(300,100));
+}
+
+
+
+void ProjectSettings::_settings_prop_edited(const String& p_name) {
+
+ String full_item = globals_editor->get_full_item_path(p_name);
+
+ _settings_changed();
+}
+
+void ProjectSettings::_settings_changed() {
+
+ timer->start();
+}
+
+void ProjectSettings::queue_save() {
+ _settings_changed();
+}
+
+
+void ProjectSettings::_copy_to_platform(int p_which) {
+
+ String catname = category->get_text();
+ if (!catname.is_valid_identifier()) {
+ message->set_text("Invalid Category.\nValid characters: a-z,A-Z,0-9 or _");
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+
+ String propname = property->get_text();
+ if (!propname.is_valid_identifier()) {
+ message->set_text("Invalid Property.\nValid characters: a-z,A-Z,0-9 or _");
+ message->popup_centered(Size2(300,100));
+ return;
+ }
+
+ String name = catname+"/"+propname;
+ Variant value=GlobalConfig::get_singleton()->get(name);
+
+ catname+="."+popup_platform->get_popup()->get_item_text(p_which);
+ name = catname+"/"+propname;
+
+ GlobalConfig::get_singleton()->set(name,value);
+ globals_editor->get_property_editor()->update_tree();
+
+}
+
+
+void ProjectSettings::add_translation(const String& p_translation) {
+
+ _translation_add(p_translation);
+}
+
+void ProjectSettings::_translation_add(const String& p_path) {
+
+ PoolStringArray translations = GlobalConfig::get_singleton()->get("locale/translations");
+
+
+ for(int i=0;i<translations.size();i++) {
+
+ if (translations[i]==p_path)
+ return; //exists
+ }
+
+ translations.push_back(p_path);
+ undo_redo->create_action(TTR("Add Translation"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translations",translations);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translations",GlobalConfig::get_singleton()->get("locale/translations"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+}
+
+void ProjectSettings::_translation_file_open() {
+
+ translation_file_open->popup_centered_ratio();
+}
+
+void ProjectSettings::_translation_delete(Object *p_item,int p_column, int p_button) {
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ti);
+
+ int idx=ti->get_metadata(0);
+
+ PoolStringArray translations = GlobalConfig::get_singleton()->get("locale/translations");
+
+ ERR_FAIL_INDEX(idx,translations.size());
+
+ translations.remove(idx);
+
+ undo_redo->create_action(TTR("Remove Translation"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translations",translations);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translations",GlobalConfig::get_singleton()->get("locale/translations"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+
+}
+
+void ProjectSettings::_translation_res_file_open() {
+
+ translation_res_file_open->popup_centered_ratio();
+
+}
+
+void ProjectSettings::_translation_res_add(const String& p_path){
+
+ Variant prev;
+ Dictionary remaps;
+
+ if (GlobalConfig::get_singleton()->has("locale/translation_remaps")) {
+ remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+ prev=remaps;
+ }
+
+ if (remaps.has(p_path))
+ return; //pointless already has it
+
+ remaps[p_path]=PoolStringArray();
+
+ undo_redo->create_action(TTR("Add Remapped Path"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translation_remaps",remaps);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translation_remaps",prev);
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+}
+
+void ProjectSettings::_translation_res_option_file_open(){
+
+ translation_res_option_file_open->popup_centered_ratio();
+
+}
+void ProjectSettings::_translation_res_option_add(const String& p_path) {
+
+ ERR_FAIL_COND(!GlobalConfig::get_singleton()->has("locale/translation_remaps"));
+
+ Dictionary remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+
+ String key = k->get_metadata(0);
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PoolStringArray r = remaps[key];
+ r.push_back(p_path+":"+"en");
+ remaps[key]=r;
+
+
+ undo_redo->create_action(TTR("Resource Remap Add Remap"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translation_remaps",remaps);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translation_remaps",GlobalConfig::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+}
+
+
+
+void ProjectSettings::_translation_res_select() {
+
+ if (updating_translations)
+ return;
+
+
+ call_deferred("_update_translations");
+}
+
+void ProjectSettings::_translation_res_option_changed() {
+
+ if (updating_translations)
+ return;
+
+ if (!GlobalConfig::get_singleton()->has("locale/translation_remaps"))
+ return;
+
+ Dictionary remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+ TreeItem *ed = translation_remap_options->get_edited();
+ ERR_FAIL_COND(!ed);
+
+ String key = k->get_metadata(0);
+ int idx = ed->get_metadata(0);
+ String path = ed->get_metadata(1);
+ int which = ed->get_range(1);
+
+ Vector<String> langs = TranslationServer::get_all_locales();
+
+ ERR_FAIL_INDEX(which,langs.size());
+
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PoolStringArray r = remaps[key];
+ ERR_FAIL_INDEX(idx,r.size());
+ r.set(idx,path+":"+langs[which]);
+ remaps[key]=r;
+
+ updating_translations=true;
+ undo_redo->create_action(TTR("Change Resource Remap Language"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translation_remaps",remaps);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translation_remaps",GlobalConfig::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+ updating_translations=false;
+
+}
+
+
+void ProjectSettings::_translation_res_delete(Object *p_item,int p_column, int p_button) {
+
+
+ if (updating_translations)
+ return;
+
+ if (!GlobalConfig::get_singleton()->has("locale/translation_remaps"))
+ return;
+
+ Dictionary remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = p_item->cast_to<TreeItem>();
+
+ String key = k->get_metadata(0);
+ ERR_FAIL_COND(!remaps.has(key));
+
+ remaps.erase(key);
+
+ undo_redo->create_action(TTR("Remove Resource Remap"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translation_remaps",remaps);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translation_remaps",GlobalConfig::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+}
+
+void ProjectSettings::_translation_res_option_delete(Object *p_item,int p_column, int p_button) {
+
+ if (updating_translations)
+ return;
+
+ if (!GlobalConfig::get_singleton()->has("locale/translation_remaps"))
+ return;
+
+ Dictionary remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+ TreeItem *ed = p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ed);
+
+ String key = k->get_metadata(0);
+ int idx = ed->get_metadata(0);
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PoolStringArray r = remaps[key];
+ ERR_FAIL_INDEX(idx,remaps.size());
+ r.remove(idx);
+ remaps[key]=r;
+
+
+ undo_redo->create_action(TTR("Remove Resource Remap Option"));
+ undo_redo->add_do_property(GlobalConfig::get_singleton(),"locale/translation_remaps",remaps);
+ undo_redo->add_undo_property(GlobalConfig::get_singleton(),"locale/translation_remaps",GlobalConfig::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this,"_update_translations");
+ undo_redo->add_undo_method(this,"_update_translations");
+ undo_redo->add_do_method(this,"_settings_changed");
+ undo_redo->add_undo_method(this,"_settings_changed");
+ undo_redo->commit_action();
+
+}
+
+void ProjectSettings::_update_translations() {
+
+ //update translations
+
+ if (updating_translations)
+ return;
+
+ updating_translations=true;
+
+ translation_list->clear();
+ TreeItem *root = translation_list->create_item(NULL);
+ translation_list->set_hide_root(true);
+ if (GlobalConfig::get_singleton()->has("locale/translations")) {
+
+ PoolStringArray translations = GlobalConfig::get_singleton()->get("locale/translations");
+ for(int i=0;i<translations.size();i++) {
+
+ TreeItem *t = translation_list->create_item(root);
+ t->set_editable(0,false);
+ t->set_text(0,translations[i].replace_first("res://",""));
+ t->set_tooltip(0,translations[i]);
+ t->set_metadata(0,i);
+ t->add_button(0,get_icon("Del","EditorIcons"),0);
+ }
+ }
+
+
+ //update translation remaps
+
+ String remap_selected;
+ if (translation_remap->get_selected()) {
+ remap_selected = translation_remap->get_selected()->get_metadata(0);
+ }
+
+ translation_remap->clear();
+ translation_remap_options->clear();
+ root = translation_remap->create_item(NULL);
+ TreeItem *root2 = translation_remap_options->create_item(NULL);
+ translation_remap->set_hide_root(true);
+ translation_remap_options->set_hide_root(true);
+ translation_res_option_add_button->set_disabled(true);
+
+ Vector<String> langs = TranslationServer::get_all_locales();
+ Vector<String> names = TranslationServer::get_all_locale_names();
+ String langnames;
+ for(int i=0;i<names.size();i++) {
+ if (i>0)
+ langnames+=",";
+ langnames+=names[i];
+ }
+
+ if (GlobalConfig::get_singleton()->has("locale/translation_remaps")) {
+
+ Dictionary remaps = GlobalConfig::get_singleton()->get("locale/translation_remaps");
+ List<Variant> rk;
+ remaps.get_key_list(&rk);
+ Vector<String> keys;
+ for(List<Variant>::Element *E=rk.front();E;E=E->next()) {
+ keys.push_back(E->get());
+ }
+ keys.sort();
+
+ for(int i=0;i<keys.size();i++) {
+
+ TreeItem *t = translation_remap->create_item(root);
+ t->set_editable(0,false);
+ t->set_text(0,keys[i].replace_first("res://",""));
+ t->set_tooltip(0,keys[i]);
+ t->set_metadata(0,keys[i]);
+ t->add_button(0,get_icon("Del","EditorIcons"),0);
+ if (keys[i]==remap_selected) {
+ t->select(0);
+ translation_res_option_add_button->set_disabled(false);
+
+ PoolStringArray selected = remaps[keys[i]];
+ for(int j=0;j<selected.size();j++) {
+
+ String s = selected[j];
+ int qp = s.find_last(":");
+ String path = s.substr(0,qp);
+ String locale = s.substr(qp+1,s.length());
+
+ TreeItem *t2 = translation_remap_options->create_item(root2);
+ t2->set_editable(0,false);
+ t2->set_text(0,path.replace_first("res://",""));
+ t2->set_tooltip(0,path);
+ t2->set_metadata(0,j);
+ t2->add_button(0,get_icon("Del","EditorIcons"),0);
+ t2->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
+ t2->set_text(1,langnames);
+ t2->set_editable(1,true);
+ t2->set_metadata(1,path);
+ int idx = langs.find(locale);
+ print_line("find "+locale+" at "+itos(idx));
+ if (idx<0)
+ idx=0;
+
+ t2->set_range(1,idx);
+ }
+ }
+
+
+ }
+ }
+
+
+ updating_translations=false;
+
+}
+
+void ProjectSettings::_toggle_search_bar(bool p_pressed) {
+
+ globals_editor->get_property_editor()->set_use_filter(p_pressed);
+
+ if (p_pressed) {
+
+ search_bar->show();
+ add_prop_bar->hide();
+ search_box->grab_focus();
+ search_box->select_all();
+ } else {
+
+ search_bar->hide();
+ add_prop_bar->show();
+ }
+}
+
+void ProjectSettings::_clear_search_box() {
+
+ if (search_box->get_text()=="")
+ return;
+
+ search_box->clear();
+ globals_editor->get_property_editor()->update_tree();
+}
+
+void ProjectSettings::set_plugins_page() {
+
+ tab_container->set_current_tab( plugin_settings->get_index() );
+}
+
+void ProjectSettings::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_item_selected"),&ProjectSettings::_item_selected);
+ ClassDB::bind_method(D_METHOD("_item_add"),&ProjectSettings::_item_add);
+ ClassDB::bind_method(D_METHOD("_item_adds"),&ProjectSettings::_item_adds);
+ ClassDB::bind_method(D_METHOD("_item_del"),&ProjectSettings::_item_del);
+ ClassDB::bind_method(D_METHOD("_item_checked"),&ProjectSettings::_item_checked);
+ ClassDB::bind_method(D_METHOD("_save"),&ProjectSettings::_save);
+ ClassDB::bind_method(D_METHOD("_action_add"),&ProjectSettings::_action_add);
+ ClassDB::bind_method(D_METHOD("_action_adds"),&ProjectSettings::_action_adds);
+ ClassDB::bind_method(D_METHOD("_action_selected"),&ProjectSettings::_action_selected);
+ ClassDB::bind_method(D_METHOD("_action_edited"),&ProjectSettings::_action_edited);
+ ClassDB::bind_method(D_METHOD("_action_button_pressed"),&ProjectSettings::_action_button_pressed);
+ ClassDB::bind_method(D_METHOD("_update_actions"),&ProjectSettings::_update_actions);
+ ClassDB::bind_method(D_METHOD("_wait_for_key"),&ProjectSettings::_wait_for_key);
+ ClassDB::bind_method(D_METHOD("_add_item"),&ProjectSettings::_add_item);
+ ClassDB::bind_method(D_METHOD("_device_input_add"),&ProjectSettings::_device_input_add);
+ ClassDB::bind_method(D_METHOD("_press_a_key_confirm"),&ProjectSettings::_press_a_key_confirm);
+ ClassDB::bind_method(D_METHOD("_settings_prop_edited"),&ProjectSettings::_settings_prop_edited);
+ ClassDB::bind_method(D_METHOD("_copy_to_platform"),&ProjectSettings::_copy_to_platform);
+ ClassDB::bind_method(D_METHOD("_update_translations"),&ProjectSettings::_update_translations);
+ ClassDB::bind_method(D_METHOD("_translation_delete"),&ProjectSettings::_translation_delete);
+ ClassDB::bind_method(D_METHOD("_settings_changed"),&ProjectSettings::_settings_changed);
+ ClassDB::bind_method(D_METHOD("_translation_add"),&ProjectSettings::_translation_add);
+ ClassDB::bind_method(D_METHOD("_translation_file_open"),&ProjectSettings::_translation_file_open);
+
+ ClassDB::bind_method(D_METHOD("_translation_res_add"),&ProjectSettings::_translation_res_add);
+ ClassDB::bind_method(D_METHOD("_translation_res_file_open"),&ProjectSettings::_translation_res_file_open);
+ ClassDB::bind_method(D_METHOD("_translation_res_option_add"),&ProjectSettings::_translation_res_option_add);
+ ClassDB::bind_method(D_METHOD("_translation_res_option_file_open"),&ProjectSettings::_translation_res_option_file_open);
+ ClassDB::bind_method(D_METHOD("_translation_res_select"),&ProjectSettings::_translation_res_select);
+ ClassDB::bind_method(D_METHOD("_translation_res_option_changed"),&ProjectSettings::_translation_res_option_changed);
+ ClassDB::bind_method(D_METHOD("_translation_res_delete"),&ProjectSettings::_translation_res_delete);
+ ClassDB::bind_method(D_METHOD("_translation_res_option_delete"),&ProjectSettings::_translation_res_option_delete);
+
+ ClassDB::bind_method(D_METHOD("_clear_search_box"),&ProjectSettings::_clear_search_box);
+ ClassDB::bind_method(D_METHOD("_toggle_search_bar"),&ProjectSettings::_toggle_search_bar);
+
+}
+
+ProjectSettings::ProjectSettings(EditorData *p_data) {
+
+
+ singleton=this;
+ set_title(TTR("Project Settings (godot.cfg)"));
+ set_resizable(true);
+ undo_redo=&p_data->get_undo_redo();
+ data=p_data;
+
+
+ tab_container = memnew( TabContainer );
+ add_child(tab_container);
+ //set_child_rect(tab_container);
+
+ //tab_container->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN, 15 );
+ //tab_container->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END, 15 );
+ //tab_container->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN, 15 );
+ //tab_container->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END, 35 );
+
+ VBoxContainer *props_base = memnew( VBoxContainer );
+ props_base->set_alignment(BoxContainer::ALIGN_BEGIN);
+ props_base->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tab_container->add_child(props_base);
+ props_base->set_name(TTR("General"));
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ props_base->add_child(hbc);
+
+ search_button = memnew( ToolButton );
+ search_button->set_toggle_mode(true);
+ search_button->set_pressed(false);
+ search_button->set_text(TTR("Search"));
+ hbc->add_child(search_button);
+ search_button->connect("toggled",this,"_toggle_search_bar");
+
+ hbc->add_child( memnew( VSeparator ) );
+
+ add_prop_bar = memnew( HBoxContainer );
+ add_prop_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbc->add_child(add_prop_bar);
+
+ Label *l = memnew( Label );
+ add_prop_bar->add_child(l);
+ l->set_text(TTR("Category:"));
+
+ category = memnew( LineEdit );
+ category->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ add_prop_bar->add_child(category);
+ category->connect("text_entered",this,"_item_adds");
+
+ l = memnew( Label );
+ add_prop_bar->add_child(l);
+ l->set_text(TTR("Property:"));
+
+ property = memnew( LineEdit );
+ property->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ add_prop_bar->add_child(property);
+ property->connect("text_entered",this,"_item_adds");
+
+ l = memnew( Label );
+ add_prop_bar->add_child(l);
+ l->set_text(TTR("Type:"));
+
+ type = memnew( OptionButton );
+ type->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ add_prop_bar->add_child(type);
+ type->add_item("bool");
+ type->add_item("int");
+ type->add_item("float");
+ type->add_item("string");
+
+ Button *add = memnew( Button );
+ add_prop_bar->add_child(add);
+ add->set_text(TTR("Add"));
+ add->connect("pressed",this,"_item_add");
+
+ Button *del = memnew( Button );
+ add_prop_bar->add_child(del);
+ del->set_text(TTR("Del"));
+ del->connect("pressed",this,"_item_del");
+
+ search_bar = memnew( HBoxContainer );
+ search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbc->add_child(search_bar);
+ search_bar->hide();
+
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_bar->add_child(search_box);
+
+ clear_button = memnew( ToolButton );
+ search_bar->add_child(clear_button);
+ clear_button->connect("pressed",this,"_clear_search_box");
+
+ globals_editor = memnew( SectionedPropertyEditor );
+ props_base->add_child(globals_editor);
+ globals_editor->get_property_editor()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
+ //globals_editor->hide_top_label();
+ globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ globals_editor->get_property_editor()->register_text_enter(search_box);
+ globals_editor->get_property_editor()->set_capitalize_paths(false);
+ globals_editor->get_property_editor()->get_scene_tree()->connect("cell_selected",this,"_item_selected");
+ globals_editor->get_property_editor()->connect("property_toggled",this,"_item_checked",varray(),CONNECT_DEFERRED);
+ globals_editor->get_property_editor()->connect("property_edited",this,"_settings_prop_edited");
+
+/*
+ Button *save = memnew( Button );
+ props_base->add_child(save);
+
+ save->set_anchor(MARGIN_LEFT,ANCHOR_END);
+ save->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ save->set_anchor(MARGIN_TOP,ANCHOR_END);
+ save->set_anchor(MARGIN_BOTTOM,ANCHOR_END);
+ save->set_begin( Point2(80,28) );
+ save->set_end( Point2(10,20) );
+ save->set_text("Save");
+ save->connect("pressed",this,"_save");
+*/
+
+ hbc = memnew( HBoxContainer );
+ props_base->add_child(hbc);
+
+ popup_platform = memnew( MenuButton );
+ popup_platform->set_text(TTR("Copy To Platform.."));
+ popup_platform->set_disabled(true);
+ hbc->add_child(popup_platform);
+
+ hbc->add_spacer();
+
+ /*List<StringName> ep;
+ EditorImportExport::get_singleton()->get_export_platforms(&ep);
+ ep.sort_custom<StringName::AlphCompare>();
+
+ for(List<StringName>::Element *E=ep.front();E;E=E->next()) {
+
+ popup_platform->get_popup()->add_item( E->get() );
+
+ }*/
+
+ popup_platform->get_popup()->connect("id_pressed",this,"_copy_to_platform");
+ get_ok()->set_text(TTR("Close"));
+ set_hide_on_ok(true);
+
+ message = memnew( ConfirmationDialog );
+ add_child(message);
+ //message->get_cancel()->hide();
+ message->set_hide_on_ok(true);
+
+ Control *input_base = memnew( Control );
+ input_base->set_name(TTR("Input Map"));
+ input_base->set_area_as_parent_rect();
+ tab_container->add_child(input_base);
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ input_base->add_child(vbc);
+ vbc->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN, 5 );
+ vbc->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END, 5 );
+ vbc->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN, 5 );
+ vbc->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END, 5 );
+
+ l = memnew( Label );
+ vbc->add_child(l);
+ l->set_pos(Point2(6,5));
+ l->set_text(TTR("Action:"));
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+ action_name = memnew( LineEdit );
+ action_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc->add_child(action_name);
+ action_name->connect("text_entered",this,"_action_adds");
+
+ add = memnew( Button );
+ hbc->add_child(add);
+ add->set_custom_minimum_size(Size2(150, 0));
+ add->set_text(TTR("Add"));
+ add->connect("pressed",this,"_action_add");
+
+ input_editor = memnew( Tree );
+ vbc->add_child(input_editor);
+ input_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+ input_editor->connect("item_edited",this,"_action_edited");
+ input_editor->connect("cell_selected",this,"_action_selected");
+ input_editor->connect("button_pressed",this,"_action_button_pressed");
+ popup_add = memnew( PopupMenu );
+ add_child(popup_add);
+ popup_add->connect("id_pressed",this,"_add_item");
+
+ press_a_key = memnew( ConfirmationDialog );
+ press_a_key->set_focus_mode(FOCUS_ALL);
+ add_child(press_a_key);
+
+ l = memnew( Label );
+ l->set_text(TTR("Press a Key.."));
+ l->set_area_as_parent_rect();
+ l->set_align(Label::ALIGN_CENTER);
+ l->set_margin(MARGIN_TOP,20);
+ l->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,30);
+ press_a_key_label=l;
+ press_a_key->add_child(l);
+ press_a_key->connect("gui_input",this,"_wait_for_key");
+ press_a_key->connect("confirmed",this,"_press_a_key_confirm");
+
+
+ device_input=memnew( ConfirmationDialog );
+ add_child(device_input);
+ device_input->get_ok()->set_text(TTR("Add"));
+ device_input->connect("confirmed",this,"_device_input_add");
+
+ hbc = memnew( HBoxContainer );
+ device_input->add_child(hbc);
+ //device_input->set_child_rect(hbc);
+
+ VBoxContainer *vbc_left = memnew( VBoxContainer );
+ hbc->add_child(vbc_left);
+
+ l = memnew( Label );
+ l->set_text(TTR("Device:"));
+ vbc_left->add_child(l);
+
+ device_id = memnew( SpinBox );
+ device_id->set_value(0);
+ vbc_left->add_child(device_id);
+
+ VBoxContainer *vbc_right = memnew( VBoxContainer );
+ hbc->add_child(vbc_right);
+ vbc_right->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ l = memnew( Label );
+ l->set_text(TTR("Index:"));
+ vbc_right->add_child(l);
+ device_index_label=l;
+
+ device_index = memnew( OptionButton );
+ vbc_right->add_child(device_index);
+
+ /*
+ save = memnew( Button );
+ input_base->add_child(save);
+ save->set_anchor(MARGIN_LEFT,ANCHOR_END);
+ save->set_anchor(MARGIN_RIGHT,ANCHOR_END);
+ save->set_anchor(MARGIN_TOP,ANCHOR_END);
+ save->set_anchor(MARGIN_BOTTOM,ANCHOR_END);
+ save->set_begin( Point2(80,28) );
+ save->set_end( Point2(10,20) );
+ save->set_text("Save");
+ save->connect("pressed",this,"_save");
+*/
+ setting=false;
+
+ //translations
+ TabContainer *translations = memnew( TabContainer );
+ translations->set_name(TTR("Localization"));
+ tab_container->add_child(translations);
+
+ {
+
+ VBoxContainer *tvb = memnew( VBoxContainer );
+ translations->add_child(tvb);
+ tvb->set_name(TTR("Translations"));
+ HBoxContainer *thb = memnew( HBoxContainer);
+ tvb->add_child(thb);
+ thb->add_child( memnew( Label(TTR("Translations:"))));
+ thb->add_spacer();
+ Button *addtr = memnew( Button(TTR("Add..")) );
+ addtr->connect("pressed",this,"_translation_file_open");
+ thb->add_child(addtr);
+ MarginContainer *tmc = memnew( MarginContainer );
+ tvb->add_child(tmc);
+ tmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ translation_list = memnew( Tree );
+ translation_list->set_v_size_flags(SIZE_EXPAND_FILL);
+ tmc->add_child(translation_list);
+
+ translation_file_open=memnew( EditorFileDialog );
+ add_child(translation_file_open);
+ translation_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ translation_file_open->connect("file_selected",this,"_translation_add");
+
+ }
+
+ {
+ VBoxContainer *tvb = memnew( VBoxContainer );
+ translations->add_child(tvb);
+ tvb->set_name(TTR("Remaps"));
+ HBoxContainer *thb = memnew( HBoxContainer);
+ tvb->add_child(thb);
+ thb->add_child( memnew( Label(TTR("Resources:"))));
+ thb->add_spacer();
+ Button *addtr = memnew( Button(TTR("Add..")) );
+ addtr->connect("pressed",this,"_translation_res_file_open");
+ thb->add_child(addtr);
+ MarginContainer *tmc = memnew( MarginContainer );
+ tvb->add_child(tmc);
+ tmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ translation_remap = memnew( Tree );
+ translation_remap->set_v_size_flags(SIZE_EXPAND_FILL);
+ translation_remap->connect("cell_selected",this,"_translation_res_select");
+ tmc->add_child(translation_remap);
+ translation_remap->connect("button_pressed",this,"_translation_res_delete");
+
+ translation_res_file_open=memnew( EditorFileDialog );
+ add_child(translation_res_file_open);
+ translation_res_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ translation_res_file_open->connect("file_selected",this,"_translation_res_add");
+
+ thb = memnew( HBoxContainer);
+ tvb->add_child(thb);
+ thb->add_child( memnew( Label(TTR("Remaps by Locale:"))));
+ thb->add_spacer();
+ addtr = memnew( Button(TTR("Add..")) );
+ addtr->connect("pressed",this,"_translation_res_option_file_open");
+ translation_res_option_add_button=addtr;
+ thb->add_child(addtr);
+ tmc = memnew( MarginContainer );
+ tvb->add_child(tmc);
+ tmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ translation_remap_options = memnew( Tree );
+ translation_remap_options->set_v_size_flags(SIZE_EXPAND_FILL);
+ tmc->add_child(translation_remap_options);
+
+ translation_remap_options->set_columns(2);
+ translation_remap_options->set_column_title(0,TTR("Path"));
+ translation_remap_options->set_column_title(1,TTR("Locale"));
+ translation_remap_options->set_column_titles_visible(true);
+ translation_remap_options->set_column_expand(0,true);
+ translation_remap_options->set_column_expand(1,false);
+ translation_remap_options->set_column_min_width(1,200);
+ translation_remap_options->connect("item_edited",this,"_translation_res_option_changed");
+ translation_remap_options->connect("button_pressed",this,"_translation_res_option_delete");
+
+ translation_res_option_file_open=memnew( EditorFileDialog );
+ add_child(translation_res_option_file_open);
+ translation_res_option_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ translation_res_option_file_open->connect("file_selected",this,"_translation_res_option_add");
+
+ }
+
+
+ {
+ autoload_settings = memnew( EditorAutoloadSettings );
+ autoload_settings->set_name(TTR("AutoLoad"));
+ tab_container->add_child(autoload_settings);
+ autoload_settings->connect("autoload_changed", this, "_settings_changed");
+ }
+
+ {
+
+ plugin_settings = memnew( EditorPluginSettings );
+ plugin_settings->set_name(TTR("Plugins"));
+ tab_container->add_child(plugin_settings);
+ }
+
+ timer = memnew( Timer );
+ timer->set_wait_time(1.5);
+ timer->connect("timeout",GlobalConfig::get_singleton(),"save");
+ timer->set_one_shot(true);
+ add_child(timer);
+
+ updating_translations=false;
+
+
+ /*
+ Control * es = memnew( Control );
+ es->set_name("Export");
+ tab_container->add_child(es);
+ export_settings = memnew( ProjectExportSettings );
+ es->add_child(export_settings);
+ export_settings->set_area_as_parent_rect();
+ export_settings->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END, 35 );
+*/
+}
diff --git a/editor/project_settings.h b/editor/project_settings.h
new file mode 100644
index 0000000000..96ac2e2c11
--- /dev/null
+++ b/editor/project_settings.h
@@ -0,0 +1,164 @@
+/*************************************************************************/
+/* project_settings.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROJECT_SETTINGS_H
+#define PROJECT_SETTINGS_H
+
+#include "scene/gui/dialogs.h"
+#include "property_editor.h"
+#include "undo_redo.h"
+#include "editor_data.h"
+#include "scene/gui/tab_container.h"
+#include "editor_autoload_settings.h"
+#include "editor_plugin_settings.h"
+
+//#include "project_export_settings.h"
+
+class ProjectSettings : public AcceptDialog {
+ GDCLASS( ProjectSettings, AcceptDialog );
+
+
+ TabContainer *tab_container;
+
+ Timer *timer;
+ InputEvent::Type add_type;
+ String add_at;
+
+ EditorData *data;
+ UndoRedo *undo_redo;
+ SectionedPropertyEditor *globals_editor;
+
+ HBoxContainer *search_bar;
+ ToolButton *search_button;
+ LineEdit *search_box;
+ ToolButton *clear_button;
+
+ HBoxContainer *add_prop_bar;
+ ConfirmationDialog *message;
+ LineEdit *category;
+ LineEdit *property;
+ OptionButton *type;
+ PopupMenu *popup_add;
+ ConfirmationDialog *press_a_key;
+ Label*press_a_key_label;
+ ConfirmationDialog *device_input;
+ SpinBox *device_id;
+ OptionButton *device_index;
+ Label *device_index_label;
+ MenuButton *popup_platform;
+
+ LineEdit *action_name;
+ Tree *input_editor;
+ bool setting;
+ bool updating_translations;
+
+ InputEvent last_wait_for_key;
+
+ EditorFileDialog *translation_file_open;
+ Tree *translation_list;
+
+
+ Button *translation_res_option_add_button;
+ EditorFileDialog *translation_res_file_open;
+ EditorFileDialog *translation_res_option_file_open;
+ Tree *translation_remap;
+ Tree *translation_remap_options;
+
+ EditorAutoloadSettings *autoload_settings;
+
+ EditorPluginSettings *plugin_settings;
+
+ void _item_selected();
+ void _item_adds(String);
+ void _item_add();
+ void _item_del();
+ void _update_actions();
+ void _save();
+ void _add_item(int p_item);
+
+ void _action_adds(String);
+ void _action_add();
+ void _device_input_add();
+
+ void _item_checked(const String& p_item, bool p_check);
+ void _action_selected();
+ void _action_edited();
+ void _action_button_pressed(Object* p_obj, int p_column,int p_id);
+ void _wait_for_key(const InputEvent& p_event);
+ void _press_a_key_confirm();
+ void _show_last_added(const InputEvent& p_event, const String& p_name);
+
+ void _settings_prop_edited(const String& p_name);
+ void _settings_changed();
+
+ //ProjectExportSettings *export_settings;
+ void _copy_to_platform(int p_which);
+
+
+ void _translation_file_open();
+ void _translation_add(const String& p_path);
+ void _translation_delete(Object *p_item,int p_column, int p_button);
+ void _update_translations();
+
+ void _translation_res_file_open();
+ void _translation_res_add(const String& p_path);
+ void _translation_res_delete(Object *p_item,int p_column, int p_button);
+ void _translation_res_select();
+ void _translation_res_option_file_open();
+ void _translation_res_option_add(const String& p_path);
+ void _translation_res_option_changed();
+ void _translation_res_option_delete(Object *p_item,int p_column, int p_button);
+
+ void _toggle_search_bar(bool p_pressed);
+ void _clear_search_box();
+
+
+
+ ProjectSettings();
+
+
+ static ProjectSettings *singleton;
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void add_translation(const String& p_translation);
+ static ProjectSettings *get_singleton() { return singleton; }
+ void popup_project_settings();
+ void set_plugins_page();
+
+ void queue_save();
+
+
+ ProjectSettings(EditorData *p_data);
+};
+
+#endif // PROJECT_SETTINGS_H
diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp
new file mode 100644
index 0000000000..533a5b156b
--- /dev/null
+++ b/editor/property_editor.cpp
@@ -0,0 +1,4960 @@
+/*************************************************************************/
+/* property_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "property_editor.h"
+
+#include "scene/gui/label.h"
+#include "io/resource_loader.h"
+#include "io/image_loader.h"
+#include "os/input.h"
+#include "os/keyboard.h"
+#include "class_db.h"
+#include "print_string.h"
+#include "global_config.h"
+#include "scene/resources/font.h"
+#include "pair.h"
+#include "scene/scene_string_names.h"
+#include "editor_settings.h"
+#include "editor_export.h"
+#include "editor_node.h"
+#include "multi_node_edit.h"
+#include "array_property_edit.h"
+#include "editor_help.h"
+#include "scene/resources/packed_scene.h"
+#include "scene/main/viewport.h"
+#include "editor_file_system.h"
+#include "create_dialog.h"
+#include "property_selector.h"
+#include "global_config.h"
+
+void CustomPropertyEditor::_notification(int p_what) {
+
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ RID ci = get_canvas_item();
+ get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ /*
+ if (v.get_type()==Variant::COLOR) {
+
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2( 10,10,60, get_size().height-20 ), v );
+ }*/
+ }
+}
+
+
+void CustomPropertyEditor::_menu_option(int p_which) {
+
+
+ switch(type) {
+
+ case Variant::INT: {
+
+ if (hint==PROPERTY_HINT_FLAGS) {
+
+ int val = v;
+
+ if (val&(1<<p_which)) {
+
+ val&=~(1<<p_which);
+ } else {
+ val|=(1<<p_which);
+ }
+
+ v=val;
+ emit_signal("variant_changed");
+ } else if (hint==PROPERTY_HINT_ENUM) {
+
+ v=p_which;
+ emit_signal("variant_changed");
+
+ }
+ } break;
+ case Variant::STRING: {
+
+ if (hint==PROPERTY_HINT_ENUM) {
+
+ v=hint_text.get_slice(",",p_which);
+ emit_signal("variant_changed");
+
+ }
+ } break;
+ case Variant::OBJECT: {
+
+ switch(p_which) {
+ case OBJ_MENU_LOAD: {
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ String type=(hint==PROPERTY_HINT_RESOURCE_TYPE)?hint_text:String();
+
+ List<String> extensions;
+ for (int i=0;i<type.get_slice_count(",");i++) {
+
+ ResourceLoader::get_recognized_extensions_for_type(type.get_slice(",",i),&extensions);
+ }
+
+ Set<String> valid_extensions;
+ for (List<String>::Element *E=extensions.front();E;E=E->next()) {
+ print_line("found: "+E->get());
+ valid_extensions.insert(E->get());
+ }
+
+ file->clear_filters();
+ for (Set<String>::Element *E=valid_extensions.front();E;E=E->next()) {
+
+ file->add_filter("*."+E->get()+" ; "+E->get().to_upper() );
+
+ }
+
+ file->popup_centered_ratio();
+ } break;
+
+ case OBJ_MENU_EDIT: {
+
+ RefPtr RefPtr=v;
+
+ if (!RefPtr.is_null()) {
+
+ emit_signal("resource_edit_request");
+ hide();
+ }
+ } break;
+ case OBJ_MENU_CLEAR: {
+
+
+ v=Variant();
+ emit_signal("variant_changed");
+ hide();
+ } break;
+
+ case OBJ_MENU_MAKE_UNIQUE: {
+
+
+ RefPtr RefPtr=v;
+ Ref<Resource> res_orig = RefPtr;
+ if (res_orig.is_null())
+ return;
+
+ List<PropertyInfo> property_list;
+ res_orig->get_property_list(&property_list);
+ List< Pair<String,Variant> > propvalues;
+
+ for(List<PropertyInfo>::Element *E=property_list.front();E;E=E->next()) {
+
+ Pair<String,Variant> p;
+ PropertyInfo &pi = E->get();
+ if (pi.usage&PROPERTY_USAGE_STORAGE) {
+
+ p.first=pi.name;
+ p.second=res_orig->get(pi.name);
+ }
+
+ propvalues.push_back(p);
+ }
+
+ String orig_type = res_orig->get_class();
+
+ Object *inst = ClassDB::instance( orig_type );
+
+ Ref<Resource> res = Ref<Resource>( inst->cast_to<Resource>() );
+
+ ERR_FAIL_COND(res.is_null());
+
+ for(List< Pair<String,Variant> >::Element *E=propvalues.front();E;E=E->next()) {
+
+ Pair<String,Variant> &p=E->get();
+ res->set(p.first,p.second);
+ }
+
+ v=res.get_ref_ptr();
+ emit_signal("variant_changed");
+ hide();
+ } break;
+
+ case OBJ_MENU_COPY: {
+
+ EditorSettings::get_singleton()->set_resource_clipboard(v);
+
+ } break;
+ case OBJ_MENU_PASTE: {
+
+ v=EditorSettings::get_singleton()->get_resource_clipboard();
+ emit_signal("variant_changed");
+
+ } break;
+ case OBJ_MENU_REIMPORT: {
+
+ RES r=v;
+/* if (r.is_valid() && r->get_import_metadata().is_valid()) {
+ Ref<ResourceImportMetadata> rimd = r->get_import_metadata();
+ Ref<EditorImportPlugin> eip = EditorImportExport::get_singleton()->get_import_plugin_by_name(rimd->get_editor());
+ if (eip.is_valid()) {
+ eip->import_dialog(r->get_path());
+ }
+ }*/
+ } break;
+ case OBJ_MENU_NEW_SCRIPT: {
+
+ if (owner->cast_to<Node>())
+ EditorNode::get_singleton()->get_scene_tree_dock()->open_script_dialog(owner->cast_to<Node>());
+
+ } break;
+ case OBJ_MENU_SHOW_IN_FILE_SYSTEM: {
+ RES r=v;
+ FileSystemDock *file_system_dock=EditorNode::get_singleton()->get_filesystem_dock();
+ file_system_dock->navigate_to_path(r->get_path());
+ // Ensure that the FileSystem dock is visible.
+ TabContainer* tab_container=(TabContainer*)file_system_dock->get_parent_control();
+ tab_container->set_current_tab(file_system_dock->get_position_in_parent());
+ } break;
+ default: {
+
+
+ ERR_FAIL_COND( inheritors_array.empty() );
+
+
+
+
+ String intype=inheritors_array[p_which-TYPE_BASE_ID];
+
+ if (intype=="ViewportTexture") {
+
+ scene_tree->set_title(TTR("Pick a Viewport"));
+ scene_tree->popup_centered_ratio();
+ picking_viewport=true;
+ return;
+
+ }
+
+ Object *obj = ClassDB::instance(intype);
+ ERR_BREAK( !obj );
+ Resource *res=obj->cast_to<Resource>();
+ ERR_BREAK( !res );
+ if (owner && hint==PROPERTY_HINT_RESOURCE_TYPE && hint_text=="Script") {
+ //make visual script the right type
+ res->call("set_instance_base_type",owner->get_class());
+ }
+
+ v=Ref<Resource>(res).get_ref_ptr();
+ emit_signal("variant_changed");
+
+ } break;
+ }
+
+
+ } break;
+ default:{}
+ }
+
+
+}
+
+void CustomPropertyEditor::hide_menu() {
+ menu->hide();
+}
+
+Variant CustomPropertyEditor::get_variant() const {
+
+ return v;
+}
+
+String CustomPropertyEditor::get_name() const {
+
+ return name;
+}
+
+bool CustomPropertyEditor::edit(Object* p_owner,const String& p_name,Variant::Type p_type, const Variant& p_variant,int p_hint,String p_hint_text) {
+
+ owner=p_owner;
+ updating=true;
+ name=p_name;
+ v=p_variant;
+ field_names.clear();
+ hint=p_hint;
+ hint_text=p_hint_text;
+ type_button->hide();
+ if (color_picker)
+ color_picker->hide();
+ texture_preview->hide();
+ inheritors_array.clear();
+ text_edit->hide();
+ easing_draw->hide();
+ spinbox->hide();
+ slider->hide();
+
+ for (int i=0;i<MAX_VALUE_EDITORS;i++) {
+
+ value_editor[i]->hide();
+ value_label[i]->hide();
+ if (i<4)
+ scroll[i]->hide();
+ }
+
+ for (int i=0;i<MAX_ACTION_BUTTONS;i++) {
+
+ action_buttons[i]->hide();
+ }
+
+ checks20gc->hide();
+ for(int i=0;i<20;i++)
+ checks20[i]->hide();
+
+ type = (p_variant.get_type()!=Variant::NIL && p_variant.get_type()!=Variant::_RID && p_type!=Variant::OBJECT)? p_variant.get_type() : p_type;
+
+
+ switch(type) {
+
+ case Variant::BOOL: {
+
+ checks20gc->show();
+
+ CheckBox *c=checks20[0];
+ c->set_text("True");
+ checks20gc->set_pos(Vector2(4,4));
+ c->set_pressed(v);
+ c->show();
+
+ checks20gc->set_size(checks20gc->get_minimum_size());
+ set_size(checks20gc->get_pos()+checks20gc->get_size()+Vector2(4,4)*EDSCALE);
+
+ } break;
+ case Variant::INT:
+ case Variant::REAL: {
+
+ if (hint==PROPERTY_HINT_RANGE) {
+
+ int c = hint_text.get_slice_count(",");
+ float min=0,max=100,step=1;
+ if (c>=1) {
+
+ if (!hint_text.get_slice(",",0).empty())
+ min=hint_text.get_slice(",",0).to_double();
+ }
+ if (c>=2) {
+
+ if (!hint_text.get_slice(",",1).empty())
+ max=hint_text.get_slice(",",1).to_double();
+ }
+
+ if (c>=3) {
+
+ if (!hint_text.get_slice(",",2).empty())
+ step= hint_text.get_slice(",",2).to_double();
+ }
+
+ if (c>=4 && hint_text.get_slice(",",3)=="slider") {
+ slider->set_min(min);
+ slider->set_max(max);
+ slider->set_step(step);
+ slider->set_value(v);
+ slider->show();
+ set_size(Size2(110,30)*EDSCALE);
+ } else {
+ spinbox->set_min(min);
+ spinbox->set_max(max);
+ spinbox->set_step(step);
+ spinbox->set_value(v);
+ spinbox->show();
+ set_size(Size2(70,35)*EDSCALE);
+ }
+
+ } else if (hint==PROPERTY_HINT_ENUM) {
+
+ menu->clear();
+ Vector<String> options = hint_text.split(",");
+ for(int i=0;i<options.size();i++) {
+ menu->add_item(options[i],i);
+ }
+ menu->set_pos(get_pos());
+ menu->popup();
+ hide();
+ updating=false;
+ return false;
+
+
+ } else if (hint==PROPERTY_HINT_LAYERS_2D_PHYSICS || hint==PROPERTY_HINT_LAYERS_2D_RENDER || hint==PROPERTY_HINT_LAYERS_3D_PHYSICS || hint==PROPERTY_HINT_LAYERS_3D_RENDER) {
+
+
+ String title;
+ String basename;
+ switch (hint) {
+ case PROPERTY_HINT_LAYERS_2D_RENDER: basename="layer_names/2d_render"; title="2D Render Layers"; break;
+ case PROPERTY_HINT_LAYERS_2D_PHYSICS: basename="layer_names/2d_physics"; title="2D Physics Layers"; break;
+ case PROPERTY_HINT_LAYERS_3D_RENDER: basename="layer_names/3d_render"; title="3D Render Layers"; break;
+ case PROPERTY_HINT_LAYERS_3D_PHYSICS: basename="layer_names/3d_physics";title="3D Physics Layers"; break;
+ }
+
+ checks20gc->show();
+ uint32_t flgs = v;
+ for(int i=0;i<2;i++) {
+
+ Point2 ofs(4,4);
+ ofs.y+=22*i;
+ for(int j=0;j<10;j++) {
+
+ int idx = i*10+j;
+ CheckBox *c=checks20[idx];
+ c->set_text(GlobalConfig::get_singleton()->get(basename+"/layer_"+itos(idx+1)));
+ c->set_pressed( flgs & (1<<(i*10+j)) );
+ c->show();
+ }
+
+
+ }
+
+ show();
+
+ value_label[0]->set_text(title);
+ value_label[0]->show();
+ value_label[0]->set_pos(Vector2(4,4)*EDSCALE);
+
+ checks20gc->set_pos(Vector2(4,4)*EDSCALE+Vector2(0,value_label[0]->get_size().height+4*EDSCALE));
+ checks20gc->set_size(checks20gc->get_minimum_size());
+
+ set_size(Vector2(4,4)*EDSCALE+checks20gc->get_pos()+checks20gc->get_size());
+
+
+ } else if (hint==PROPERTY_HINT_EXP_EASING) {
+
+ easing_draw->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
+ easing_draw->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
+ easing_draw->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,5);
+ easing_draw->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,30);
+ type_button->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,3);
+ type_button->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,3);
+ type_button->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,25);
+ type_button->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,7);
+ type_button->set_text(TTR("Preset.."));
+ type_button->get_popup()->clear();
+ type_button->get_popup()->add_item(TTR("Linear"),EASING_LINEAR);
+ type_button->get_popup()->add_item(TTR("Ease In"),EASING_EASE_IN);
+ type_button->get_popup()->add_item(TTR("Ease Out"),EASING_EASE_OUT);
+ if (hint_text!="attenuation") {
+ type_button->get_popup()->add_item(TTR("Zero"),EASING_ZERO);
+ type_button->get_popup()->add_item(TTR("Easing In-Out"),EASING_IN_OUT);
+ type_button->get_popup()->add_item(TTR("Easing Out-In"),EASING_OUT_IN);
+ }
+
+ type_button->show();
+ easing_draw->show();
+ set_size(Size2(200,150)*EDSCALE);
+ } else if (hint==PROPERTY_HINT_FLAGS) {
+ menu->clear();
+ Vector<String> flags = hint_text.split(",");
+ for(int i=0;i<flags.size();i++) {
+ String flag = flags[i];
+ if (flag=="")
+ continue;
+ menu->add_check_item(flag,i);
+ int f = v;
+ if (f&(1<<i))
+ menu->set_item_checked(menu->get_item_index(i),true);
+ }
+ menu->set_pos(get_pos());
+ menu->popup();
+ hide();
+ updating=false;
+ return false;
+
+ } else {
+ List<String> names;
+ names.push_back("value:");
+ config_value_editors(1,1,50,names);
+ value_editor[0]->set_text( String::num(v) );
+ }
+
+ } break;
+ case Variant::STRING: {
+
+ if (hint==PROPERTY_HINT_FILE || hint==PROPERTY_HINT_GLOBAL_FILE) {
+
+ List<String> names;
+ names.push_back(TTR("File.."));
+ names.push_back(TTR("Clear"));
+ config_action_buttons(names);
+
+ } else if (hint==PROPERTY_HINT_DIR || hint==PROPERTY_HINT_GLOBAL_DIR) {
+
+ List<String> names;
+ names.push_back(TTR("Dir.."));
+ names.push_back(TTR("Clear"));
+ config_action_buttons(names);
+ } else if (hint==PROPERTY_HINT_ENUM) {
+
+ menu->clear();
+ Vector<String> options = hint_text.split(",");
+ for(int i=0;i<options.size();i++) {
+ menu->add_item(options[i],i);
+ }
+ menu->set_pos(get_pos());
+ menu->popup();
+ hide();
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_MULTILINE_TEXT) {
+
+ text_edit->show();
+ text_edit->set_text(v);
+
+ //action_buttons[0];
+
+ int button_margin = get_constant("button_margin","Dialogs");
+ int margin = get_constant("margin","Dialogs");
+
+ action_buttons[0]->set_anchor( MARGIN_LEFT, ANCHOR_END );
+ action_buttons[0]->set_anchor( MARGIN_TOP, ANCHOR_END );
+ action_buttons[0]->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ action_buttons[0]->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ action_buttons[0]->set_begin( Point2( 70, button_margin-5 ) );
+ action_buttons[0]->set_end( Point2( margin, margin ) );
+ action_buttons[0]->set_text(TTR("Close"));
+ action_buttons[0]->show();
+
+ } else if (hint==PROPERTY_HINT_TYPE_STRING) {
+
+ /* FIXME: This is repeated twice, with slightly different behavior! Which one? Check line 644 */
+ if (!create_dialog) {
+ create_dialog = memnew( CreateDialog );
+ create_dialog->connect("create",this,"_create_dialog_callback");
+ add_child(create_dialog);
+ }
+
+ if (hint_text!=String()) {
+ create_dialog->set_base_type(hint_text);
+ } else {
+ create_dialog->set_base_type("Object");
+ }
+
+ create_dialog->popup(false);
+ hide();
+ updating=false;
+ return false;
+
+
+ } else if (hint==PROPERTY_HINT_METHOD_OF_VARIANT_TYPE) {
+#define MAKE_PROPSELECT if (!property_select) { property_select = memnew(PropertySelector); property_select->connect("selected",this,"_create_selected_property"); add_child(property_select); } hide();
+
+ MAKE_PROPSELECT;
+
+ Variant::Type type=Variant::NIL;
+ for(int i=0;i<Variant::VARIANT_MAX;i++) {
+ if (hint_text==Variant::get_type_name(Variant::Type(i))) {
+ type=Variant::Type(i);
+ }
+ }
+ if (type)
+ property_select->select_method_from_basic_type(type,v);
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_METHOD_OF_BASE_TYPE) {
+ MAKE_PROPSELECT
+
+ property_select->select_method_from_base_type(hint_text,v);
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_METHOD_OF_INSTANCE) {
+
+ MAKE_PROPSELECT
+
+ Object *instance = ObjectDB::get_instance(hint_text.to_int64());
+ if (instance)
+ property_select->select_method_from_instance(instance,v);
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_METHOD_OF_SCRIPT) {
+ MAKE_PROPSELECT
+
+ Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ if (obj && obj->cast_to<Script>()) {
+ property_select->select_method_from_script(obj->cast_to<Script>(),v);
+ }
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE) {
+
+ MAKE_PROPSELECT
+ Variant::Type type=Variant::NIL;
+ String tname=hint_text;
+ if (tname.find(".")!=-1)
+ tname=tname.get_slice(".",0);
+ for(int i=0;i<Variant::VARIANT_MAX;i++) {
+ if (tname==Variant::get_type_name(Variant::Type(i))) {
+ type=Variant::Type(Variant::Type(i));
+ }
+ }
+ InputEvent::Type iet = InputEvent::NONE;
+ if (hint_text.find(".")!=-1) {
+ iet=InputEvent::Type(int(hint_text.get_slice(".",1).to_int()));
+ }
+ if (type)
+ property_select->select_property_from_basic_type(type,iet,v);
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_PROPERTY_OF_BASE_TYPE) {
+
+ MAKE_PROPSELECT
+
+ property_select->select_property_from_base_type(hint_text,v);
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_PROPERTY_OF_INSTANCE) {
+
+ Object *instance = ObjectDB::get_instance(hint_text.to_int64());
+ if (instance)
+ property_select->select_property_from_instance(instance,v);
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_PROPERTY_OF_SCRIPT) {
+ MAKE_PROPSELECT
+
+ Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ if (obj && obj->cast_to<Script>()) {
+ property_select->select_property_from_script(obj->cast_to<Script>(),v);
+ }
+
+ updating=false;
+ return false;
+
+ } else if (hint==PROPERTY_HINT_TYPE_STRING) {
+ if (!create_dialog) {
+ /* FIXME: ... and here. See line 529 */
+ create_dialog = memnew( CreateDialog );
+ create_dialog->connect("create",this,"_create_dialog_callback");
+ add_child(create_dialog);
+ }
+
+ } else {
+ List<String> names;
+ names.push_back("string:");
+ config_value_editors(1,1,50,names);
+ value_editor[0]->set_text( v );
+ }
+
+ } break;
+ case Variant::VECTOR2: {
+
+ field_names.push_back("x");
+ field_names.push_back("y");
+ config_value_editors(2,2,10,field_names);
+ Vector2 vec=v;
+ value_editor[0]->set_text( String::num( vec.x) );
+ value_editor[1]->set_text( String::num( vec.y) );
+ } break;
+ case Variant::RECT2: {
+
+ field_names.push_back("x");
+ field_names.push_back("y");
+ field_names.push_back("w");
+ field_names.push_back("h");
+ config_value_editors(4,4,10,field_names);
+ Rect2 r=v;
+ value_editor[0]->set_text( String::num( r.pos.x) );
+ value_editor[1]->set_text( String::num( r.pos.y) );
+ value_editor[2]->set_text( String::num( r.size.x) );
+ value_editor[3]->set_text( String::num( r.size.y) );
+ } break;
+ case Variant::VECTOR3: {
+
+ field_names.push_back("x");
+ field_names.push_back("y");
+ field_names.push_back("z");
+ config_value_editors(3,3,10,field_names);
+ Vector3 vec=v;
+ value_editor[0]->set_text( String::num( vec.x) );
+ value_editor[1]->set_text( String::num( vec.y) );
+ value_editor[2]->set_text( String::num( vec.z) );
+ } break;
+ case Variant::PLANE: {
+
+ field_names.push_back("x");
+ field_names.push_back("y");
+ field_names.push_back("z");
+ field_names.push_back("d");
+ config_value_editors(4,4,10,field_names);
+ Plane plane=v;
+ value_editor[0]->set_text( String::num( plane.normal.x ) );
+ value_editor[1]->set_text( String::num( plane.normal.y ) );
+ value_editor[2]->set_text( String::num( plane.normal.z ) );
+ value_editor[3]->set_text( String::num( plane.d ) );
+
+ } break;
+ case Variant::QUAT: {
+
+ field_names.push_back("x");
+ field_names.push_back("y");
+ field_names.push_back("z");
+ field_names.push_back("w");
+ config_value_editors(4,4,10,field_names);
+ Quat q=v;
+ value_editor[0]->set_text( String::num( q.x ) );
+ value_editor[1]->set_text( String::num( q.y ) );
+ value_editor[2]->set_text( String::num( q.z ) );
+ value_editor[3]->set_text( String::num( q.w ) );
+
+ } break;
+ case Variant::RECT3: {
+
+ field_names.push_back("px");
+ field_names.push_back("py");
+ field_names.push_back("pz");
+ field_names.push_back("sx");
+ field_names.push_back("sy");
+ field_names.push_back("sz");
+ config_value_editors(6,3,16,field_names);
+
+ Rect3 aabb=v;
+ value_editor[0]->set_text( String::num( aabb.pos.x ) );
+ value_editor[1]->set_text( String::num( aabb.pos.y ) );
+ value_editor[2]->set_text( String::num( aabb.pos.z ) );
+ value_editor[3]->set_text( String::num( aabb.size.x ) );
+ value_editor[4]->set_text( String::num( aabb.size.y ) );
+ value_editor[5]->set_text( String::num( aabb.size.z ) );
+
+ } break;
+ case Variant::TRANSFORM2D: {
+
+ field_names.push_back("xx");
+ field_names.push_back("xy");
+ field_names.push_back("yx");
+ field_names.push_back("yy");
+ field_names.push_back("ox");
+ field_names.push_back("oy");
+ config_value_editors(6,2,16,field_names);
+
+ Transform2D basis=v;
+ for(int i=0;i<6;i++) {
+
+ value_editor[i]->set_text( String::num( basis.elements[i/2][i%2] ) );
+ }
+
+ } break;
+ case Variant::BASIS: {
+
+ field_names.push_back("xx");
+ field_names.push_back("xy");
+ field_names.push_back("xz");
+ field_names.push_back("yx");
+ field_names.push_back("yy");
+ field_names.push_back("yz");
+ field_names.push_back("zx");
+ field_names.push_back("zy");
+ field_names.push_back("zz");
+ config_value_editors(9,3,16,field_names);
+
+ Basis basis=v;
+ for(int i=0;i<9;i++) {
+
+ value_editor[i]->set_text( String::num( basis.elements[i/3][i%3] ) );
+ }
+
+ } break;
+ case Variant::TRANSFORM: {
+
+
+ field_names.push_back("xx");
+ field_names.push_back("xy");
+ field_names.push_back("xz");
+ field_names.push_back("xo");
+ field_names.push_back("yx");
+ field_names.push_back("yy");
+ field_names.push_back("yz");
+ field_names.push_back("yo");
+ field_names.push_back("zx");
+ field_names.push_back("zy");
+ field_names.push_back("zz");
+ field_names.push_back("zo");
+ config_value_editors(12,4,16,field_names);
+
+ Transform tr=v;
+ for(int i=0;i<9;i++) {
+
+ value_editor[(i/3)*4+i%3]->set_text( String::num( tr.basis.elements[i/3][i%3] ) );
+ }
+
+ value_editor[3]->set_text( String::num( tr.origin.x ) );
+ value_editor[7]->set_text( String::num( tr.origin.y ) );
+ value_editor[11]->set_text( String::num( tr.origin.z ) );
+
+ } break;
+ case Variant::COLOR: {
+
+ if (!color_picker) {
+ //late init for performance
+ color_picker = memnew( ColorPicker );
+ add_child(color_picker);
+ color_picker->hide();
+ color_picker->set_area_as_parent_rect();
+ for(int i=0;i<4;i++)
+ color_picker->set_margin((Margin)i,5);
+ color_picker->connect("color_changed",this,"_color_changed");
+ }
+
+ color_picker->show();
+ color_picker->set_edit_alpha(hint!=PROPERTY_HINT_COLOR_NO_ALPHA);
+ color_picker->set_pick_color(v);
+ set_size( Size2(300*EDSCALE, color_picker->get_combined_minimum_size().height+10*EDSCALE));
+ color_picker->set_focus_on_line_edit();
+ /*
+ int ofs=80;
+ int m=10;
+ int h=20;
+ Color c=v;
+ float values[4]={c.r,c.g,c.b,c.a};
+ for (int i=0;i<4;i++) {
+ int y=m+i*h;
+
+ value_editor[i]->show();
+ value_label[i]->show();
+ value_label[i]->set_pos(Point2(ofs,y));
+ scroll[i]->set_min(0);
+ scroll[i]->set_max(1.0);
+ scroll[i]->set_page(0);
+ scroll[i]->set_pos(Point2(ofs+15,y+Math::floor((h-scroll[i]->get_minimum_size().height)/2.0)));
+ scroll[i]->set_val(values[i]);
+ scroll[i]->set_size(Size2(120,1));
+ scroll[i]->show();
+ value_editor[i]->set_pos(Point2(ofs+140,y));
+ value_editor[i]->set_size(Size2(40,h));
+ value_editor[i]->set_text( String::num(values[i],2 ));
+
+ }
+
+ value_label[0]->set_text("R");
+ value_label[1]->set_text("G");
+ value_label[2]->set_text("B");
+ value_label[3]->set_text("A");
+
+ Size2 new_size = value_editor[3]->get_pos() + value_editor[3]->get_size() + Point2(10,10);
+ set_size( new_size );
+ */
+
+ } break;
+ case Variant::IMAGE: {
+
+ List<String> names;
+ names.push_back(TTR("New"));
+ names.push_back(TTR("Load"));
+ names.push_back(TTR("Clear"));
+ config_action_buttons(names);
+
+ } break;
+ case Variant::NODE_PATH: {
+
+ List<String> names;
+ names.push_back(TTR("Assign"));
+ names.push_back(TTR("Clear"));
+ config_action_buttons(names);
+
+ } break;
+ case Variant::OBJECT: {
+
+ if (hint!=PROPERTY_HINT_RESOURCE_TYPE)
+ break;
+
+
+ menu->clear();
+ menu->set_size(Size2(1,1));
+
+ if (p_name=="script" && hint_text=="Script" && owner->cast_to<Node>()) {
+ menu->add_icon_item(get_icon("Script","EditorIcons"),TTR("New Script"),OBJ_MENU_NEW_SCRIPT);
+ menu->add_separator();
+ } else if (hint_text!="") {
+ int idx=0;
+
+ for(int i=0;i<hint_text.get_slice_count(",");i++) {
+
+
+
+ String base=hint_text.get_slice(",",i);
+
+ Set<String> valid_inheritors;
+ valid_inheritors.insert(base);
+ List<StringName> inheritors;
+ ClassDB::get_inheriters_from_class(base.strip_edges(),&inheritors);
+ List<StringName>::Element *E=inheritors.front();
+ while(E) {
+ valid_inheritors.insert(E->get());
+ E=E->next();
+ }
+
+ for(Set<String>::Element *E=valid_inheritors.front();E;E=E->next()) {
+ String t = E->get();
+ if (!ClassDB::can_instance(t))
+ continue;
+ inheritors_array.push_back(t);
+
+ int id = TYPE_BASE_ID+idx;
+ if (has_icon(t,"EditorIcons")) {
+
+ menu->add_icon_item(get_icon(t,"EditorIcons"),TTR("New")+" "+t,id);
+ } else {
+
+ menu->add_item(TTR("New")+" "+t,id);
+ }
+
+ idx++;
+ }
+
+
+ }
+
+ if (menu->get_item_count())
+ menu->add_separator();
+ }
+
+ menu->add_icon_item(get_icon("Load","EditorIcons"),"Load",OBJ_MENU_LOAD);
+
+ if (!RES(v).is_null()) {
+
+
+
+ menu->add_icon_item(get_icon("EditResource","EditorIcons"),"Edit",OBJ_MENU_EDIT);
+ menu->add_icon_item(get_icon("Del","EditorIcons"),"Clear",OBJ_MENU_CLEAR);
+ menu->add_icon_item(get_icon("Duplicate","EditorIcons"),"Make Unique",OBJ_MENU_MAKE_UNIQUE);
+ RES r = v;
+ if (r.is_valid() && r->get_path().is_resource_file()) {
+ /*if (r->get_import_metadata().is_valid()) {
+ menu->add_separator();
+ menu->add_icon_item(get_icon("ReloadSmall","EditorIcons"),"Re-Import",OBJ_MENU_REIMPORT);
+ }*/
+ menu->add_separator();
+ menu->add_item(TTR("Show in File System"),OBJ_MENU_SHOW_IN_FILE_SYSTEM);
+ }
+ /*if (r.is_valid() && r->get_path().is_resource_file()) {
+ menu->set_item_tooltip(1,r->get_path());
+ } else if (r.is_valid()) {
+ menu->set_item_tooltip(1,r->get_name()+" ("+r->get_type()+")");
+ }*/
+ } else {
+
+ }
+
+
+ RES cb=EditorSettings::get_singleton()->get_resource_clipboard();
+ bool paste_valid=false;
+ if (cb.is_valid()) {
+ if (hint_text=="")
+ paste_valid=true;
+ else
+ for (int i = 0; i < hint_text.get_slice_count(",");i++)
+ if (ClassDB::is_parent_class(cb->get_class(),hint_text.get_slice(",",i))) {
+ paste_valid=true;
+ break;
+ }
+ }
+
+ if (!RES(v).is_null() || paste_valid) {
+ menu->add_separator();
+
+
+ if (!RES(v).is_null()) {
+
+ menu->add_item(TTR("Copy"),OBJ_MENU_COPY);
+ }
+
+ if (paste_valid) {
+
+ menu->add_item(TTR("Paste"),OBJ_MENU_PASTE);
+ }
+ }
+
+
+
+ menu->set_pos(get_pos());
+ menu->popup();
+ hide();
+ updating=false;
+ return false;
+
+
+ } break;
+ case Variant::INPUT_EVENT: {
+
+
+ } break;
+ case Variant::DICTIONARY: {
+
+
+ } break;
+ case Variant::POOL_BYTE_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_INT_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_REAL_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_STRING_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_VECTOR3_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_COLOR_ARRAY: {
+
+
+ } break;
+ default: {}
+ }
+
+ updating=false;
+ return true;
+}
+
+////void CustomPropertyEditor::_save_properties_values(List<String> p_names) {
+////
+//// field_names=p_names;
+//// for (int i=0;i<p_names.size();i++) {
+//// field_values.push_back(v.get(p_names[i]));
+//// }
+////}
+
+void CustomPropertyEditor::_file_selected(String p_file) {
+
+ switch(type) {
+
+ case Variant::STRING: {
+
+ if (hint==PROPERTY_HINT_FILE || hint==PROPERTY_HINT_DIR) {
+
+ v=GlobalConfig::get_singleton()->localize_path(p_file);
+ emit_signal("variant_changed");
+ hide();
+ }
+
+ if (hint==PROPERTY_HINT_GLOBAL_FILE || hint==PROPERTY_HINT_GLOBAL_DIR) {
+
+ v=p_file;
+ emit_signal("variant_changed");
+ hide();
+ }
+
+ } break;
+ case Variant::OBJECT: {
+
+ String type=(hint==PROPERTY_HINT_RESOURCE_TYPE)?hint_text:String();
+
+ RES res = ResourceLoader::load(p_file,type);
+ if (res.is_null()) {
+ error->set_text(TTR("Error loading file: Not a resource!"));
+ error->popup_centered_minsize();
+ break;
+ }
+ v=res.get_ref_ptr();
+ emit_signal("variant_changed");
+ hide();
+ } break;
+ case Variant::IMAGE: {
+
+ Image image;
+ Error err = ImageLoader::load_image(p_file,&image);
+ ERR_EXPLAIN(TTR("Couldn't load image"));
+ ERR_FAIL_COND(err);
+ v=image;
+ emit_signal("variant_changed");
+ hide();
+ } break;
+ default: {}
+ }
+}
+
+void CustomPropertyEditor::_type_create_selected(int p_idx) {
+
+
+ if (type==Variant::INT || type==Variant::REAL) {
+
+
+ float newval=0;
+ switch(p_idx) {
+
+ case EASING_LINEAR: {
+
+ newval=1;
+ } break;
+ case EASING_EASE_IN: {
+
+ newval=2.0;
+ } break;
+ case EASING_EASE_OUT: {
+ newval=0.5;
+ } break;
+ case EASING_ZERO: {
+
+ newval=0;
+ } break;
+ case EASING_IN_OUT: {
+
+ newval=-0.5;
+ } break;
+ case EASING_OUT_IN: {
+ newval=-2.0;
+ } break;
+ }
+
+ v=newval;
+ emit_signal("variant_changed");
+ easing_draw->update();
+
+ } else if (type==Variant::OBJECT) {
+
+ ERR_FAIL_INDEX(p_idx,inheritors_array.size());
+
+ //List<String> inheritors;
+ //ClassDB::get_inheriters_from(hint_text,&inheritors);
+ //inheritors.push_front(hint_text);
+
+ //ERR_FAIL_INDEX( p_idx, inheritors.size() );
+ String intype=inheritors_array[p_idx];
+
+ Object *obj = ClassDB::instance(intype);
+
+ ERR_FAIL_COND( !obj );
+
+
+ Resource *res=obj->cast_to<Resource>();
+ ERR_FAIL_COND( !res );
+
+ v=Ref<Resource>(res).get_ref_ptr();
+ emit_signal("variant_changed");
+ hide();
+ }
+
+}
+
+
+void CustomPropertyEditor::_color_changed(const Color& p_color) {
+
+ v=p_color;
+ emit_signal("variant_changed");
+
+}
+
+void CustomPropertyEditor::_node_path_selected(NodePath p_path) {
+
+ if (picking_viewport) {
+
+ Node* to_node=get_node(p_path);
+ if (!to_node->cast_to<Viewport>()) {
+ EditorNode::get_singleton()->show_warning("Selected node is not a Viewport!");
+ return;
+ }
+
+ Ref<ViewportTexture> vt;
+ vt.instance();
+ vt->set_viewport_path_in_scene(get_tree()->get_edited_scene_root()->get_path_to(to_node));
+ vt->setup_local_to_scene();
+ v=vt;
+ emit_signal("variant_changed");
+ return;
+ }
+
+ if (hint==PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && hint_text!=String()) {
+
+ Node* node=get_node(hint_text);
+ if (node) {
+
+ Node *tonode=node->get_node(p_path);
+ if (tonode) {
+ p_path=node->get_path_to(tonode);
+ }
+ }
+
+ } else if (owner) {
+
+ Node *node=NULL;
+
+ if (owner->is_class("Node"))
+ node = owner->cast_to<Node>();
+ else if (owner->is_class("ArrayPropertyEdit"))
+ node = owner->cast_to<ArrayPropertyEdit>()->get_node();
+
+ if (!node) {
+ v=p_path;
+ emit_signal("variant_changed");
+ call_deferred("hide"); //to not mess with dialogs
+ return;
+ }
+
+ Node *tonode=node->get_node(p_path);
+ if (tonode) {
+ p_path=node->get_path_to(tonode);
+ }
+ }
+
+ v=p_path;
+ emit_signal("variant_changed");
+ call_deferred("hide"); //to not mess with dialogs
+
+}
+
+void CustomPropertyEditor::_action_pressed(int p_which) {
+
+
+ if (updating)
+ return;
+
+ switch(type) {
+ case Variant::BOOL: {
+ v=checks20[0]->is_pressed();
+ emit_signal("variant_changed");
+ } break;
+ case Variant::INT: {
+
+ if (hint==PROPERTY_HINT_LAYERS_2D_PHYSICS || hint==PROPERTY_HINT_LAYERS_2D_RENDER || hint==PROPERTY_HINT_LAYERS_3D_PHYSICS || hint==PROPERTY_HINT_LAYERS_3D_RENDER) {
+
+ uint32_t f = v;
+ if (checks20[p_which]->is_pressed())
+ f|=(1<<p_which);
+ else
+ f&=~(1<<p_which);
+
+ v=f;
+ emit_signal("variant_changed");
+ }
+
+ } break;
+ case Variant::STRING: {
+
+ if (hint==PROPERTY_HINT_MULTILINE_TEXT) {
+
+ hide();
+
+ } else if (hint==PROPERTY_HINT_FILE || hint==PROPERTY_HINT_GLOBAL_FILE) {
+ if (p_which==0) {
+
+ if (hint==PROPERTY_HINT_FILE)
+ file->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ else
+ file->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->clear_filters();
+
+ file->clear_filters();
+
+
+ if (hint_text!="") {
+ Vector<String> extensions=hint_text.split(",");
+ for(int i=0;i<extensions.size();i++) {
+
+ String filter = extensions[i];
+ if (filter.begins_with("."))
+ filter="*"+extensions[i];
+ else if (!filter.begins_with("*"))
+ filter="*."+extensions[i];
+
+
+ file->add_filter(filter+" ; "+extensions[i].to_upper() );
+
+ }
+ }
+ file->popup_centered_ratio();
+ } else {
+
+ v="";
+ emit_signal("variant_changed");
+ hide();
+
+ }
+
+ } else if (hint==PROPERTY_HINT_DIR || hint==PROPERTY_HINT_GLOBAL_DIR) {
+
+ if (p_which==0) {
+
+ if (hint==PROPERTY_HINT_DIR)
+ file->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ else
+ file->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ file->clear_filters();
+ file->popup_centered_ratio();
+ } else {
+
+ v="";
+ emit_signal("variant_changed");
+ hide();
+
+ }
+
+ }
+
+ } break;
+ case Variant::NODE_PATH: {
+
+ if (p_which==0) {
+
+ picking_viewport=false;
+ scene_tree->set_title(TTR("Pick a Node"));
+ scene_tree->popup_centered_ratio();
+
+ } else if (p_which==1) {
+
+
+ v=NodePath();
+ emit_signal("variant_changed");
+ hide();
+ }
+ } break;
+ case Variant::OBJECT: {
+
+ if (p_which==0) {
+
+
+ ERR_FAIL_COND( inheritors_array.empty() );
+
+ String intype=inheritors_array[0];
+
+
+ if (hint==PROPERTY_HINT_RESOURCE_TYPE) {
+
+ Object *obj = ClassDB::instance(intype);
+ ERR_BREAK( !obj );
+ Resource *res=obj->cast_to<Resource>();
+ ERR_BREAK( !res );
+
+ v=Ref<Resource>(res).get_ref_ptr();
+ emit_signal("variant_changed");
+ hide();
+
+ }
+ } else if (p_which==1) {
+
+ file->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ List<String> extensions;
+ String type=(hint==PROPERTY_HINT_RESOURCE_TYPE)?hint_text:String();
+
+ ResourceLoader::get_recognized_extensions_for_type(type,&extensions);
+ file->clear_filters();
+ for (List<String>::Element *E=extensions.front();E;E=E->next()) {
+
+ file->add_filter("*."+E->get()+" ; "+E->get().to_upper() );
+
+ }
+
+ file->popup_centered_ratio();
+
+ } else if (p_which==2) {
+
+ RefPtr RefPtr=v;
+
+ if (!RefPtr.is_null()) {
+
+ emit_signal("resource_edit_request");
+ hide();
+ }
+
+ } else if (p_which==3) {
+
+
+ v=Variant();
+ emit_signal("variant_changed");
+ hide();
+ } else if (p_which==4) {
+
+
+ RefPtr RefPtr=v;
+ Ref<Resource> res_orig = RefPtr;
+ if (res_orig.is_null())
+ return;
+
+ List<PropertyInfo> property_list;
+ res_orig->get_property_list(&property_list);
+ List< Pair<String,Variant> > propvalues;
+
+ for(List<PropertyInfo>::Element *E=property_list.front();E;E=E->next()) {
+
+ Pair<String,Variant> p;
+ PropertyInfo &pi = E->get();
+ if (pi.usage&PROPERTY_USAGE_STORAGE) {
+
+ p.first=pi.name;
+ p.second=res_orig->get(pi.name);
+ }
+
+ propvalues.push_back(p);
+ }
+
+ Ref<Resource> res = Ref<Resource>( ClassDB::instance( res_orig->get_class() ));
+
+ ERR_FAIL_COND(res.is_null());
+
+ for(List< Pair<String,Variant> >::Element *E=propvalues.front();E;E=E->next()) {
+
+ Pair<String,Variant> &p=E->get();
+ res->set(p.first,p.second);
+ }
+
+ v=res.get_ref_ptr();
+ emit_signal("variant_changed");
+ hide();
+ }
+
+ } break;
+ case Variant::IMAGE: {
+
+ if (p_which==0) {
+ //new image too difficult
+ ERR_PRINT("New Image Unimplemented");
+
+ } else if (p_which==1) {
+
+ file->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ List<String> extensions;
+ ImageLoader::get_recognized_extensions(&extensions);
+
+ file->clear_filters();
+
+ for (List<String>::Element *E=extensions.front();E;E=E->next()) {
+
+ file->add_filter("*."+E->get()+" ; "+E->get().to_upper() );
+
+ }
+
+ file->popup_centered_ratio();
+
+ } else if (p_which==2) {
+
+ v=Image();
+ emit_signal("variant_changed");
+ hide();
+ }
+
+ } break;
+ default: {};
+ }
+
+}
+
+void CustomPropertyEditor::_scroll_modified(double p_value) {
+
+ if (updating)
+ return;
+ /*
+ switch(type) {
+
+ case Variant::COLOR: {
+
+ for (int i=0;i<4;i++) {
+
+ value_editor[i]->set_text( String::num(scroll[i]->get_val(),2) );
+ }
+ Color c;
+ c.r=scroll[0]->get_val();
+ c.g=scroll[1]->get_val();
+ c.b=scroll[2]->get_val();
+ c.a=scroll[3]->get_val();
+ v=c;
+ update();
+ emit_signal("variant_changed");
+ } break;
+ default: {}
+ }
+ */
+}
+
+
+void CustomPropertyEditor::_drag_easing(const InputEvent& p_ev) {
+
+
+ if (p_ev.type==InputEvent::MOUSE_MOTION && p_ev.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+
+ float rel = p_ev.mouse_motion.relative_x;
+ if (rel==0)
+ return;
+
+ bool flip=hint_text=="attenuation";
+
+ if (flip)
+ rel=-rel;
+
+ float val = v;
+ if (val==0)
+ return;
+ bool sg = val < 0;
+ val = Math::absf(val);
+
+ val = Math::log(val)/Math::log((float)2.0);
+ //logspace
+ val+=rel*0.05;
+ //
+
+ val = Math::pow(2.0f,val);
+ if (sg)
+ val=-val;
+
+ v=val;
+ easing_draw->update();
+ //emit_signal("variant_changed");
+ emit_signal("variant_changed");
+ }
+ if (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.button_index==BUTTON_LEFT) {
+
+
+ }
+
+}
+
+
+void CustomPropertyEditor::_draw_easing() {
+
+
+ RID ci = easing_draw->get_canvas_item();
+
+ Size2 s = easing_draw->get_size();
+ Rect2 r(Point2(),s);
+ r=r.grow(3);
+ get_stylebox("normal","LineEdit")->draw(ci,r);
+ //VisualServer::get_singleton()->canvas_item_add
+
+
+ int points = 48;
+
+ float prev=1.0;
+ float exp=v;
+ bool flip=hint_text=="attenuation";
+
+ Ref<Font> f = get_font("font","Label");
+ Color color = get_color("font_color","Label");
+
+ for(int i=1;i<=points;i++) {
+
+ float ifl = i/float(points);
+ float iflp = (i-1)/float(points);
+
+ float h = 1.0-Math::ease(ifl,exp);
+
+ if (flip) {
+ ifl=1.0-ifl;
+ iflp=1.0-iflp;
+ }
+
+ VisualServer::get_singleton()->canvas_item_add_line(ci,Point2(iflp*s.width,prev*s.height),Point2(ifl*s.width,h*s.height),color);
+ prev=h;
+ }
+
+ f->draw(ci,Point2(10,10+f->get_ascent()),String::num(exp,2),color);
+}
+
+void CustomPropertyEditor::_text_edit_changed() {
+
+ v=text_edit->get_text();
+ emit_signal("variant_changed");
+
+}
+
+void CustomPropertyEditor::_create_dialog_callback() {
+
+
+ v=create_dialog->get_selected_type();
+ emit_signal("variant_changed");
+}
+
+void CustomPropertyEditor::_create_selected_property(const String& p_prop) {
+
+
+ v=p_prop;
+ emit_signal("variant_changed");
+}
+
+void CustomPropertyEditor::_modified(String p_string) {
+
+ if (updating)
+ return;
+ updating=true;
+ switch(type) {
+ case Variant::INT: {
+
+ if (evaluator)
+ v=evaluator->eval(value_editor[0]->get_text());
+ else
+ v=value_editor[0]->get_text().to_int();
+ emit_signal("variant_changed");
+
+
+ } break;
+ case Variant::REAL: {
+
+ if (hint!=PROPERTY_HINT_EXP_EASING) {
+ if (evaluator)
+ v=evaluator->eval(value_editor[0]->get_text());
+ else
+ v=value_editor[0]->get_text().to_double();
+ emit_signal("variant_changed");
+
+ }
+
+ } break;
+ case Variant::STRING: {
+
+ v=value_editor[0]->get_text();
+ emit_signal("variant_changed");
+ } break;
+ case Variant::VECTOR2: {
+
+ Vector2 vec;
+ if (evaluator) {
+ vec.x=evaluator->eval(value_editor[0]->get_text());
+ vec.y=evaluator->eval(value_editor[1]->get_text());
+ } else {
+ vec.x=value_editor[0]->get_text().to_double();
+ vec.y=value_editor[1]->get_text().to_double();
+ }
+ v=vec;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::RECT2: {
+
+ Rect2 r2;
+ if (evaluator) {
+ r2.pos.x=evaluator->eval(value_editor[0]->get_text());
+ r2.pos.y=evaluator->eval(value_editor[1]->get_text());
+ r2.size.x=evaluator->eval(value_editor[2]->get_text());
+ r2.size.y=evaluator->eval(value_editor[3]->get_text());
+ } else {
+ r2.pos.x=value_editor[0]->get_text().to_double();
+ r2.pos.y=value_editor[1]->get_text().to_double();
+ r2.size.x=value_editor[2]->get_text().to_double();
+ r2.size.y=value_editor[3]->get_text().to_double();
+ }
+ v=r2;
+ _emit_changed_whole_or_field();
+
+ } break;
+
+ case Variant::VECTOR3: {
+
+ Vector3 vec;
+ if (evaluator) {
+ vec.x=evaluator->eval(value_editor[0]->get_text());
+ vec.y=evaluator->eval(value_editor[1]->get_text());
+ vec.z=evaluator->eval(value_editor[2]->get_text());
+ } else {
+ vec.x=value_editor[0]->get_text().to_double();
+ vec.y=value_editor[1]->get_text().to_double();
+ vec.z=value_editor[2]->get_text().to_double();
+ }
+ v=vec;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::PLANE: {
+
+ Plane pl;
+ if (evaluator) {
+ pl.normal.x=evaluator->eval(value_editor[0]->get_text());
+ pl.normal.y=evaluator->eval(value_editor[1]->get_text());
+ pl.normal.z=evaluator->eval(value_editor[2]->get_text());
+ pl.d=evaluator->eval(value_editor[3]->get_text());
+ } else {
+ pl.normal.x=value_editor[0]->get_text().to_double();
+ pl.normal.y=value_editor[1]->get_text().to_double();
+ pl.normal.z=value_editor[2]->get_text().to_double();
+ pl.d=value_editor[3]->get_text().to_double();
+ }
+ v=pl;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::QUAT: {
+
+ Quat q;
+ if (evaluator) {
+ q.x=evaluator->eval(value_editor[0]->get_text());
+ q.y=evaluator->eval(value_editor[1]->get_text());
+ q.z=evaluator->eval(value_editor[2]->get_text());
+ q.w=evaluator->eval(value_editor[3]->get_text());
+ } else {
+ q.x=value_editor[0]->get_text().to_double();
+ q.y=value_editor[1]->get_text().to_double();
+ q.z=value_editor[2]->get_text().to_double();
+ q.w=value_editor[3]->get_text().to_double();
+ }
+ v=q;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::RECT3: {
+
+ Vector3 pos;
+ Vector3 size;
+
+ if (evaluator) {
+ pos.x=evaluator->eval(value_editor[0]->get_text());
+ pos.y=evaluator->eval(value_editor[1]->get_text());
+ pos.z=evaluator->eval(value_editor[2]->get_text());
+ size.x=evaluator->eval(value_editor[3]->get_text());
+ size.y=evaluator->eval(value_editor[4]->get_text());
+ size.z=evaluator->eval(value_editor[5]->get_text());
+ } else {
+ pos.x=value_editor[0]->get_text().to_double();
+ pos.y=value_editor[1]->get_text().to_double();
+ pos.z=value_editor[2]->get_text().to_double();
+ size.x=value_editor[3]->get_text().to_double();
+ size.y=value_editor[4]->get_text().to_double();
+ size.z=value_editor[5]->get_text().to_double();
+ }
+ v=Rect3(pos,size);
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::TRANSFORM2D: {
+
+ Transform2D m;
+ for(int i=0;i<6;i++) {
+ if (evaluator) {
+ m.elements[i/2][i%2]=evaluator->eval(value_editor[i]->get_text());
+ } else {
+ m.elements[i/2][i%2]=value_editor[i]->get_text().to_double();
+ }
+ }
+
+ v=m;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::BASIS: {
+
+ Basis m;
+ for(int i=0;i<9;i++) {
+
+ if (evaluator) {
+ m.elements[i/3][i%3]=evaluator->eval(value_editor[i]->get_text());
+ } else {
+ m.elements[i/3][i%3]=value_editor[i]->get_text().to_double();
+ }
+ }
+
+ v=m;
+ _emit_changed_whole_or_field();
+
+ } break;
+ case Variant::TRANSFORM: {
+
+ Basis basis;
+ for(int i=0;i<9;i++) {
+
+ if (evaluator) {
+ basis.elements[i/3][i%3]=evaluator->eval(value_editor[(i/3)*4+i%3]->get_text());
+ } else {
+ basis.elements[i/3][i%3]=value_editor[(i/3)*4+i%3]->get_text().to_double();
+ }
+ }
+
+ Vector3 origin;
+
+ if (evaluator) {
+ origin.x=evaluator->eval(value_editor[3]->get_text());
+ origin.y=evaluator->eval(value_editor[7]->get_text());
+ origin.z=evaluator->eval(value_editor[11]->get_text());
+ } else {
+ origin.x=value_editor[3]->get_text().to_double();
+ origin.y=value_editor[7]->get_text().to_double();
+ origin.z=value_editor[11]->get_text().to_double();
+ }
+
+ v=Transform(basis,origin);
+ _emit_changed_whole_or_field();
+
+
+ } break;
+ case Variant::COLOR: {
+ /*
+ for (int i=0;i<4;i++) {
+
+ scroll[i]->set_val( value_editor[i]->get_text().to_double() );
+ }
+ Color c;
+ c.r=value_editor[0]->get_text().to_double();
+ c.g=value_editor[1]->get_text().to_double();
+ c.b=value_editor[2]->get_text().to_double();
+ c.a=value_editor[3]->get_text().to_double();
+ v=c;
+ update();
+ emit_signal("variant_changed");
+ */
+ } break;
+ case Variant::IMAGE: {
+
+
+ } break;
+ case Variant::NODE_PATH: {
+
+ v=NodePath(value_editor[0]->get_text());
+ emit_signal("variant_changed");
+ } break;
+ case Variant::INPUT_EVENT: {
+
+
+ } break;
+ case Variant::DICTIONARY: {
+
+
+ } break;
+ case Variant::POOL_BYTE_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_INT_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_REAL_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_STRING_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_VECTOR3_ARRAY: {
+
+
+ } break;
+ case Variant::POOL_COLOR_ARRAY: {
+
+
+ } break;
+ default: {}
+ }
+
+ updating=false;
+}
+
+void CustomPropertyEditor::_emit_changed_whole_or_field() {
+
+ if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+ emit_signal("variant_changed");
+ } else {
+ emit_signal("variant_field_changed",field_names[focused_value_editor]);
+ }
+}
+
+void CustomPropertyEditor::_range_modified(double p_value)
+{
+ v=p_value;
+ emit_signal("variant_changed");
+}
+
+void CustomPropertyEditor::_focus_enter() {
+ switch(type) {
+ case Variant::REAL:
+ case Variant::STRING:
+ case Variant::VECTOR2:
+ case Variant::RECT2:
+ case Variant::VECTOR3:
+ case Variant::PLANE:
+ case Variant::QUAT:
+ case Variant::RECT3:
+ case Variant::TRANSFORM2D:
+ case Variant::BASIS:
+ case Variant::TRANSFORM: {
+ for (int i=0;i<MAX_VALUE_EDITORS;++i) {
+ if (value_editor[i]->has_focus()) {
+ focused_value_editor=i;
+ value_editor[i]->select_all();
+ break;
+ }
+ }
+ } break;
+ default: {}
+ }
+
+}
+
+void CustomPropertyEditor::_focus_exit() {
+ switch(type) {
+ case Variant::REAL:
+ case Variant::STRING:
+ case Variant::VECTOR2:
+ case Variant::RECT2:
+ case Variant::VECTOR3:
+ case Variant::PLANE:
+ case Variant::QUAT:
+ case Variant::RECT3:
+ case Variant::TRANSFORM2D:
+ case Variant::BASIS:
+ case Variant::TRANSFORM: {
+ for (int i=0;i<MAX_VALUE_EDITORS;++i) {
+ value_editor[i]->select(0, 0);
+ }
+ } break;
+ default: {}
+ }
+
+}
+
+void CustomPropertyEditor::config_action_buttons(const List<String>& p_strings) {
+
+ int w=100;
+ int h=18;
+ int m=5;
+
+ set_size( Size2( w, m*2+(h+m)*p_strings.size() ) );
+
+ for (int i=0;i<MAX_ACTION_BUTTONS;i++) {
+
+ if (i<p_strings.size()) {
+ action_buttons[i]->show();
+ action_buttons[i]->set_text(p_strings[i]);
+ action_buttons[i]->set_pos( Point2( m, m+i*(h+m) ));
+ action_buttons[i]->set_size( Size2( w-m*2, h ) );
+ action_buttons[i]->set_flat(true);
+ } else {
+ action_buttons[i]->hide();
+ }
+ }
+
+
+}
+
+void CustomPropertyEditor::config_value_editors(int p_amount, int p_columns,int p_label_w,const List<String>& p_strings) {
+
+ int w=80;
+ int h=20;
+ int m=10;
+
+ int rows=((p_amount-1)/p_columns)+1;
+
+ set_size( Size2( m*(1+p_columns)+(w+p_label_w)*p_columns, m*(1+rows)+h*rows ) );
+
+ for (int i=0;i<MAX_VALUE_EDITORS;i++) {
+
+ int c=i%p_columns;
+ int r=i/p_columns;
+
+ if (i<p_amount) {
+ value_editor[i]->show();
+ value_label[i]->show();
+ value_label[i]->set_text(i<p_strings.size()?p_strings[i]:String(""));
+ value_editor[i]->set_pos( Point2( m+p_label_w+c*(w+m+p_label_w), m+r*(h+m) ));
+ value_editor[i]->set_size( Size2( w, h ) );
+ value_label[i]->set_pos( Point2( m+c*(w+m+p_label_w), m+r*(h+m) ) );
+ value_editor[i]->set_editable(!read_only);
+ } else {
+ value_editor[i]->hide();
+ value_label[i]->hide();
+ }
+ }
+
+
+
+}
+
+
+void CustomPropertyEditor::_bind_methods() {
+
+ ClassDB::bind_method("_focus_enter", &CustomPropertyEditor::_focus_enter);
+ ClassDB::bind_method("_focus_exit", &CustomPropertyEditor::_focus_exit);
+ ClassDB::bind_method("_modified",&CustomPropertyEditor::_modified);
+ ClassDB::bind_method("_range_modified", &CustomPropertyEditor::_range_modified);
+ ClassDB::bind_method("_scroll_modified",&CustomPropertyEditor::_scroll_modified);
+ ClassDB::bind_method("_action_pressed",&CustomPropertyEditor::_action_pressed);
+ ClassDB::bind_method("_file_selected",&CustomPropertyEditor::_file_selected);
+ ClassDB::bind_method("_type_create_selected",&CustomPropertyEditor::_type_create_selected);
+ ClassDB::bind_method("_node_path_selected",&CustomPropertyEditor::_node_path_selected);
+ ClassDB::bind_method("_color_changed",&CustomPropertyEditor::_color_changed);
+ ClassDB::bind_method("_draw_easing",&CustomPropertyEditor::_draw_easing);
+ ClassDB::bind_method("_drag_easing",&CustomPropertyEditor::_drag_easing);
+ ClassDB::bind_method( "_text_edit_changed",&CustomPropertyEditor::_text_edit_changed);
+ ClassDB::bind_method( "_menu_option",&CustomPropertyEditor::_menu_option);
+ ClassDB::bind_method( "_create_dialog_callback",&CustomPropertyEditor::_create_dialog_callback);
+ ClassDB::bind_method( "_create_selected_property",&CustomPropertyEditor::_create_selected_property);
+
+
+
+ ADD_SIGNAL( MethodInfo("variant_changed") );
+ ADD_SIGNAL( MethodInfo("variant_field_changed",PropertyInfo(Variant::STRING,"field")) );
+ ADD_SIGNAL( MethodInfo("resource_edit_request") );
+}
+CustomPropertyEditor::CustomPropertyEditor() {
+
+
+ read_only=false;
+ updating=false;
+
+ for (int i=0;i<MAX_VALUE_EDITORS;i++) {
+
+ value_editor[i]=memnew( LineEdit );
+ add_child( value_editor[i] );
+ value_label[i]=memnew( Label );
+ add_child( value_label[i] );
+ value_editor[i]->hide();
+ value_label[i]->hide();
+ value_editor[i]->connect("text_entered", this,"_modified");
+ value_editor[i]->connect("focus_entered", this, "_focus_enter");
+ value_editor[i]->connect("focus_exited", this, "_focus_exit");
+ }
+ focused_value_editor=-1;
+
+ for(int i=0;i<4;i++) {
+
+ scroll[i] = memnew( HScrollBar );
+ scroll[i]->hide();
+ scroll[i]->set_min(0);
+ scroll[i]->set_max(1.0);
+ scroll[i]->set_step(0.01);
+ add_child(scroll[i]);
+ scroll[i]->connect("value_changed", this,"_scroll_modified");
+
+ }
+
+ checks20gc = memnew( GridContainer );
+ add_child(checks20gc);
+ checks20gc->set_columns(11);
+
+ for(int i=0;i<20;i++) {
+ if (i==5 || i==15) {
+ Control *space = memnew( Control );
+ space->set_custom_minimum_size(Size2(20,0)*EDSCALE);
+ checks20gc->add_child(space);
+ }
+
+ checks20[i]=memnew( CheckBox );
+ checks20[i]->set_toggle_mode(true);
+ checks20[i]->set_focus_mode(FOCUS_NONE);
+ checks20gc->add_child(checks20[i]);
+ checks20[i]->hide();
+ checks20[i]->connect("pressed",this,"_action_pressed",make_binds(i));
+ checks20[i]->set_tooltip(vformat(TTR("Bit %d, val %d."), i, 1<<i));
+ }
+
+ text_edit = memnew( TextEdit );
+ add_child(text_edit);
+ text_edit->set_area_as_parent_rect();
+ for(int i=0;i<4;i++)
+ text_edit->set_margin((Margin)i,5);
+ text_edit->set_margin(MARGIN_BOTTOM,30);
+
+ text_edit->hide();
+ text_edit->connect("text_changed",this,"_text_edit_changed");
+
+ for (int i=0;i<MAX_ACTION_BUTTONS;i++) {
+
+ action_buttons[i]=memnew(Button);
+ action_buttons[i]->hide();
+ add_child(action_buttons[i]);
+ Vector<Variant> binds;
+ binds.push_back(i);
+ action_buttons[i]->connect("pressed", this,"_action_pressed",binds);
+ }
+
+ color_picker=NULL;
+
+
+
+ set_as_toplevel(true);
+ file = memnew ( EditorFileDialog );
+ add_child(file);
+ file->hide();
+
+ file->connect("file_selected", this,"_file_selected");
+ file->connect("dir_selected", this,"_file_selected");
+
+ error = memnew( ConfirmationDialog );
+ error->set_title(TTR("Error!"));
+ add_child(error);
+ //error->get_cancel()->hide();
+
+ type_button = memnew( MenuButton );
+ add_child(type_button);
+ type_button->hide();
+ type_button->get_popup()->connect("id_pressed", this,"_type_create_selected");
+
+
+ scene_tree = memnew( SceneTreeDialog );
+ add_child(scene_tree);
+ scene_tree->connect("selected", this,"_node_path_selected");
+ scene_tree->get_scene_tree()->set_show_enabled_subscene(true);
+
+ texture_preview = memnew( TextureRect );
+ add_child( texture_preview);
+ texture_preview->hide();
+
+ easing_draw=memnew( Control );
+ add_child(easing_draw);
+ easing_draw->hide();
+ easing_draw->connect("draw",this,"_draw_easing");
+ easing_draw->connect("gui_input",this,"_drag_easing");
+ //easing_draw->emit_signal(SceneStringNames::get_singleton()->input_event,InputEvent());
+ easing_draw->set_default_cursor_shape(Control::CURSOR_MOVE);
+
+ menu = memnew(PopupMenu);
+ add_child(menu);
+ menu->connect("id_pressed",this,"_menu_option");
+
+ evaluator = NULL;
+
+ spinbox = memnew ( SpinBox );
+ add_child(spinbox);
+ spinbox->set_area_as_parent_rect(5);
+ spinbox->connect("value_changed",this,"_range_modified");
+
+ slider = memnew ( HSlider );
+ add_child(slider);
+ slider->set_area_as_parent_rect(5);
+ slider->connect("value_changed",this,"_range_modified");
+
+ create_dialog = NULL;
+ property_select = NULL;
+}
+
+bool PropertyEditor::_might_be_in_instance() {
+
+ if (!obj)
+ return false;
+
+ Node *node = obj->cast_to<Node>();
+
+ Node* edited_scene =EditorNode::get_singleton()->get_edited_scene();
+
+ bool might_be=false;
+
+ while(node) {
+
+ if (node->get_scene_instance_state().is_valid()) {
+ might_be=true;
+ break;
+ }
+ if (node==edited_scene) {
+ if (node->get_scene_inherited_state().is_valid()) {
+ might_be=true;
+ break;
+ }
+ might_be=false;
+ break;
+ }
+ node=node->get_owner();
+ }
+
+ return might_be;
+
+}
+
+bool PropertyEditor::_get_instanced_node_original_property(const StringName& p_prop, Variant& value) {
+
+ Node *node = obj->cast_to<Node>();
+
+ if (!node)
+ return false;
+
+ Node *orig=node;
+
+ Node* edited_scene =EditorNode::get_singleton()->get_edited_scene();
+
+ bool found=false;
+
+ //print_line("for prop - "+String(p_prop));
+
+
+ while(node) {
+
+ Ref<SceneState> ss;
+
+ if (node==edited_scene) {
+ ss=node->get_scene_inherited_state();
+
+ } else {
+ ss=node->get_scene_instance_state();
+ }
+ //print_line("at - "+String(edited_scene->get_path_to(node)));
+
+ if (ss.is_valid()) {
+
+ NodePath np = node->get_path_to(orig);
+ int node_idx = ss->find_node_by_path(np);
+ //print_line("\t valid, nodeidx "+itos(node_idx));
+ if (node_idx>=0) {
+ bool lfound=false;
+ Variant lvar;
+ lvar=ss->get_property_value(node_idx,p_prop,lfound);
+ if (lfound) {
+
+ found=true;
+ value=lvar;
+ //print_line("\t found value "+String(value));
+ }
+ }
+ }
+ if (node==edited_scene) {
+ //just in case
+ break;
+ }
+ node=node->get_owner();
+
+ }
+
+ return found;
+}
+
+bool PropertyEditor::_is_property_different(const Variant& p_current, const Variant& p_orig,int p_usage) {
+
+
+ {
+ Node *node = obj->cast_to<Node>();
+ if (!node)
+ return false;
+
+ Node* edited_scene =EditorNode::get_singleton()->get_edited_scene();
+ bool found_state=false;
+
+ //print_line("for prop - "+String(p_prop));
+
+
+ while(node) {
+
+ Ref<SceneState> ss;
+
+ if (node==edited_scene) {
+ ss=node->get_scene_inherited_state();
+
+ } else {
+ ss=node->get_scene_instance_state();
+ }
+
+ if (ss.is_valid()) {
+ found_state=true;
+ }
+ if (node==edited_scene) {
+ //just in case
+ break;
+ }
+ node=node->get_owner();
+ }
+
+ if (!found_state)
+ return false; //pointless to check if we are not comparing against anything.
+ }
+
+ if (p_orig.get_type()==Variant::NIL) {
+
+
+
+ //special cases
+ if (p_current.is_zero() && p_usage&PROPERTY_USAGE_STORE_IF_NONZERO)
+ return false;
+ if (p_current.is_one() && p_usage&PROPERTY_USAGE_STORE_IF_NONONE)
+ return false;
+ }
+
+ if (p_current.get_type()==Variant::REAL && p_orig.get_type()==Variant::REAL) {
+ float a = p_current;
+ float b = p_orig;
+
+ return Math::abs(a-b)>CMP_EPSILON; //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error
+ }
+
+ return bool(Variant::evaluate(Variant::OP_NOT_EQUAL,p_current,p_orig));
+}
+
+TreeItem *PropertyEditor::find_item(TreeItem *p_item,const String& p_name) {
+
+
+ if (!p_item)
+ return NULL;
+
+ String name = p_item->get_metadata(1);
+
+ if (name==p_name) {
+
+ return p_item;
+ }
+
+ TreeItem *c=p_item->get_children();
+
+ while (c) {
+
+ TreeItem *found = find_item(c,p_name);
+ if (found)
+ return found;
+ c=c->get_next();
+ }
+
+ return NULL;
+}
+
+
+void PropertyEditor::_changed_callback(Object *p_changed,const char * p_prop) {
+
+
+ _changed_callbacks(p_changed,p_prop);
+}
+
+void PropertyEditor::_changed_callbacks(Object *p_changed,const String& p_prop) {
+
+
+ if (p_changed!=obj)
+ return;
+
+ if (changing)
+ return;
+
+ if (p_prop==String())
+ update_tree_pending=true;
+ else {
+
+ pending[p_prop]=p_prop;
+
+ }
+}
+
+void PropertyEditor::update_property(const String& p_prop) {
+
+ if (obj)
+ _changed_callbacks(obj,p_prop);
+}
+
+
+void PropertyEditor::set_item_text(TreeItem *p_item, int p_type, const String& p_name, int p_hint, const String& p_hint_text) {
+
+ switch( p_type ) {
+
+ case Variant::BOOL: {
+
+ p_item->set_checked( 1, obj->get( p_name ) );
+ } break;
+ case Variant::REAL:
+ case Variant::INT: {
+
+ if (p_hint==PROPERTY_HINT_LAYERS_2D_PHYSICS || p_hint==PROPERTY_HINT_LAYERS_2D_RENDER || p_hint==PROPERTY_HINT_LAYERS_3D_PHYSICS || p_hint==PROPERTY_HINT_LAYERS_3D_RENDER) {
+ tree->update();
+ break;
+ }
+
+ if (p_hint==PROPERTY_HINT_FLAGS) {
+ Vector<String> values = p_hint_text.split(",");
+ String flags;
+ int val = obj->get(p_name);
+ for(int i=0;i<values.size();i++) {
+
+ String v = values[i];
+ if (v=="")
+ continue;
+ if (!(val&(1<<i)))
+ continue;
+
+ if (flags!="")
+ flags+=", ";
+ flags+=v;
+ }
+ p_item->set_text(1, flags );
+ break;
+ }
+
+ if (p_hint==PROPERTY_HINT_EXP_EASING) {
+
+ p_item->set_text(1, String::num(obj->get( p_name ),2) );
+ break;
+ }
+
+
+ //p_item->set_cell_mode( 1, TreeItem::CELL_MODE_RANGE );
+
+ if (p_type==Variant::REAL) {
+ p_item->set_range(1, obj->get( p_name ) );
+
+ } else {
+ /* FIXME: Why are both statements equal? */
+ p_item->set_range(1, obj->get( p_name ) );
+ }
+
+
+ p_item->set_editable(1,!read_only);
+
+
+ } break;
+ case Variant::STRING:
+
+
+ if (p_hint==PROPERTY_HINT_TYPE_STRING) {
+
+ p_item->set_text(1,obj->get(p_name));
+ }
+
+ if ( p_hint==PROPERTY_HINT_METHOD_OF_VARIANT_TYPE ||
+ p_hint==PROPERTY_HINT_METHOD_OF_BASE_TYPE ||
+ p_hint==PROPERTY_HINT_METHOD_OF_INSTANCE ||
+ p_hint==PROPERTY_HINT_METHOD_OF_SCRIPT ||
+ p_hint==PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE ||
+ p_hint==PROPERTY_HINT_PROPERTY_OF_BASE_TYPE ||
+ p_hint==PROPERTY_HINT_PROPERTY_OF_INSTANCE ||
+ p_hint==PROPERTY_HINT_PROPERTY_OF_SCRIPT ) {
+
+ p_item->set_text(1,obj->get(p_name));
+ }
+
+
+ if (p_hint==PROPERTY_HINT_ENUM) {
+
+ Vector<String> strings = p_hint_text.split(",");
+ String current = obj->get(p_name);
+ int idx=0;
+ for(int x=0;x<strings.size();x++) {
+ if (strings[x]==current) {
+ idx=x;
+ break;
+ }
+ }
+ p_item->set_text(1, p_hint_text);
+ p_item->set_range(1,idx);
+ break;
+ }
+
+ case Variant::VECTOR3:
+ case Variant::QUAT:
+ case Variant::VECTOR2:
+ case Variant::RECT3:
+ case Variant::RECT2:
+ case Variant::TRANSFORM2D:
+ case Variant::BASIS:
+ case Variant::TRANSFORM: {
+
+ p_item->set_text(1,obj->get(p_name));
+
+ } break;
+ case Variant::COLOR: {
+
+ tree->update();
+ //p_item->set_text(1,obj->get(p_name));
+
+ } break;
+ case Variant::IMAGE: {
+
+ Image img = obj->get( p_name );
+ if (img.empty())
+ p_item->set_text(1,"[Image (empty)]");
+ else
+ p_item->set_text(1,"[Image "+itos(img.get_width())+"x"+itos(img.get_height())+"-"+String(Image::get_format_name(img.get_format()))+"]");
+
+ } break;
+ case Variant::NODE_PATH: {
+
+ p_item->set_text(1,obj->get(p_name));
+ } break;
+ case Variant::OBJECT: {
+
+
+ if (obj->get( p_name ).get_type() == Variant::NIL || obj->get( p_name ).operator RefPtr().is_null()) {
+ p_item->set_text(1,"<null>");
+ p_item->set_icon(1,Ref<Texture>());
+
+ Dictionary d = p_item->get_metadata(0);
+ int hint=d.has("hint")?d["hint"].operator int():-1;
+ String hint_text=d.has("hint_text")?d["hint_text"]:"";
+ if (hint==PROPERTY_HINT_RESOURCE_TYPE && hint_text == "Texture") {
+ p_item->set_icon(1,NULL);
+ }
+
+ } else {
+ RES res = obj->get( p_name ).operator RefPtr();
+ if (res->is_class("Texture")) {
+ int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
+ p_item->set_icon_max_width(1,tw);
+ p_item->set_icon(1,res);
+ p_item->set_text(1,"");
+
+ } else if (res->get_name() != "") {
+
+ p_item->set_text(1, res->get_name());
+ } else if (res->get_path()!="" && !res->get_path().begins_with("local://")) {
+ p_item->set_text(1, res->get_path().get_file());
+ } else {
+ p_item->set_text(1,"<"+res->get_class()+">");
+ };
+
+
+ if (res.is_valid() && res->get_path().is_resource_file()) {
+ p_item->set_tooltip(1,res->get_path());
+ } else if (res.is_valid()) {
+ p_item->set_tooltip(1,res->get_name()+" ("+res->get_class()+")");
+ }
+
+
+ if (has_icon(res->get_class(),"EditorIcons")) {
+
+ p_item->set_icon(0,get_icon(res->get_class(),"EditorIcons"));
+ } else {
+
+ Dictionary d = p_item->get_metadata(0);
+ int hint=d.has("hint")?d["hint"].operator int():-1;
+ String hint_text=d.has("hint_text")?d["hint_text"]:"";
+ if (hint==PROPERTY_HINT_RESOURCE_TYPE) {
+
+ if (has_icon(hint_text,"EditorIcons")) {
+
+ p_item->set_icon(0,get_icon(hint_text,"EditorIcons"));
+
+ } else {
+ p_item->set_icon(0,get_icon("Object","EditorIcons"));
+
+ }
+ }
+ }
+
+ if (!res->is_class("Texture")) {
+ //texture already previews via itself
+ EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res,this,"_resource_preview_done",p_item->get_instance_ID());
+ }
+
+
+
+ }
+
+
+ } break;
+ default: {};
+ }
+
+}
+
+
+void PropertyEditor::_check_reload_status(const String&p_name, TreeItem* item) {
+
+ bool has_reload=false;
+ int found=-1;
+ bool is_disabled=false;
+
+ for(int i=0;i<item->get_button_count(1);i++) {
+
+ if (item->get_button_id(1,i)==3) {
+ found=i;
+ is_disabled=item->is_button_disabled(1,i);
+ break;
+ }
+ }
+
+ if (_might_be_in_instance()) {
+
+
+ Variant vorig;
+ Dictionary d=item->get_metadata(0);
+ int usage = d.has("usage")?int(int(d["usage"])&(PROPERTY_USAGE_STORE_IF_NONONE|PROPERTY_USAGE_STORE_IF_NONZERO)):0;
+
+
+ if (_get_instanced_node_original_property(p_name,vorig) || usage) {
+ Variant v = obj->get(p_name);
+
+
+ bool changed = _is_property_different(v,vorig,usage);
+
+ //if ((found!=-1 && !is_disabled)!=changed) {
+
+ if (changed) {
+
+ has_reload=true;
+ } else {
+
+ }
+
+ //}
+
+ }
+
+ }
+
+ if (obj->call("property_can_revert",p_name).operator bool()) {
+
+ has_reload=true;
+ }
+
+
+ if (!has_reload && !obj->get_script().is_null()) {
+ Ref<Script> scr = obj->get_script();
+ Variant orig_value;
+ if (scr->get_property_default_value(p_name,orig_value)) {
+ if (orig_value!=obj->get(p_name)) {
+ has_reload=true;
+ }
+ }
+ }
+
+ //print_line("found: "+itos(found)+" has reload: "+itos(has_reload)+" is_disabled "+itos(is_disabled));
+ if (found!=-1 && !has_reload) {
+
+ if (!is_disabled) {
+ item->erase_button(1,found);
+ if (item->get_cell_mode(1)==TreeItem::CELL_MODE_RANGE && item->get_text(1)==String()) {
+ item->add_button(1,get_icon("ReloadEmpty","EditorIcons"),3,true);
+ }
+ }
+ } else if (found==-1 && has_reload) {
+ item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ } else if (found!=-1 && has_reload && is_disabled) {
+ item->erase_button(1,found);
+ item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ }
+}
+
+
+
+bool PropertyEditor::_is_drop_valid(const Dictionary& p_drag_data, const Dictionary& p_item_data) const {
+
+ Dictionary d = p_item_data;
+
+ if (d.has("type")) {
+
+ int type = d["type"];
+ if (type==Variant::OBJECT && d.has("hint") && d.has("hint_text") && int(d["hint"])==PROPERTY_HINT_RESOURCE_TYPE) {
+
+
+ String allowed_type=d["hint_text"];
+
+ Dictionary drag_data = p_drag_data;
+ if (drag_data.has("type") && String(drag_data["type"])=="resource") {
+ Ref<Resource> res = drag_data["resource"];
+ for(int i=0;i<allowed_type.get_slice_count(",");i++) {
+ String at = allowed_type.get_slice(",",i).strip_edges();
+ if (res.is_valid() && ClassDB::is_parent_class(res->get_class(),at)) {
+ return true;
+ }
+ }
+
+ }
+
+ if (drag_data.has("type") && String(drag_data["type"])=="files") {
+
+ Vector<String> files = drag_data["files"];
+
+ if (files.size()==1) {
+ String file = files[0];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+ if (ftype!="") {
+
+ for(int i=0;i<allowed_type.get_slice_count(",");i++) {
+ String at = allowed_type.get_slice(",",i).strip_edges();
+ if (ClassDB::is_parent_class(ftype,at)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ return false;
+
+}
+void PropertyEditor::_mark_drop_fields(TreeItem* p_at) {
+
+ if (_is_drop_valid(get_viewport()->gui_get_drag_data(),p_at->get_metadata(0)))
+ p_at->set_custom_bg_color(1,Color(0.7,0.5,0.2),true);
+
+ if (p_at->get_children()) {
+ _mark_drop_fields(p_at->get_children());
+ }
+
+ if (p_at->get_next()) {
+ _mark_drop_fields(p_at->get_next());
+ }
+}
+
+Variant PropertyEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+
+ TreeItem *item = tree->get_item_at_pos(p_point);
+ if (!item)
+ return Variant();
+
+ Dictionary d = item->get_metadata(0);
+ if (!d.has("name"))
+ return Variant();
+
+ int col = tree->get_column_at_pos(p_point);
+ if (col==0) {
+
+ Dictionary dp;
+ dp["type"]="obj_property";
+ dp["object"]=obj;
+ dp["property"]=d["name"];
+ dp["value"]=obj->get(d["name"]);
+
+ Label *label =memnew( Label );
+ label->set_text(d["name"]);
+ set_drag_preview(label);
+ return dp;
+ }
+
+
+
+ Variant val = obj->get(d["name"]);
+
+ if (val.get_type()==Variant::OBJECT) {
+ RES res = val;
+ if (res.is_valid()) {
+
+ custom_editor->hide_menu();
+ return EditorNode::get_singleton()->drag_resource(res,p_from);
+ }
+ }
+
+ return Variant();
+}
+
+bool PropertyEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
+
+ TreeItem *item = tree->get_item_at_pos(p_point);
+ if (!item)
+ return false;
+
+ int col = tree->get_column_at_pos(p_point);
+ if (col!=1)
+ return false;
+
+ return _is_drop_valid(p_data,item->get_metadata(0));
+
+}
+void PropertyEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
+
+ TreeItem *item = tree->get_item_at_pos(p_point);
+ if (!item)
+ return;
+
+ int col = tree->get_column_at_pos(p_point);
+ if (col!=1)
+ return;
+
+ if (!_is_drop_valid(p_data,item->get_metadata(0)))
+ return;
+
+ Dictionary d = item->get_metadata(0);
+
+ if (!d.has("name"))
+ return;
+
+ String name=d["name"];
+
+ Dictionary drag_data = p_data;
+ if (drag_data.has("type") && String(drag_data["type"])=="resource") {
+ Ref<Resource> res = drag_data["resource"];
+ if (res.is_valid()) {
+ _edit_set(name,res);
+ return;
+ }
+ }
+
+ if (drag_data.has("type") && String(drag_data["type"])=="files") {
+
+ Vector<String> files = drag_data["files"];
+
+ if (files.size()==1) {
+ String file = files[0];
+ RES res = ResourceLoader::load(file);
+ if (res.is_valid()) {
+ _edit_set(name,res);
+ return;
+ }
+ }
+ }
+}
+
+
+void PropertyEditor::_clear_drop_fields(TreeItem* p_at) {
+
+ Dictionary d = p_at->get_metadata(0);
+
+ if (d.has("type")) {
+
+ int type = d["type"];
+ if (type==Variant::OBJECT) {
+ p_at->clear_custom_bg_color(1);
+ }
+
+ }
+
+ if (p_at->get_children()) {
+ _clear_drop_fields(p_at->get_children());
+ }
+
+ if (p_at->get_next()) {
+ _clear_drop_fields(p_at->get_next());
+ }
+}
+
+void PropertyEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ get_tree()->connect("node_removed",this,"_node_removed");
+ }
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ get_tree()->disconnect("node_removed",this,"_node_removed");
+ edit(NULL);
+ }
+
+
+ if (p_what==NOTIFICATION_DRAG_BEGIN) {
+
+ if (is_visible_in_tree() && tree->get_root()) {
+ _mark_drop_fields(tree->get_root());
+ }
+ }
+
+ if (p_what==NOTIFICATION_DRAG_END) {
+ if (is_visible_in_tree() && tree->get_root()) {
+ _clear_drop_fields(tree->get_root());
+ }
+
+ }
+
+ if (p_what==NOTIFICATION_FIXED_PROCESS) {
+
+
+ if (refresh_countdown>0) {
+ refresh_countdown-=get_fixed_process_delta_time();
+ if (refresh_countdown<=0) {
+ TreeItem *root = tree->get_root();
+ _refresh_item(root);
+ }
+ }
+
+ changing=true;
+
+ if (update_tree_pending) {
+
+ update_tree();
+ update_tree_pending=false;
+
+ } else {
+
+ const String *k=NULL;
+ while ((k=pending.next(k))) {
+
+ TreeItem * item = find_item(tree->get_root(),*k);
+ if (!item)
+ continue;
+
+ _check_reload_status(*k,item);
+
+ Dictionary d=item->get_metadata(0);
+ set_item_text(item,d["type"],d["name"],d["hint"],d["hint_text"]);
+ }
+ }
+
+ pending.clear();
+
+ changing=false;
+
+ }
+}
+
+TreeItem *PropertyEditor::get_parent_node(String p_path,HashMap<String,TreeItem*>& item_paths,TreeItem *root) {
+
+ TreeItem *item=NULL;
+
+ if (p_path=="") {
+
+ item = root;
+ } else if (item_paths.has(p_path)) {
+
+ item = item_paths.get(p_path);
+ } else {
+
+ //printf("path %s parent path %s - item name %s\n",p_path.ascii().get_data(),p_path.left( p_path.find_last("/") ).ascii().get_data(),p_path.right( p_path.find_last("/") ).ascii().get_data() );
+ TreeItem *parent = get_parent_node( p_path.left( p_path.find_last("/") ),item_paths,root );
+ item = tree->create_item( parent );
+
+ String name = (p_path.find("/")!=-1)?p_path.right( p_path.find_last("/")+1 ):p_path;
+ if (capitalize_paths)
+ item->set_text(0, name.capitalize() );
+ else
+ item->set_text(0, name );
+ item->set_tooltip(0, p_path);
+ if (item->get_parent()!=root) {
+ item->set_icon( 0, get_icon("Folder","EditorIcons"));
+ }
+
+ item->set_editable(0,false);
+ item->set_selectable(0,subsection_selectable);
+ item->set_editable(1,false);
+ item->set_selectable(1,subsection_selectable);
+
+ if (item->get_parent()==root) {
+
+ item->set_custom_bg_color(0,get_color("prop_subsection","Editor"));
+ item->set_custom_bg_color(1,get_color("prop_subsection","Editor"));
+ }
+
+ item_paths[p_path]=item;
+ }
+
+ return item;
+
+}
+
+
+void PropertyEditor::_refresh_item(TreeItem *p_item) {
+
+ if (!p_item)
+ return;
+
+ String name = p_item->get_metadata(1);
+
+ if (name!=String()) {
+
+
+ _check_reload_status(name,p_item);
+#if 0
+ bool has_reload=false;
+
+ int found=-1;
+ for(int i=0;i<p_item->get_button_count(1);i++) {
+
+ if (p_item->get_button_id(1,i)==3) {
+ found=i;
+ break;
+ }
+ }
+
+ if (_might_be_in_instance()) {
+
+ Variant vorig;
+ Dictionary d=p_item->get_metadata(0);
+ int usage = d.has("usage")?int(int(d["usage"])&(PROPERTY_USAGE_STORE_IF_NONONE|PROPERTY_USAGE_STORE_IF_NONZERO)):0;
+
+
+ if (_get_instanced_node_original_property(name,vorig) || usage) {
+ Variant v = obj->get(name);
+
+
+ bool changed = _is_property_different(v,vorig,usage);
+
+ if ((found!=-1)!=changed) {
+
+ if (changed) {
+
+ has_reload=true;
+
+ } else {
+
+ //p_item->erase_button(1,found);
+ }
+
+ }
+
+ }
+
+ }
+
+ if (!has_reload && !obj->get_script().is_null()) {
+ Ref<Script> scr = obj->get_script();
+ Variant orig_value;
+ if (scr->get_property_default_value(name,orig_value)) {
+ if (orig_value!=obj->get(name)) {
+ has_reload=true;
+ }
+ }
+ }
+
+ if (!has_reload && found!=-1) {
+ p_item->erase_button(1,found);
+ } else if (has_reload && found==-1) {
+ p_item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ }
+#endif
+ Dictionary d=p_item->get_metadata(0);
+ set_item_text(p_item,d["type"],d["name"],d["hint"],d["hint_text"]);
+ }
+
+ TreeItem *c=p_item->get_children();
+
+ while (c) {
+
+ _refresh_item(c);
+
+ c=c->get_next();
+ }
+
+}
+
+void PropertyEditor::refresh() {
+
+ if (refresh_countdown>0)
+ return;
+ refresh_countdown=EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval");
+
+}
+
+void PropertyEditor::update_tree() {
+
+
+ tree->clear();
+
+ if (!obj)
+ return;
+
+ HashMap<String,TreeItem*> item_path;
+
+ TreeItem *root = tree->create_item(NULL);
+ tree->set_hide_root(true);
+
+ /*
+ TreeItem *title = tree->create_item(root);
+
+ title->set_custom_bg_color(0,get_color("prop_section","Editor"));
+ title->set_text(0,"Property"); // todo, fetch name if ID exists in database
+ title->set_editable(0,false);
+ title->set_selectable(0,false);
+ title->set_custom_bg_color(1,get_color("prop_section","Editor"));
+ title->set_text(1,"Value"); // todo, fetch name if ID exists in database
+ title->set_editable(1,false);
+ title->set_selectable(1,false);
+*/
+
+ /*
+ if (obj->cast_to<Node>() || obj->cast_to<Resource>()) {
+ TreeItem *type = tree->create_item(root);
+
+ type->set_text(0,"Type"); // todo, fetch name if ID exists in database
+ type->set_text(1,obj->get_type()); // todo, fetch name if ID exists in database
+ if (has_icon(obj->get_type(),"EditorIcons"))
+ type->set_icon(1,get_icon(obj->get_type(),"EditorIcons") );
+ else
+ type->set_icon(1,get_icon("Object","EditorIcons") );
+
+ type->set_selectable(0,false);
+ type->set_selectable(1,false);
+
+
+ TreeItem *name = tree->create_item(root);
+
+ name->set_text(0,"Name"); // todo, fetch name if ID exists in database
+ if (obj->is_type("Resource"))
+ name->set_text(1,obj->cast_to<Resource>()->get_name());
+ else if (obj->is_type("Node"))
+ name->set_text(1,obj->cast_to<Node>()->get_name());
+ name->set_selectable(0,false);
+ name->set_selectable(1,false);
+ }
+*/
+ List<PropertyInfo> plist;
+ obj->get_property_list(&plist,true);
+
+ bool draw_red=false;
+
+ {
+ Node *nod = obj->cast_to<Node>();
+ Node *es = EditorNode::get_singleton()->get_edited_scene();
+ if (nod && es!=nod && nod->get_owner()!=es) {
+ draw_red=true;
+ }
+ }
+
+
+ Color sscolor=get_color("prop_subsection","Editor");
+
+ TreeItem * current_category=NULL;
+
+ String filter = search_box ? search_box->get_text() : "";
+ String group;
+ String group_base;
+
+ for (List<PropertyInfo>::Element *I=plist.front() ; I ; I=I->next()) {
+
+ PropertyInfo& p = I->get();
+
+ //make sure the property can be edited
+
+ if (p.usage&PROPERTY_USAGE_GROUP) {
+
+ group=p.name;
+ group_base=p.hint_string;
+
+ continue;
+
+ } else if (p.usage&PROPERTY_USAGE_CATEGORY) {
+
+ group="";
+ group_base="";
+
+ if (!show_categories)
+ continue;
+
+ List<PropertyInfo>::Element *N=I->next();
+ bool valid=true;
+ //if no properties in category, skip
+ while(N) {
+ if (N->get().usage&PROPERTY_USAGE_EDITOR)
+ break;
+ if (N->get().usage&PROPERTY_USAGE_CATEGORY) {
+ valid=false;
+ break;
+ }
+ N=N->next();
+ }
+ if (!valid)
+ continue; //empty, ignore
+ TreeItem * sep = tree->create_item(root);
+ current_category=sep;
+ String type=p.name;
+ /*if (has_icon(type,"EditorIcons"))
+ sep->set_icon(0,get_icon(type,"EditorIcons") );
+ else
+ sep->set_icon(0,get_icon("Object","EditorIcons") );
+ print_line("CATEGORY: "+type);
+ */
+ sep->set_text(0,type);
+ sep->set_selectable(0,false);
+ sep->set_selectable(1,false);
+ sep->set_custom_bg_color(0,get_color("prop_category","Editor"));
+ sep->set_custom_bg_color(1,get_color("prop_category","Editor"));
+
+ if (use_doc_hints) {
+ StringName type=p.name;
+ if (!class_descr_cache.has(type)) {
+
+ String descr;
+ DocData *dd=EditorHelp::get_doc_data();
+ Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(type);
+ if (E) {
+ descr=E->get().brief_description;
+ }
+ class_descr_cache[type]=descr.word_wrap(80);
+
+ }
+
+ sep->set_tooltip(0,TTR("Class:")+" "+p.name+":\n\n"+class_descr_cache[type]);
+ }
+ //sep->set_custom_color(0,Color(1,1,1));
+
+
+ continue;
+ } else if ( ! (p.usage&PROPERTY_USAGE_EDITOR ) )
+ continue;
+
+
+ if (hide_script && p.name=="script")
+ continue;
+
+ String basename=p.name;
+ if (group!="") {
+ if (group_base!="") {
+ if (basename.begins_with(group_base)) {
+ basename=basename.replace_first(group_base,"");
+ } else {
+ group=""; //no longer using group base, clear
+ }
+ }
+ }
+
+ if (group!="") {
+ basename=group+"/"+basename;
+ }
+
+ String name = (basename.find("/")!=-1)?basename.right( basename.find_last("/")+1 ):basename;
+
+ if (capitalize_paths)
+ name = name.camelcase_to_underscore().capitalize();
+
+ String path=basename.left( basename.find_last("/") ) ;
+
+ if (use_filter && filter!="") {
+
+ String cat = path;
+
+ if (capitalize_paths)
+ cat = cat.capitalize();
+
+ if (!filter.is_subsequence_ofi(cat) && !filter.is_subsequence_ofi(name))
+ continue;
+ }
+
+ //printf("property %s\n",basename.ascii().get_data());
+ TreeItem * parent = get_parent_node(path,item_path,current_category?current_category:root );
+ /*
+ if (parent->get_parent()==root)
+ parent=root;
+ */
+ int level = 0;
+ if (parent!=root) {
+ level++;
+ TreeItem *parent_lev=parent;
+ while(parent_lev->get_parent()!=root) {
+ parent_lev=parent_lev->get_parent();
+ level++;
+ }
+ }
+ if (level>4)
+ level=4;
+
+ Color col = sscolor;
+ col.a=(level/4.0)*0.7;
+
+ TreeItem * item = tree->create_item( parent );
+
+ if (level>0) {
+ item->set_custom_bg_color(0,col);
+ //item->set_custom_bg_color(1,col);
+ }
+ item->set_editable(0,false);
+ item->set_selectable(0,false);
+
+ if (p.usage&PROPERTY_USAGE_CHECKABLE) {
+
+ item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ item->set_selectable(0,true);
+ item->set_editable(0,true);
+ item->set_checked(0,p.usage&PROPERTY_USAGE_CHECKED);
+ }
+
+ item->set_text(0, name);
+ item->set_tooltip(0, p.name);
+
+ if (use_doc_hints) {
+ StringName setter;
+ StringName type;
+ if (ClassDB::get_setter_and_type_for_property(obj->get_class_name(),p.name,type,setter)) {
+
+ String descr;
+ bool found=false;
+ Map<StringName,Map<StringName,String> >::Element *E=descr_cache.find(type);
+ if (E) {
+
+ Map<StringName,String>::Element *F=E->get().find(setter);
+ if (F) {
+ found=true;
+ descr=F->get();
+ }
+ }
+ if (!found) {
+
+ DocData *dd=EditorHelp::get_doc_data();
+ Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(type);
+ if (E) {
+ for(int i=0;i<E->get().methods.size();i++) {
+ if (E->get().methods[i].name==setter.operator String()) {
+ descr=E->get().methods[i].description.strip_edges().word_wrap(80);
+ }
+ }
+ }
+
+ descr_cache[type][setter]=descr;
+ }
+
+ item->set_tooltip(0, TTR("Property:")+" "+p.name+"\n\n"+descr);
+ }
+ }
+ //EditorHelp::get_doc_data();
+
+ Dictionary d;
+ d["name"]=p.name;
+ d["type"]=(int)p.type;
+ d["hint"]=(int)p.hint;
+ d["hint_text"]=p.hint_string;
+ d["usage"]=(int)p.usage;
+
+ item->set_metadata( 0, d );
+ item->set_metadata( 1, p.name );
+
+ if (draw_red)
+ item->set_custom_color(0,Color(0.8,0.4,0.20));
+
+
+ if (p.name==selected_property) {
+
+ item->select(1);
+ }
+
+
+ //printf("property %s type %i\n",p.name.ascii().get_data(),p.type);
+ switch( p.type ) {
+
+ case Variant::BOOL: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CHECK );
+ item->set_text(1,TTR("On"));
+ item->set_tooltip(1, obj->get(p.name) ? "True" : "False");
+ item->set_checked( 1, obj->get( p.name ) );
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Bool","EditorIcons") );
+ item->set_editable(1,!read_only);
+
+ } break;
+ case Variant::REAL:
+ case Variant::INT: {
+
+ if (p.hint==PROPERTY_HINT_EXP_EASING) {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_text(1, String::num(obj->get( p.name ),2) );
+ item->set_editable(1,!read_only);
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Curve","EditorIcons"));
+
+ break;
+
+ }
+
+ if (p.hint==PROPERTY_HINT_LAYERS_2D_PHYSICS || p.hint==PROPERTY_HINT_LAYERS_2D_RENDER || p.hint==PROPERTY_HINT_LAYERS_3D_PHYSICS || p.hint==PROPERTY_HINT_LAYERS_3D_RENDER) {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable(1,!read_only);
+ item->set_custom_draw(1,this,"_draw_flags");
+ break;
+ }
+
+ if (p.hint==PROPERTY_HINT_FLAGS) {
+
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable(1,!read_only);
+ //item->set_icon( 0, get_icon("Curve","EditorIcons"));
+
+ Vector<String> values = p.hint_string.split(",");
+ String flags;
+ int val = obj->get(p.name);
+ for(int i=0;i<values.size();i++) {
+
+ String v = values[i];
+ if (v=="")
+ continue;
+ if (!(val&(1<<i)))
+ continue;
+
+ if (flags!="")
+ flags+=", ";
+ flags+=v;
+ }
+ item->set_text(1, flags );
+ break;
+
+ }
+
+ if (p.hint==PROPERTY_HINT_ENUM)
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_RANGE );
+ else
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_RANGE_EXPRESSION );
+
+
+ if (p.hint==PROPERTY_HINT_SPRITE_FRAME || p.hint==PROPERTY_HINT_RANGE || p.hint==PROPERTY_HINT_EXP_RANGE) {
+
+ int c = p.hint_string.get_slice_count(",");
+ float min=0,max=100,step=1;
+ if (c>=1) {
+
+ min=p.hint_string.get_slice(",",0).to_double();
+ }
+ if (c>=2) {
+
+ max=p.hint_string.get_slice(",",1).to_double();
+ }
+
+ if (p.hint!=PROPERTY_HINT_SPRITE_FRAME && c>=3) {
+
+ step= p.hint_string.get_slice(",",2).to_double();
+ }
+
+
+ item->set_range_config(1,min,max,step,p.hint==PROPERTY_HINT_EXP_RANGE);
+ } else if (p.hint==PROPERTY_HINT_ENUM) {
+
+ //int c = p.hint_string.get_slice_count(",");
+ item->set_text(1,p.hint_string);
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Enum","EditorIcons") );
+ item->set_range(1, obj->get( p.name ) );
+ item->set_editable(1,!read_only);
+ break;
+ } else if (p.hint==PROPERTY_HINT_OBJECT_ID) {
+
+ //int c = p.hint_string.get_slice_count(",");
+ item->set_cell_mode(1,TreeItem::CELL_MODE_CUSTOM);
+
+ String type=p.hint_string;
+ if (type=="")
+ type="Object";
+
+ ObjectID id = obj->get( p.name );
+ if (id!=0) {
+ item->set_text(1,type+" ID: "+itos(id));
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+ } else {
+ item->set_text(1,"[Empty]");
+ }
+
+ if (has_icon(p.hint_string,"EditorIcons")) {
+ type=p.hint_string;
+ } else {
+ type="Object";
+ }
+
+ item->set_icon(0,get_icon(type,"EditorIcons"));
+
+ break;
+
+ } else {
+ if (p.type == Variant::REAL) {
+
+ item->set_range_config(1, -16777216, 16777216, 0.001);
+ } else {
+
+ item->set_range_config(1, -2147483647, 2147483647, 1);
+ }
+ };
+
+ if (p.type==Variant::REAL) {
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Real","EditorIcons"));
+ item->set_range(1, obj->get( p.name ) );
+
+ } else {
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Integer","EditorIcons") );
+ item->set_range(1, obj->get( p.name ) );
+ }
+
+
+ item->set_editable(1,!read_only);
+
+
+ } break;
+ case Variant::STRING: {
+
+ switch (p.hint) {
+
+ case PROPERTY_HINT_DIR:
+ case PROPERTY_HINT_FILE:
+ case PROPERTY_HINT_GLOBAL_DIR:
+ case PROPERTY_HINT_GLOBAL_FILE: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_STRING );
+ item->set_editable(1,!read_only);
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("File","EditorIcons") );
+ item->set_text(1,obj->get(p.name));
+ item->add_button(1,get_icon("Folder","EditorIcons"));
+
+ } break;
+ case PROPERTY_HINT_ENUM: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_RANGE );
+ Vector<String> strings = p.hint_string.split(",");
+ String current = obj->get(p.name);
+ int idx=0;
+ for(int x=0;x<strings.size();x++) {
+ if (strings[x]==current) {
+ idx=x;
+ break;
+ }
+ }
+ item->set_text(1, p.hint_string);
+ item->set_range(1,idx);
+ item->set_editable( 1, !read_only );
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Enum","EditorIcons") );
+
+
+ } break;
+ case PROPERTY_HINT_METHOD_OF_VARIANT_TYPE: ///< a property of a type
+ case PROPERTY_HINT_METHOD_OF_BASE_TYPE: ///< a method of a base type
+ case PROPERTY_HINT_METHOD_OF_INSTANCE: ///< a method of an instance
+ case PROPERTY_HINT_METHOD_OF_SCRIPT: ///< a method of a script & base
+ case PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE: ///< a property of a type
+ case PROPERTY_HINT_PROPERTY_OF_BASE_TYPE: ///< a property of a base type
+ case PROPERTY_HINT_PROPERTY_OF_INSTANCE: ///< a property of an instance
+ case PROPERTY_HINT_PROPERTY_OF_SCRIPT: ///< a property of a script & base
+ case PROPERTY_HINT_TYPE_STRING: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM);
+ item->set_editable(1,!read_only);
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("String","EditorIcons") );
+ item->set_text(1,obj->get(p.name));
+
+ } break;
+
+ default: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_STRING );
+ item->set_editable(1,!read_only);
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("String","EditorIcons") );
+ item->set_text(1,obj->get(p.name));
+ if (p.hint==PROPERTY_HINT_MULTILINE_TEXT)
+ item->add_button(1,get_icon("MultiLine","EditorIcons") );
+
+ } break;
+ }
+
+ } break;
+ case Variant::ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+
+ Variant v = obj->get(p.name);
+ String type_name = "Array";
+ String type_name_suffix = "";
+
+ String hint = p.hint_string;
+ while(hint.begins_with(itos(Variant::ARRAY)+":")) {
+ type_name += "<Array";
+ type_name_suffix += ">";
+ hint = hint.substr(2, hint.size()-2);
+ }
+ if(hint.find(":") >= 0) {
+ hint = hint.substr(0,hint.find(":"));
+ if(hint.find("/") >= 0) {
+ hint = hint.substr(0,hint.find("/"));
+ }
+ type_name += "<" + Variant::get_type_name(Variant::Type(hint.to_int()));
+ type_name_suffix += ">";
+ }
+ type_name += type_name_suffix;
+
+ if (v.is_array())
+ item->set_text(1,type_name+"["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,type_name+"[]");
+
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("ArrayData","EditorIcons") );
+
+
+ } break;
+
+ case Variant::POOL_INT_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"IntArray["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"IntArray[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("ArrayInt","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_REAL_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"FloatArray["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"FloatArray[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("ArrayReal","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_STRING_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"String["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"String[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("ArrayString","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_BYTE_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"Byte["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"Byte[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("ArrayData","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_VECTOR2_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"Vector2["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"Vector2[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Vector2","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_VECTOR3_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"Vector3["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"Vector3[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Vector","EditorIcons") );
+
+
+ } break;
+ case Variant::POOL_COLOR_ARRAY: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+
+ Variant v = obj->get(p.name);
+ if (v.is_array())
+ item->set_text(1,"Color["+itos(v.call("size"))+"]");
+ else
+ item->set_text(1,"Color[]");
+ if (show_type_icons)
+ item->set_icon( 0, get_icon("Color","EditorIcons") );
+
+
+ } break;
+ case Variant::VECTOR2: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Vector2","EditorIcons") );
+
+ } break;
+ case Variant::RECT2: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Rect2","EditorIcons") );
+
+ } break;
+ case Variant::VECTOR3: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Vector","EditorIcons") );
+
+ } break;
+ case Variant::TRANSFORM2D:
+ case Variant::BASIS: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1, obj->get(p.name));
+ } break;
+ case Variant::TRANSFORM: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Matrix","EditorIcons") );
+
+ } break;
+ case Variant::PLANE: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Plane","EditorIcons") );
+
+ } break;
+ case Variant::RECT3: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,"Rect3");
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Rect3","EditorIcons") );
+ } break;
+
+ case Variant::QUAT: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, true );
+ item->set_text(1,obj->get(p.name));
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Quat","EditorIcons") );
+
+ } break;
+ case Variant::COLOR: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, !read_only );
+ //item->set_text(1,obj->get(p.name));
+ item->set_custom_draw(1,this,"_draw_transparency");
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Color","EditorIcons") );
+
+ } break;
+ case Variant::IMAGE: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, !read_only );
+ Image img = obj->get( p.name );
+ if (img.empty())
+ item->set_text(1,"[Image (empty)]");
+ else
+ item->set_text(1,"[Image "+itos(img.get_width())+"x"+itos(img.get_height())+"-"+String(Image::get_format_name(img.get_format()))+"]");
+ if (show_type_icons)
+ item->set_icon( 0,get_icon("Image","EditorIcons") );
+
+ } break;
+ case Variant::NODE_PATH: {
+
+ item->set_cell_mode(1, TreeItem::CELL_MODE_STRING);
+ item->set_editable( 1, !read_only );
+ item->set_text(1,obj->get(p.name));
+ item->add_button(1, get_icon("CopyNodePath", "EditorIcons"));
+
+ } break;
+ case Variant::OBJECT: {
+
+ item->set_cell_mode( 1, TreeItem::CELL_MODE_CUSTOM );
+ item->set_editable( 1, !read_only );
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+ String type;
+ if (p.hint==PROPERTY_HINT_RESOURCE_TYPE)
+ type=p.hint_string;
+
+ if (obj->get( p.name ).get_type() == Variant::NIL || obj->get( p.name ).operator RefPtr().is_null()) {
+ item->set_text(1,"<null>");
+ item->set_icon(1,Ref<Texture>());
+
+ } else {
+ RES res = obj->get( p.name ).operator RefPtr();
+
+ if (res->is_class("Texture")) {
+ int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
+ item->set_icon_max_width(1,tw);
+ item->set_icon(1,res);
+ item->set_text(1,"");
+
+ } else if (res->get_name() != "") {
+
+ item->set_text(1, res->get_name());
+ } else if (res->get_path()!="" && !res->get_path().begins_with("local://")) {
+ item->set_text(1, res->get_path().get_file());
+
+ } else {
+ item->set_text(1,"<"+res->get_class()+">");
+ }
+
+ if (has_icon(res->get_class(),"EditorIcons")) {
+ type=res->get_class();
+ }
+
+ if (res.is_valid() && res->get_path().is_resource_file()) {
+ item->set_tooltip(1,res->get_path());
+ } else if (res.is_valid()) {
+ item->set_tooltip(1,res->get_name()+" ("+res->get_class()+")");
+ }
+ if (!res->is_class("Texture")) {
+ //texture already previews via itself
+ EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res,this,"_resource_preview_done",item->get_instance_ID());
+ }
+
+ }
+
+
+ if (type!=String()) {
+ if (type.find(",")!=-1)
+ type=type.get_slice(",",0);
+ //printf("prop %s , type %s\n",p.name.ascii().get_data(),p.hint_string.ascii().get_data());
+ if (has_icon(type,"EditorIcons"))
+ item->set_icon( 0, get_icon(type,"EditorIcons") );
+ else
+ item->set_icon( 0, get_icon("Object","EditorIcons") );
+ }
+
+ //item->double_click_signal.connect( Method1<int>( Method2<int,String>( this, &Editoritem_obj_edited ), p.name ) );
+
+ } break;
+ default: {};
+ }
+
+ if (keying) {
+
+ if (p.hint==PROPERTY_HINT_SPRITE_FRAME) {
+
+ item->add_button(1,get_icon("KeyNext","EditorIcons"),5);
+ } else {
+ item->add_button(1,get_icon("Key","EditorIcons"),2);
+ }
+ }
+
+ bool has_reload=false;
+
+ bool mbi = _might_be_in_instance();
+ if (mbi) {
+
+ Variant vorig;
+ Dictionary d=item->get_metadata(0);
+ int usage = d.has("usage")?int(int(d["usage"])&(PROPERTY_USAGE_STORE_IF_NONONE|PROPERTY_USAGE_STORE_IF_NONZERO)):0;
+ if (_get_instanced_node_original_property(p.name,vorig) || usage) {
+ Variant v = obj->get(p.name);
+
+
+ if (_is_property_different(v,vorig,usage)) {
+ //print_line("FOR "+String(p.name)+" RELOAD WITH: "+String(v)+"("+Variant::get_type_name(v.get_type())+")=="+String(vorig)+"("+Variant::get_type_name(vorig.get_type())+")");
+ item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ has_reload=true;
+ }
+ }
+
+ }
+
+ if (obj->call("property_can_revert",p.name).operator bool()) {
+
+ item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ has_reload=true;
+ }
+
+ if (!has_reload && !obj->get_script().is_null()) {
+ Ref<Script> scr = obj->get_script();
+ Variant orig_value;
+ if (scr->get_property_default_value(p.name,orig_value)) {
+ if (orig_value!=obj->get(p.name)) {
+ item->add_button(1,get_icon("ReloadSmall","EditorIcons"),3);
+ has_reload=true;
+ }
+ }
+ }
+
+ if (mbi && !has_reload && item->get_cell_mode(1)==TreeItem::CELL_MODE_RANGE && item->get_text(1)==String()) {
+ item->add_button(1,get_icon("ReloadEmpty","EditorIcons"),3,true);
+ }
+
+
+
+ }
+}
+
+void PropertyEditor::_draw_transparency(Object *t, const Rect2& p_rect) {
+
+ TreeItem *ti=t->cast_to<TreeItem>();
+ if (!ti)
+ return;
+
+ Color color=obj->get(ti->get_metadata(1));
+ Ref<Texture> arrow=tree->get_icon("select_arrow");
+
+ // make a little space between consecutive color fields
+ Rect2 area=p_rect;
+ area.pos.y+=1;
+ area.size.height-=2;
+ area.size.width-=arrow->get_size().width+5;
+ tree->draw_texture_rect(get_icon("Transparent", "EditorIcons"), area, true);
+ tree->draw_rect(area, color);
+
+}
+
+
+void PropertyEditor::_item_selected() {
+
+
+ TreeItem *item = tree->get_selected();
+ ERR_FAIL_COND(!item);
+ selected_property=item->get_metadata(1);
+
+}
+
+
+void PropertyEditor::_edit_set(const String& p_name, const Variant& p_value, bool p_refresh_all, const String& p_changed_field) {
+
+ if (autoclear) {
+ TreeItem *item = tree->get_selected();
+ if (item && item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK) {
+
+ item->set_checked(0,true);
+ }
+ }
+
+ if (!undo_redo|| obj->cast_to<ArrayPropertyEdit>()) { //kind of hacky
+
+ obj->set(p_name,p_value);
+ if (p_refresh_all)
+ _changed_callbacks(obj,"");
+ else
+ _changed_callbacks(obj,p_name);
+
+ emit_signal(_prop_edited,p_name);
+
+ } else if (obj->cast_to<MultiNodeEdit>()) {
+
+ obj->cast_to<MultiNodeEdit>()->set_property_field(p_name,p_value,p_changed_field);
+ _changed_callbacks(obj,p_name);
+ emit_signal(_prop_edited,p_name);
+ } else {
+
+ undo_redo->create_action(TTR("Set")+" "+p_name,UndoRedo::MERGE_ENDS);
+ undo_redo->add_do_property(obj,p_name,p_value);
+ undo_redo->add_undo_property(obj,p_name,obj->get(p_name));
+
+ if (p_refresh_all) {
+ undo_redo->add_do_method(this,"_changed_callback",obj,"");
+ undo_redo->add_undo_method(this,"_changed_callback",obj,"");
+ } else {
+
+ undo_redo->add_do_method(this,"_changed_callback",obj,p_name);
+ undo_redo->add_undo_method(this,"_changed_callback",obj,p_name);
+ }
+
+ Resource *r = obj->cast_to<Resource>();
+ if (r) {
+ if (!r->is_edited() && String(p_name)!="resource/edited") {
+ undo_redo->add_do_method(r,"set_edited",true);
+ undo_redo->add_undo_method(r,"set_edited",false);
+ }
+
+ if (String(p_name)=="resource_local_to_scene") {
+ bool prev = obj->get(p_name);
+ bool next = p_value;
+ if (next) {
+ undo_redo->add_do_method(this,"setup_local_to_scene");
+ }
+ if (prev) {
+ undo_redo->add_undo_method(this,"setup_local_to_scene");
+ }
+ }
+ }
+ undo_redo->add_do_method(this,"emit_signal",_prop_edited,p_name);
+ undo_redo->add_undo_method(this,"emit_signal",_prop_edited,p_name);
+ undo_redo->commit_action();
+ }
+}
+
+
+void PropertyEditor::_item_edited() {
+
+
+ TreeItem * item = tree->get_edited();
+ if (!item)
+ return; //it all happened too fast..
+
+ Dictionary d = item->get_metadata(0);
+
+ String name=d["name"];
+
+ if (tree->get_edited_column()==0) {
+ //property checked
+ if (autoclear) {
+ if (!item->is_checked(0)) {
+ obj->set(name,Variant());
+ update_property(name);
+ } else {
+ Variant::CallError ce;
+ obj->set(name,Variant::construct(Variant::Type(int(d["type"])),NULL,0,ce));
+ }
+ } else {
+ emit_signal("property_toggled",name,item->is_checked(0));
+ }
+ return;
+ }
+
+ if (autoclear && item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK && item->get_cell_mode(1)!=TreeItem::CELL_MODE_CUSTOM) {
+ item->set_checked(0,true);
+
+ }
+
+
+ int type=d["type"];
+ int hint= d["hint"];
+ int usage = d["usage"];
+ bool refresh_all = usage&PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED;
+
+ String hint_text=d["hint_text"];
+ switch(type) {
+
+ case Variant::NIL: {
+
+ } break;
+ case Variant::BOOL: {
+
+ _edit_set(name,item->is_checked(1),refresh_all);
+ item->set_tooltip(1, item->is_checked(1) ? "True" : "False");
+ } break;
+ case Variant::INT:
+ case Variant::REAL: {
+
+ if (hint==PROPERTY_HINT_LAYERS_2D_PHYSICS || hint==PROPERTY_HINT_LAYERS_2D_RENDER || hint==PROPERTY_HINT_LAYERS_3D_PHYSICS || hint==PROPERTY_HINT_LAYERS_3D_RENDER)
+ break;
+ if (hint==PROPERTY_HINT_EXP_EASING)
+ break;
+ if (hint==PROPERTY_HINT_FLAGS)
+ break;
+
+ if (type==Variant::INT)
+ _edit_set(name,int(item->get_range(1)),refresh_all);
+ else
+ _edit_set(name,item->get_range(1),refresh_all);
+ } break;
+ case Variant::STRING: {
+
+ if (hint==PROPERTY_HINT_ENUM) {
+
+ int idx= item->get_range(1);
+
+ Vector<String> strings = hint_text.split(",");
+ String txt;
+ if (idx>=0 && idx<strings.size()) {
+
+ txt=strings[idx];
+ }
+
+ _edit_set(name,txt,refresh_all);
+ } else {
+ _edit_set(name,item->get_text(1),refresh_all);
+ }
+ } break;
+ // math types
+
+ case Variant::VECTOR3: {
+
+ } break;
+ case Variant::PLANE: {
+
+ } break;
+ case Variant::QUAT: {
+
+ } break;
+ case Variant::RECT3: {
+
+ } break;
+ case Variant::BASIS: {
+
+ } break;
+ case Variant::TRANSFORM: {
+
+ } break;
+
+ case Variant::COLOR: {
+ //_edit_set(name,item->get_custom_bg_color(0));
+ } break;
+ case Variant::IMAGE: {
+
+ } break;
+ case Variant::NODE_PATH: {
+ _edit_set(name, NodePath(item->get_text(1)),refresh_all);
+
+ } break;
+
+ case Variant::INPUT_EVENT: {
+
+ } break;
+ case Variant::DICTIONARY: {
+
+ } break;
+
+ // arrays
+ case Variant::POOL_BYTE_ARRAY: {
+
+ } break;
+ case Variant::POOL_INT_ARRAY: {
+
+ } break;
+ case Variant::POOL_REAL_ARRAY: {
+
+ } break;
+ case Variant::POOL_STRING_ARRAY: {
+
+ } break;
+ case Variant::POOL_VECTOR3_ARRAY: {
+
+ } break;
+ case Variant::POOL_COLOR_ARRAY: {
+
+ } break;
+
+
+ };
+}
+
+
+void PropertyEditor::_resource_edit_request() {
+
+ RES res=custom_editor->get_variant();
+ if (res.is_null())
+ return;
+
+ String name=custom_editor->get_name();
+
+
+ emit_signal("resource_selected",res.get_ref_ptr(),name);
+}
+
+void PropertyEditor::_custom_editor_edited() {
+
+
+ if (!obj)
+ return;
+
+ _edit_set(custom_editor->get_name(), custom_editor->get_variant());
+}
+
+void PropertyEditor::_custom_editor_edited_field(const String& p_field_name) {
+
+ ERR_FAIL_COND(p_field_name=="");
+
+ if (!obj)
+ return;
+
+ _edit_set(custom_editor->get_name(), custom_editor->get_variant(), false, p_field_name);
+}
+
+void PropertyEditor::_custom_editor_request(bool p_arrow) {
+
+ TreeItem * item = tree->get_edited();
+ ERR_FAIL_COND(!item);
+ Dictionary d = item->get_metadata(0);
+
+ //int type=d["type"];
+ String name=d["name"];
+ Variant::Type type=Variant::NIL;
+ if (d.has("type"))
+ type=(Variant::Type)((int)(d["type"]));
+
+ Variant v=obj->get(name);
+ int hint=d.has("hint")?d["hint"].operator int():-1;
+ String hint_text=d.has("hint_text")?d["hint_text"]:"";
+ Rect2 where=tree->get_custom_popup_rect();
+ custom_editor->set_pos(where.pos);
+
+ if (custom_editor->edit(obj,name,type,v,hint,hint_text)) {
+ custom_editor->popup();
+ }
+}
+
+void PropertyEditor::edit(Object* p_object) {
+
+
+ if (obj==p_object)
+ return;
+ if (obj) {
+
+ obj->remove_change_receptor(this);
+ }
+
+ obj=p_object;
+
+ evaluator->edit(p_object);
+
+ update_tree();
+
+ if (obj) {
+
+ obj->add_change_receptor(this);
+ }
+
+
+}
+
+void PropertyEditor::_set_range_def(Object *p_item, String prop,float p_frame) {
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ti);
+
+ ti->call_deferred("set_range",1, p_frame);
+ obj->call_deferred("set",prop,p_frame);
+
+}
+
+void PropertyEditor::_edit_button(Object *p_item, int p_column, int p_button) {
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ti);
+
+ Dictionary d = ti->get_metadata(0);
+
+ if (p_button==2) {
+
+ if (!d.has("name"))
+ return;
+ String prop=d["name"];
+ emit_signal("property_keyed",prop,obj->get(prop),false);
+ } else if (p_button==5) {
+ print_line("PB5");
+ if (!d.has("name"))
+ return;
+ String prop=d["name"];
+ emit_signal("property_keyed",prop,obj->get(prop),true);
+ //set_range(p_column, ti->get_range(p_column)+1.0 );
+ call_deferred("_set_range_def",ti,prop,ti->get_range(p_column)+1.0);
+ } else if (p_button==3) {
+
+ if (!d.has("name"))
+ return;
+
+ String prop=d["name"];
+
+ Variant vorig;
+
+ if (_might_be_in_instance() && _get_instanced_node_original_property(prop,vorig)) {
+
+ _edit_set(prop,vorig);
+ return;
+ }
+
+ if (obj->call("property_can_revert",prop).operator bool()) {
+ Variant rev = obj->call("property_get_revert",prop);
+ _edit_set(prop,rev);
+ }
+
+ if (!obj->get_script().is_null()) {
+ Ref<Script> scr = obj->get_script();
+ Variant orig_value;
+ if (scr->get_property_default_value(prop,orig_value)) {
+ _edit_set(prop,orig_value);
+ }
+ }
+
+
+ } else {
+
+ Dictionary d = ti->get_metadata(0);
+ if (!d.has("type"))
+ return;
+ if (!d.has("hint"))
+ return;
+ if (!d.has("name"))
+ return;
+ if (!d.has("hint_text"))
+ return;
+
+ int t = d["type"];
+ int h = d["hint"];
+ String n = d["name"];
+ String ht = d["hint_text"];
+
+ if(t == Variant::NODE_PATH) {
+
+ Variant v = obj->get(n);
+ custom_editor->edit(obj, n, (Variant::Type)t, v, h, ht);
+ Rect2 where = tree->get_item_rect(ti, 1);
+ where.pos -= tree->get_scroll();
+ where.pos += tree->get_global_pos();
+ custom_editor->set_pos(where.pos);
+ custom_editor->popup();
+
+ } else if (t==Variant::STRING) {
+
+
+ Variant v = obj->get(n);
+ custom_editor->edit(obj,n,(Variant::Type)t,v,h,ht);
+ //Rect2 where=tree->get_custom_popup_rect();
+ if (h==PROPERTY_HINT_FILE || h==PROPERTY_HINT_DIR || h==PROPERTY_HINT_GLOBAL_DIR || h==PROPERTY_HINT_GLOBAL_FILE) {
+
+ Rect2 where=tree->get_item_rect(ti,1);
+ where.pos-=tree->get_scroll();
+ where.pos+=tree->get_global_pos();
+ custom_editor->set_pos(where.pos);
+ custom_editor->popup();
+ } else {
+ custom_editor->popup_centered_ratio();
+ }
+
+ } else if (t==Variant::OBJECT) {
+
+ RES r = obj->get(n);
+ if (r.is_valid()) {
+
+ emit_signal("resource_selected",r,n);
+ }
+ } else if (t==Variant::INT && h==PROPERTY_HINT_OBJECT_ID) {
+
+ emit_signal("object_id_selected",obj->get(n));
+ print_line("OBJ ID SELECTED");
+
+ } else if (t==Variant::ARRAY || t==Variant::POOL_INT_ARRAY || t==Variant::POOL_REAL_ARRAY || t==Variant::POOL_STRING_ARRAY || t==Variant::POOL_VECTOR2_ARRAY || t==Variant::POOL_VECTOR3_ARRAY || t==Variant::POOL_COLOR_ARRAY || t==Variant::POOL_BYTE_ARRAY) {
+
+ Variant v = obj->get(n);
+
+ if (v.get_type()!=t) {
+ Variant::CallError ce;
+ v=Variant::construct(Variant::Type(t),NULL,0,ce);
+ }
+
+ Ref<ArrayPropertyEdit> ape = memnew( ArrayPropertyEdit );
+ ape->edit(obj,n,ht,Variant::Type(t));
+
+ EditorNode::get_singleton()->push_item(ape.ptr());
+ }
+ }
+}
+
+
+void PropertyEditor::_node_removed(Node *p_node) {
+
+ if (p_node==obj) {
+
+ edit(NULL);
+ }
+}
+
+
+void PropertyEditor::set_keying(bool p_active) {
+
+ if (keying==p_active)
+ return;
+
+ keying=p_active;
+ update_tree();
+}
+
+void PropertyEditor::_draw_flags(Object *t,const Rect2& p_rect) {
+
+ TreeItem *ti = t->cast_to<TreeItem>();
+ if (!ti)
+ return;
+
+ Dictionary d = ti->get_metadata(0);
+
+ if (!d.has("name"))
+ return;
+
+ uint32_t f = obj->get(d["name"]);
+
+ int bsize = (p_rect.size.height*80/100)/2;
+
+ int h = bsize*2+1;
+ int vofs = (p_rect.size.height-h)/2;
+
+ for(int i=0;i<2;i++) {
+
+ Point2 ofs(4,vofs);
+ if (i==1)
+ ofs.y+=bsize+1;
+
+ ofs+=p_rect.pos;
+ for(int j=0;j<10;j++) {
+
+ Point2 o = ofs+Point2(j*(bsize+1),0);
+ if (j>=5)
+ o.x+=1;
+
+ uint32_t idx=i*10+j;
+ bool on=f&(1<<idx);
+ tree->draw_rect(Rect2(o,Size2(bsize,bsize)),Color(0,0,0,on?0.8:0.3));
+ }
+ }
+
+
+}
+
+void PropertyEditor::_filter_changed(const String& p_text) {
+
+ update_tree();
+}
+
+
+
+void PropertyEditor::_resource_preview_done(const String& p_path,const Ref<Texture>& p_preview,Variant p_ud) {
+
+ if (p_preview.is_null())
+ return; //don't bother with empty preview
+
+ ObjectID id = p_ud;
+ Object *obj = ObjectDB::get_instance(id);
+
+ if (!obj)
+ return;
+
+ TreeItem *ti = obj->cast_to<TreeItem>();
+
+ ERR_FAIL_COND(!ti);
+
+ int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
+
+ ti->set_icon(1,p_preview); //should be scaled I think?
+ ti->set_icon_max_width(1,tw);
+ ti->set_text(1,"");
+}
+void PropertyEditor::_bind_methods() {
+
+ ClassDB::bind_method( "_item_edited",&PropertyEditor::_item_edited);
+ ClassDB::bind_method( "_item_selected",&PropertyEditor::_item_selected);
+ ClassDB::bind_method( "_custom_editor_request",&PropertyEditor::_custom_editor_request);
+ ClassDB::bind_method( "_custom_editor_edited",&PropertyEditor::_custom_editor_edited);
+ ClassDB::bind_method( "_custom_editor_edited_field",&PropertyEditor::_custom_editor_edited_field,DEFVAL(""));
+ ClassDB::bind_method( "_resource_edit_request",&PropertyEditor::_resource_edit_request);
+ ClassDB::bind_method( "_node_removed",&PropertyEditor::_node_removed);
+ ClassDB::bind_method( "_edit_button",&PropertyEditor::_edit_button);
+ ClassDB::bind_method( "_changed_callback",&PropertyEditor::_changed_callbacks);
+ ClassDB::bind_method( "_draw_flags",&PropertyEditor::_draw_flags);
+ ClassDB::bind_method( "_set_range_def",&PropertyEditor::_set_range_def);
+ ClassDB::bind_method( "_filter_changed",&PropertyEditor::_filter_changed);
+ ClassDB::bind_method( "update_tree",&PropertyEditor::update_tree);
+ ClassDB::bind_method( "_resource_preview_done",&PropertyEditor::_resource_preview_done);
+ ClassDB::bind_method( "refresh",&PropertyEditor::refresh);
+ ClassDB::bind_method( "_draw_transparency",&PropertyEditor::_draw_transparency);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &PropertyEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &PropertyEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &PropertyEditor::drop_data_fw);
+
+ ADD_SIGNAL( MethodInfo("property_toggled",PropertyInfo( Variant::STRING, "property"),PropertyInfo( Variant::BOOL, "value")));
+ ADD_SIGNAL( MethodInfo("resource_selected", PropertyInfo( Variant::OBJECT, "res"),PropertyInfo( Variant::STRING, "prop") ) );
+ ADD_SIGNAL( MethodInfo("object_id_selected", PropertyInfo( Variant::INT, "id")) );
+ ADD_SIGNAL( MethodInfo("property_keyed",PropertyInfo( Variant::STRING, "property")));
+ ADD_SIGNAL( MethodInfo("property_edited",PropertyInfo( Variant::STRING, "property")));
+}
+
+Tree *PropertyEditor::get_scene_tree() {
+
+ return tree;
+}
+
+Label* PropertyEditor::get_top_label() {
+
+ return top_label;
+}
+
+void PropertyEditor::hide_top_label() {
+
+ top_label->hide();
+ tree->set_begin( Point2(0,0 ));
+}
+
+String PropertyEditor::get_selected_path() const {
+
+
+ TreeItem *ti = tree->get_selected();
+ if (!ti)
+ return "";
+
+ Dictionary d = ti->get_metadata(0);
+
+ if (d.has("name"))
+ return d["name"];
+ else
+ return "";
+}
+
+void PropertyEditor::set_capitalize_paths(bool p_capitalize) {
+
+ capitalize_paths=p_capitalize;
+}
+
+void PropertyEditor::set_autoclear(bool p_enable) {
+
+ autoclear=p_enable;
+}
+
+void PropertyEditor::set_show_categories(bool p_show) {
+
+ show_categories=p_show;
+ update_tree();
+}
+
+void PropertyEditor::set_use_filter(bool p_use) {
+
+ if (p_use==use_filter)
+ return;
+
+ use_filter=p_use;
+ update_tree();
+}
+
+void PropertyEditor::register_text_enter(Node* p_line_edit) {
+
+ ERR_FAIL_NULL(p_line_edit);
+ search_box=p_line_edit->cast_to<LineEdit>();
+
+ if (search_box)
+ search_box->connect("text_changed",this,"_filter_changed");
+}
+
+void PropertyEditor::set_subsection_selectable(bool p_selectable) {
+
+ if (p_selectable==subsection_selectable)
+ return;
+
+ subsection_selectable=p_selectable;
+ update_tree();
+}
+
+PropertyEditor::PropertyEditor() {
+
+ _prop_edited="property_edited";
+
+ hide_script=false;
+
+ undo_redo=NULL;
+ obj=NULL;
+ search_box=NULL;
+ changing=false;
+ update_tree_pending=false;
+
+ top_label = memnew( Label );
+ top_label->set_text(TTR("Properties:"));
+ top_label->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ top_label->set_begin( Point2( 10,0) );
+ top_label->set_end( Point2( 0,12) );
+
+ add_child(top_label);
+
+
+ tree = memnew( Tree );
+ tree->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ tree->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ tree->set_begin( Point2(0,19 ));
+ tree->set_end( Point2(0,0 ));
+
+ tree->set_columns(2);
+ tree->set_column_expand(0,true);
+ tree->set_column_min_width(0,30);
+ tree->set_column_expand(1,true);
+ tree->set_column_min_width(1,18);
+
+ //tree->set_hide_root(true);
+ add_child( tree );
+
+ tree->connect("item_edited", this,"_item_edited",varray(),CONNECT_DEFERRED);
+ tree->connect("cell_selected", this,"_item_selected");
+
+ tree->set_drag_forwarding(this);
+
+ set_fixed_process(true);
+
+ custom_editor = memnew( CustomPropertyEditor );
+ add_child(custom_editor);
+
+ tree->connect("custom_popup_edited", this,"_custom_editor_request");
+ tree->connect("button_pressed", this,"_edit_button");
+ custom_editor->connect("variant_changed", this,"_custom_editor_edited");
+ custom_editor->connect("variant_field_changed", this,"_custom_editor_edited_field");
+ custom_editor->connect("resource_edit_request", this,"_resource_edit_request",make_binds(),CONNECT_DEFERRED);
+ tree->set_hide_folding(true);
+
+ evaluator = memnew (PropertyValueEvaluator);
+ tree->set_value_evaluator(evaluator);
+ custom_editor->set_value_evaluator(evaluator);
+
+ capitalize_paths=true;
+ autoclear=false;
+ tree->set_column_titles_visible(false);
+
+ keying=false;
+ read_only=false;
+ show_categories=false;
+ refresh_countdown=0;
+ use_doc_hints=false;
+ use_filter=false;
+ subsection_selectable=false;
+ show_type_icons=EDITOR_DEF("interface/show_type_icons",false);
+
+}
+
+
+PropertyEditor::~PropertyEditor()
+{
+ memdelete(evaluator);
+}
+
+
+/////////////////////////////
+
+
+
+
+
+class SectionedPropertyEditorFilter : public Object {
+
+ GDCLASS( SectionedPropertyEditorFilter, Object );
+
+ Object *edited;
+ String section;
+ bool allow_sub;
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ if (!edited)
+ return false;
+
+ String name=p_name;
+ if (section!="") {
+ name=section+"/"+name;
+ }
+
+ bool valid;
+ edited->set(name,p_value,&valid);
+ //_change_notify(p_name.operator String().utf8().get_data());
+ return valid;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const{
+
+ if (!edited)
+ return false;
+
+ String name=p_name;
+ if (section!="") {
+ name=section+"/"+name;
+ }
+
+ bool valid=false;
+
+ r_ret=edited->get(name,&valid);
+ return valid;
+
+
+ }
+ void _get_property_list(List<PropertyInfo> *p_list) const{
+
+ if (!edited)
+ return;
+
+ List<PropertyInfo> pinfo;
+ edited->get_property_list(&pinfo);
+ for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ PropertyInfo pi=E->get();
+ int sp = pi.name.find("/");
+
+ if (pi.name=="resource_path" || pi.name=="resource_name" || pi.name.begins_with("script/")) //skip resource stuff
+ continue;
+
+ if (sp==-1) {
+ pi.name="Global/"+pi.name;
+
+ }
+
+ if (pi.name.begins_with(section+"/")) {
+ pi.name=pi.name.replace_first(section+"/","");
+ if (!allow_sub && pi.name.find("/")!=-1)
+ continue;
+ p_list->push_back(pi);
+ }
+ }
+
+ }
+
+ bool property_can_revert(const String& p_name) {
+
+ return edited->call("property_can_revert",section+"/"+p_name);
+ }
+
+ Variant property_get_revert(const String& p_name) {
+
+ return edited->call("property_get_revert",section+"/"+p_name);
+ }
+
+protected:
+ static void _bind_methods() {
+
+ ClassDB::bind_method("property_can_revert",&SectionedPropertyEditorFilter::property_can_revert);
+ ClassDB::bind_method("property_get_revert",&SectionedPropertyEditorFilter::property_get_revert);
+ }
+
+public:
+
+ void set_section(const String& p_section,bool p_allow_sub) {
+
+ section=p_section;
+ allow_sub=p_allow_sub;
+ _change_notify();
+ }
+
+ void set_edited(Object* p_edited) {
+ edited=p_edited;
+ _change_notify();
+ }
+
+ SectionedPropertyEditorFilter() {
+ edited=NULL;
+ }
+
+};
+
+
+void SectionedPropertyEditor::_bind_methods() {
+
+ ClassDB::bind_method("_section_selected",&SectionedPropertyEditor::_section_selected);
+
+ ClassDB::bind_method("update_category_list", &SectionedPropertyEditor::update_category_list);
+}
+
+void SectionedPropertyEditor::_section_selected() {
+
+ if (!sections->get_selected())
+ return;
+
+ filter->set_section( sections->get_selected()->get_metadata(0), sections->get_selected()->get_children()==NULL);
+}
+
+void SectionedPropertyEditor::set_current_section(const String& p_section) {
+
+ if (section_map.has(p_section)) {
+ section_map[p_section]->select(0);
+ }
+}
+
+String SectionedPropertyEditor::get_current_section() const {
+
+ if (sections->get_selected())
+ return sections->get_selected()->get_metadata(0);
+ else
+ return "";
+}
+
+String SectionedPropertyEditor::get_full_item_path(const String& p_item) {
+
+ String base = get_current_section();
+
+ if (base!="")
+ return base+"/"+p_item;
+ else
+ return p_item;
+}
+
+void SectionedPropertyEditor::edit(Object* p_object) {
+
+ if (!p_object) {
+ obj = -1;
+ sections->clear();
+
+ filter->set_edited(NULL);
+ editor->edit(NULL);
+
+ return;
+ }
+
+ ObjectID id = p_object->get_instance_ID();
+
+ if (obj != id) {
+
+ obj = id;
+ update_category_list();
+
+ filter->set_edited(p_object);
+ editor->edit(filter);
+
+ if (sections->get_root()->get_children()) {
+ sections->get_root()->get_children()->select(0);
+ }
+ } else {
+
+ update_category_list();
+ }
+}
+
+void SectionedPropertyEditor::update_category_list() {
+
+ String selected_category=get_current_section();
+ sections->clear();
+
+ Object *o = ObjectDB::get_instance(obj);
+
+ if (!o)
+ return;
+
+ List<PropertyInfo> pinfo;
+ o->get_property_list(&pinfo);
+
+ section_map.clear();
+
+ TreeItem *root = sections->create_item();
+ section_map[""]=root;
+
+
+ for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ PropertyInfo pi=E->get();
+
+ if (pi.usage&PROPERTY_USAGE_CATEGORY)
+ continue;
+ else if ( !(pi.usage&PROPERTY_USAGE_EDITOR) )
+ continue;
+
+ if (pi.name.find(":")!=-1 || pi.name=="script" || pi.name=="resource_name" || pi.name=="resource_path")
+ continue;
+ int sp = pi.name.find("/");
+ if (sp==-1)
+ pi.name="Global/"+pi.name;
+
+ Vector<String> sectionarr = pi.name.split("/");
+ String metasection;
+
+
+ for(int i=0;i<MIN(2,sectionarr.size()-1);i++) {
+
+ TreeItem *parent = section_map[metasection];
+
+ if (i>0) {
+ metasection+="/"+sectionarr[i];
+ } else {
+ metasection=sectionarr[i];
+ }
+
+
+ if (!section_map.has(metasection)) {
+ TreeItem *ms = sections->create_item(parent);
+ section_map[metasection]=ms;
+ ms->set_text(0,sectionarr[i].capitalize());
+ ms->set_metadata(0,metasection);
+
+ }
+ }
+
+ }
+
+ if (section_map.has(selected_category)) {
+ section_map[selected_category]->select(0);
+ }
+}
+
+PropertyEditor *SectionedPropertyEditor::get_property_editor() {
+
+ return editor;
+}
+
+SectionedPropertyEditor::SectionedPropertyEditor() {
+
+ obj = -1;
+
+ VBoxContainer *left_vb = memnew( VBoxContainer);
+ left_vb->set_custom_minimum_size(Size2(160,0)*EDSCALE);
+ add_child(left_vb);
+
+ sections = memnew( Tree );
+ sections->set_v_size_flags(SIZE_EXPAND_FILL);
+ sections->set_hide_root(true);
+
+ left_vb->add_margin_child(TTR("Sections:"),sections,true);
+
+ VBoxContainer *right_vb = memnew( VBoxContainer);
+ right_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(right_vb);
+
+ filter = memnew( SectionedPropertyEditorFilter );
+ editor = memnew( PropertyEditor );
+ editor->set_v_size_flags(SIZE_EXPAND_FILL);
+ right_vb->add_margin_child(TTR("Properties:"),editor,true);
+
+ editor->get_scene_tree()->set_column_titles_visible(false);
+
+
+ editor->hide_top_label();
+
+ sections->connect("cell_selected",this,"_section_selected");
+
+}
+
+SectionedPropertyEditor::~SectionedPropertyEditor() {
+
+ memdelete(filter);
+}
+
+double PropertyValueEvaluator::eval(const String& p_text) {
+
+ if (!obj || !script_language)
+ return _default_eval(p_text);
+
+ Ref<Script> script= Ref<Script>(script_language ->create_script());
+ script->set_source_code(_build_script(p_text));
+ Error err = script->reload();
+ if (err) {
+ print_line("[PropertyValueEvaluator] Error loading script for expression: " + p_text);
+ return _default_eval(p_text);
+ }
+
+ ScriptInstance *script_instance = script->instance_create(this);
+ if (!script_instance)
+ return _default_eval(p_text);
+
+ Variant::CallError call_err;
+ script_instance->call("set_this",obj);
+ double result = script_instance->call("e", NULL, 0, call_err );
+ if (call_err.error == Variant::CallError::CALL_OK) {
+ return result;
+ }
+ print_line("[PropertyValueEvaluator]: Error eval! Error code: " + itos(call_err.error));
+
+ memdelete(script_instance);
+
+ return _default_eval(p_text);
+}
+
+
+void PropertyValueEvaluator::edit(Object *p_obj) {
+ obj = p_obj;
+}
+
+String PropertyValueEvaluator::_build_script(const String& p_text) {
+ String script_text = "tool\nvar this\nfunc set_this(p_this):\n\tthis=p_this\nfunc e():\n\treturn ";
+ script_text += p_text.strip_edges();
+ script_text += "\n";
+ return script_text;
+}
+
+PropertyValueEvaluator::PropertyValueEvaluator() {
+ script_language=NULL;
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ if (ScriptServer::get_language(i)->get_name()=="GDScript") {
+ script_language=ScriptServer::get_language(i);
+ }
+ }
+}
+
+PropertyValueEvaluator::~PropertyValueEvaluator() {
+
+}
diff --git a/editor/property_editor.h b/editor/property_editor.h
new file mode 100644
index 0000000000..c9ae9a85cc
--- /dev/null
+++ b/editor/property_editor.h
@@ -0,0 +1,352 @@
+/*************************************************************************/
+/* property_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROPERTY_EDITOR_H
+#define PROPERTY_EDITOR_H
+
+#include "scene/gui/tree.h"
+#include "scene/gui/button.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/label.h"
+#include "editor/editor_file_dialog.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/color_picker.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/text_edit.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/grid_container.h"
+#include "scene_tree_editor.h"
+
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+
+class PropertyValueEvaluator;
+class CreateDialog;
+class PropertySelector;
+
+class CustomPropertyEditor : public Popup {
+
+ GDCLASS( CustomPropertyEditor, Popup );
+
+ enum {
+ MAX_VALUE_EDITORS=12,
+ MAX_ACTION_BUTTONS=5,
+ OBJ_MENU_LOAD=0,
+ OBJ_MENU_EDIT=1,
+ OBJ_MENU_CLEAR=2,
+ OBJ_MENU_MAKE_UNIQUE=3,
+ OBJ_MENU_COPY=4,
+ OBJ_MENU_PASTE=5,
+ OBJ_MENU_REIMPORT=6,
+ OBJ_MENU_NEW_SCRIPT=7,
+ OBJ_MENU_SHOW_IN_FILE_SYSTEM=8,
+ TYPE_BASE_ID=100
+ };
+
+ enum {
+ EASING_LINEAR,
+ EASING_EASE_IN,
+ EASING_EASE_OUT,
+ EASING_ZERO,
+ EASING_IN_OUT,
+ EASING_OUT_IN
+ };
+
+
+ PopupMenu *menu;
+ SceneTreeDialog *scene_tree;
+ EditorFileDialog *file;
+ ConfirmationDialog *error;
+ String name;
+ Variant::Type type;
+ Variant v;
+ List<String> field_names;
+ int hint;
+ String hint_text;
+ LineEdit *value_editor[MAX_VALUE_EDITORS];
+ int focused_value_editor;
+ Label *value_label[MAX_VALUE_EDITORS];
+ HScrollBar *scroll[4];
+ Button *action_buttons[MAX_ACTION_BUTTONS];
+ MenuButton *type_button;
+ Vector<String> inheritors_array;
+ TextureRect *texture_preview;
+ ColorPicker *color_picker;
+ TextEdit *text_edit;
+ bool read_only;
+ bool picking_viewport;
+ GridContainer *checks20gc;
+ CheckBox *checks20[20];
+ SpinBox *spinbox;
+ HSlider *slider;
+
+
+ Control *easing_draw;
+ CreateDialog *create_dialog;
+ PropertySelector *property_select;
+
+ Object* owner;
+
+ bool updating;
+
+ PropertyValueEvaluator *evaluator;
+
+ void _text_edit_changed();
+ void _file_selected(String p_file);
+ void _scroll_modified(double p_value);
+ void _modified(String p_string);
+ void _range_modified(double p_value);
+ void _focus_enter();
+ void _focus_exit();
+ void _action_pressed(int p_which);
+ void _type_create_selected(int p_idx);
+ void _create_dialog_callback();
+ void _create_selected_property(const String &p_prop);
+
+
+ void _color_changed(const Color& p_color);
+ void _draw_easing();
+ void _menu_option(int p_which);
+
+ void _drag_easing(const InputEvent& p_ev);
+
+ void _node_path_selected(NodePath p_path);
+ void show_value_editors(int p_amount);
+ void config_value_editors(int p_amount, int p_columns,int p_label_w,const List<String>& p_strings);
+ void config_action_buttons(const List<String>& p_strings);
+
+ void _emit_changed_whole_or_field();
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+
+ void hide_menu();
+
+ Variant get_variant() const;
+ String get_name() const;
+
+ void set_read_only(bool p_read_only) { read_only=p_read_only; }
+
+ void set_value_evaluator( PropertyValueEvaluator *p_evaluator) { evaluator=p_evaluator; }
+
+ bool edit(Object* p_owner,const String& p_name,Variant::Type p_type, const Variant& p_variant,int p_hint,String p_hint_text);
+
+ CustomPropertyEditor();
+};
+
+class PropertyEditor : public Control {
+
+ GDCLASS( PropertyEditor, Control );
+
+ Tree *tree;
+ Label *top_label;
+ //Object *object;
+ LineEdit *search_box;
+
+ PropertyValueEvaluator *evaluator;
+
+ Object* obj;
+
+
+ StringName _prop_edited;
+
+ bool capitalize_paths;
+ bool changing;
+ bool update_tree_pending;
+ bool autoclear;
+ bool keying;
+ bool read_only;
+ bool show_categories;
+ bool show_type_icons;
+ float refresh_countdown;
+ bool use_doc_hints;
+ bool use_filter;
+ bool subsection_selectable;
+ bool hide_script;
+
+ HashMap<String,String> pending;
+ String selected_property;
+
+ Map<StringName,Map<StringName,String> > descr_cache;
+ Map<StringName,String > class_descr_cache;
+
+ CustomPropertyEditor *custom_editor;
+
+ void _resource_edit_request();
+ void _custom_editor_edited();
+ void _custom_editor_edited_field(const String& p_field_name);
+ void _custom_editor_request(bool p_arrow);
+
+ void _item_selected();
+ void _item_edited();
+ TreeItem *get_parent_node(String p_path,HashMap<String,TreeItem*>& item_paths,TreeItem *root);
+
+ void set_item_text(TreeItem *p_item, int p_type, const String& p_name, int p_hint=PROPERTY_HINT_NONE, const String& p_hint_text="");
+
+ TreeItem *find_item(TreeItem *p_item,const String& p_name);
+
+
+ virtual void _changed_callback(Object *p_changed,const char * p_what);
+ virtual void _changed_callbacks(Object *p_changed,const String& p_callback);
+
+ void _check_reload_status(const String&p_name,TreeItem* item);
+
+ void _edit_button(Object *p_item, int p_column, int p_button);
+
+ void _node_removed(Node *p_node);
+
+friend class ProjectExportDialog;
+ void _edit_set(const String& p_name, const Variant& p_value,bool p_refresh_all=false, const String& p_changed_field="");
+ void _draw_flags(Object *ti,const Rect2& p_rect);
+
+ bool _might_be_in_instance();
+ bool _get_instanced_node_original_property(const StringName& p_prop,Variant& value);
+ bool _is_property_different(const Variant& p_current, const Variant& p_orig,int p_usage=0);
+
+ void _refresh_item(TreeItem *p_item);
+ void _set_range_def(Object *p_item, String prop, float p_frame);
+
+ void _filter_changed(const String& p_text);
+
+ void _mark_drop_fields(TreeItem* p_at);
+ void _clear_drop_fields(TreeItem* p_at);
+
+ bool _is_drop_valid(const Dictionary& p_drag_data, const Dictionary& p_item_data) const;
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+ void _resource_preview_done(const String& p_path,const Ref<Texture>& p_preview,Variant p_ud);
+ void _draw_transparency(Object *t, const Rect2& p_rect);
+
+ UndoRedo *undo_redo;
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo=p_undo_redo; }
+
+ String get_selected_path() const;
+
+ Tree *get_scene_tree();
+ Label* get_top_label();
+ void hide_top_label();
+ void update_tree();
+ void update_property(const String& p_prop);
+
+ void refresh();
+
+ void edit(Object* p_object);
+
+ void set_keying(bool p_active);
+ void set_read_only(bool p_read_only) { read_only=p_read_only; custom_editor->set_read_only(p_read_only);}
+
+ void set_capitalize_paths(bool p_capitalize);
+ void set_autoclear(bool p_enable);
+
+ void set_show_categories(bool p_show);
+ void set_use_doc_hints(bool p_enable) { use_doc_hints=p_enable; }
+ void set_hide_script(bool p_hide) { hide_script=p_hide; }
+
+ void set_use_filter(bool p_use);
+ void register_text_enter(Node *p_line_edit);
+
+ void set_subsection_selectable(bool p_selectable);
+
+ PropertyEditor();
+ ~PropertyEditor();
+
+};
+
+
+class SectionedPropertyEditorFilter;
+
+class SectionedPropertyEditor : public HBoxContainer {
+
+
+ GDCLASS(SectionedPropertyEditor,HBoxContainer);
+
+ ObjectID obj;
+
+ Tree *sections;
+ SectionedPropertyEditorFilter *filter;
+
+ Map<String,TreeItem*> section_map;
+ PropertyEditor *editor;
+
+
+ static void _bind_methods();
+ void _section_selected();
+
+public:
+
+ PropertyEditor *get_property_editor();
+ void edit(Object* p_object);
+ String get_full_item_path(const String& p_item);
+
+ void set_current_section(const String& p_section);
+ String get_current_section() const;
+
+ void update_category_list();
+
+ SectionedPropertyEditor();
+ ~SectionedPropertyEditor();
+};
+
+class PropertyValueEvaluator : public ValueEvaluator {
+ GDCLASS( PropertyValueEvaluator, ValueEvaluator );
+
+ Object *obj;
+ ScriptLanguage *script_language;
+ String _build_script(const String& p_text);
+
+ _FORCE_INLINE_ double _default_eval(const String& p_text) {
+ return p_text.to_double();
+ }
+
+public:
+
+ void edit(Object *p_obj);
+ double eval(const String& p_text);
+
+ PropertyValueEvaluator();
+ ~PropertyValueEvaluator();
+};
+
+#endif
diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp
new file mode 100644
index 0000000000..71ffae4729
--- /dev/null
+++ b/editor/property_selector.cpp
@@ -0,0 +1,626 @@
+/*************************************************************************/
+/* property_selector.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "property_selector.h"
+
+#include "editor_scale.h"
+#include "os/keyboard.h"
+
+void PropertySelector::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void PropertySelector::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY) {
+
+ switch(p_ie.key.scancode) {
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_PAGEUP:
+ case KEY_PAGEDOWN: {
+
+ search_options->call("_gui_input", p_ie);
+ search_box->accept_event();
+
+ TreeItem *root = search_options->get_root();
+ if (!root->get_children())
+ break;
+
+ TreeItem *current = search_options->get_selected();
+
+ TreeItem *item = search_options->get_next_selected(root);
+ while (item) {
+ item->deselect(0);
+ item = search_options->get_next_selected(item);
+ }
+
+ current->select(0);
+
+ } break;
+ }
+ }
+}
+
+
+void PropertySelector::_update_search() {
+
+
+ if (properties)
+ set_title(TTR("Select Property"));
+ else
+ set_title(TTR("Select Method"));
+
+ search_options->clear();
+ help_bit->set_text("");
+
+
+ TreeItem *root = search_options->create_item();
+
+
+ if (properties) {
+
+ List<PropertyInfo> props;
+
+ if (instance) {
+ instance->get_property_list(&props,true);
+ } else if (type!=Variant::NIL) {
+ Variant v;
+ if (type==Variant::INPUT_EVENT) {
+ InputEvent ie;
+ ie.type=event_type;
+ v=ie;
+ } else {
+ Variant::CallError ce;
+ v=Variant::construct(type,NULL,0,ce);
+ }
+
+ v.get_property_list(&props);
+ } else {
+
+
+ Object *obj = ObjectDB::get_instance(script);
+ if (obj && obj->cast_to<Script>()) {
+
+ props.push_back(PropertyInfo(Variant::NIL,"Script Variables",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_CATEGORY));
+ obj->cast_to<Script>()->get_script_property_list(&props);
+ }
+
+ StringName base=base_type;
+ while(base) {
+ props.push_back(PropertyInfo(Variant::NIL,base,PROPERTY_HINT_NONE,"",PROPERTY_USAGE_CATEGORY));
+ ClassDB::get_property_list(base,&props,true);
+ base=ClassDB::get_parent_class(base);
+ }
+
+ }
+
+ TreeItem *category=NULL;
+
+ bool found=false;
+
+ Ref<Texture> type_icons[Variant::VARIANT_MAX]={
+ Control::get_icon("MiniVariant","EditorIcons"),
+ Control::get_icon("MiniBoolean","EditorIcons"),
+ Control::get_icon("MiniInteger","EditorIcons"),
+ Control::get_icon("MiniFloat","EditorIcons"),
+ Control::get_icon("MiniString","EditorIcons"),
+ Control::get_icon("MiniVector2","EditorIcons"),
+ Control::get_icon("MiniRect2","EditorIcons"),
+ Control::get_icon("MiniVector3","EditorIcons"),
+ Control::get_icon("MiniMatrix2","EditorIcons"),
+ Control::get_icon("MiniPlane","EditorIcons"),
+ Control::get_icon("MiniQuat","EditorIcons"),
+ Control::get_icon("MiniAabb","EditorIcons"),
+ Control::get_icon("MiniMatrix3","EditorIcons"),
+ Control::get_icon("MiniTransform","EditorIcons"),
+ Control::get_icon("MiniColor","EditorIcons"),
+ Control::get_icon("MiniImage","EditorIcons"),
+ Control::get_icon("MiniPath","EditorIcons"),
+ Control::get_icon("MiniRid","EditorIcons"),
+ Control::get_icon("MiniObject","EditorIcons"),
+ Control::get_icon("MiniInput","EditorIcons"),
+ Control::get_icon("MiniDictionary","EditorIcons"),
+ Control::get_icon("MiniArray","EditorIcons"),
+ Control::get_icon("MiniRawArray","EditorIcons"),
+ Control::get_icon("MiniIntArray","EditorIcons"),
+ Control::get_icon("MiniFloatArray","EditorIcons"),
+ Control::get_icon("MiniStringArray","EditorIcons"),
+ Control::get_icon("MiniVector2Array","EditorIcons"),
+ Control::get_icon("MiniVector3Array","EditorIcons"),
+ Control::get_icon("MiniColorArray","EditorIcons")
+ };
+
+
+ for (List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
+ if (E->get().usage==PROPERTY_USAGE_CATEGORY) {
+ if (category && category->get_children()==NULL) {
+ memdelete(category); //old category was unused
+ }
+ category = search_options->create_item(root);
+ category->set_text(0,E->get().name);
+ category->set_selectable(0,false);
+
+ Ref<Texture> icon;
+ if (E->get().name=="Script Variables") {
+ icon=get_icon("Script","EditorIcons");
+ } else if (has_icon(E->get().name,"EditorIcons")) {
+ icon=get_icon(E->get().name,"EditorIcons");
+ } else {
+ icon=get_icon("Object","EditorIcons");
+ }
+ category->set_icon(0,icon);
+ continue;
+ }
+
+ if (!(E->get().usage&PROPERTY_USAGE_EDITOR))
+ continue;
+
+ if (search_box->get_text()!=String() && E->get().name.find(search_box->get_text())==-1)
+ continue;
+ TreeItem *item = search_options->create_item(category?category:root);
+ item->set_text(0,E->get().name);
+ item->set_metadata(0,E->get().name);
+ item->set_icon(0,type_icons[E->get().type]);
+
+ if (!found && search_box->get_text()!=String() && E->get().name.find(search_box->get_text())!=-1) {
+ item->select(0);
+ found=true;
+ }
+
+ item->set_selectable(0,true);
+ }
+
+ if (category && category->get_children()==NULL) {
+ memdelete(category); //old category was unused
+ }
+ } else {
+
+ List<MethodInfo> methods;
+
+ if (type!=Variant::NIL) {
+ Variant v;
+ Variant::CallError ce;
+ v=Variant::construct(type,NULL,0,ce);
+ v.get_method_list(&methods);
+ } else {
+
+
+ Object *obj = ObjectDB::get_instance(script);
+ if (obj && obj->cast_to<Script>()) {
+
+ methods.push_back(MethodInfo("*Script Methods"));
+ obj->cast_to<Script>()->get_script_method_list(&methods);
+ }
+
+ StringName base=base_type;
+ while(base) {
+ methods.push_back(MethodInfo("*"+String(base)));
+ ClassDB::get_method_list(base,&methods,true);
+ base=ClassDB::get_parent_class(base);
+ }
+
+ }
+
+ TreeItem *category=NULL;
+
+ bool found=false;
+ bool script_methods=false;
+
+ for (List<MethodInfo>::Element *E=methods.front();E;E=E->next()) {
+ if (E->get().name.begins_with("*")) {
+ if (category && category->get_children()==NULL) {
+ memdelete(category); //old category was unused
+ }
+ category = search_options->create_item(root);
+ category->set_text(0,E->get().name.replace_first("*",""));
+ category->set_selectable(0,false);
+
+ Ref<Texture> icon;
+ script_methods=false;
+ if (E->get().name=="*Script Methods") {
+ icon=get_icon("Script","EditorIcons");
+ script_methods=true;
+ } else if (has_icon(E->get().name,"EditorIcons")) {
+ icon=get_icon(E->get().name,"EditorIcons");
+ } else {
+ icon=get_icon("Object","EditorIcons");
+ }
+ category->set_icon(0,icon);
+
+ continue;
+ }
+
+ String name = E->get().name.get_slice(":",0);
+ if (!script_methods && name.begins_with("_") && !(E->get().flags&METHOD_FLAG_VIRTUAL))
+ continue;
+
+ if (search_box->get_text()!=String() && name.find(search_box->get_text())==-1)
+ continue;
+
+ TreeItem *item = search_options->create_item(category?category:root);
+
+ MethodInfo mi=E->get();
+
+ String desc;
+ if (mi.name.find(":")!=-1) {
+ desc=mi.name.get_slice(":",1)+" ";
+ mi.name=mi.name.get_slice(":",0);
+ } else if (mi.return_val.type!=Variant::NIL)
+ desc=Variant::get_type_name(mi.return_val.type);
+ else
+ desc="void ";
+
+
+
+ desc+=" "+mi.name+" ( ";
+
+ for(int i=0;i<mi.arguments.size();i++) {
+
+ if (i>0)
+ desc+=", ";
+
+ if (mi.arguments[i].type==Variant::NIL)
+ desc+="var ";
+ else if (mi.arguments[i].name.find(":")!=-1) {
+ desc+=mi.arguments[i].name.get_slice(":",1)+" ";
+ mi.arguments[i].name=mi.arguments[i].name.get_slice(":",0);
+ } else
+ desc+=Variant::get_type_name(mi.arguments[i].type)+" ";
+
+ desc+=mi.arguments[i].name;
+
+ }
+
+ desc+=" )";
+
+ item->set_text(0,desc);
+ item->set_metadata(0,name);
+ item->set_selectable(0,true);
+
+ if (!found && search_box->get_text()!=String() && name.find(search_box->get_text())!=-1) {
+ item->select(0);
+ found=true;
+ }
+
+ }
+
+ if (category && category->get_children()==NULL) {
+ memdelete(category); //old category was unused
+ }
+
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+
+
+void PropertySelector::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+ emit_signal("selected",ti->get_metadata(0));
+ hide();
+}
+
+void PropertySelector::_item_selected() {
+
+ help_bit->set_text("");
+
+ TreeItem *item=search_options->get_selected();
+ if (!item)
+ return;
+ String name = item->get_metadata(0);
+
+ String class_type;
+ if (properties && type==Variant::INPUT_EVENT) {
+
+ switch(event_type) {
+ case InputEvent::NONE: class_type="InputEvent"; break;
+ case InputEvent::KEY: class_type="InputEventKey"; break;
+ case InputEvent::MOUSE_MOTION: class_type="InputEventMouseMotion"; break;
+ case InputEvent::MOUSE_BUTTON: class_type="InputEventMouseButton"; break;
+ case InputEvent::JOYPAD_MOTION: class_type="InputEventJoypadMotion"; break;
+ case InputEvent::JOYPAD_BUTTON: class_type="InputEventJoypadButton"; break;
+ case InputEvent::SCREEN_TOUCH: class_type="InputEventScreenTouch"; break;
+ case InputEvent::SCREEN_DRAG: class_type="InputEventScreenDrag"; break;
+ case InputEvent::ACTION: class_type="InputEventAction"; break;
+ default: {}
+ }
+
+ } else if (type) {
+ class_type=Variant::get_type_name(type);
+
+ } else {
+ class_type=base_type;
+ }
+
+ DocData *dd=EditorHelp::get_doc_data();
+ String text;
+
+
+ if (properties) {
+
+ String at_class=class_type;
+
+
+
+ while(at_class!=String()) {
+
+
+ Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(at_class);
+ if (E) {
+ for(int i=0;i<E->get().properties.size();i++) {
+ if (E->get().properties[i].name==name) {
+ text=E->get().properties[i].description;
+ }
+ }
+ }
+
+ at_class=ClassDB::get_parent_class(at_class);
+ }
+
+ if (text==String()) {
+
+ StringName setter;
+ StringName type;
+ if (ClassDB::get_setter_and_type_for_property(class_type,name,type,setter)) {
+ Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(type);
+ if (E) {
+ for(int i=0;i<E->get().methods.size();i++) {
+ if (E->get().methods[i].name==setter.operator String()) {
+ text=E->get().methods[i].description;
+ }
+ }
+ }
+
+
+ }
+ }
+
+ } else {
+
+
+ String at_class=class_type;
+
+ while(at_class!=String()) {
+
+ Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(at_class);
+ if (E) {
+ for(int i=0;i<E->get().methods.size();i++) {
+ if (E->get().methods[i].name==name) {
+ text=E->get().methods[i].description;
+ }
+ }
+ }
+
+ at_class=ClassDB::get_parent_class(at_class);
+ }
+ }
+
+
+ if (text==String())
+ return;
+
+ help_bit->set_text(text);
+
+}
+
+
+void PropertySelector::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+
+ }
+}
+
+
+
+void PropertySelector::select_method_from_base_type(const String& p_base,const String& p_current) {
+
+ base_type=p_base;
+ selected=p_current;
+ type=Variant::NIL;
+ script=0;
+ properties=false;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+}
+
+void PropertySelector::select_method_from_script(const Ref<Script>& p_script,const String& p_current){
+
+ ERR_FAIL_COND( p_script.is_null() );
+ base_type=p_script->get_instance_base_type();
+ selected=p_current;
+ type=Variant::NIL;
+ script=p_script->get_instance_ID();
+ properties=false;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+void PropertySelector::select_method_from_basic_type(Variant::Type p_type, const String &p_current){
+
+ ERR_FAIL_COND(p_type==Variant::NIL);
+ base_type="";
+ selected=p_current;
+ type=p_type;
+ script=0;
+ properties=false;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+
+void PropertySelector::select_method_from_instance(Object* p_instance, const String &p_current){
+
+
+ base_type=p_instance->get_class();
+ selected=p_current;
+ type=Variant::NIL;
+ script=0;
+ {
+ Ref<Script> scr = p_instance->get_script();
+ if (scr.is_valid())
+ script=scr->get_instance_ID();
+ }
+ properties=false;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+
+
+void PropertySelector::select_property_from_base_type(const String& p_base,const String& p_current) {
+
+ base_type=p_base;
+ selected=p_current;
+ type=Variant::NIL;
+ script=0;
+ properties=true;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+}
+
+void PropertySelector::select_property_from_script(const Ref<Script>& p_script,const String& p_current){
+
+ ERR_FAIL_COND( p_script.is_null() );
+
+ base_type=p_script->get_instance_base_type();
+ selected=p_current;
+ type=Variant::NIL;
+ script=p_script->get_instance_ID();
+ properties=true;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+void PropertySelector::select_property_from_basic_type(Variant::Type p_type, InputEvent::Type p_event_type, const String &p_current){
+
+ ERR_FAIL_COND(p_type==Variant::NIL);
+ base_type="";
+ selected=p_current;
+ type=p_type;
+ event_type=p_event_type;
+ script=0;
+ properties=true;
+ instance=NULL;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+
+void PropertySelector::select_property_from_instance(Object* p_instance, const String &p_current){
+
+
+ base_type="";
+ selected=p_current;
+ type=Variant::NIL;
+ script=0;
+ properties=true;
+ instance=p_instance;
+
+ popup_centered_ratio(0.6);
+ search_box->set_text("");
+ search_box->grab_focus();
+ _update_search();
+
+}
+
+void PropertySelector::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&PropertySelector::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&PropertySelector::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&PropertySelector::_sbox_input);
+ ClassDB::bind_method(D_METHOD("_item_selected"),&PropertySelector::_item_selected);
+
+ ADD_SIGNAL(MethodInfo("selected",PropertyInfo(Variant::STRING,"name")));
+
+}
+
+
+PropertySelector::PropertySelector() {
+
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+ search_box = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Search:"),search_box);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("Open"));
+ get_ok()->set_disabled(true);
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
+ search_options->connect("item_activated",this,"_confirmed");
+ search_options->connect("cell_selected",this,"_item_selected");
+ search_options->set_hide_root(true);
+ search_options->set_hide_folding(true);
+
+ help_bit = memnew( EditorHelpBit );
+ vbc->add_margin_child(TTR("Description:"),help_bit);
+ help_bit->connect("request_hide",this,"_closed");
+
+
+}
diff --git a/editor/property_selector.h b/editor/property_selector.h
new file mode 100644
index 0000000000..c2ce996be2
--- /dev/null
+++ b/editor/property_selector.h
@@ -0,0 +1,83 @@
+/*************************************************************************/
+/* property_selector.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PROPERTYSELECTOR_H
+#define PROPERTYSELECTOR_H
+
+#include "editor/property_editor.h"
+#include "scene/gui/rich_text_label.h"
+#include "editor_help.h"
+
+class PropertySelector : public ConfirmationDialog {
+ GDCLASS(PropertySelector,ConfirmationDialog )
+
+
+ LineEdit *search_box;
+ Tree *search_options;
+
+ void _update_search();
+
+ void _sbox_input(const InputEvent& p_ie);
+
+ void _confirmed();
+ void _text_changed(const String& p_newtext);
+
+ EditorHelpBit *help_bit;
+
+ bool properties;
+ String selected;
+ Variant::Type type;
+ InputEvent::Type event_type;
+ String base_type;
+ ObjectID script;
+ Object *instance;
+
+ void _item_selected();
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+
+
+public:
+
+
+ void select_method_from_base_type(const String& p_base,const String& p_current="");
+ void select_method_from_script(const Ref<Script>& p_script,const String& p_current="");
+ void select_method_from_basic_type(Variant::Type p_type,const String& p_current="");
+ void select_method_from_instance(Object* p_instance, const String &p_current="");
+
+ void select_property_from_base_type(const String& p_base,const String& p_current="");
+ void select_property_from_script(const Ref<Script>& p_script,const String& p_current="");
+ void select_property_from_basic_type(Variant::Type p_type,InputEvent::Type p_event_type,const String& p_current="");
+ void select_property_from_instance(Object* p_instance, const String &p_current="");
+
+ PropertySelector();
+};
+
+#endif // PROPERTYSELECTOR_H
diff --git a/editor/pvrtc_compress.cpp b/editor/pvrtc_compress.cpp
new file mode 100644
index 0000000000..b130f6c773
--- /dev/null
+++ b/editor/pvrtc_compress.cpp
@@ -0,0 +1,134 @@
+/*************************************************************************/
+/* pvrtc_compress.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "pvrtc_compress.h"
+
+#include "editor_settings.h"
+#include "scene/resources/texture.h"
+#include "io/resource_saver.h"
+#include "io/resource_loader.h"
+#include "os/os.h"
+#include "os/file_access.h"
+
+static void (*_base_image_compress_pvrtc2_func)(Image *)=NULL;
+static void (*_base_image_compress_pvrtc4_func)(Image *)=NULL;
+
+static void _compress_image(Image::CompressMode p_mode,Image *p_image) {
+
+ String ttpath = EditorSettings::get_singleton()->get("filesystem/import/pvrtc_texture_tool");
+
+ if (ttpath.strip_edges()=="" || !FileAccess::exists(ttpath)) {
+ switch(p_mode) {
+
+ case Image::COMPRESS_PVRTC2:
+ if (_base_image_compress_pvrtc2_func)
+ _base_image_compress_pvrtc2_func(p_image);
+ else if (_base_image_compress_pvrtc4_func)
+ _base_image_compress_pvrtc4_func(p_image);
+
+ break;
+ case Image::COMPRESS_PVRTC4:
+ if (_base_image_compress_pvrtc4_func)
+ _base_image_compress_pvrtc4_func(p_image);
+
+ break;
+ default: ERR_FAIL();
+
+ }
+ return;
+ }
+ String spath = EditorSettings::get_singleton()->get_settings_path();
+
+
+ List<String> args;
+
+ String src_img = spath+"/"+"_tmp_src_img.png";
+ String dst_img = spath+"/"+"_tmp_dst_img.pvr";
+
+ args.push_back("-i");
+ args.push_back(src_img);
+ args.push_back("-o");
+ args.push_back(dst_img);
+ args.push_back("-f");
+ switch(p_mode) {
+
+ case Image::COMPRESS_PVRTC2: args.push_back("PVRTC2"); break;
+ case Image::COMPRESS_PVRTC4: args.push_back("PVRTC4"); break;
+ case Image::COMPRESS_ETC: args.push_back("ETC"); break;
+ default: ERR_FAIL();
+
+ }
+
+ if (EditorSettings::get_singleton()->get("filesystem/import/pvrtc_fast_conversion").operator bool()) {
+ args.push_back("-pvrtcfast");
+ }
+ if (p_image->has_mipmaps())
+ args.push_back("-m");
+
+ Ref<ImageTexture> t = memnew( ImageTexture );
+ t->create_from_image(*p_image,0);
+ ResourceSaver::save(src_img,t);
+
+ Error err = OS::get_singleton()->execute(ttpath,args,true);
+ ERR_EXPLAIN(TTR("Could not execute PVRTC tool:")+" "+ttpath);
+ ERR_FAIL_COND(err!=OK);
+
+
+ t=ResourceLoader::load(dst_img,"Texture");
+
+ ERR_EXPLAIN(TTR("Can't load back converted image using PVRTC tool:")+" "+dst_img);
+ ERR_FAIL_COND(t.is_null());
+
+ *p_image=t->get_data();
+}
+
+
+static void _compress_pvrtc2(Image *p_image) {
+
+ _compress_image(Image::COMPRESS_PVRTC2,p_image);
+}
+
+static void _compress_pvrtc4(Image *p_image) {
+
+ _compress_image(Image::COMPRESS_PVRTC4,p_image);
+}
+
+static void _compress_etc(Image *p_image) {
+
+ _compress_image(Image::COMPRESS_ETC,p_image);
+}
+
+void _pvrtc_register_compressors() {
+
+ _base_image_compress_pvrtc2_func=Image::_image_compress_pvrtc2_func;
+ _base_image_compress_pvrtc4_func=Image::_image_compress_pvrtc4_func;
+
+ Image::_image_compress_pvrtc2_func=_compress_pvrtc2;
+ Image::_image_compress_pvrtc4_func=_compress_pvrtc4;
+ //Image::_image_compress_etc_func=_compress_etc; //use the built in one for ETC
+}
diff --git a/editor/pvrtc_compress.h b/editor/pvrtc_compress.h
new file mode 100644
index 0000000000..4ba29026c5
--- /dev/null
+++ b/editor/pvrtc_compress.h
@@ -0,0 +1,37 @@
+/*************************************************************************/
+/* pvrtc_compress.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef PVRTC_COMPRESS_H
+#define PVRTC_COMPRESS_H
+
+#include "image.h"
+
+void _pvrtc_register_compressors();
+
+
+#endif // PVRTC_COMPRESS_H
diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp
new file mode 100644
index 0000000000..f43189a7bf
--- /dev/null
+++ b/editor/quick_open.cpp
@@ -0,0 +1,285 @@
+/*************************************************************************/
+/* quick_open.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "quick_open.h"
+
+#include "os/keyboard.h"
+
+void EditorQuickOpen::popup(const StringName &p_base, bool p_enable_multi, bool p_add_dirs, bool p_dontclear) {
+
+ add_directories=p_add_dirs;
+ popup_centered_ratio(0.6);
+ if (p_dontclear)
+ search_box->select_all();
+ else
+ search_box->clear();
+ if (p_enable_multi)
+ search_options->set_select_mode(Tree::SELECT_MULTI);
+ else
+ search_options->set_select_mode(Tree::SELECT_SINGLE);
+ search_box->grab_focus();
+ base_type=p_base;
+ _update_search();
+}
+
+String EditorQuickOpen::get_selected() const {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return String();
+
+ return "res://" + ti->get_text(0);
+}
+
+Vector<String> EditorQuickOpen::get_selected_files() const {
+
+ Vector<String> files;
+
+ TreeItem* item = search_options->get_next_selected(search_options->get_root());
+ while (item) {
+
+ files.push_back("res://"+item->get_text(0));
+
+ item = search_options->get_next_selected(item);
+ }
+
+ return files;
+}
+
+void EditorQuickOpen::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void EditorQuickOpen::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY) {
+
+ switch(p_ie.key.scancode) {
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_PAGEUP:
+ case KEY_PAGEDOWN: {
+
+ search_options->call("_gui_input", p_ie);
+ search_box->accept_event();
+
+ TreeItem *root = search_options->get_root();
+ if (!root->get_children())
+ break;
+
+ TreeItem *current = search_options->get_selected();
+
+ TreeItem *item = search_options->get_next_selected(root);
+ while (item) {
+ item->deselect(0);
+ item = search_options->get_next_selected(item);
+ }
+
+ current->select(0);
+
+ } break;
+ }
+ }
+
+}
+
+float EditorQuickOpen::_path_cmp(String search, String path) const {
+
+ if (search == path) {
+ return 1.2f;
+ }
+ if (path.findn(search) != -1) {
+ return 1.1f;
+ }
+ return path.to_lower().similarity(search.to_lower());
+}
+
+void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< String, Ref<Texture> > > &list) {
+
+ if (!add_directories) {
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+
+ _parse_fs(efsd->get_subdir(i), list);
+ }
+ }
+
+ String search_text = search_box->get_text();
+
+ if (add_directories) {
+ String path = efsd->get_path();
+ if (!path.ends_with("/"))
+ path+="/";
+ if (path!="res://") {
+ path=path.substr(6,path.length());
+ if (search_text.is_subsequence_ofi(path)) {
+ Pair< String, Ref<Texture> > pair;
+ pair.first = path;
+ pair.second = get_icon("folder", "FileDialog");
+
+ if (search_text != String() && list.size() > 0) {
+
+ float this_sim = _path_cmp(search_text, path);
+ float other_sim = _path_cmp(list[0].first, path);
+ int pos = 1;
+
+ while (pos < list.size() && this_sim <= other_sim) {
+ other_sim = _path_cmp(list[pos++].first, path);
+ }
+
+ pos = this_sim >= other_sim ? pos - 1 : pos;
+ list.insert(pos, pair);
+
+ } else {
+ list.push_back(pair);
+ }
+ }
+ }
+ }
+ for(int i=0;i<efsd->get_file_count();i++) {
+
+ String file = efsd->get_file_path(i);
+ file=file.substr(6,file.length());
+
+ if (ClassDB::is_parent_class(efsd->get_file_type(i),base_type) && (search_text.is_subsequence_ofi(file))) {
+ Pair< String, Ref<Texture> > pair;
+ pair.first = file;
+ pair.second = get_icon((has_icon(efsd->get_file_type(i), ei) ? efsd->get_file_type(i) : ot), ei);
+
+ if (search_text != String() && list.size() > 0) {
+
+ float this_sim = _path_cmp(search_text, file);
+ float other_sim = _path_cmp(list[0].first, file);
+ int pos = 1;
+
+ while (pos < list.size() && this_sim <= other_sim) {
+ other_sim = _path_cmp(list[pos++].first, file);
+ }
+
+ pos = this_sim >= other_sim ? pos - 1 : pos;
+ list.insert(pos, pair);
+
+ } else {
+
+ list.push_back(pair);
+ }
+ }
+ }
+
+
+ if (add_directories) {
+ for(int i=0;i<efsd->get_subdir_count();i++) {
+
+ _parse_fs(efsd->get_subdir(i), list);
+ }
+ }
+
+}
+
+void EditorQuickOpen::_update_search() {
+
+ search_options->clear();
+ TreeItem *root = search_options->create_item();
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem();
+ Vector< Pair< String, Ref<Texture> > > list;
+
+ _parse_fs(efsd, list);
+
+ for (int i = 0; i < list.size(); i++) {
+ TreeItem *ti = search_options->create_item(root);
+ ti->set_text(0, list[i].first);
+ ti->set_icon(0, list[i].second);
+ }
+
+ if (root->get_children()) {
+ TreeItem *ti = root->get_children();
+
+ ti->select(0);
+ ti->set_as_cursor(0);
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+void EditorQuickOpen::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+ emit_signal("quick_open");
+ hide();
+}
+
+void EditorQuickOpen::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+ }
+}
+
+
+StringName EditorQuickOpen::get_base_type() const {
+
+ return base_type;
+}
+
+void EditorQuickOpen::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&EditorQuickOpen::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&EditorQuickOpen::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&EditorQuickOpen::_sbox_input);
+
+ ADD_SIGNAL(MethodInfo("quick_open"));
+
+}
+
+
+EditorQuickOpen::EditorQuickOpen() {
+
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+ search_box = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Search:"),search_box);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("Open"));
+ get_ok()->set_disabled(true);
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
+ search_options->connect("item_activated",this,"_confirmed");
+ search_options->set_hide_root(true);
+ ei="EditorIcons";
+ ot="Object";
+ add_directories=false;
+}
diff --git a/editor/quick_open.h b/editor/quick_open.h
new file mode 100644
index 0000000000..ef91d910b1
--- /dev/null
+++ b/editor/quick_open.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* quick_open.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef EDITOR_QUICK_OPEN_H
+#define EDITOR_QUICK_OPEN_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tree.h"
+#include "editor_file_system.h"
+#include "pair.h"
+class EditorQuickOpen : public ConfirmationDialog {
+
+ GDCLASS(EditorQuickOpen,ConfirmationDialog )
+
+ LineEdit *search_box;
+ Tree *search_options;
+ StringName base_type;
+ StringName ei;
+ StringName ot;
+ bool add_directories;
+
+
+ void _update_search();
+
+ void _sbox_input(const InputEvent& p_ie);
+ void _parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< String,Ref <Texture> > > &list);
+ float _path_cmp(String search, String path) const;
+
+
+ void _confirmed();
+ void _text_changed(const String& p_newtext);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ StringName get_base_type() const;
+
+ String get_selected() const;
+ Vector<String> get_selected_files() const;
+
+ void popup(const StringName& p_base,bool p_enable_multi=false,bool p_add_dirs=false,bool p_dontclear=false);
+ EditorQuickOpen();
+};
+
+#endif // EDITOR_QUICK_OPEN_H
diff --git a/editor/register_exporters.h b/editor/register_exporters.h
new file mode 100644
index 0000000000..30ec522a00
--- /dev/null
+++ b/editor/register_exporters.h
@@ -0,0 +1,35 @@
+/*************************************************************************/
+/* register_exporters.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef REGISTER_EXPORTERS_H
+#define REGISTER_EXPORTERS_H
+
+
+void register_exporters();
+
+#endif
diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp
new file mode 100644
index 0000000000..c5b74d9006
--- /dev/null
+++ b/editor/reparent_dialog.cpp
@@ -0,0 +1,120 @@
+/*************************************************************************/
+/* reparent_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "reparent_dialog.h"
+
+#include "scene/gui/label.h"
+#include "scene/gui/box_container.h"
+#include "print_string.h"
+
+void ReparentDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed", this,"_reparent");
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ disconnect("confirmed", this,"_reparent");
+ }
+
+ if (p_what==NOTIFICATION_DRAW) {
+
+ //RID ci = get_canvas_item();
+ //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+}
+
+void ReparentDialog::_cancel() {
+
+ hide();
+
+}
+void ReparentDialog::_reparent() {
+
+ if (tree->get_selected()) {
+
+ emit_signal("reparent",tree->get_selected()->get_path(),keep_transform->is_pressed());
+ hide();
+ }
+}
+
+void ReparentDialog::set_current(const Set<Node*>& p_selection) {
+
+ tree->set_marked(p_selection,false,false);
+ //tree->set_selected(p_node->get_parent());
+}
+
+void ReparentDialog::_bind_methods() {
+
+ ClassDB::bind_method("_reparent",&ReparentDialog::_reparent);
+ ClassDB::bind_method("_cancel",&ReparentDialog::_cancel);
+
+ ADD_SIGNAL( MethodInfo("reparent",PropertyInfo(Variant::NODE_PATH,"path"),PropertyInfo(Variant::BOOL,"keep_global_xform")));
+}
+
+
+ReparentDialog::ReparentDialog() {
+
+ set_title(TTR("Reparent Node"));
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+ tree = memnew( SceneTreeEditor(false) );
+ tree->set_show_enabled_subscene(true);
+
+ vbc->add_margin_child(TTR("Reparent Location (Select new Parent):"),tree,true);
+
+ tree->get_scene_tree()->connect("item_activated",this,"_reparent");
+
+ //Label *label = memnew( Label );
+ //label->set_pos( Point2( 15,8) );
+ //label->set_text("Reparent Location (Select new Parent):");
+
+ keep_transform = memnew( CheckBox );
+ keep_transform->set_text(TTR("Keep Global Transform"));
+ keep_transform->set_pressed(true);
+ vbc->add_child(keep_transform);
+
+
+ //vbc->add_margin_child("Options:",node_only);
+
+ //cancel->connect("pressed", this,"_cancel");
+
+ get_ok()->set_text(TTR("Reparent"));
+
+}
+
+
+ReparentDialog::~ReparentDialog()
+{
+}
+
diff --git a/editor/reparent_dialog.h b/editor/reparent_dialog.h
new file mode 100644
index 0000000000..200760314c
--- /dev/null
+++ b/editor/reparent_dialog.h
@@ -0,0 +1,68 @@
+/*************************************************************************/
+/* reparent_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef REPARENT_DIALOG_H
+#define REPARENT_DIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/button.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/check_box.h"
+#include "editor/scene_tree_editor.h"
+#include "scene/gui/line_edit.h"
+/**
+@author Juan Linietsky <reduzio@gmail.com>
+*/
+class ReparentDialog : public ConfirmationDialog {
+
+ GDCLASS( ReparentDialog, ConfirmationDialog );
+
+ SceneTreeEditor *tree;
+ CheckBox *keep_transform;
+
+
+ void update_tree();
+ void _reparent();
+ void _cancel();
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void set_current(const Set<Node*>& p_selection);
+ String get_selected_type();
+
+ ReparentDialog();
+ ~ReparentDialog();
+
+};
+
+#endif
diff --git a/editor/resources_dock.cpp b/editor/resources_dock.cpp
new file mode 100644
index 0000000000..8648361bae
--- /dev/null
+++ b/editor/resources_dock.cpp
@@ -0,0 +1,409 @@
+/*************************************************************************/
+/* resources_dock.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "resources_dock.h"
+
+#include "editor_node.h"
+#include "io/resource_loader.h"
+#include "io/resource_saver.h"
+#include "editor_settings.h"
+#include "project_settings.h"
+#include "global_config.h"
+#include "editor_file_system.h"
+
+
+void ResourcesDock::_tool_selected(int p_tool) {
+
+ current_action=p_tool;
+
+ switch(p_tool) {
+
+ case TOOL_NEW: {
+
+ create_dialog->popup_centered_ratio();
+ } break;
+ case TOOL_OPEN: {
+ editor->open_resource();
+
+ } break;
+ case TOOL_SAVE: {
+
+ TreeItem *ti = resources->get_selected();
+ if (!ti)
+ break;
+ Ref<Resource> current_res = ti->get_metadata(0);
+
+
+ if (current_res->get_path()!="" && current_res->get_path().find("::")==-1) {
+ _file_action(current_res->get_path());
+ break;
+ };
+
+ }; /* fallthrough */
+ case TOOL_SAVE_AS: {
+
+ TreeItem *ti = resources->get_selected();
+ if (!ti)
+ break;
+
+ save_resource_as(ti->get_metadata(0));
+
+
+ } break;
+ case TOOL_MAKE_LOCAL: {
+
+ TreeItem *ti = resources->get_selected();
+ if (!ti)
+ break;
+ Ref<Resource> current_res = ti->get_metadata(0);
+ current_res->set_path("");
+ _update_name(ti);
+ } break;
+ case TOOL_COPY: {
+
+ TreeItem *ti = resources->get_selected();
+ if (!ti)
+ break;
+ Ref<Resource> current_res = ti->get_metadata(0);
+ EditorSettings::get_singleton()->set_resource_clipboard(current_res);
+
+ } break;
+ case TOOL_PASTE: {
+
+ add_resource(EditorSettings::get_singleton()->get_resource_clipboard());
+ } break;
+
+ }
+}
+
+
+
+void ResourcesDock::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_ENTER_TREE: {
+
+ button_new->set_icon(get_icon("New","EditorIcons"));
+ button_open->set_icon(get_icon("Folder","EditorIcons"));
+ button_save->set_icon(get_icon("Save","EditorIcons"));
+ button_tools->set_icon(get_icon("Tools","EditorIcons"));
+
+
+ } break;
+ }
+
+}
+
+
+void ResourcesDock::save_resource(const String& p_path,const Ref<Resource>& p_resource) {
+
+ editor->get_editor_data().apply_changes_in_editors();
+ int flg=0;
+ if (EditorSettings::get_singleton()->get("on_save/compress_binary_resources"))
+ flg|=ResourceSaver::FLAG_COMPRESS;
+ /*
+ if (EditorSettings::get_singleton()->get("on_save/save_paths_as_relative"))
+ flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
+ */
+
+ String path = GlobalConfig::get_singleton()->localize_path(p_path);
+ Error err = ResourceSaver::save(path,p_resource,flg|ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS);
+
+ if (err!=OK) {
+ accept->set_text(TTR("Error saving resource!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+ //EditorFileSystem::get_singleton()->update_file(path,p_resource->get_type());
+
+ ((Resource*)p_resource.ptr())->set_path(path);
+ editor->emit_signal("resource_saved",p_resource);
+
+}
+
+void ResourcesDock::save_resource_as(const Ref<Resource>& p_resource) {
+
+ current_action=TOOL_SAVE_AS;
+
+ RES res(p_resource);
+
+ List<String> extensions;
+ ResourceSaver::get_recognized_extensions(res,&extensions);
+ file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+
+ if (p_resource->get_path()!="" && p_resource->get_path().find("::")==-1) {
+
+ file->set_current_path(p_resource->get_path());
+ } else {
+
+ String existing;
+ if (extensions.size()) {
+ existing="new_"+res->get_class().to_lower()+"."+extensions.front()->get().to_lower();
+ }
+
+ file->set_current_file(existing);
+ }
+
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ file->popup_centered_ratio();
+
+}
+
+void ResourcesDock::_file_action(const String& p_path) {
+
+
+ switch(current_action) {
+
+ case TOOL_OPEN: {
+
+ } break;
+ case TOOL_SAVE:
+ case TOOL_SAVE_AS: {
+
+ TreeItem *ti = resources->get_selected();
+ if (!ti)
+ break;
+ Ref<Resource> current_res = ti->get_metadata(0);
+
+ RES res(current_res);
+
+ save_resource(p_path,res);
+
+ _update_name(ti);
+
+ } break;
+
+ }
+}
+
+void ResourcesDock::_update_name(TreeItem *item) {
+
+ Ref<Resource> res = item->get_metadata(0);
+
+
+ if (res->get_name()!="")
+ item->set_text(0,res->get_name());
+ else if (res->get_path()!="" && res->get_path().find("::")==-1)
+ item->set_text(0,res->get_path().get_file());
+ else
+ item->set_text(0,res->get_class()+" ("+itos(res->get_instance_ID())+")");
+
+}
+
+
+void ResourcesDock::remove_resource(const Ref<Resource>& p_resource) {
+
+ TreeItem *root = resources->get_root();
+ ERR_FAIL_COND(!root);
+
+ TreeItem *existing=root->get_children();
+
+ while(existing) {
+
+ Ref<Resource> r = existing->get_metadata(0);
+ if (r==p_resource) {
+ //existing->move_to_top();
+ memdelete(existing);
+ return;
+ }
+ existing=existing->get_next();
+ }
+
+
+}
+
+void ResourcesDock::add_resource(const Ref<Resource>& p_resource) {
+
+ if (block_add)
+ return;
+ if (!p_resource.is_valid())
+ return;
+
+ TreeItem *root = resources->get_root();
+ ERR_FAIL_COND(!root);
+
+ TreeItem *existing=root->get_children();
+
+ while(existing) {
+
+ Ref<Resource> r = existing->get_metadata(0);
+ if (r==p_resource) {
+ //existing->move_to_top();
+ existing->select(0);
+ resources->ensure_cursor_is_visible();
+ return; // existing
+ }
+ existing=existing->get_next();
+ }
+
+ TreeItem *res = resources->create_item(root);
+ res->set_metadata(0,p_resource);
+
+ if (has_icon(p_resource->get_class(),"EditorIcons")) {
+ res->set_icon(0,get_icon(p_resource->get_class(),"EditorIcons"));
+ }
+
+ _update_name(res);
+ res->add_button(0,get_icon("Del","EditorIcons"));
+ res->move_to_top();
+ res->select(0);
+ resources->ensure_cursor_is_visible();
+
+}
+
+void ResourcesDock::_resource_selected() {
+
+ TreeItem *sel = resources->get_selected();
+ ERR_FAIL_COND(!sel);
+
+
+ Ref<Resource> r = sel->get_metadata(0);
+ if (r.is_null())
+ return;
+ block_add=true;
+ editor->push_item(r.ptr());
+ block_add=false;
+}
+
+void ResourcesDock::_delete(Object* p_item, int p_column, int p_id) {
+
+ TreeItem *ti = p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ti);
+
+
+ call_deferred("remove_resource",ti->get_metadata(0));
+
+}
+
+void ResourcesDock::_create() {
+
+ Object *c = create_dialog->instance_selected();
+
+ ERR_FAIL_COND(!c);
+ Resource *r = c->cast_to<Resource>();
+ ERR_FAIL_COND(!r);
+
+ REF res( r );
+
+ editor->push_item(c);
+
+}
+
+void ResourcesDock::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_tool_selected"),&ResourcesDock::_tool_selected);
+ ClassDB::bind_method(D_METHOD("_create"),&ResourcesDock::_create);
+ ClassDB::bind_method(D_METHOD("_resource_selected"),&ResourcesDock::_resource_selected);
+ ClassDB::bind_method(D_METHOD("_delete"),&ResourcesDock::_delete);
+ ClassDB::bind_method(D_METHOD("remove_resource"),&ResourcesDock::remove_resource);
+ ClassDB::bind_method(D_METHOD("_file_action"),&ResourcesDock::_file_action);
+
+
+
+}
+
+void ResourcesDock::cleanup() {
+
+
+ resources->clear();
+ resources->create_item(); //root
+
+}
+
+
+ResourcesDock::ResourcesDock(EditorNode *p_editor) {
+
+ editor=p_editor;
+
+ VBoxContainer *vbc = this;
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+
+ Button *b;
+ b = memnew( ToolButton );
+ b->set_tooltip(TTR("Create New Resource"));
+ b->connect("pressed",this,"_tool_selected",make_binds(TOOL_NEW));
+ hbc->add_child( b );
+ button_new=b;
+
+ b = memnew( ToolButton );
+ b->set_tooltip(TTR("Open Resource"));
+ b->connect("pressed",this,"_tool_selected",make_binds(TOOL_OPEN));
+ hbc->add_child( b );
+ button_open=b;
+
+ MenuButton *mb = memnew( MenuButton );
+ mb->set_tooltip(TTR("Save Resource"));
+ mb->get_popup()->add_item(TTR("Save Resource"),TOOL_SAVE);
+ mb->get_popup()->add_item(TTR("Save Resource As.."),TOOL_SAVE_AS);
+ mb->get_popup()->connect("id_pressed",this,"_tool_selected" );
+ hbc->add_child( mb );
+ button_save=mb;
+
+ hbc->add_spacer();
+
+ mb = memnew( MenuButton );
+ mb->set_tooltip(TTR("Resource Tools"));
+ mb->get_popup()->add_item(TTR("Make Local"),TOOL_MAKE_LOCAL);
+ mb->get_popup()->add_item(TTR("Copy"),TOOL_COPY);
+ mb->get_popup()->add_item(TTR("Paste"),TOOL_PASTE);
+ mb->get_popup()->connect("id_pressed",this,"_tool_selected" );
+ hbc->add_child( mb );
+ button_tools=mb;
+
+ resources = memnew( Tree );
+ vbc->add_child(resources);
+ resources->set_v_size_flags(SIZE_EXPAND_FILL);
+ resources->create_item(); //root
+ resources->set_hide_root(true);
+ resources->connect("cell_selected",this,"_resource_selected");
+ resources->connect("button_pressed",this,"_delete");
+
+ create_dialog = memnew( CreateDialog );
+ add_child(create_dialog);
+ create_dialog->set_base_type("Resource");
+ create_dialog->connect("create",this,"_create");
+ accept = memnew (AcceptDialog);
+ add_child(accept);
+
+ file = memnew( EditorFileDialog );
+ add_child(file);
+ file->connect("file_selected",this,"_file_action");
+
+
+ block_add=false;
+}
+
diff --git a/editor/resources_dock.h b/editor/resources_dock.h
new file mode 100644
index 0000000000..e225786583
--- /dev/null
+++ b/editor/resources_dock.h
@@ -0,0 +1,109 @@
+/*************************************************************************/
+/* resources_dock.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef RESOURCES_DOCK_H
+#define RESOURCES_DOCK_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/file_dialog.h"
+#include "create_dialog.h"
+#include "editor_file_dialog.h"
+
+
+class EditorNode;
+
+class ResourcesDock : public VBoxContainer {
+
+ GDCLASS( ResourcesDock, VBoxContainer );
+
+ enum {
+ TOOL_NEW,
+ TOOL_OPEN,
+ TOOL_SAVE,
+ TOOL_SAVE_AS,
+ TOOL_MAKE_LOCAL,
+ TOOL_COPY,
+ TOOL_PASTE,
+ TOOL_MAX
+ };
+
+
+ EditorNode *editor;
+
+ Button *button_new;
+ Button *button_open;
+ Button *button_save;
+ Button *button_tools;
+
+ CreateDialog *create_dialog;
+
+ AcceptDialog *accept;
+ EditorFileDialog *file;
+ Tree *resources;
+ bool block_add;
+ int current_action;
+
+
+
+
+
+ void _file_action(const String& p_action);
+
+
+
+ void _delete(Object* p_item, int p_column, int p_id);
+ void _resource_selected();
+ void _update_name(TreeItem *item);
+ void _tool_selected(int p_tool);
+ void _create();
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void add_resource(const Ref<Resource>& p_resource);
+ void remove_resource(const Ref<Resource>& p_resource);
+ void save_resource(const String& p_path,const Ref<Resource>& p_resource);
+ void save_resource_as(const Ref<Resource>& p_resource);
+
+
+ void cleanup();
+
+ ResourcesDock(EditorNode *p_editor);
+};
+
+#endif // RESOURCES_DOCK_H
diff --git a/editor/run_settings_dialog.cpp b/editor/run_settings_dialog.cpp
new file mode 100644
index 0000000000..4d69c7ad84
--- /dev/null
+++ b/editor/run_settings_dialog.cpp
@@ -0,0 +1,98 @@
+/*************************************************************************/
+/* run_settings_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "run_settings_dialog.h"
+
+
+void RunSettingsDialog::popup_run_settings() {
+
+ popup_centered(Size2( 300, 150 ));
+}
+
+void RunSettingsDialog::set_custom_arguments(const String& p_arguments) {
+
+
+ arguments->set_text(p_arguments);
+}
+String RunSettingsDialog::get_custom_arguments() const {
+
+ return arguments->get_text();
+}
+
+
+void RunSettingsDialog::_bind_methods() {
+
+ ClassDB::bind_method("_run_mode_changed",&RunSettingsDialog::_run_mode_changed);
+ //ClassDB::bind_method("_browse_selected_file",&RunSettingsDialog::_browse_selected_file);
+}
+
+void RunSettingsDialog::_run_mode_changed(int idx) {
+
+ if (idx==0)
+ arguments->set_editable(false);
+ else
+ arguments->set_editable(true);
+}
+
+int RunSettingsDialog::get_run_mode() const {
+
+ return run_mode->get_selected();
+}
+
+void RunSettingsDialog::set_run_mode(int p_run_mode) {
+
+ run_mode->select(p_run_mode);
+ arguments->set_editable(p_run_mode);
+}
+
+RunSettingsDialog::RunSettingsDialog() {
+
+ /* SNAP DIALOG */
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+ //set_child_rect(vbc);
+
+ run_mode = memnew( OptionButton );
+ vbc->add_margin_child(TTR("Run Mode:"),run_mode);
+ run_mode->add_item(TTR("Current Scene"));
+ run_mode->add_item(TTR("Main Scene"));
+ run_mode->connect("item_selected",this,"_run_mode_changed");
+ arguments = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Main Scene Arguments:"),arguments);
+ arguments->set_editable(false);
+
+ get_ok()->set_text(TTR("Close"));
+ //get_cancel()->set_text("Close");
+
+ arguments->set_text("-l $scene");
+
+ set_title(TTR("Scene Run Settings"));
+
+
+}
diff --git a/editor/run_settings_dialog.h b/editor/run_settings_dialog.h
new file mode 100644
index 0000000000..2efc18e43f
--- /dev/null
+++ b/editor/run_settings_dialog.h
@@ -0,0 +1,67 @@
+/*************************************************************************/
+/* run_settings_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef RUN_SETTINGS_DIALOG_H
+#define RUN_SETTINGS_DIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/check_button.h"
+#include "scene/gui/file_dialog.h"
+
+class RunSettingsDialog : public AcceptDialog {
+
+ GDCLASS( RunSettingsDialog, AcceptDialog);
+public:
+ enum RunMode {
+ RUN_LOCAL_SCENE,
+ RUN_MAIN_SCENE,
+ };
+private:
+
+ OptionButton *run_mode;
+ LineEdit *arguments;
+
+ void _run_mode_changed(int idx);
+protected:
+
+ static void _bind_methods();
+public:
+
+ int get_run_mode() const;
+ void set_run_mode(int p_run_mode);
+
+ void set_custom_arguments(const String& p_arguments);
+ String get_custom_arguments() const;
+
+ void popup_run_settings();
+
+ RunSettingsDialog();
+};
+
+#endif // RUN_SETTINGS_DIALOG_H
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
new file mode 100644
index 0000000000..47eb84ab79
--- /dev/null
+++ b/editor/scene_tree_dock.cpp
@@ -0,0 +1,2061 @@
+/*************************************************************************/
+/* scene_tree_dock.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "scene_tree_dock.h"
+
+#include "editor_node.h"
+#include "global_config.h"
+#include "os/keyboard.h"
+#include "scene/resources/packed_scene.h"
+#include "editor_settings.h"
+#include "editor/plugins/canvas_item_editor_plugin.h"
+#include "editor/plugins/spatial_editor_plugin.h"
+#include "script_editor_debugger.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "core/io/resource_saver.h"
+#include "multi_node_edit.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "animation_editor.h"
+#include "scene/main/viewport.h"
+
+
+void SceneTreeDock::_nodes_drag_begin() {
+
+
+ if (restore_script_editor_on_drag) {
+ EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
+ restore_script_editor_on_drag=false;
+ }
+
+}
+
+void SceneTreeDock::_input(InputEvent p_event) {
+
+ if (p_event.type==InputEvent::MOUSE_BUTTON && !p_event.mouse_button.pressed && p_event.mouse_button.button_index==BUTTON_LEFT) {
+ restore_script_editor_on_drag=false; //lost chance
+ }
+}
+
+void SceneTreeDock::_unhandled_key_input(InputEvent p_event) {
+
+ if (get_viewport()->get_modal_stack_top())
+ return; //ignore because of modal window
+
+ if (!p_event.key.pressed || p_event.key.echo)
+ return;
+
+ if (ED_IS_SHORTCUT("scene_tree/add_child_node", p_event)) {
+ _tool_selected(TOOL_NEW);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/instance_scene", p_event)) {
+ _tool_selected(TOOL_INSTANCE);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/change_node_type", p_event)) {
+ _tool_selected(TOOL_REPLACE);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/duplicate", p_event)) {
+ _tool_selected(TOOL_DUPLICATE);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/attach_script", p_event)) {
+ _tool_selected(TOOL_ATTACH_SCRIPT);
+ }
+ else if(ED_IS_SHORTCUT("scene_tree/clear_script", p_event)) {
+ _tool_selected(TOOL_CLEAR_SCRIPT);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/move_up", p_event)) {
+ _tool_selected(TOOL_MOVE_UP);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/move_down", p_event)) {
+ _tool_selected(TOOL_MOVE_DOWN);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/reparent", p_event)) {
+ _tool_selected(TOOL_REPARENT);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/merge_from_scene", p_event)) {
+ _tool_selected(TOOL_MERGE_FROM_SCENE);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/save_branch_as_scene", p_event)) {
+ _tool_selected(TOOL_NEW_SCENE_FROM);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/delete_no_confirm", p_event)) {
+ _tool_selected(TOOL_ERASE, true);
+ }
+ else if(ED_IS_SHORTCUT("scene_tree/copy_node_path", p_event)) {
+ _tool_selected(TOOL_COPY_NODE_PATH);
+ }
+ else if (ED_IS_SHORTCUT("scene_tree/delete", p_event)) {
+ _tool_selected(TOOL_ERASE);
+ }
+}
+
+void SceneTreeDock::instance(const String& p_file) {
+
+ Node *parent = scene_tree->get_selected();
+ if (!parent || !edited_scene) {
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("OK :("));
+ accept->set_text(TTR("No parent to instance a child at."));
+ accept->popup_centered_minsize();
+ return;
+ };
+
+ ERR_FAIL_COND(!parent);
+
+ Vector<String> scenes;
+ scenes.push_back(p_file);
+ _perform_instance_scenes(scenes,parent,-1);
+
+}
+
+void SceneTreeDock::instance_scenes(const Vector<String>& p_files, Node *p_parent) {
+
+ Node *parent = p_parent;
+
+ if (!parent) {
+ parent = scene_tree->get_selected();
+ }
+
+ if (!parent || !edited_scene) {
+
+ accept->get_ok()->set_text(TTR("OK"));
+ accept->set_text(TTR("No parent to instance the scenes at."));
+ accept->popup_centered_minsize();
+ return;
+ };
+
+ _perform_instance_scenes(p_files, parent, -1);
+}
+
+void SceneTreeDock::_perform_instance_scenes(const Vector<String>& p_files,Node* parent,int p_pos) {
+
+
+
+ ERR_FAIL_COND(!parent);
+
+
+ Vector<Node*> instances;
+
+ bool error=false;
+
+ for(int i=0;i<p_files.size();i++) {
+
+ Ref<PackedScene> sdata = ResourceLoader::load(p_files[i]);
+ if (!sdata.is_valid()) {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(vformat(TTR("Error loading scene from %s"),p_files[i]));
+ accept->popup_centered_minsize();
+ error=true;
+ break;
+
+ }
+
+ Node*instanced_scene=sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ if (!instanced_scene) {
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(vformat(TTR("Error instancing scene from %s"),p_files[i]));
+ accept->popup_centered_minsize();
+ error=true;
+ break;
+
+ }
+
+ if (edited_scene->get_filename()!="") {
+
+ if (_cyclical_dependency_exists(edited_scene->get_filename(), instanced_scene)) {
+
+ accept->get_ok()->set_text(TTR("Ok"));
+ accept->set_text(vformat(TTR("Cannot instance the scene '%s' because the current scene exists within one of its nodes."),p_files[i]));
+ accept->popup_centered_minsize();
+ error=true;
+ break;
+ }
+ }
+
+ instanced_scene->set_filename( GlobalConfig::get_singleton()->localize_path(p_files[i]) );
+
+ instances.push_back(instanced_scene);
+ }
+
+ if (error) {
+ for(int i=0;i<instances.size();i++) {
+ memdelete(instances[i]);
+ }
+ return;
+ }
+
+
+
+ //instanced_scene->generate_instance_state();
+
+ editor_data->get_undo_redo().create_action(TTR("Instance Scene(s)"));
+
+ for(int i=0;i<instances.size();i++) {
+
+ Node* instanced_scene=instances[i];
+
+ editor_data->get_undo_redo().add_do_method(parent,"add_child",instanced_scene);
+ if (p_pos>=0) {
+ editor_data->get_undo_redo().add_do_method(parent,"move_child",instanced_scene,p_pos+i);
+ }
+ editor_data->get_undo_redo().add_do_method(instanced_scene,"set_owner",edited_scene);
+ editor_data->get_undo_redo().add_do_method(editor_selection,"clear");
+ editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",instanced_scene);
+ editor_data->get_undo_redo().add_do_reference(instanced_scene);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",instanced_scene);
+
+ String new_name = parent->validate_child_name(instanced_scene);
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_instance_node",edited_scene->get_path_to(parent),p_files[i],new_name);
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(edited_scene->get_path_to(parent))+"/"+new_name));
+ }
+
+ editor_data->get_undo_redo().commit_action();
+
+
+}
+
+void SceneTreeDock::_replace_with_branch_scene(const String& p_file,Node* base) {
+ Ref<PackedScene> sdata = ResourceLoader::load(p_file);
+ if (!sdata.is_valid()) {
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(vformat(TTR("Error loading scene from %s"),p_file));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ Node *instanced_scene=sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ if (!instanced_scene) {
+ accept->get_ok()->set_text(TTR("Ugh"));
+ accept->set_text(vformat(TTR("Error instancing scene from %s"),p_file));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ Node *parent = base->get_parent();
+ int pos = base->get_index();
+ memdelete(base);
+ parent->add_child(instanced_scene);
+ parent->move_child(instanced_scene, pos);
+ instanced_scene->set_owner(edited_scene);
+ editor_selection->clear();
+ editor_selection->add_node(instanced_scene);
+ scene_tree->set_selected(instanced_scene);
+}
+
+bool SceneTreeDock::_cyclical_dependency_exists(const String& p_target_scene_path, Node* p_desired_node) {
+ int childCount = p_desired_node->get_child_count();
+
+ if (p_desired_node->get_filename()==p_target_scene_path) {
+ return true;
+ }
+
+ for (int i=0;i<childCount;i++) {
+ Node* child=p_desired_node->get_child(i);
+
+ if(_cyclical_dependency_exists(p_target_scene_path,child)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
+
+ current_option=p_tool;
+
+ switch(p_tool) {
+
+ case TOOL_NEW: {
+ /*
+ if (!_validate_no_foreign())
+ break;
+ */
+ create_dialog->popup(true);
+ } break;
+ case TOOL_INSTANCE: {
+
+ Node *scene = edited_scene;
+
+ if (!scene) {
+
+ EditorNode::get_singleton()->new_inherited_scene();
+
+ /* should be legal now
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text("I see..");
+ accept->set_text("This operation can't be done without a tree root.");
+ accept->popup_centered_minsize();
+ */
+ break;
+ }
+
+ /*
+ if (!_validate_no_foreign())
+ break;
+ */
+
+ file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ List<String> extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene",&extensions);
+ file->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+
+ file->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ //file->set_current_path(current_path);
+ file->popup_centered_ratio();
+
+ } break;
+ case TOOL_REPLACE: {
+
+ create_dialog->popup(false);
+ } break;
+ case TOOL_CONNECT: {
+
+ Node *current = scene_tree->get_selected();
+ if (!current)
+ break;
+
+ /*
+ if (!_validate_no_foreign())
+ break;
+ connect_dialog->popup_centered_ratio();
+ connect_dialog->set_node(current);
+ */
+
+ } break;
+ case TOOL_GROUP: {
+
+ Node *current = scene_tree->get_selected();
+ if (!current)
+ break;
+ /*
+ if (!_validate_no_foreign())
+ break;
+ groups_editor->set_current(current);
+ groups_editor->popup_centered_ratio();
+ */
+ } break;
+ case TOOL_ATTACH_SCRIPT: {
+
+ Node *selected = scene_tree->get_selected();
+ if (!selected)
+ break;
+
+ /*
+ if (!_validate_no_foreign())
+ break;
+ */
+
+ Ref<Script> existing = selected->get_script();
+ if (existing.is_valid())
+ editor->push_item(existing.ptr());
+ else {
+ String path = selected->get_filename();
+ script_create_dialog->config(selected->get_class(),path);
+ script_create_dialog->popup_centered(Size2(300,290));
+ //script_create_dialog->popup_centered_minsize();
+
+ }
+
+ } break;
+ case TOOL_CLEAR_SCRIPT: {
+ Node *selected = scene_tree->get_selected();
+ if(!selected)
+ break;
+
+ Ref<Script> existing = selected->get_script();
+ if(existing.is_valid()) {
+ const RefPtr empty;
+ selected->set_script(empty);
+ button_create_script->show();
+ button_clear_script->hide();
+ }
+
+ } break;
+ case TOOL_MOVE_UP:
+ case TOOL_MOVE_DOWN: {
+
+ if (!scene_tree->get_selected())
+ break;
+
+
+ if (scene_tree->get_selected()==edited_scene) {
+
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation can't be done on the tree root."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+
+ if (!_validate_no_foreign())
+ break;
+
+ bool MOVING_DOWN = (p_tool == TOOL_MOVE_DOWN);
+ bool MOVING_UP = !MOVING_DOWN;
+
+ Node *common_parent = scene_tree->get_selected()->get_parent();
+ List<Node*> selection = editor_selection->get_selected_node_list();
+ selection.sort_custom<Node::Comparator>(); // sort by index
+ if (MOVING_DOWN)
+ selection.invert();
+
+ int lowest_id = common_parent->get_child_count() - 1;
+ int highest_id = 0;
+ for (List<Node*>::Element *E = selection.front(); E; E = E->next()) {
+ int index = E->get()->get_index();
+
+ if (index > highest_id) highest_id = index;
+ if (index < lowest_id) lowest_id = index;
+
+ if (E->get()->get_parent() != common_parent)
+ common_parent = NULL;
+ }
+
+ if (!common_parent || (MOVING_DOWN && highest_id >= common_parent->get_child_count() - MOVING_DOWN) || (MOVING_UP && lowest_id == 0))
+ break; // one or more nodes can not be moved
+
+ if (selection.size() == 1) editor_data->get_undo_redo().create_action(TTR("Move Node In Parent"));
+ if (selection.size() > 1) editor_data->get_undo_redo().create_action(TTR("Move Nodes In Parent"));
+
+ for (int i = 0; i < selection.size(); i++) {
+ Node *top_node = selection[i];
+ Node *bottom_node = selection[selection.size() - 1 - i];
+
+ ERR_FAIL_COND(!top_node->get_parent());
+ ERR_FAIL_COND(!bottom_node->get_parent());
+
+ int bottom_node_pos = bottom_node->get_index();
+ int top_node_pos_next = top_node->get_index() + (MOVING_DOWN ? 1 : -1);
+
+ editor_data->get_undo_redo().add_do_method(top_node->get_parent(), "move_child", top_node, top_node_pos_next);
+ editor_data->get_undo_redo().add_undo_method(bottom_node->get_parent(), "move_child", bottom_node, bottom_node_pos);
+ }
+
+ editor_data->get_undo_redo().commit_action();
+
+ } break;
+ case TOOL_DUPLICATE: {
+
+ if (!edited_scene)
+ break;
+
+
+ if (editor_selection->is_selected(edited_scene)) {
+
+
+ current_option=-1;
+ //accept->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation can't be done on the tree root."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ if (!_validate_no_foreign())
+ break;
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+ if (selection.size()==0)
+ break;
+
+ List<Node*> reselect;
+
+ editor_data->get_undo_redo().create_action(TTR("Duplicate Node(s)"));
+ editor_data->get_undo_redo().add_do_method(editor_selection,"clear");
+
+ Node *dupsingle=NULL;
+
+
+ for (List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ Node *node = E->get();
+ Node *parent = node->get_parent();
+
+ List<Node*> owned;
+ node->get_owned_by(node->get_owner(),&owned);
+
+ Map<Node*,Node*> duplimap;
+ Node * dup = _duplicate(node,duplimap);
+
+ ERR_CONTINUE(!dup);
+
+ if (selection.size()==1)
+ dupsingle=dup;
+
+ dup->set_name(parent->validate_child_name(dup));
+
+ editor_data->get_undo_redo().add_do_method(parent,"_add_child_below_node",node, dup);
+ for (List<Node*>::Element *F=owned.front();F;F=F->next()) {
+
+ if (!duplimap.has(F->get())) {
+
+ continue;
+ }
+ Node *d=duplimap[F->get()];
+ editor_data->get_undo_redo().add_do_method(d,"set_owner",node->get_owner());
+ }
+ editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",dup);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",dup);
+ editor_data->get_undo_redo().add_do_reference(dup);
+
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_duplicate_node",edited_scene->get_path_to(node),dup->get_name());
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(edited_scene->get_path_to(parent))+"/"+dup->get_name()));
+
+ //parent->add_child(dup);
+ //reselect.push_back(dup);
+ }
+
+ editor_data->get_undo_redo().commit_action();
+
+ if (dupsingle)
+ editor->push_item(dupsingle);
+
+
+
+
+
+ } break;
+ case TOOL_REPARENT: {
+
+
+ if (!scene_tree->get_selected())
+ break;
+
+
+ if (editor_selection->is_selected(edited_scene)) {
+
+
+ current_option=-1;
+ //confirmation->get_cancel()->hide();
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation can't be done on the tree root."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ if (!_validate_no_foreign())
+ break;
+
+ List<Node*> nodes = editor_selection->get_selected_node_list();
+ Set<Node*> nodeset;
+ for(List<Node*>::Element *E=nodes.front();E;E=E->next()) {
+
+ nodeset.insert(E->get());
+ }
+ reparent_dialog->popup_centered_ratio();
+ reparent_dialog->set_current( nodeset );
+
+ } break;
+ case TOOL_MULTI_EDIT: {
+
+ Node*root=EditorNode::get_singleton()->get_edited_scene();
+ if (!root)
+ break;
+ Ref<MultiNodeEdit> mne = memnew( MultiNodeEdit );
+ for (const Map<Node*,Object*>::Element *E=EditorNode::get_singleton()->get_editor_selection()->get_selection().front();E;E=E->next()) {
+ mne->add_node(root->get_path_to(E->key()));
+ }
+
+ EditorNode::get_singleton()->push_item(mne.ptr());
+
+ } break;
+
+ case TOOL_ERASE: {
+
+ List<Node*> remove_list = editor_selection->get_selected_node_list();
+
+ if (remove_list.empty())
+ return;
+
+ if (!_validate_no_foreign())
+ break;
+
+ if (p_confirm_override) {
+ _delete_confirm();
+
+ // hack, force 2d editor viewport to refresh after deletion
+ if (CanvasItemEditor *editor = CanvasItemEditor::get_singleton())
+ editor->get_viewport_control()->update();
+
+ } else {
+ delete_dialog->set_text(TTR("Delete Node(s)?"));
+ delete_dialog->popup_centered_minsize();
+ }
+
+ } break;
+ case TOOL_MERGE_FROM_SCENE: {
+
+ EditorNode::get_singleton()->merge_from_scene();
+ } break;
+ case TOOL_NEW_SCENE_FROM: {
+
+ Node *scene = editor_data->get_edited_scene_root();
+
+ if (!scene) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation can't be done without a scene."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.size()!=1) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation requires a single selected node."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ Node *tocopy = selection.front()->get();
+
+ if (tocopy==scene){
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Can not perform with the root node."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ if (tocopy!=editor_data->get_edited_scene_root() && tocopy->get_filename()!="") {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation can't be done on instanced scenes."));
+ accept->popup_centered_minsize();
+ break;
+ }
+
+ new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+
+ List<String> extensions;
+ Ref<PackedScene> sd = memnew( PackedScene );
+ ResourceSaver::get_recognized_extensions(sd,&extensions);
+ new_scene_from_dialog->clear_filters();
+ for(int i=0;i<extensions.size();i++) {
+ new_scene_from_dialog->add_filter("*."+extensions[i]+" ; "+extensions[i].to_upper());
+ }
+
+ String existing;
+ if (extensions.size()) {
+ String root_name(tocopy->get_name());
+ existing=root_name+"."+extensions.front()->get().to_lower();
+ }
+ new_scene_from_dialog->set_current_path(existing);
+
+ new_scene_from_dialog->popup_centered_ratio();
+ new_scene_from_dialog->set_title(TTR("Save New Scene As.."));
+
+ } break;
+ case TOOL_COPY_NODE_PATH: {
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if(List<Node*>::Element *e = selection.front()) {
+ if(Node *node = e->get()) {
+ Node *root = EditorNode::get_singleton()->get_edited_scene();
+ NodePath path = root->get_path().rel_path_to(node->get_path());
+ OS::get_singleton()->set_clipboard(path);
+ }
+ }
+ } break;
+ }
+
+}
+
+void SceneTreeDock::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+ if (!first_enter)
+ break;
+ first_enter=false;
+
+ CanvasItemEditorPlugin *canvas_item_plugin = editor_data->get_editor("2D")->cast_to<CanvasItemEditorPlugin>();
+ if (canvas_item_plugin) {
+ canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree");
+ canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", scene_tree, "_update_tree");
+ scene_tree->connect("node_changed", canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), "update");
+ }
+ button_add->set_icon(get_icon("Add","EditorIcons"));
+ button_instance->set_icon(get_icon("Instance","EditorIcons"));
+ button_create_script->set_icon(get_icon("ScriptCreate","EditorIcons"));
+ button_clear_script->set_icon(get_icon("ScriptRemove", "EditorIcons"));
+
+
+ filter_icon->set_texture(get_icon("Zoom","EditorIcons"));
+
+ EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed",this,"_selection_changed");
+
+ } break;
+ }
+}
+
+
+void SceneTreeDock::_load_request(const String& p_path) {
+
+ editor->open_request(p_path);
+}
+
+void SceneTreeDock::_script_open_request(const Ref<Script>& p_script) {
+
+ editor->edit_resource(p_script);
+}
+
+void SceneTreeDock::_node_selected() {
+
+
+ Node *node=scene_tree->get_selected();
+
+ if (!node) {
+
+ editor->push_item(NULL);
+ return;
+ }
+
+ if (ScriptEditor::get_singleton()->is_visible_in_tree()) {
+ restore_script_editor_on_drag=true;
+ }
+
+ editor->push_item(node);
+
+
+}
+
+void SceneTreeDock::_node_renamed() {
+
+ _node_selected();
+}
+
+Node *SceneTreeDock::_duplicate(Node *p_node, Map<Node*,Node*> &duplimap) {
+
+ Node *node=NULL;
+
+ if (p_node->get_filename()!="") { //an instance
+
+ Ref<PackedScene> sd = ResourceLoader::load( p_node->get_filename() );
+ ERR_FAIL_COND_V(!sd.is_valid(),NULL);
+ node = sd->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ ERR_FAIL_COND_V(!node,NULL);
+ node->set_scene_instance_load_placeholder(p_node->get_scene_instance_load_placeholder());
+ //node->generate_instance_state();
+ } else {
+ Object *obj = ClassDB::instance(p_node->get_class());
+ ERR_FAIL_COND_V(!obj,NULL);
+ node = obj->cast_to<Node>();
+ if (!node)
+ memdelete(obj);
+ ERR_FAIL_COND_V(!node,NULL);
+
+ }
+
+ List<PropertyInfo> plist;
+
+ p_node->get_property_list(&plist);
+
+ for(List<PropertyInfo>::Element *E=plist.front();E;E=E->next()) {
+
+ if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
+ continue;
+ String name = E->get().name;
+ node->set( name, p_node->get(name) );
+
+ }
+
+
+ List<Node::GroupInfo> group_info;
+ p_node->get_groups(&group_info);
+ for (List<Node::GroupInfo>::Element *E=group_info.front();E;E=E->next()) {
+
+ if (E->get().persistent)
+ node->add_to_group(E->get().name,true);
+ }
+
+
+ node->set_name(p_node->get_name());
+ duplimap[p_node]=node;
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ Node *child = p_node->get_child(i);
+ if (p_node->get_owner()!=child->get_owner())
+ continue; //don't bother with not in-scene nodes.
+
+ Node *dup = _duplicate(child,duplimap);
+ if (!dup) {
+ memdelete(node);
+ return NULL;
+ }
+
+ node->add_child(dup);
+ }
+
+ return node;
+
+}
+
+
+void SceneTreeDock::_set_owners(Node *p_owner, const Array& p_nodes) {
+
+ for(int i=0;i<p_nodes.size();i++) {
+
+ Object *obj=p_nodes[i];
+ if (!obj)
+ continue;
+
+ Node *n=obj->cast_to<Node>();
+ if (!n)
+ continue;
+ n->set_owner(p_owner);
+ }
+}
+
+
+void SceneTreeDock::_fill_path_renames(Vector<StringName> base_path,Vector<StringName> new_base_path,Node * p_node, List<Pair<NodePath,NodePath> > *p_renames) {
+
+ base_path.push_back(p_node->get_name());
+ if (new_base_path.size())
+ new_base_path.push_back(p_node->get_name());
+
+ NodePath from( base_path,true );
+ NodePath to;
+ if (new_base_path.size())
+ to=NodePath( new_base_path,true );
+
+ Pair<NodePath,NodePath> npp;
+ npp.first=from;
+ npp.second=to;
+
+ p_renames->push_back(npp);
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ _fill_path_renames(base_path,new_base_path,p_node->get_child(i),p_renames);
+ }
+
+
+}
+
+void SceneTreeDock::fill_path_renames(Node* p_node, Node *p_new_parent, List<Pair<NodePath,NodePath> > *p_renames) {
+
+ if (!bool(EDITOR_DEF("editors/animation/autorename_animation_tracks",true)))
+ return;
+
+
+ Vector<StringName> base_path;
+ Node *n = p_node->get_parent();
+ while(n) {
+ base_path.push_back(n->get_name());
+ n=n->get_parent();
+ }
+ base_path.invert();
+
+ Vector<StringName> new_base_path;
+ if (p_new_parent) {
+ n = p_new_parent;
+ while(n) {
+ new_base_path.push_back(n->get_name());
+ n=n->get_parent();
+ }
+
+ new_base_path.invert();
+ }
+
+ _fill_path_renames(base_path,new_base_path,p_node,p_renames);
+}
+
+void SceneTreeDock::perform_node_renames(Node* p_base,List<Pair<NodePath,NodePath> > *p_renames, Map<Ref<Animation>, Set<int> > *r_rem_anims) {
+
+ Map<Ref<Animation>, Set<int> > rem_anims;
+
+ if (!r_rem_anims)
+ r_rem_anims=&rem_anims;
+
+ if (!bool(EDITOR_DEF("editors/animation/autorename_animation_tracks",true)))
+ return;
+
+ if (!p_base) {
+
+ p_base=edited_scene;
+ }
+
+ if (!p_base)
+ return;
+
+
+ if (p_base->cast_to<AnimationPlayer>()) {
+
+ AnimationPlayer *ap=p_base->cast_to<AnimationPlayer>();
+ List<StringName> anims;
+ ap->get_animation_list(&anims);
+ Node *root = ap->get_node(ap->get_root());
+
+
+ if (root) {
+
+
+ NodePath root_path=root->get_path();
+ NodePath new_root_path=root_path;
+
+
+ for(List<Pair<NodePath,NodePath> >::Element* E=p_renames->front();E;E=E->next()) {
+
+ if (E->get().first==root_path) {
+ new_root_path=E->get().second;
+ break;
+ }
+ }
+
+ if (new_root_path!=NodePath()) {
+ //will not be erased
+
+ for(List<StringName>::Element *E=anims.front();E;E=E->next()) {
+
+ Ref<Animation> anim=ap->get_animation(E->get());
+ if (!r_rem_anims->has(anim)) {
+ r_rem_anims->insert(anim,Set<int>());
+ Set<int> &ran = r_rem_anims->find(anim)->get();
+ for(int i=0;i<anim->get_track_count();i++)
+ ran.insert(i);
+ }
+
+ Set<int> &ran = r_rem_anims->find(anim)->get();
+
+ if (anim.is_null())
+ continue;
+
+ for(int i=0;i<anim->get_track_count();i++) {
+
+ NodePath track_np=anim->track_get_path(i);
+ Node *n = root->get_node(track_np);
+ if (!n) {
+ continue;
+ }
+
+ NodePath old_np = n->get_path();
+
+ if (!ran.has(i))
+ continue; //channel was removed
+
+ for(List<Pair<NodePath,NodePath> >::Element* E=p_renames->front();E;E=E->next()) {
+
+ if (E->get().first==old_np) {
+
+
+ if (E->get().second==NodePath()) {
+ //will be erased
+
+ int idx=0;
+ Set<int>::Element *EI=ran.front();
+ ERR_FAIL_COND(!EI); //bug
+ while(EI->get()!=i) {
+ idx++;
+ EI=EI->next();
+ ERR_FAIL_COND(!EI); //another bug
+
+ }
+
+ editor_data->get_undo_redo().add_do_method(anim.ptr(),"remove_track",idx);
+ editor_data->get_undo_redo().add_undo_method(anim.ptr(),"add_track",anim->track_get_type(i),idx);
+ editor_data->get_undo_redo().add_undo_method(anim.ptr(),"track_set_path",idx,track_np);
+ editor_data->get_undo_redo().add_undo_method(anim.ptr(),"track_set_interpolation_type",idx,anim->track_get_interpolation_type(i));
+ for(int j=0;j<anim->track_get_key_count(i);j++) {
+
+ editor_data->get_undo_redo().add_undo_method(anim.ptr(),"track_insert_key",idx,anim->track_get_key_time(i,j),anim->track_get_key_value(i,j),anim->track_get_key_transition(i,j));
+ }
+
+ ran.erase(i); //byebye channel
+
+ } else {
+ //will be renamed
+ NodePath rel_path = new_root_path.rel_path_to(E->get().second);
+
+ NodePath new_path = NodePath( rel_path.get_names(), track_np.get_subnames(), false, track_np.get_property() );
+ if (new_path==track_np)
+ continue; //bleh
+ editor_data->get_undo_redo().add_do_method(anim.ptr(),"track_set_path",i,new_path);
+ editor_data->get_undo_redo().add_undo_method(anim.ptr(),"track_set_path",i,track_np);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ for(int i=0;i<p_base->get_child_count();i++)
+ perform_node_renames(p_base->get_child(i),p_renames,r_rem_anims);
+
+}
+
+
+void SceneTreeDock::_node_prerenamed(Node* p_node, const String& p_new_name) {
+
+
+ List<Pair<NodePath,NodePath> > path_renames;
+
+ Vector<StringName> base_path;
+ Node *n = p_node->get_parent();
+ while(n) {
+ base_path.push_back(n->get_name());
+ n=n->get_parent();
+ }
+ base_path.invert();
+
+
+ Vector<StringName> new_base_path=base_path;
+ base_path.push_back(p_node->get_name());
+
+ new_base_path.push_back(p_new_name);
+
+ Pair<NodePath,NodePath> npp;
+ npp.first = NodePath(base_path,true);
+ npp.second = NodePath(new_base_path,true);
+ path_renames.push_back(npp);
+
+
+ for(int i=0;i<p_node->get_child_count();i++)
+ _fill_path_renames(base_path,new_base_path,p_node->get_child(i),&path_renames);
+
+ perform_node_renames(NULL,&path_renames);
+
+}
+
+bool SceneTreeDock::_validate_no_foreign() {
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ for (List<Node*>::Element *E=selection.front();E;E=E->next()) {
+
+ if (E->get()!=edited_scene && E->get()->get_owner()!=edited_scene) {
+
+ accept->get_ok()->set_text(TTR("Makes Sense!"));
+ accept->set_text(TTR("Can't operate on nodes from a foreign scene!"));
+ accept->popup_centered_minsize();
+ return false;
+
+ }
+
+ if (edited_scene->get_scene_inherited_state().is_valid() && edited_scene->get_scene_inherited_state()->find_node_by_path(edited_scene->get_path_to(E->get()))>=0) {
+
+ accept->get_ok()->set_text(TTR("Makes Sense!"));
+ accept->set_text(TTR("Can't operate on nodes the current scene inherits from!"));
+ accept->popup_centered_minsize();
+ return false;
+
+ }
+
+ }
+
+ return true;
+}
+
+void SceneTreeDock::_node_reparent(NodePath p_path,bool p_keep_global_xform) {
+
+
+ Node *new_parent = scene_root->get_node(p_path);
+ ERR_FAIL_COND(!new_parent);
+
+ //ok all valid
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.empty())
+ return; //nothing to reparent
+
+ Vector<Node*> nodes;
+
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+ nodes.push_back(E->get());
+ }
+
+ _do_reparent(new_parent,-1,nodes,p_keep_global_xform);
+
+}
+
+
+void SceneTreeDock::_do_reparent(Node* p_new_parent,int p_position_in_parent,Vector<Node*> p_nodes,bool p_keep_global_xform) {
+
+
+ Node *new_parent = p_new_parent;
+ ERR_FAIL_COND(!new_parent);
+
+ Node *validate=new_parent;
+ while(validate) {
+
+ if (p_nodes.find(validate)!=-1) {
+ ERR_EXPLAIN("Selection changed at some point.. can't reparent");
+ ERR_FAIL();
+ return;
+ }
+ validate=validate->get_parent();
+ }
+
+ //ok all valid
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (p_nodes.size()==0)
+ return; //nothing to reparent
+
+ //sort by tree order, so re-adding is easy
+ p_nodes.sort_custom<Node::Comparator>();
+
+ editor_data->get_undo_redo().create_action(TTR("Reparent Node"));
+
+ List<Pair<NodePath,NodePath> > path_renames;
+ Vector<StringName> former_names;
+
+ int inc=0;
+
+ for(int ni=0;ni<p_nodes.size();ni++) {
+
+ //no undo for now, sorry
+ Node *node = p_nodes[ni];
+
+ fill_path_renames(node,new_parent,&path_renames);
+ former_names.push_back(node->get_name());
+
+ List<Node*> owned;
+ node->get_owned_by(node->get_owner(),&owned);
+ Array owners;
+ for(List<Node*>::Element *E=owned.front();E;E=E->next()) {
+
+ owners.push_back(E->get());
+ }
+
+
+ if (new_parent==node->get_parent() && node->get_index() < p_position_in_parent+ni) {
+ //if child will generate a gap when moved, adjust
+ inc--;
+ }
+
+ editor_data->get_undo_redo().add_do_method(node->get_parent(),"remove_child",node);
+ editor_data->get_undo_redo().add_do_method(new_parent,"add_child",node);
+
+ if (p_position_in_parent>=0)
+ editor_data->get_undo_redo().add_do_method(new_parent,"move_child",node,p_position_in_parent+inc);
+
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ String new_name = new_parent->validate_child_name(node);
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_reparent_node",edited_scene->get_path_to(node),edited_scene->get_path_to(new_parent),new_name,-1);
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_reparent_node",NodePath(String(edited_scene->get_path_to(new_parent))+"/"+new_name),edited_scene->get_path_to(node->get_parent()),node->get_name(),node->get_index());
+
+ if (p_keep_global_xform) {
+ if (node->cast_to<Node2D>())
+ editor_data->get_undo_redo().add_do_method(node,"set_global_transform",node->cast_to<Node2D>()->get_global_transform());
+ if (node->cast_to<Spatial>())
+ editor_data->get_undo_redo().add_do_method(node,"set_global_transform",node->cast_to<Spatial>()->get_global_transform());
+ if (node->cast_to<Control>())
+ editor_data->get_undo_redo().add_do_method(node,"set_global_pos",node->cast_to<Control>()->get_global_pos());
+ }
+
+ editor_data->get_undo_redo().add_do_method(this,"_set_owners",edited_scene,owners);
+
+ if (AnimationPlayerEditor::singleton->get_key_editor()->get_root()==node)
+ editor_data->get_undo_redo().add_do_method(AnimationPlayerEditor::singleton->get_key_editor(),"set_root",node);
+
+ editor_data->get_undo_redo().add_undo_method(new_parent,"remove_child",node);
+ editor_data->get_undo_redo().add_undo_method(node,"set_name",former_names[ni]);
+
+ inc++;
+
+ }
+
+ //add and move in a second step.. (so old order is preserved)
+
+
+
+ for(int ni=0;ni<p_nodes.size();ni++) {
+
+ Node *node = p_nodes[ni];
+
+ List<Node*> owned;
+ node->get_owned_by(node->get_owner(),&owned);
+ Array owners;
+ for(List<Node*>::Element *E=owned.front();E;E=E->next()) {
+
+ owners.push_back(E->get());
+ }
+
+ int child_pos = node->get_position_in_parent();
+
+ editor_data->get_undo_redo().add_undo_method(node->get_parent(),"add_child",node);
+ editor_data->get_undo_redo().add_undo_method(node->get_parent(),"move_child",node,child_pos);
+ editor_data->get_undo_redo().add_undo_method(this,"_set_owners",edited_scene,owners);
+ if (AnimationPlayerEditor::singleton->get_key_editor()->get_root()==node)
+ editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::singleton->get_key_editor(),"set_root",node);
+
+ if (p_keep_global_xform) {
+ if (node->cast_to<Node2D>())
+ editor_data->get_undo_redo().add_undo_method(node,"set_transform",node->cast_to<Node2D>()->get_transform());
+ if (node->cast_to<Spatial>())
+ editor_data->get_undo_redo().add_undo_method(node,"set_transform",node->cast_to<Spatial>()->get_transform());
+ if (node->cast_to<Control>())
+ editor_data->get_undo_redo().add_undo_method(node,"set_pos",node->cast_to<Control>()->get_pos());
+ }
+
+
+
+ }
+
+ perform_node_renames(NULL,&path_renames);
+
+ editor_data->get_undo_redo().commit_action();
+ //node->set_owner(owner);
+}
+
+void SceneTreeDock::_script_created(Ref<Script> p_script) {
+
+ Node *selected = scene_tree->get_selected();
+ if (!selected)
+ return;
+ selected->set_script(p_script.get_ref_ptr());
+ editor->push_item(p_script.operator->());
+ button_create_script->hide();
+ button_clear_script->show();
+
+}
+
+
+void SceneTreeDock::_delete_confirm() {
+
+ List<Node*> remove_list = editor_selection->get_selected_node_list();
+
+ if (remove_list.empty())
+ return;
+
+
+ editor->get_editor_plugins_over()->make_visible(false);
+
+ editor_data->get_undo_redo().create_action(TTR("Remove Node(s)"));
+
+ bool entire_scene=false;
+
+ for(List<Node*>::Element *E=remove_list.front();E;E=E->next()) {
+
+ if (E->get()==edited_scene) {
+ entire_scene=true;
+ }
+ }
+
+ if (entire_scene) {
+
+ editor_data->get_undo_redo().add_do_method(editor,"set_edited_scene",(Object*)NULL);
+ editor_data->get_undo_redo().add_undo_method(editor,"set_edited_scene",edited_scene);
+ editor_data->get_undo_redo().add_undo_method(edited_scene,"set_owner",edited_scene->get_owner());
+ editor_data->get_undo_redo().add_undo_reference(edited_scene);
+
+ } else {
+
+ remove_list.sort_custom<Node::Comparator>(); //sort nodes to keep positions
+ List<Pair<NodePath,NodePath> > path_renames;
+
+
+ //delete from animation
+ for(List<Node*>::Element *E=remove_list.front();E;E=E->next()) {
+ Node *n = E->get();
+ if (!n->is_inside_tree() || !n->get_parent())
+ continue;
+
+ fill_path_renames(n,NULL,&path_renames);
+
+ }
+
+ perform_node_renames(NULL,&path_renames);
+ //delete for read
+ for(List<Node*>::Element *E=remove_list.front();E;E=E->next()) {
+ Node *n = E->get();
+ if (!n->is_inside_tree() || !n->get_parent())
+ continue;
+
+ List<Node*> owned;
+ n->get_owned_by(n->get_owner(),&owned);
+ Array owners;
+ for(List<Node*>::Element *E=owned.front();E;E=E->next()) {
+
+ owners.push_back(E->get());
+ }
+
+
+ editor_data->get_undo_redo().add_do_method(n->get_parent(),"remove_child",n);
+ editor_data->get_undo_redo().add_undo_method(n->get_parent(),"add_child",n);
+ editor_data->get_undo_redo().add_undo_method(n->get_parent(),"move_child",n,n->get_index());
+ if (AnimationPlayerEditor::singleton->get_key_editor()->get_root()==n)
+ editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::singleton->get_key_editor(),"set_root",n);
+ editor_data->get_undo_redo().add_undo_method(this,"_set_owners",edited_scene,owners);
+ //editor_data->get_undo_redo().add_undo_method(n,"set_owner",n->get_owner());
+ editor_data->get_undo_redo().add_undo_reference(n);
+
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_remove_and_keep_node",edited_scene->get_path_to(n),n->get_instance_ID());
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_restore_node",n->get_instance_ID(),edited_scene->get_path_to(n->get_parent()),n->get_index());
+
+ }
+
+
+ }
+ editor_data->get_undo_redo().commit_action();
+
+
+}
+
+
+
+
+void SceneTreeDock::_selection_changed() {
+
+ int selection_size = EditorNode::get_singleton()->get_editor_selection()->get_selection().size();
+ if (selection_size>1) {
+ //automatically turn on multi-edit
+ _tool_selected(TOOL_MULTI_EDIT);
+ }
+
+ if (selection_size==1) {
+ if(EditorNode::get_singleton()->get_editor_selection()->get_selection().front()->key()->get_script().is_null()) {
+ button_create_script->show();
+ button_clear_script->hide();
+ }
+ else {
+ button_create_script->hide();
+ button_clear_script->show();
+ }
+ } else {
+ button_create_script->hide();
+ button_clear_script->hide();
+ }
+
+ //tool_buttons[TOOL_MULTI_EDIT]->set_disabled(EditorNode::get_singleton()->get_editor_selection()->get_selection().size()<2);
+
+}
+
+
+void SceneTreeDock::_create() {
+
+
+ if (current_option==TOOL_NEW) {
+
+ Node *parent=NULL;
+
+
+ if (edited_scene) {
+ // If root exists in edited scene
+ parent = scene_tree->get_selected();
+ if( !parent )
+ parent = edited_scene;
+
+ } else {
+ // If no root exist in edited scene
+ parent = scene_root;
+ ERR_FAIL_COND(!parent);
+ }
+
+ Object *c = create_dialog->instance_selected();
+
+ ERR_FAIL_COND(!c);
+ Node *child=c->cast_to<Node>();
+ ERR_FAIL_COND(!child);
+
+ editor_data->get_undo_redo().create_action(TTR("Create Node"));
+
+ if (edited_scene) {
+
+ editor_data->get_undo_redo().add_do_method(parent,"add_child",child);
+ editor_data->get_undo_redo().add_do_method(child,"set_owner",edited_scene);
+ editor_data->get_undo_redo().add_do_method(editor_selection,"clear");
+ editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",child);
+ editor_data->get_undo_redo().add_do_reference(child);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",child);
+
+
+ String new_name = parent->validate_child_name(child);
+ ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ editor_data->get_undo_redo().add_do_method(sed,"live_debug_create_node",edited_scene->get_path_to(parent),child->get_class(),new_name);
+ editor_data->get_undo_redo().add_undo_method(sed,"live_debug_remove_node",NodePath(String(edited_scene->get_path_to(parent))+"/"+new_name));
+
+ } else {
+
+ editor_data->get_undo_redo().add_do_method(editor,"set_edited_scene",child);
+ editor_data->get_undo_redo().add_do_reference(child);
+ editor_data->get_undo_redo().add_undo_method(editor,"set_edited_scene",(Object*)NULL);
+
+ }
+
+ editor_data->get_undo_redo().commit_action();
+ editor->push_item(c);
+
+ if (c->cast_to<Control>()) {
+ //make editor more comfortable, so some controls don't appear super shrunk
+ Control *ct = c->cast_to<Control>();
+
+ Size2 ms = ct->get_minimum_size();
+ if (ms.width<4)
+ ms.width=40;
+ if (ms.height<4)
+ ms.height=40;
+ ct->set_size(ms);
+ }
+
+
+ } else if (current_option==TOOL_REPLACE) {
+ Node * n = scene_tree->get_selected();
+ ERR_FAIL_COND(!n);
+
+ Object *c = create_dialog->instance_selected();
+
+ ERR_FAIL_COND(!c);
+ Node *newnode=c->cast_to<Node>();
+ ERR_FAIL_COND(!newnode);
+
+ List<PropertyInfo> pinfo;
+ n->get_property_list(&pinfo);
+
+ for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+ if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
+ continue;
+ newnode->set(E->get().name,n->get(E->get().name));
+ }
+
+ editor->push_item(NULL);
+
+ //reconnect signals
+ List<MethodInfo> sl;
+
+ n->get_signal_list(&sl);
+ for (List<MethodInfo>::Element *E=sl.front();E;E=E->next()) {
+
+ List<Object::Connection> cl;
+ n->get_signal_connection_list(E->get().name,&cl);
+
+ for(List<Object::Connection>::Element *F=cl.front();F;F=F->next()) {
+
+ Object::Connection &c=F->get();
+ if (!(c.flags&Object::CONNECT_PERSIST))
+ continue;
+ newnode->connect(c.signal,c.target,c.method,varray(),Object::CONNECT_PERSIST);
+ }
+
+ }
+
+ String newname=n->get_name();
+
+ List<Node*> to_erase;
+ for(int i=0;i<n->get_child_count();i++) {
+ if (n->get_child(i)->get_owner()==NULL && n->is_owned_by_parent()) {
+ to_erase.push_back(n->get_child(i));
+ }
+ }
+ n->replace_by(newnode,true);
+
+ if (n==edited_scene) {
+ edited_scene=newnode;
+ editor->set_edited_scene(newnode);
+ newnode->set_editable_instances(n->get_editable_instances());
+ }
+
+ //small hack to make collisionshapes and other kind of nodes to work
+ for(int i=0;i<newnode->get_child_count();i++) {
+ Node *c=newnode->get_child(i);
+ c->call("set_transform", c->call("get_transform") );
+ }
+ editor_data->get_undo_redo().clear_history();
+ newnode->set_name(newname);
+
+ editor->push_item(newnode);
+
+ memdelete(n);
+
+ while(to_erase.front()) {
+ memdelete(to_erase.front()->get());
+ to_erase.pop_front();
+ }
+
+
+
+ }
+
+}
+
+
+void SceneTreeDock::set_edited_scene(Node* p_scene) {
+
+ edited_scene=p_scene;
+}
+
+void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected ) {
+
+ scene_tree->set_selected(p_node,p_emit_selected);
+
+}
+
+void SceneTreeDock::import_subscene() {
+
+ import_subscene_dialog->popup_centered_ratio();
+}
+
+void SceneTreeDock::_import_subscene() {
+
+ Node* parent = scene_tree->get_selected();
+ if (!parent) {
+ parent = editor_data->get_edited_scene_root();
+ ERR_FAIL_COND(!parent);
+ }
+
+ import_subscene_dialog->move(parent,edited_scene);
+ editor_data->get_undo_redo().clear_history(); //no undo for now..
+
+
+/*
+ editor_data->get_undo_redo().create_action("Import Subscene");
+ editor_data->get_undo_redo().add_do_method(parent,"add_child",ss);
+ //editor_data->get_undo_redo().add_do_method(editor_selection,"clear");
+ //editor_data->get_undo_redo().add_do_method(editor_selection,"add_node",child);
+ editor_data->get_undo_redo().add_do_reference(ss);
+ editor_data->get_undo_redo().add_undo_method(parent,"remove_child",ss);
+ editor_data->get_undo_redo().commit_action();
+*/
+}
+
+void SceneTreeDock::_new_scene_from(String p_file) {
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.size()!=1) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("This operation requires a single selected node."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ Node *base = selection.front()->get();
+
+ Map<Node*,Node*> reown;
+ reown[editor_data->get_edited_scene_root()]=base;
+ Node *copy = base->duplicate_and_reown(reown);
+ if (copy) {
+
+ Ref<PackedScene> sdata = memnew( PackedScene );
+ Error err = sdata->pack(copy);
+ memdelete(copy);
+
+ if (err!=OK) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Couldn't save new scene. Likely dependencies (instances) couldn't be satisfied."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ int flg=0;
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ flg|=ResourceSaver::FLAG_COMPRESS;
+ /*
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/save_paths_as_relative"))
+ flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
+ */
+
+
+ err = ResourceSaver::save(p_file,sdata,flg);
+ if (err!=OK) {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Error saving scene."));
+ accept->popup_centered_minsize();
+ return;
+ }
+ _replace_with_branch_scene(p_file, base);
+ } else {
+ accept->get_ok()->set_text(TTR("I see.."));
+ accept->set_text(TTR("Error duplicating scene to save it."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+}
+
+static bool _is_node_visible(Node* p_node) {
+
+ if (!p_node->get_owner())
+ return false;
+ if (p_node->get_owner()!=EditorNode::get_singleton()->get_edited_scene() && !EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node->get_owner()))
+ return false;
+
+ return true;
+
+}
+
+static bool _has_visible_children(Node* p_node) {
+
+ bool collapsed = p_node->is_displayed_folded();
+ if (collapsed)
+ return false;
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ Node* child = p_node->get_child(i);
+ if (!_is_node_visible(child))
+ continue;
+
+ return true;
+ }
+
+ return false;
+
+}
+
+
+
+static Node* _find_last_visible(Node* p_node) {
+
+ Node* last=NULL;
+
+ bool collapsed = p_node->is_displayed_folded();
+
+ if (!collapsed) {
+ for(int i=0;i<p_node->get_child_count();i++) {
+ if (_is_node_visible(p_node->get_child(i))) {
+ last=p_node->get_child(i);
+ }
+ }
+ }
+
+ if (last) {
+ Node* lastc=_find_last_visible(last);
+ if (lastc)
+ last=lastc;
+
+
+ } else {
+ last=p_node;
+ }
+
+ return last;
+}
+
+
+void SceneTreeDock::_normalize_drop(Node*& to_node, int &to_pos, int p_type) {
+
+ to_pos=-1;
+
+ if (p_type==-1) {
+ //drop at above selected node
+ if (to_node==EditorNode::get_singleton()->get_edited_scene()) {
+ to_node=NULL;
+ ERR_EXPLAIN("Cannot perform drop above the root node!");
+ ERR_FAIL();
+ }
+
+ to_pos=to_node->get_index();
+ to_node=to_node->get_parent();
+
+ } else if (p_type==1) {
+ //drop at below selected node
+ if (to_node==EditorNode::get_singleton()->get_edited_scene()) {
+ //if at lower sibling of root node
+ to_pos=0; //just insert at begining of root node
+ return;
+ }
+
+
+ Node* lower_sibling=NULL;
+
+
+
+ if (_has_visible_children(to_node) ) {
+ to_pos=0;
+ } else {
+
+
+ for(int i=to_node->get_index()+1;i<to_node->get_parent()->get_child_count();i++) {
+ Node *c =to_node->get_parent()->get_child(i);
+ if (_is_node_visible(c)) {
+ lower_sibling=c;
+ break;
+ }
+ }
+ if (lower_sibling) {
+ to_pos=lower_sibling->get_index();
+ }
+
+ to_node=to_node->get_parent();
+
+
+ }
+#if 0
+ //quite complicated, look for next visible in tree
+ upper_sibling=_find_last_visible(upper_sibling);
+
+ if (upper_sibling->get_parent()==to_node->get_parent()) {
+ //just insert over this node because nothing is above at an upper level
+ to_pos=to_node->get_index();
+ to_node=to_node->get_parent();
+ } else {
+ to_pos=-1; //insert last in whathever is up
+ to_node=upper_sibling->get_parent(); //insert at a parent of whathever is up
+ }
+
+
+ } else {
+ //just insert over this node because nothing is above at the same level
+ to_pos=to_node->get_index();
+ to_node=to_node->get_parent();
+ }
+#endif
+
+ }
+
+}
+
+void SceneTreeDock::_files_dropped(Vector<String> p_files,NodePath p_to,int p_type) {
+
+ Node *node = get_node(p_to);
+ ERR_FAIL_COND(!node);
+
+ int to_pos=-1;
+ _normalize_drop(node,to_pos,p_type);
+ _perform_instance_scenes(p_files,node,to_pos);
+}
+
+void SceneTreeDock::_script_dropped(String p_file, NodePath p_to) {
+ Ref<Script> scr = ResourceLoader::load(p_file);
+ ERR_FAIL_COND(!scr.is_valid());
+ Node *n = get_node(p_to);
+ if (n) {
+ n->set_script(scr.get_ref_ptr());
+ }
+}
+
+void SceneTreeDock::_nodes_dragged(Array p_nodes,NodePath p_to,int p_type) {
+
+ Vector<Node*> nodes;
+ Node *to_node;
+
+ for(int i=0;i<p_nodes.size();i++) {
+ Node *n=get_node((p_nodes[i]));
+ if (n) {
+ nodes.push_back(n);
+ }
+ }
+
+ if (nodes.size()==0)
+ return;
+
+ to_node=get_node(p_to);
+ if (!to_node)
+ return;
+
+ int to_pos=-1;
+
+ _normalize_drop(to_node,to_pos,p_type);
+ _do_reparent(to_node,to_pos,nodes,true);
+
+}
+
+void SceneTreeDock::_tree_rmb(const Vector2& p_menu_pos) {
+ if (!EditorNode::get_singleton()->get_edited_scene()) {
+
+ menu->clear();
+ menu->add_icon_shortcut(get_icon("Add","EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
+ menu->add_icon_shortcut(get_icon("Instance","EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
+
+ menu->set_size(Size2(1,1));
+ menu->set_pos(p_menu_pos);
+ menu->popup();
+ return;
+ }
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.size()==0)
+ return;
+
+ menu->clear();
+
+
+ if (selection.size()==1) {
+ menu->add_icon_shortcut(get_icon("Add","EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
+ menu->add_icon_shortcut(get_icon("Instance","EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
+ menu->add_separator();
+ menu->add_icon_shortcut(get_icon("Reload","EditorIcons"),ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
+ //menu->add_separator(); moved to their own dock
+ //menu->add_icon_item(get_icon("Groups","EditorIcons"),TTR("Edit Groups"),TOOL_GROUP);
+ //menu->add_icon_item(get_icon("Connect","EditorIcons"),TTR("Edit Connections"),TOOL_CONNECT);
+ menu->add_separator();
+ menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT);
+ menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT);
+ menu->add_separator();
+ }
+
+ menu->add_icon_shortcut(get_icon("Up","EditorIcons"),ED_GET_SHORTCUT("scene_tree/move_up"), TOOL_MOVE_UP);
+ menu->add_icon_shortcut(get_icon("Down","EditorIcons"),ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN);
+ menu->add_icon_shortcut(get_icon("Duplicate","EditorIcons"),ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE);
+ menu->add_icon_shortcut(get_icon("Reparent","EditorIcons"),ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT);
+
+ if (selection.size()==1) {
+ menu->add_separator();
+ menu->add_icon_shortcut(get_icon("Blend","EditorIcons"),ED_GET_SHORTCUT("scene_tree/merge_from_scene"), TOOL_MERGE_FROM_SCENE);
+ menu->add_icon_shortcut(get_icon("CreateNewSceneFrom","EditorIcons"),ED_GET_SHORTCUT("scene_tree/save_branch_as_scene"), TOOL_NEW_SCENE_FROM);
+ menu->add_separator();
+ menu->add_icon_shortcut(get_icon("CopyNodePath","EditorIcons"), ED_GET_SHORTCUT("scene_tree/copy_node_path"), TOOL_COPY_NODE_PATH);
+ }
+ menu->add_separator();
+ menu->add_icon_shortcut(get_icon("Remove","EditorIcons"), ED_SHORTCUT("scene_tree/delete", TTR("Delete Node(s)"), KEY_DELETE), TOOL_ERASE);
+ menu->set_size(Size2(1,1));
+ menu->set_pos(p_menu_pos);
+ menu->popup();
+
+}
+
+
+void SceneTreeDock::_filter_changed(const String& p_filter) {
+
+ scene_tree->set_filter(p_filter);
+}
+
+String SceneTreeDock::get_filter() {
+
+ return filter->get_text();
+}
+
+void SceneTreeDock::set_filter(const String& p_filter){
+
+ filter->set_text(p_filter);
+ scene_tree->set_filter(p_filter);
+}
+
+
+void SceneTreeDock::_focus_node() {
+
+ Node *node = scene_tree->get_selected();
+ ERR_FAIL_COND(!node);
+
+ if (node->is_class("CanvasItem")) {
+ CanvasItemEditorPlugin *editor = editor_data->get_editor("2D")->cast_to<CanvasItemEditorPlugin>();
+ editor->get_canvas_item_editor()->focus_selection();
+ } else {
+ SpatialEditorPlugin *editor = editor_data->get_editor("3D")->cast_to<SpatialEditorPlugin>();
+ editor->get_spatial_editor()->get_editor_viewport(0)->focus_selection();
+ }
+}
+
+void SceneTreeDock::open_script_dialog(Node* p_for_node) {
+
+ scene_tree->set_selected(p_for_node,false);
+ _tool_selected(TOOL_ATTACH_SCRIPT);
+}
+
+void SceneTreeDock::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_tool_selected"),&SceneTreeDock::_tool_selected,DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("_create"),&SceneTreeDock::_create);
+ //ClassDB::bind_method(D_METHOD("_script_created"),&SceneTreeDock::_script_created);
+ ClassDB::bind_method(D_METHOD("_node_reparent"),&SceneTreeDock::_node_reparent);
+ ClassDB::bind_method(D_METHOD("_set_owners"),&SceneTreeDock::_set_owners);
+ ClassDB::bind_method(D_METHOD("_node_selected"),&SceneTreeDock::_node_selected);
+ ClassDB::bind_method(D_METHOD("_node_renamed"),&SceneTreeDock::_node_renamed);
+ ClassDB::bind_method(D_METHOD("_script_created"),&SceneTreeDock::_script_created);
+ ClassDB::bind_method(D_METHOD("_load_request"),&SceneTreeDock::_load_request);
+ ClassDB::bind_method(D_METHOD("_script_open_request"),&SceneTreeDock::_script_open_request);
+ ClassDB::bind_method(D_METHOD("_unhandled_key_input"),&SceneTreeDock::_unhandled_key_input);
+ ClassDB::bind_method(D_METHOD("_input"),&SceneTreeDock::_input);
+ ClassDB::bind_method(D_METHOD("_nodes_drag_begin"),&SceneTreeDock::_nodes_drag_begin);
+ ClassDB::bind_method(D_METHOD("_delete_confirm"),&SceneTreeDock::_delete_confirm);
+ ClassDB::bind_method(D_METHOD("_node_prerenamed"),&SceneTreeDock::_node_prerenamed);
+ ClassDB::bind_method(D_METHOD("_import_subscene"),&SceneTreeDock::_import_subscene);
+ ClassDB::bind_method(D_METHOD("_selection_changed"),&SceneTreeDock::_selection_changed);
+ ClassDB::bind_method(D_METHOD("_new_scene_from"),&SceneTreeDock::_new_scene_from);
+ ClassDB::bind_method(D_METHOD("_nodes_dragged"),&SceneTreeDock::_nodes_dragged);
+ ClassDB::bind_method(D_METHOD("_files_dropped"),&SceneTreeDock::_files_dropped);
+ ClassDB::bind_method(D_METHOD("_script_dropped"),&SceneTreeDock::_script_dropped);
+ ClassDB::bind_method(D_METHOD("_tree_rmb"),&SceneTreeDock::_tree_rmb);
+ ClassDB::bind_method(D_METHOD("_filter_changed"),&SceneTreeDock::_filter_changed);
+ ClassDB::bind_method(D_METHOD("_focus_node"),&SceneTreeDock::_focus_node);
+
+
+ ClassDB::bind_method(D_METHOD("instance"),&SceneTreeDock::instance);
+}
+
+
+
+SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelection *p_editor_selection,EditorData &p_editor_data) {
+
+ editor=p_editor;
+ edited_scene=NULL;
+ editor_data=&p_editor_data;
+ editor_selection=p_editor_selection;
+ scene_root=p_scene_root;
+
+ VBoxContainer *vbc = this;
+
+ HBoxContainer *filter_hbc = memnew( HBoxContainer );
+ ToolButton *tb;
+
+ ED_SHORTCUT("scene_tree/add_child_node",TTR("Add Child Node"), KEY_MASK_CMD|KEY_A);
+ ED_SHORTCUT("scene_tree/instance_scene",TTR("Instance Child Scene"));
+ ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type"));
+ ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script"));
+ ED_SHORTCUT("scene_tree/clear_script", TTR("Clear Script"));
+ ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KEY_MASK_CMD | KEY_UP);
+ ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KEY_MASK_CMD | KEY_DOWN);
+ ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"),KEY_MASK_CMD | KEY_D);
+ ED_SHORTCUT("scene_tree/reparent", TTR("Reparent"));
+ ED_SHORTCUT("scene_tree/merge_from_scene", TTR("Merge From Scene"));
+ ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene"));
+ ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KEY_MASK_CMD|KEY_C);
+ ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT|KEY_DELETE);
+ ED_SHORTCUT("scene_tree/delete", TTR("Delete"), KEY_DELETE);
+
+ tb = memnew( ToolButton );
+ tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_NEW, false));
+ tb->set_tooltip(TTR("Add/Create a New Node"));
+ tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/add_child_node"));
+ filter_hbc->add_child(tb);
+ button_add=tb;
+
+ tb = memnew( ToolButton );
+ tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_INSTANCE, false));
+ tb->set_tooltip(TTR("Instance a scene file as a Node. Creates an inherited scene if no root node exists."));
+ tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/instance_scene"));
+ filter_hbc->add_child(tb);
+ button_instance=tb;
+
+
+
+ vbc->add_child(filter_hbc);
+ filter = memnew( LineEdit );
+ filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ filter_hbc->add_child(filter);
+ filter_icon = memnew( TextureRect );
+ filter_hbc->add_child(filter_icon);
+ filter_icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
+ filter->connect("text_changed",this,"_filter_changed");
+
+
+ tb = memnew( ToolButton );
+ tb->connect("pressed",this,"_tool_selected",make_binds(TOOL_ATTACH_SCRIPT, false));
+ tb->set_tooltip(TTR("Attach a new or existing script for the selected node."));
+ tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/attach_script"));
+ filter_hbc->add_child(tb);
+ button_create_script=tb;
+
+ tb = memnew(ToolButton);
+ tb->connect("pressed", this, "_tool_selected", make_binds(TOOL_CLEAR_SCRIPT, false));
+ tb->set_tooltip(TTR("Clear a script for the selected node."));
+ tb->set_shortcut(ED_GET_SHORTCUT("scene_tree/clear_script"));
+ filter_hbc->add_child(tb);
+ button_clear_script = tb;
+
+
+ scene_tree = memnew( SceneTreeEditor(false,true,true ));
+ vbc->add_child(scene_tree);
+ scene_tree->set_v_size_flags(SIZE_EXPAND|SIZE_FILL);
+ scene_tree->connect("rmb_pressed",this,"_tree_rmb");
+
+ scene_tree->connect("node_selected", this,"_node_selected",varray(),CONNECT_DEFERRED);
+ scene_tree->connect("node_renamed", this,"_node_renamed",varray(),CONNECT_DEFERRED);
+ scene_tree->connect("node_prerename", this,"_node_prerenamed");
+ scene_tree->connect("open",this,"_load_request");
+ scene_tree->connect("open_script",this,"_script_open_request");
+ scene_tree->connect("nodes_rearranged",this,"_nodes_dragged");
+ scene_tree->connect("files_dropped",this,"_files_dropped");
+ scene_tree->connect("script_dropped",this,"_script_dropped");
+ scene_tree->connect("nodes_dragged",this,"_nodes_drag_begin");
+
+ scene_tree->get_scene_tree()->connect("item_double_clicked", this, "_focus_node");
+
+ scene_tree->set_undo_redo(&editor_data->get_undo_redo());
+ scene_tree->set_editor_selection(editor_selection);
+
+
+ create_dialog = memnew( CreateDialog );
+ create_dialog->set_base_type("Node");
+ add_child(create_dialog);
+ create_dialog->connect("create",this,"_create");
+
+ //groups_editor = memnew( GroupsEditor );
+ //add_child(groups_editor);
+ //groups_editor->set_undo_redo(&editor_data->get_undo_redo());
+
+ //connect_dialog = memnew( ConnectionsDialog(p_editor) );
+ //add_child(connect_dialog);
+ //connect_dialog->set_undoredo(&editor_data->get_undo_redo());
+
+ script_create_dialog = memnew( ScriptCreateDialog );
+ add_child(script_create_dialog);
+ script_create_dialog->connect("script_created",this,"_script_created");
+
+ reparent_dialog = memnew( ReparentDialog );
+ add_child(reparent_dialog);
+ reparent_dialog->connect("reparent",this,"_node_reparent");
+
+ accept = memnew( AcceptDialog );
+ add_child(accept);
+
+ file = memnew( EditorFileDialog );
+ add_child(file);
+ file->connect("file_selected",this,"instance");
+ set_process_unhandled_key_input(true);
+
+ delete_dialog = memnew( ConfirmationDialog );
+ add_child(delete_dialog);
+ delete_dialog->connect("confirmed",this,"_delete_confirm");
+
+ import_subscene_dialog = memnew( EditorSubScene );
+ add_child(import_subscene_dialog);
+ import_subscene_dialog->connect("subscene_selected",this,"_import_subscene");
+
+ new_scene_from_dialog = memnew( EditorFileDialog );
+ new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ add_child(new_scene_from_dialog);
+ new_scene_from_dialog->connect("file_selected",this,"_new_scene_from");
+
+
+ menu = memnew( PopupMenu );
+ add_child(menu);
+ menu->connect("id_pressed",this,"_tool_selected");
+ first_enter=true;
+ restore_script_editor_on_drag=false;
+
+ vbc->add_constant_override("separation",4);
+ set_process_input(true);
+}
diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h
new file mode 100644
index 0000000000..2ee7ba3d06
--- /dev/null
+++ b/editor/scene_tree_dock.h
@@ -0,0 +1,188 @@
+/*************************************************************************/
+/* scene_tree_dock.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCENE_TREE_DOCK_H
+#define SCENE_TREE_DOCK_H
+
+#include "scene/gui/control.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/label.h"
+#include "scene/gui/button.h"
+#include "scene/gui/tool_button.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/popup_menu.h"
+#include "scene_tree_editor.h"
+#include "create_dialog.h"
+#include "editor_data.h"
+#include "groups_editor.h"
+#include "connections_dialog.h"
+#include "script_create_dialog.h"
+#include "reparent_dialog.h"
+#include "scene/animation/animation_player.h"
+#include "editor_sub_scene.h"
+class EditorNode;
+
+class SceneTreeDock : public VBoxContainer {
+
+ GDCLASS( SceneTreeDock, VBoxContainer );
+
+ enum Tool {
+
+ TOOL_NEW,
+ TOOL_INSTANCE,
+ TOOL_REPLACE,
+ TOOL_CONNECT,
+ TOOL_GROUP,
+ TOOL_ATTACH_SCRIPT,
+ TOOL_CLEAR_SCRIPT,
+ TOOL_MOVE_UP,
+ TOOL_MOVE_DOWN,
+ TOOL_DUPLICATE,
+ TOOL_REPARENT,
+ TOOL_NEW_SCENE_FROM,
+ TOOL_MERGE_FROM_SCENE,
+ TOOL_MULTI_EDIT,
+ TOOL_ERASE,
+ TOOL_COPY_NODE_PATH,
+ TOOL_BUTTON_MAX
+ };
+
+
+ bool restore_script_editor_on_drag;
+
+ int current_option;
+ CreateDialog *create_dialog;
+
+ ToolButton *button_add;
+ ToolButton *button_instance;
+ ToolButton *button_create_script;
+ ToolButton *button_clear_script;
+
+ SceneTreeEditor *scene_tree;
+
+ HBoxContainer *tool_hbc;
+ void _tool_selected(int p_tool, bool p_confirm_override = false);
+
+ EditorData *editor_data;
+ EditorSelection *editor_selection;
+
+ //GroupsEditor *groups_editor;
+ //ConnectionsDialog *connect_dialog;
+ ScriptCreateDialog *script_create_dialog;
+ AcceptDialog *accept;
+ ConfirmationDialog *delete_dialog;
+
+ ReparentDialog *reparent_dialog;
+ EditorFileDialog *file;
+ EditorSubScene *import_subscene_dialog;
+ EditorFileDialog *new_scene_from_dialog;
+
+ LineEdit *filter;
+ TextureRect *filter_icon;
+
+ PopupMenu * menu;
+
+ bool first_enter;
+
+ void _create();
+ Node *scene_root;
+ Node *edited_scene;
+ EditorNode *editor;
+
+ Node *_duplicate(Node *p_node, Map<Node*,Node*> &duplimap);
+ void _node_reparent(NodePath p_path, bool p_keep_global_xform);
+ void _do_reparent(Node* p_new_parent, int p_position_in_parent, Vector<Node*> p_nodes, bool p_keep_global_xform);
+
+ void _set_owners(Node *p_owner, const Array& p_nodes);
+ void _load_request(const String& p_path);
+ void _script_open_request(const Ref<Script>& p_script);
+
+ bool _cyclical_dependency_exists(const String& p_target_scene_path, Node* p_desired_node);
+
+ void _node_selected();
+ void _node_renamed();
+ void _script_created(Ref<Script> p_script);
+
+ void _delete_confirm();
+
+
+ void _node_prerenamed(Node* p_node, const String& p_new_name);
+
+ void _nodes_drag_begin();
+ void _input(InputEvent p_event);
+ void _unhandled_key_input(InputEvent p_event);
+
+ void _import_subscene();
+
+ void _new_scene_from(String p_file);
+
+ bool _validate_no_foreign();
+ void _selection_changed();
+
+ void _fill_path_renames(Vector<StringName> base_path,Vector<StringName> new_base_path,Node * p_node, List<Pair<NodePath,NodePath> > *p_renames);
+
+ void _normalize_drop(Node*& to_node, int &to_pos, int p_type);
+
+ void _nodes_dragged(Array p_nodes,NodePath p_to,int p_type);
+ void _files_dropped(Vector<String> p_files,NodePath p_to,int p_type);
+ void _script_dropped(String p_file, NodePath p_to);
+
+ void _tree_rmb(const Vector2& p_menu_pos);
+
+ void _filter_changed(const String& p_filter);
+
+ void _perform_instance_scenes(const Vector<String>& p_files,Node* parent,int p_pos);
+ void _replace_with_branch_scene(const String& p_file,Node* base);
+
+ void _file_selected(String p_file);
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ String get_filter();
+ void set_filter(const String& p_filter);
+
+ void _focus_node();
+
+ void import_subscene();
+ void set_edited_scene(Node* p_scene);
+ void instance(const String& p_path);
+ void instance_scenes(const Vector<String>& p_files, Node *p_parent=NULL);
+ void set_selected(Node *p_node, bool p_emit_selected=false);
+ void fill_path_renames(Node* p_node, Node *p_new_parent, List<Pair<NodePath,NodePath> > *p_renames);
+ void perform_node_renames(Node* p_base,List<Pair<NodePath,NodePath> > *p_renames, Map<Ref<Animation>, Set<int> > *r_rem_anims=NULL);
+ SceneTreeEditor *get_tree_editor() { return scene_tree; }
+ EditorData *get_editor_data() { return editor_data; }
+
+ void open_script_dialog(Node* p_for_node);
+ SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelection *p_editor_selection,EditorData &p_editor_data);
+};
+
+#endif // SCENE_TREE_DOCK_H
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
new file mode 100644
index 0000000000..fb21747ebb
--- /dev/null
+++ b/editor/scene_tree_editor.cpp
@@ -0,0 +1,1316 @@
+/*************************************************************************/
+/* scene_tree_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "scene_tree_editor.h"
+
+#include "scene/gui/label.h"
+#include "editor_node.h"
+#include "print_string.h"
+#include "message_queue.h"
+#include "scene/main/viewport.h"
+#include "editor/plugins/canvas_item_editor_plugin.h"
+#include "scene/resources/packed_scene.h"
+
+Node *SceneTreeEditor::get_scene_node() {
+
+ ERR_FAIL_COND_V(!is_inside_tree(),NULL);
+
+ return get_tree()->get_edited_scene_root();
+}
+
+
+void SceneTreeEditor::_subscene_option(int p_idx) {
+
+ Object *obj = ObjectDB::get_instance(instance_node);
+ if (!obj)
+ return;
+ Node *node = obj->cast_to<Node>();
+ if (!node)
+ return;
+
+ switch(p_idx) {
+
+ case SCENE_MENU_EDITABLE_CHILDREN: {
+
+ bool editable = EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(node);
+ editable = !editable;
+
+ //node->set_instance_children_editable(editable);
+ EditorNode::get_singleton()->get_edited_scene()->set_editable_instance(node,editable);
+ instance_menu->set_item_checked(0,editable);
+ if (editable) {
+ node->set_scene_instance_load_placeholder(false);
+ instance_menu->set_item_checked(1,false);
+ }
+
+ _update_tree();
+
+ } break;
+ case SCENE_MENU_USE_PLACEHOLDER: {
+
+ bool placeholder = node->get_scene_instance_load_placeholder();
+ placeholder = !placeholder;
+
+ //node->set_instance_children_editable(editable);
+ if (placeholder) {
+ EditorNode::get_singleton()->get_edited_scene()->set_editable_instance(node,false);
+ }
+ node->set_scene_instance_load_placeholder(placeholder);
+ instance_menu->set_item_checked(0,false);
+ instance_menu->set_item_checked(1,placeholder);
+
+ _update_tree();
+
+ } break;
+ case SCENE_MENU_OPEN: {
+
+ emit_signal("open",node->get_filename());
+ } break;
+ case SCENE_MENU_CLEAR_INHERITANCE: {
+ clear_inherit_confirm->popup_centered_minsize();
+ } break;
+ case SCENE_MENU_CLEAR_INSTANCING: {
+
+ Node*root=EditorNode::get_singleton()->get_edited_scene();
+ if (!root)
+ break;
+
+
+ ERR_FAIL_COND(node->get_filename()==String());
+
+ undo_redo->create_action("Discard Instancing");
+
+ undo_redo->add_do_method(node,"set_filename","");
+ undo_redo->add_undo_method(node,"set_filename",node->get_filename());
+
+ _node_replace_owner(node,node,root);
+
+ undo_redo->add_do_method(this,"update_tree");
+ undo_redo->add_undo_method(this,"update_tree");
+
+ undo_redo->commit_action();
+
+
+ } break;
+ case SCENE_MENU_OPEN_INHERITED: {
+ if (node && node->get_scene_inherited_state().is_valid()) {
+ emit_signal("open",node->get_scene_inherited_state()->get_path());
+ }
+ } break;
+ case SCENE_MENU_CLEAR_INHERITANCE_CONFIRM: {
+ if (node && node->get_scene_inherited_state().is_valid()) {
+ node->set_scene_inherited_state(Ref<SceneState>());
+ update_tree();
+ EditorNode::get_singleton()->get_property_editor()->update_tree();
+ }
+
+ } break;
+
+
+ }
+
+}
+
+
+void SceneTreeEditor::_node_replace_owner(Node* p_base,Node* p_node,Node* p_root) {
+
+ if (p_base!=p_node) {
+
+ if (p_node->get_owner()==p_base) {
+
+ undo_redo->add_do_method(p_node,"set_owner",p_root);
+ undo_redo->add_undo_method(p_node,"set_owner",p_base);
+ }
+ }
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ _node_replace_owner(p_base,p_node->get_child(i),p_root);
+ }
+}
+
+
+void SceneTreeEditor::_cell_button_pressed(Object *p_item,int p_column,int p_id) {
+
+ TreeItem *item=p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!item);
+
+ NodePath np = item->get_metadata(0);
+
+ Node *n=get_node(np);
+ ERR_FAIL_COND(!n);
+
+ if (p_id==BUTTON_SUBSCENE) {
+ //open scene request
+ Rect2 item_rect = tree->get_item_rect(item,0);
+ item_rect.pos.y-=tree->get_scroll().y;
+ item_rect.pos+=tree->get_global_pos();
+
+ if (n==get_scene_node()) {
+ inheritance_menu->set_pos(item_rect.pos+Vector2(0,item_rect.size.y));
+ inheritance_menu->set_size(Vector2(item_rect.size.x,0));
+ inheritance_menu->popup();
+ instance_node=n->get_instance_ID();
+
+ } else {
+ instance_menu->set_pos(item_rect.pos+Vector2(0,item_rect.size.y));
+ instance_menu->set_size(Vector2(item_rect.size.x,0));
+ if (EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(n))
+ instance_menu->set_item_checked(0,true);
+ else
+ instance_menu->set_item_checked(0,false);
+
+ if (n->get_owner()==get_scene_node()) {
+ instance_menu->set_item_checked(1,n->get_scene_instance_load_placeholder());
+ instance_menu->set_item_disabled(1,false);
+ } else {
+
+ instance_menu->set_item_checked(1,false);
+ instance_menu->set_item_disabled(1,true);
+ }
+
+ instance_menu->popup();
+ instance_node=n->get_instance_ID();
+ }
+ //emit_signal("open",n->get_filename());
+ } else if (p_id==BUTTON_SCRIPT) {
+ RefPtr script=n->get_script();
+ if (!script.is_null())
+ emit_signal("open_script",script);
+
+ } else if (p_id==BUTTON_VISIBILITY) {
+
+
+ if (n->is_class("Spatial")) {
+
+ bool v = bool(n->call("is_visible"));
+ undo_redo->create_action(TTR("Toggle Spatial Visible"));
+ undo_redo->add_do_method(n,"set_visible",!v);
+ undo_redo->add_undo_method(n,"set_visible",v);
+ undo_redo->commit_action();
+
+ } else if (n->is_class("CanvasItem")) {
+
+ bool v = bool(n->call("is_visible"));
+ undo_redo->create_action(TTR("Toggle CanvasItem Visible"));
+ undo_redo->add_do_method(n,v?"hide":"show");
+ undo_redo->add_undo_method(n,v?"show":"hide");
+ undo_redo->commit_action();
+ }
+
+ } else if (p_id==BUTTON_LOCK) {
+
+ if (n->is_class("CanvasItem")) {
+ n->set_meta("_edit_lock_", Variant());
+ _update_tree();
+ emit_signal("node_changed");
+ }
+
+ } else if (p_id==BUTTON_GROUP) {
+ if (n->is_class("CanvasItem")) {
+ n->set_meta("_edit_group_", Variant());
+ _update_tree();
+ emit_signal("node_changed");
+ }
+ } else if (p_id==BUTTON_WARNING) {
+
+ String config_err = n->get_configuration_warning();
+ if (config_err==String())
+ return;
+ config_err=config_err.word_wrap(80);
+ warning->set_text(config_err);
+ warning->popup_centered_minsize();
+
+ } else if (p_id==BUTTON_SIGNALS) {
+
+ editor_selection->clear();
+ editor_selection->add_node(n);
+
+ set_selected(n);
+
+ NodeDock::singleton->get_parent()->call("set_current_tab",NodeDock::singleton->get_index());
+ NodeDock::singleton->show_connections();
+
+ } else if (p_id==BUTTON_GROUPS) {
+
+ editor_selection->clear();
+ editor_selection->add_node(n);
+
+ set_selected(n);
+
+ NodeDock::singleton->get_parent()->call("set_current_tab",NodeDock::singleton->get_index());
+ NodeDock::singleton->show_groups();
+ }
+}
+
+bool SceneTreeEditor::_add_nodes(Node *p_node,TreeItem *p_parent) {
+
+ if (!p_node)
+ return false;
+
+ // only owned nodes are editable, since nodes can create their own (manually owned) child nodes,
+ // which the editor needs not to know about.
+
+ bool part_of_subscene=false;
+
+ if (!display_foreign && p_node->get_owner()!=get_scene_node() && p_node!=get_scene_node()) {
+
+ if ((show_enabled_subscene || can_open_instance) && p_node->get_owner() && (get_scene_node()->is_editable_instance(p_node->get_owner()))) {
+
+ part_of_subscene=true;
+ //allow
+ } else {
+ return false;
+ }
+ } else {
+ part_of_subscene = p_node!=get_scene_node() && get_scene_node()->get_scene_inherited_state().is_valid() && get_scene_node()->get_scene_inherited_state()->find_node_by_path(get_scene_node()->get_path_to(p_node))>=0;
+ }
+
+ TreeItem *item = tree->create_item(p_parent);
+ item->set_text(0, p_node->get_name() );
+ if (can_rename && !part_of_subscene /*(p_node->get_owner() == get_scene_node() || p_node==get_scene_node())*/)
+ item->set_editable(0, true);
+
+ item->set_selectable(0,true);
+ if (can_rename) {
+#ifdef ENABLE_DEPRECATED
+ if (p_node->has_meta("_editor_collapsed")) {
+ //remove previous way of storing folding, which did not get along with scene inheritance and instancing
+ if ((bool)p_node->get_meta("_editor_collapsed"))
+ p_node->set_display_folded(true);
+ p_node->set_meta("_editor_collapsed",Variant());
+ }
+#endif
+ bool collapsed = p_node->is_displayed_folded();
+ if (collapsed)
+ item->set_collapsed(true);
+ }
+
+ Ref<Texture> icon;
+ if (p_node->has_meta("_editor_icon"))
+ icon=p_node->get_meta("_editor_icon");
+ else
+ icon=get_icon( (has_icon(p_node->get_class(),"EditorIcons")?p_node->get_class():String("Object")),"EditorIcons");
+ item->set_icon(0, icon );
+ item->set_metadata( 0,p_node->get_path() );
+
+ if (part_of_subscene) {
+
+ //item->set_selectable(0,marked_selectable);
+ item->set_custom_color(0,Color(0.8,0.4,0.20));
+
+ } else if (marked.has(p_node)) {
+
+ item->set_selectable(0,marked_selectable);
+ item->set_custom_color(0,Color(0.8,0.1,0.10));
+ } else if (!marked_selectable && !marked_children_selectable) {
+
+ Node *node=p_node;
+ while(node) {
+ if (marked.has(node)) {
+ item->set_selectable(0,false);
+ item->set_custom_color(0,Color(0.8,0.1,0.10));
+ break;
+ }
+ node=node->get_parent();
+ }
+ }
+
+
+
+ if (can_rename) { //should be can edit..
+
+ String warning = p_node->get_configuration_warning();
+ if (warning!=String()) {
+ item->add_button(0,get_icon("NodeWarning","EditorIcons"),BUTTON_WARNING);
+ }
+
+ bool has_connections = p_node->has_persistent_signal_connections();
+ bool has_groups = p_node->has_persistent_groups();
+
+ if (has_connections && has_groups) {
+ item->add_button(0,get_icon("ConnectionAndGroups","EditorIcons"),BUTTON_SIGNALS);
+ } else if (has_connections) {
+ item->add_button(0,get_icon("Connect","EditorIcons"),BUTTON_SIGNALS);
+ } else if (has_groups) {
+ item->add_button(0,get_icon("Groups","EditorIcons"),BUTTON_GROUPS);
+ }
+ }
+
+ if (p_node==get_scene_node() && p_node->get_scene_inherited_state().is_valid()) {
+ item->add_button(0,get_icon("InstanceOptions","EditorIcons"),BUTTON_SUBSCENE);
+ item->set_tooltip(0,TTR("Inherits:")+" "+p_node->get_scene_inherited_state()->get_path()+"\n"+TTR("Type:")+" "+p_node->get_class());
+ } else if (p_node!=get_scene_node() && p_node->get_filename()!="" && can_open_instance) {
+
+ item->add_button(0,get_icon("InstanceOptions","EditorIcons"),BUTTON_SUBSCENE);
+ item->set_tooltip(0,TTR("Instance:")+" "+p_node->get_filename()+"\n"+TTR("Type:")+" "+p_node->get_class());
+ } else {
+ item->set_tooltip(0,String(p_node->get_name())+"\n"+TTR("Type:")+" "+p_node->get_class());
+ }
+
+ if (can_open_instance) {
+
+ if (!p_node->is_connected("script_changed",this,"_node_script_changed"))
+ p_node->connect("script_changed",this,"_node_script_changed",varray(p_node));
+
+
+ if (!p_node->get_script().is_null()) {
+
+ item->add_button(0,get_icon("Script","EditorIcons"),BUTTON_SCRIPT);
+ }
+
+ if (p_node->is_class("CanvasItem")) {
+
+ bool is_locked = p_node->has_meta("_edit_lock_");//_edit_group_
+ if (is_locked)
+ item->add_button(0,get_icon("Lock", "EditorIcons"), BUTTON_LOCK);
+
+ bool is_grouped = p_node->has_meta("_edit_group_");
+ if (is_grouped)
+ item->add_button(0,get_icon("Group", "EditorIcons"), BUTTON_GROUP);
+
+ bool v = p_node->call("is_visible");
+ if (v)
+ item->add_button(0,get_icon("Visible","EditorIcons"),BUTTON_VISIBILITY);
+ else
+ item->add_button(0,get_icon("Hidden","EditorIcons"),BUTTON_VISIBILITY);
+
+ if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed"))
+ p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node));
+
+ _update_visibility_color(p_node, item);
+ } else if (p_node->is_class("Spatial")) {
+
+ bool v = p_node->call("is_visible");
+ if (v)
+ item->add_button(0,get_icon("Visible","EditorIcons"),BUTTON_VISIBILITY);
+ else
+ item->add_button(0,get_icon("Hidden","EditorIcons"),BUTTON_VISIBILITY);
+
+ if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed"))
+ p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node));
+
+ _update_visibility_color(p_node, item);
+ }
+
+ }
+
+ if (editor_selection) {
+ if (editor_selection->is_selected(p_node)) {
+
+ item->select(0);
+ }
+ }
+
+ if (selected==p_node) {
+ if (!editor_selection)
+ item->select(0);
+ item->set_as_cursor(0);
+ }
+
+ bool keep= (filter.is_subsequence_ofi(String(p_node->get_name())));
+
+ for (int i=0;i<p_node->get_child_count();i++) {
+
+ bool child_keep = _add_nodes(p_node->get_child(i),item);
+
+ keep = keep || child_keep;
+
+ }
+
+ if (!keep) {
+ memdelete(item);
+ return false;
+ } else {
+ return true;
+ }
+
+}
+
+
+void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
+
+
+ if (p_node!=get_scene_node() && !p_node->get_owner()) {
+
+ return;
+ }
+ TreeItem* item=p_node?_find(tree->get_root(),p_node->get_path()):NULL;
+ if (!item) {
+
+ return;
+ }
+ int idx=item->get_button_by_id(0,BUTTON_VISIBILITY);
+ ERR_FAIL_COND(idx==-1);
+
+ bool visible=false;
+
+ if (p_node->is_class("CanvasItem")) {
+ visible = p_node->call("is_visible");
+ CanvasItemEditor::get_singleton()->get_viewport_control()->update();
+ } else if (p_node->is_class("Spatial")) {
+ visible = p_node->call("is_visible");
+ }
+
+ if (visible)
+ item->set_button(0,idx,get_icon("Visible","EditorIcons"));
+ else
+ item->set_button(0,idx,get_icon("Hidden","EditorIcons"));
+
+ _update_visibility_color(p_node, item);
+}
+
+void SceneTreeEditor::_update_visibility_color(Node *p_node, TreeItem *p_item) {
+ if (p_node->is_class("CanvasItem") || p_node->is_class("Spatial")) {
+ Color color(1,1,1,1);
+ bool visible_on_screen = p_node->call("is_visible");
+ if (!visible_on_screen) {
+ color = Color(0.6,0.6,0.6,1);
+ }
+ int idx=p_item->get_button_by_id(0,BUTTON_VISIBILITY);
+ p_item->set_button_color(0,idx,color);
+ }
+}
+
+void SceneTreeEditor::_node_script_changed(Node *p_node) {
+
+ _update_tree();
+ /*
+ changes the order :|
+ TreeItem* item=p_node?_find(tree->get_root(),p_node->get_path()):NULL;
+ if (p_node->get_script().is_null()) {
+
+ int idx=item->get_button_by_id(0,2);
+ if (idx>=0)
+ item->erase_button(0,idx);
+ } else {
+
+ int idx=item->get_button_by_id(0,2);
+ if (idx<0)
+ item->add_button(0,get_icon("Script","EditorIcons"),2);
+
+ }*/
+
+}
+
+void SceneTreeEditor::_node_removed(Node *p_node) {
+
+ if (EditorNode::get_singleton()->is_exiting())
+ return; //speed up exit
+
+ if (p_node->is_connected("script_changed",this,"_node_script_changed"))
+ p_node->disconnect("script_changed",this,"_node_script_changed");
+
+ if (p_node->is_class("Spatial") || p_node->is_class("CanvasItem")) {
+ if (p_node->is_connected("visibility_changed",this,"_node_visibility_changed"))
+ p_node->disconnect("visibility_changed",this,"_node_visibility_changed");
+ }
+
+ if (p_node==selected) {
+ selected=NULL;
+ emit_signal("node_selected");
+ }
+
+
+}
+void SceneTreeEditor::_update_tree() {
+
+
+ if (!is_inside_tree()) {
+ tree_dirty=false;
+ return;
+ }
+
+ updating_tree=true;
+ tree->clear();
+ if (get_scene_node()) {
+ _add_nodes( get_scene_node(), NULL );
+ last_hash = hash_djb2_one_64(0);
+ _compute_hash(get_scene_node(),last_hash);
+
+ }
+ updating_tree=false;
+
+ tree_dirty=false;
+
+}
+
+void SceneTreeEditor::_compute_hash(Node *p_node,uint64_t &hash) {
+
+ hash=hash_djb2_one_64(p_node->get_instance_ID(),hash);
+ if (p_node->get_parent())
+ hash=hash_djb2_one_64(p_node->get_parent()->get_instance_ID(),hash); //so a reparent still produces a different hash
+
+
+ for(int i=0;i<p_node->get_child_count();i++) {
+
+ _compute_hash(p_node->get_child(i),hash);
+ }
+}
+
+void SceneTreeEditor::_test_update_tree() {
+
+ pending_test_update=false;
+
+ if (!is_inside_tree())
+ return;
+
+ if(tree_dirty)
+ return; // don't even bother
+
+ uint64_t hash = hash_djb2_one_64(0);
+ if (get_scene_node())
+ _compute_hash(get_scene_node(),hash);
+ //test hash
+ if (hash==last_hash)
+ return; // did not change
+
+ MessageQueue::get_singleton()->push_call(this,"_update_tree");
+ tree_dirty=true;
+}
+
+void SceneTreeEditor::_tree_changed() {
+
+ if (EditorNode::get_singleton()->is_exiting())
+ return; //speed up exit
+ if (pending_test_update)
+ return;
+ if (tree_dirty)
+ return;
+
+ MessageQueue::get_singleton()->push_call(this,"_test_update_tree");
+ pending_test_update=true;
+
+}
+
+void SceneTreeEditor::_selected_changed() {
+
+
+ TreeItem *s = tree->get_selected();
+ ERR_FAIL_COND(!s);
+ NodePath np = s->get_metadata(0);
+
+ Node *n=get_node(np);
+
+
+ if (n==selected)
+ return;
+
+
+ selected = get_node(np);
+
+ blocked++;
+ emit_signal("node_selected");
+ blocked--;
+
+
+}
+
+
+void SceneTreeEditor::_cell_multi_selected(Object *p_object,int p_cell,bool p_selected) {
+
+ TreeItem *item = p_object->cast_to<TreeItem>();
+ ERR_FAIL_COND(!item);
+
+ NodePath np = item->get_metadata(0);
+
+ Node *n=get_node(np);
+
+ if (!n)
+ return;
+
+ if (!editor_selection)
+ return;
+
+ if (p_selected) {
+ editor_selection->add_node(n);
+
+ } else {
+ editor_selection->remove_node(n);
+
+ }
+
+}
+
+void SceneTreeEditor::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ get_tree()->connect("tree_changed",this,"_tree_changed");
+ get_tree()->connect("node_removed",this,"_node_removed");
+ get_tree()->connect("node_configuration_warning_changed",this,"_warning_changed");
+
+ instance_menu->set_item_icon(5,get_icon("Load","EditorIcons"));
+ tree->connect("item_collapsed",this,"_cell_collapsed");
+ inheritance_menu->set_item_icon(2,get_icon("Load","EditorIcons"));
+ clear_inherit_confirm->connect("confirmed",this,"_subscene_option",varray(SCENE_MENU_CLEAR_INHERITANCE_CONFIRM));
+
+ EditorSettings::get_singleton()->connect("settings_changed",this,"_editor_settings_changed");
+
+
+ //get_scene()->connect("tree_changed",this,"_tree_changed",Vector<Variant>(),CONNECT_DEFERRED);
+ //get_scene()->connect("node_removed",this,"_node_removed",Vector<Variant>(),CONNECT_DEFERRED);
+ _update_tree();
+ }
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+
+ get_tree()->disconnect("tree_changed",this,"_tree_changed");
+ get_tree()->disconnect("node_removed",this,"_node_removed");
+ tree->disconnect("item_collapsed",this,"_cell_collapsed");
+ clear_inherit_confirm->disconnect("confirmed",this,"_subscene_option");
+ get_tree()->disconnect("node_configuration_warning_changed",this,"_warning_changed");
+ EditorSettings::get_singleton()->disconnect("settings_changed",this,"_editor_settings_changed");
+ }
+
+}
+
+
+TreeItem* SceneTreeEditor::_find(TreeItem *p_node,const NodePath& p_path) {
+
+ if (!p_node)
+ return NULL;
+
+ NodePath np=p_node->get_metadata(0);
+ if (np==p_path)
+ return p_node;
+
+ TreeItem *children=p_node->get_children();
+ while(children) {
+
+ TreeItem *n=_find(children,p_path);
+ if (n)
+ return n;
+ children=children->get_next();
+ }
+
+ return NULL;
+}
+
+void SceneTreeEditor::set_selected(Node *p_node,bool p_emit_selected) {
+
+ ERR_FAIL_COND(blocked>0);
+
+ if (pending_test_update)
+ _test_update_tree();
+ if (tree_dirty)
+ _update_tree();
+
+ if (selected==p_node)
+ return;
+
+
+ TreeItem* item=p_node?_find(tree->get_root(),p_node->get_path()):NULL;
+
+ if (item) {
+ // make visible when it's collapsed
+ TreeItem* node=item->get_parent();
+ while (node && node!=tree->get_root()) {
+ node->set_collapsed(false);
+ node=node->get_parent();
+ }
+ item->select(0);
+ item->set_as_cursor(0);
+ selected=p_node;
+ tree->ensure_cursor_is_visible();
+ } else {
+ if (!p_node)
+ selected=NULL;
+ _update_tree();
+ selected=p_node;
+ if (p_emit_selected)
+ emit_signal("node_selected");
+ }
+
+}
+
+void SceneTreeEditor::_rename_node(ObjectID p_node,const String& p_name) {
+
+ Object *o = ObjectDB::get_instance(p_node);
+ ERR_FAIL_COND(!o);
+ Node *n = o->cast_to<Node>();
+ ERR_FAIL_COND(!n);
+ TreeItem* item=_find(tree->get_root(),n->get_path());
+ ERR_FAIL_COND(!item);
+
+ n->set_name( p_name );
+ item->set_metadata(0,n->get_path());
+ item->set_text(0,p_name);
+ emit_signal("node_renamed");
+
+ if (!tree_dirty) {
+ MessageQueue::get_singleton()->push_call(this,"_update_tree");
+ tree_dirty=true;
+ }
+
+
+}
+
+
+void SceneTreeEditor::_renamed() {
+
+ TreeItem *which=tree->get_edited();
+
+ ERR_FAIL_COND(!which);
+ NodePath np = which->get_metadata(0);
+ Node *n=get_node(np);
+ ERR_FAIL_COND(!n);
+
+ String new_name=which->get_text(0);
+ if (new_name.find(".") != -1 || new_name.find("/") != -1) {
+
+ error->set_text(TTR("Invalid node name, the following characters are not allowed:")+"\n \".\", \"/\"");
+ error->popup_centered_minsize();
+ new_name=n->get_name();
+ }
+
+ if (new_name==n->get_name())
+ return;
+
+ if (!undo_redo) {
+ n->set_name( new_name );
+ which->set_metadata(0,n->get_path());
+ emit_signal("node_renamed");
+ } else {
+ undo_redo->create_action(TTR("Rename Node"));
+ emit_signal("node_prerename",n,new_name);
+ undo_redo->add_do_method(this,"_rename_node",n->get_instance_ID(),new_name);
+ undo_redo->add_undo_method(this,"_rename_node",n->get_instance_ID(),n->get_name());
+ undo_redo->commit_action();
+ }
+}
+
+
+Node *SceneTreeEditor::get_selected() {
+
+ return selected;
+}
+
+void SceneTreeEditor::set_marked(const Set<Node*>& p_marked,bool p_selectable,bool p_children_selectable) {
+
+ if (tree_dirty)
+ _update_tree();
+ marked=p_marked;
+ marked_selectable=p_selectable;
+ marked_children_selectable=p_children_selectable;
+ _update_tree();
+}
+
+void SceneTreeEditor::set_marked(Node *p_marked,bool p_selectable,bool p_children_selectable) {
+
+ Set<Node*> s;
+ if (p_marked)
+ s.insert(p_marked);
+ set_marked(s,p_selectable,p_children_selectable);
+
+
+}
+
+void SceneTreeEditor::set_filter(const String& p_filter) {
+
+ filter=p_filter;
+ _update_tree();
+}
+
+String SceneTreeEditor::get_filter() const {
+
+ return filter;
+}
+
+
+void SceneTreeEditor::set_display_foreign_nodes(bool p_display) {
+
+ display_foreign=p_display;
+ _update_tree();
+}
+bool SceneTreeEditor::get_display_foreign_nodes() const {
+
+ return display_foreign;
+}
+
+void SceneTreeEditor::set_editor_selection(EditorSelection *p_selection) {
+
+ editor_selection=p_selection;
+ tree->set_select_mode(Tree::SELECT_MULTI);
+ tree->set_cursor_can_exit_tree(false);
+ editor_selection->connect("selection_changed",this,"_selection_changed");
+}
+
+void SceneTreeEditor::_update_selection(TreeItem *item) {
+
+ ERR_FAIL_COND(!item);
+
+ NodePath np = item->get_metadata(0);
+
+ if (!has_node(np))
+ return;
+
+ Node *n=get_node(np);
+
+ if (!n)
+ return;
+
+ if (editor_selection->is_selected(n))
+ item->select(0);
+ else
+ item->deselect(0);
+
+ TreeItem *c=item->get_children();
+
+
+ while(c) {
+
+ _update_selection(c);
+ c=c->get_next();
+ }
+}
+
+void SceneTreeEditor::_selection_changed() {
+
+ if (!editor_selection)
+ return;
+
+ TreeItem *root=tree->get_root();
+
+ if (!root)
+ return;
+ _update_selection(root);
+}
+
+void SceneTreeEditor::_cell_collapsed(Object *p_obj) {
+
+ if (updating_tree)
+ return;
+ if (!can_rename)
+ return;
+
+ TreeItem *ti=p_obj->cast_to<TreeItem>();
+ if (!ti)
+ return;
+
+ bool collapsed=ti->is_collapsed();
+
+ NodePath np = ti->get_metadata(0);
+
+ Node *n=get_node(np);
+ ERR_FAIL_COND(!n);
+
+ n->set_display_folded(collapsed);
+
+}
+
+Variant SceneTreeEditor::get_drag_data_fw(const Point2& p_point,Control* p_from) {
+ if (!can_rename)
+ return Variant(); //not editable tree
+
+ Vector<Node*> selected;
+ Vector<Ref<Texture> > icons;
+ TreeItem *next=tree->get_next_selected(NULL);
+ while (next) {
+
+ NodePath np = next->get_metadata(0);
+
+ Node *n=get_node(np);
+ if (n) {
+
+ selected.push_back(n);
+ icons.push_back(next->get_icon(0));
+ }
+ next=tree->get_next_selected(next);
+ }
+
+ if (selected.empty())
+ return Variant();
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ Array objs;
+ int list_max = 10;
+ float opacity_step = 1.0f / list_max;
+ float opacity_item = 1.0f;
+ for(int i=0;i<selected.size();i++) {
+
+ if (i<list_max){
+ HBoxContainer *hb = memnew( HBoxContainer );
+ TextureRect *tf = memnew(TextureRect);
+ tf->set_texture(icons[i]);
+ hb->add_child(tf);
+ Label *label = memnew( Label( selected[i]->get_name() ) );
+ hb->add_child(label);
+ vb->add_child(hb);
+ hb->set_modulate(Color(1,1,1,opacity_item));
+ opacity_item -= opacity_step;
+ }
+ NodePath p = selected[i]->get_path();
+ objs.push_back(p);
+ }
+
+ set_drag_preview(vb);
+ Dictionary drag_data;
+ drag_data["type"]="nodes";
+ drag_data["nodes"]=objs;
+
+ tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN|Tree::DROP_MODE_ON_ITEM);
+ emit_signal("nodes_dragged");
+
+ return drag_data;
+}
+
+bool SceneTreeEditor::_is_script_type(const StringName &p_type) const {
+ return (script_types->find(p_type));
+}
+
+bool SceneTreeEditor::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const {
+
+ if (!can_rename)
+ return false; //not editable tree
+ if (filter!=String())
+ return false; //can't rearrange tree with filter turned on
+
+
+ Dictionary d=p_data;
+ if (!d.has("type"))
+ return false;
+
+ TreeItem *item = tree->get_item_at_pos(p_point);
+ if (!item)
+ return false;
+
+ int section = tree->get_drop_section_at_pos(p_point);
+ if (section<-1 || (section==-1 && !item->get_parent()))
+ return false;
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+ if (files.size()==0)
+ return false; //weird
+
+ if (_is_script_type(EditorFileSystem::get_singleton()->get_file_type(files[0]))) {
+ tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
+ return true;
+ }
+
+ for(int i=0;i<files.size();i++) {
+ String file = files[i];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+ if (ftype!="PackedScene")
+ return false;
+ }
+
+ tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN|Tree::DROP_MODE_ON_ITEM); //so it works..
+
+ return true;
+ }
+
+
+ if (String(d["type"])=="nodes") {
+ return true;
+ }
+
+ return false;
+}
+void SceneTreeEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) {
+
+ if (!can_drop_data_fw(p_point,p_data,p_from))
+ return;
+
+ TreeItem *item = tree->get_item_at_pos(p_point);
+ if (!item)
+ return;
+ int section = tree->get_drop_section_at_pos(p_point);
+ if (section<-1)
+ return;
+
+ NodePath np = item->get_metadata(0);
+ Node *n=get_node(np);
+ if (!n)
+ return;
+
+ Dictionary d=p_data;
+
+ if (String(d["type"])=="nodes") {
+ Array nodes=d["nodes"];
+ emit_signal("nodes_rearranged",nodes,np,section);
+ }
+
+ if (String(d["type"])=="files") {
+
+ Vector<String> files = d["files"];
+
+
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(files[0]);
+ if (_is_script_type(ftype)) {
+ emit_signal("script_dropped", files[0],np);
+ } else {
+ emit_signal("files_dropped",files,np,section);
+ }
+ }
+
+}
+
+void SceneTreeEditor::_rmb_select(const Vector2& p_pos) {
+
+ emit_signal("rmb_pressed",tree->get_global_transform().xform(p_pos));
+}
+
+
+void SceneTreeEditor::_warning_changed(Node* p_for_node) {
+
+ //should use a timer
+ update_timer->start();
+ //print_line("WARNING CHANGED "+String(p_for_node->get_name()));
+
+}
+
+
+void SceneTreeEditor::_editor_settings_changed() {
+ bool enable_rl = EditorSettings::get_singleton()->get("docks/scene_tree/draw_relationship_lines");
+ Color rl_color = EditorSettings::get_singleton()->get("docks/scene_tree/relationship_line_color");
+
+ if (enable_rl) {
+ tree->add_constant_override("draw_relationship_lines",1);
+ tree->add_color_override("relationship_line_color", rl_color);
+ }
+ else
+ tree->add_constant_override("draw_relationship_lines",0);
+
+}
+
+
+void SceneTreeEditor::_bind_methods() {
+
+ ClassDB::bind_method("_tree_changed",&SceneTreeEditor::_tree_changed);
+ ClassDB::bind_method("_update_tree",&SceneTreeEditor::_update_tree);
+ ClassDB::bind_method("_node_removed",&SceneTreeEditor::_node_removed);
+ ClassDB::bind_method("_selected_changed",&SceneTreeEditor::_selected_changed);
+ ClassDB::bind_method("_renamed",&SceneTreeEditor::_renamed);
+ ClassDB::bind_method("_rename_node",&SceneTreeEditor::_rename_node);
+ ClassDB::bind_method("_test_update_tree",&SceneTreeEditor::_test_update_tree);
+ ClassDB::bind_method("_cell_multi_selected",&SceneTreeEditor::_cell_multi_selected);
+ ClassDB::bind_method("_selection_changed",&SceneTreeEditor::_selection_changed);
+ ClassDB::bind_method("_cell_button_pressed",&SceneTreeEditor::_cell_button_pressed);
+ ClassDB::bind_method("_cell_collapsed",&SceneTreeEditor::_cell_collapsed);
+ ClassDB::bind_method("_subscene_option",&SceneTreeEditor::_subscene_option);
+ ClassDB::bind_method("_rmb_select",&SceneTreeEditor::_rmb_select);
+ ClassDB::bind_method("_warning_changed",&SceneTreeEditor::_warning_changed);
+
+ ClassDB::bind_method("_node_script_changed",&SceneTreeEditor::_node_script_changed);
+ ClassDB::bind_method("_node_visibility_changed",&SceneTreeEditor::_node_visibility_changed);
+
+ ClassDB::bind_method("_editor_settings_changed", &SceneTreeEditor::_editor_settings_changed);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &SceneTreeEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SceneTreeEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &SceneTreeEditor::drop_data_fw);
+
+ ClassDB::bind_method(D_METHOD("update_tree"), &SceneTreeEditor::update_tree);
+
+ ADD_SIGNAL( MethodInfo("node_selected") );
+ ADD_SIGNAL( MethodInfo("node_renamed") );
+ ADD_SIGNAL( MethodInfo("node_prerename") );
+ ADD_SIGNAL( MethodInfo("node_changed") );
+ ADD_SIGNAL( MethodInfo("nodes_dragged") );
+ ADD_SIGNAL( MethodInfo("nodes_rearranged",PropertyInfo(Variant::ARRAY,"paths"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
+ ADD_SIGNAL( MethodInfo("files_dropped",PropertyInfo(Variant::POOL_STRING_ARRAY,"files"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
+ ADD_SIGNAL( MethodInfo("script_dropped",PropertyInfo(Variant::STRING,"file"),PropertyInfo(Variant::NODE_PATH,"to_path")));
+ ADD_SIGNAL( MethodInfo("rmb_pressed",PropertyInfo(Variant::VECTOR2,"pos")) ) ;
+
+ ADD_SIGNAL( MethodInfo("open") );
+ ADD_SIGNAL( MethodInfo("open_script") );
+
+
+}
+
+
+SceneTreeEditor::SceneTreeEditor(bool p_label,bool p_can_rename, bool p_can_open_instance) {
+
+
+ undo_redo=NULL;
+ tree_dirty=true;
+ selected=NULL;
+
+ marked_selectable=false;
+ marked_children_selectable=false;
+ can_rename=p_can_rename;
+ can_open_instance=p_can_open_instance;
+ display_foreign=false;
+ editor_selection=NULL;
+
+ if (p_label) {
+ Label *label = memnew( Label );
+ label->set_pos( Point2(10, 0));
+ label->set_text(TTR("Scene Tree (Nodes):"));
+
+ add_child(label);
+ }
+
+ tree = memnew( Tree );
+ tree->set_anchor( MARGIN_RIGHT, ANCHOR_END );
+ tree->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
+ tree->set_begin( Point2(0,p_label?18:0 ));
+ tree->set_end( Point2(0,0 ));
+
+ add_child( tree );
+
+ tree->set_drag_forwarding(this);
+ if (p_can_rename) {
+ tree->set_allow_rmb_select(true);
+ tree->connect("item_rmb_selected",this,"_rmb_select");
+ tree->connect("empty_tree_rmb_selected",this,"_rmb_select");
+ }
+
+ tree->connect("cell_selected", this,"_selected_changed");
+ tree->connect("item_edited", this,"_renamed",varray(),CONNECT_DEFERRED);
+ tree->connect("multi_selected",this,"_cell_multi_selected");
+ tree->connect("button_pressed",this,"_cell_button_pressed");
+ //tree->connect("item_edited", this,"_renamed",Vector<Variant>(),true);
+
+ error = memnew( AcceptDialog );
+ add_child(error);
+
+ warning = memnew( AcceptDialog );
+ add_child(warning);
+ warning->set_title("Node Configuration Warning!");
+
+
+ show_enabled_subscene=false;
+
+ last_hash=0;
+ pending_test_update=false;
+ updating_tree=false;
+ blocked=0;
+
+ instance_menu = memnew( PopupMenu );
+ instance_menu->add_check_item(TTR("Editable Children"),SCENE_MENU_EDITABLE_CHILDREN);
+ instance_menu->add_check_item(TTR("Load As Placeholder"),SCENE_MENU_USE_PLACEHOLDER);
+ instance_menu->add_separator();
+ instance_menu->add_item(TTR("Discard Instancing"),SCENE_MENU_CLEAR_INSTANCING);
+ instance_menu->add_separator();
+ instance_menu->add_item(TTR("Open in Editor"),SCENE_MENU_OPEN);
+ instance_menu->connect("id_pressed",this,"_subscene_option");
+ add_child(instance_menu);
+
+ inheritance_menu = memnew( PopupMenu );
+ inheritance_menu->add_item(TTR("Clear Inheritance"),SCENE_MENU_CLEAR_INHERITANCE);
+ inheritance_menu->add_separator();
+ inheritance_menu->add_item(TTR("Open in Editor"),SCENE_MENU_OPEN_INHERITED);
+ inheritance_menu->connect("id_pressed",this,"_subscene_option");
+
+ add_child(inheritance_menu);
+
+ clear_inherit_confirm = memnew( ConfirmationDialog );
+ clear_inherit_confirm->set_text(TTR("Clear Inheritance? (No Undo!)"));
+ clear_inherit_confirm->get_ok()->set_text(TTR("Clear!"));
+ add_child(clear_inherit_confirm);
+
+ update_timer = memnew(Timer);
+ update_timer->connect("timeout",this,"_update_tree");
+ update_timer->set_one_shot(true);
+ update_timer->set_wait_time(0.5);
+ add_child(update_timer);
+
+ script_types = memnew(List<StringName>);
+ ClassDB::get_inheriters_from_class("Script", script_types);
+
+}
+
+
+
+SceneTreeEditor::~SceneTreeEditor() {
+
+ memdelete(script_types);
+}
+
+
+/******** DIALOG *********/
+
+void SceneTreeDialog::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ connect("confirmed", this,"_select");
+
+ }
+
+ if (p_what==NOTIFICATION_EXIT_TREE) {
+ disconnect("confirmed", this,"_select");
+
+ }
+ if (p_what==NOTIFICATION_DRAW) {
+
+ RID ci = get_canvas_item();
+ get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED && is_visible_in_tree()) {
+
+ tree->update_tree();
+ }
+
+
+}
+
+void SceneTreeDialog::_cancel() {
+
+ hide();
+
+
+
+}
+void SceneTreeDialog::_select() {
+
+ if (tree->get_selected()) {
+ emit_signal("selected",tree->get_selected()->get_path());
+ hide();
+ }
+}
+
+void SceneTreeDialog::_bind_methods() {
+
+ ClassDB::bind_method("_select",&SceneTreeDialog::_select);
+ ClassDB::bind_method("_cancel",&SceneTreeDialog::_cancel);
+ ADD_SIGNAL( MethodInfo("selected",PropertyInfo(Variant::NODE_PATH,"path")));
+
+}
+
+
+SceneTreeDialog::SceneTreeDialog() {
+
+ set_title(TTR("Select a Node"));
+
+ tree = memnew( SceneTreeEditor(false,false) );
+ add_child(tree);
+ //set_child_rect(tree);
+
+ tree->get_scene_tree()->connect("item_activated",this,"_select");
+
+}
+
+
+SceneTreeDialog::~SceneTreeDialog()
+{
+}
diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h
new file mode 100644
index 0000000000..5586f02c00
--- /dev/null
+++ b/editor/scene_tree_editor.h
@@ -0,0 +1,199 @@
+/*************************************************************************/
+/* scene_tree_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCENE_TREE_EDITOR_H
+#define SCENE_TREE_EDITOR_H
+
+#include "scene/gui/tree.h"
+#include "scene/gui/button.h"
+#include "scene/gui/dialogs.h"
+#include "undo_redo.h"
+#include "editor_data.h"
+#include "editor_settings.h"
+/**
+ @author Juan Linietsky <reduzio@gmail.com>
+*/
+class SceneTreeEditor : public Control {
+
+ GDCLASS( SceneTreeEditor, Control );
+
+ EditorSelection *editor_selection;
+
+ enum {
+ BUTTON_SUBSCENE=0,
+ BUTTON_VISIBILITY=1,
+ BUTTON_SCRIPT=2,
+ BUTTON_LOCK=3,
+ BUTTON_GROUP=4,
+ BUTTON_WARNING=5,
+ BUTTON_SIGNALS=6,
+ BUTTON_GROUPS=7,
+ };
+
+ enum {
+ SCENE_MENU_EDITABLE_CHILDREN,
+ SCENE_MENU_USE_PLACEHOLDER,
+ SCENE_MENU_OPEN,
+ SCENE_MENU_CLEAR_INHERITANCE,
+ SCENE_MENU_OPEN_INHERITED,
+ SCENE_MENU_CLEAR_INHERITANCE_CONFIRM,
+ SCENE_MENU_CLEAR_INSTANCING,
+ };
+
+ Tree *tree;
+ Node *selected;
+ PopupMenu *instance_menu;
+ PopupMenu *inheritance_menu;
+ ObjectID instance_node;
+
+ String filter;
+
+ AcceptDialog *error;
+ AcceptDialog *warning;
+ ConfirmationDialog *clear_inherit_confirm;
+
+ int blocked;
+
+ void _compute_hash(Node *p_node,uint64_t &hash);
+
+ bool _add_nodes(Node *p_node,TreeItem *p_parent);
+ void _test_update_tree();
+ void _update_tree();
+ void _tree_changed();
+ void _node_removed(Node *p_node);
+
+ TreeItem* _find(TreeItem *p_node,const NodePath& p_path);
+ void _notification(int p_what);
+ void _selected_changed();
+ void _rename_node(ObjectID p_node,const String& p_name);
+
+ void _cell_collapsed(Object *p_obj);
+
+ uint64_t last_hash;
+
+ bool can_rename;
+ bool can_open_instance;
+ bool updating_tree;
+ bool show_enabled_subscene;
+
+ void _renamed();
+ UndoRedo *undo_redo;
+
+ Set<Node*> marked;
+ bool marked_selectable;
+ bool marked_children_selectable;
+ bool display_foreign;
+ bool tree_dirty;
+ bool pending_test_update;
+ static void _bind_methods();
+
+ void _cell_button_pressed(Object *p_item,int p_column,int p_id);
+ void _cell_multi_selected(Object *p_object,int p_cel,bool p_selected);
+ void _update_selection(TreeItem *item);
+ void _node_script_changed(Node *p_node);
+ void _node_visibility_changed(Node *p_node);
+ void _update_visibility_color(Node *p_node, TreeItem *p_item);
+ void _subscene_option(int p_idx);
+
+ void _node_replace_owner(Node* p_base,Node* p_node,Node* p_root);
+
+
+ void _selection_changed();
+ Node *get_scene_node();
+
+ Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+ bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+ void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+
+ void _rmb_select(const Vector2& p_pos);
+
+ void _warning_changed(Node* p_for_node);
+
+ void _editor_settings_changed();
+
+ Timer* update_timer;
+
+ List<StringName> *script_types;
+ bool _is_script_type(const StringName &p_type) const;
+
+public:
+
+ void set_filter(const String& p_filter);
+ String get_filter() const;
+
+ void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo=p_undo_redo; };
+ void set_display_foreign_nodes(bool p_display);
+ bool get_display_foreign_nodes() const;
+
+ void set_marked(const Set<Node*>& p_marked,bool p_selectable=false,bool p_children_selectable=true);
+ void set_marked(Node *p_marked,bool p_selectable=false,bool p_children_selectable=true);
+ void set_selected(Node *p_node,bool p_emit_selected=true);
+ Node *get_selected();
+ void set_can_rename(bool p_can_rename) { can_rename=p_can_rename; }
+ void set_editor_selection(EditorSelection *p_selection);
+
+ void set_show_enabled_subscene(bool p_show) { show_enabled_subscene=p_show; }
+
+ void update_tree() { _update_tree(); }
+
+
+ Tree* get_scene_tree() { return tree; }
+
+ SceneTreeEditor(bool p_label=true,bool p_can_rename=false, bool p_can_open_instance=false);
+ ~SceneTreeEditor();
+
+};
+
+
+class SceneTreeDialog : public ConfirmationDialog {
+
+ GDCLASS( SceneTreeDialog, ConfirmationDialog );
+
+ SceneTreeEditor *tree;
+ //Button *select;
+ //Button *cancel;
+
+ void update_tree();
+ void _select();
+ void _cancel();
+
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ SceneTreeEditor *get_scene_tree() { return tree; }
+ SceneTreeDialog();
+ ~SceneTreeDialog();
+
+};
+
+
+#endif
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
new file mode 100644
index 0000000000..dfaa1f645c
--- /dev/null
+++ b/editor/script_create_dialog.cpp
@@ -0,0 +1,437 @@
+/*************************************************************************/
+/* script_create_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "script_create_dialog.h"
+
+#include "script_language.h"
+#include "global_config.h"
+#include "io/resource_saver.h"
+#include "os/file_access.h"
+#include "editor_file_system.h"
+
+void ScriptCreateDialog::config(const String& p_base_name,const String&p_base_path) {
+
+ class_name->set_text("");
+ parent_name->set_text(p_base_name);
+ if (p_base_path!="") {
+ initial_bp=p_base_path.get_basename();
+ file_path->set_text(initial_bp+"."+ScriptServer::get_language( language_menu->get_selected() )->get_extension());
+ } else {
+ initial_bp="";
+ file_path->set_text("");
+ }
+ _class_name_changed("");
+ _path_changed(file_path->get_text());
+}
+
+bool ScriptCreateDialog::_validate(const String& p_string) {
+
+ if (p_string.length()==0)
+ return false;
+
+
+ for(int i=0;i<p_string.length();i++) {
+
+ if (i==0) {
+ if (p_string[0]>='0' && p_string[0]<='9')
+ return false; // no start with number plz
+ }
+
+ bool valid_char = (p_string[i]>='0' && p_string[i]<='9') || (p_string[i]>='a' && p_string[i]<='z') || (p_string[i]>='A' && p_string[i]<='Z') || p_string[i]=='_';
+
+ if (!valid_char)
+ return false;
+
+ }
+
+ return true;
+}
+
+void ScriptCreateDialog::_class_name_changed(const String& p_name) {
+
+ if (!_validate(parent_name->get_text())) {
+ error_label->set_text(TTR("Invalid parent class name"));
+ error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ } else if (class_name->is_editable()) {
+ if (class_name->get_text()=="") {
+ error_label->set_text(TTR("Valid chars:")+" a-z A-Z 0-9 _");
+ error_label->add_color_override("font_color",Color(1,1,1,0.6));
+ } else if (!_validate(class_name->get_text())) {
+ error_label->set_text(TTR("Invalid class name"));
+ error_label->add_color_override("font_color",Color(1,0.2,0.2,0.8));
+ } else {
+ error_label->set_text(TTR("Valid name"));
+ error_label->add_color_override("font_color",Color(0,1.0,0.8,0.8));
+ }
+ } else {
+
+ error_label->set_text(TTR("N/A"));
+ error_label->add_color_override("font_color",Color(0,1.0,0.8,0.8));
+ }
+}
+
+void ScriptCreateDialog::ok_pressed() {
+
+ if (create_new){
+ _create_new();
+ } else {
+ _load_exist();
+ }
+
+ create_new=true;
+ _update_controls();
+
+}
+
+void ScriptCreateDialog::_create_new() {
+
+ if (class_name->is_editable() && !_validate(class_name->get_text())) {
+ alert->set_text(TTR("Class name is invalid!"));
+ alert->popup_centered_minsize();
+ return;
+ }
+ if (!_validate(parent_name->get_text())) {
+ alert->set_text(TTR("Parent class name is invalid!"));
+ alert->popup_centered_minsize();
+ return;
+ }
+
+ String cname;
+ if (class_name->is_editable())
+ cname=class_name->get_text();
+
+ Ref<Script> scr = ScriptServer::get_language( language_menu->get_selected() )->get_template(cname,parent_name->get_text());
+
+ String selected_language = language_menu->get_item_text(language_menu->get_selected());
+ editor_settings->set_project_metadata("script_setup", "last_selected_language", selected_language);
+
+ if (cname!="")
+ scr->set_name(cname);
+
+ if (!internal->is_pressed()) {
+ String lpath = GlobalConfig::get_singleton()->localize_path(file_path->get_text());
+ scr->set_path(lpath);
+ if (!path_valid) {
+ alert->set_text(TTR("Invalid path!"));
+ alert->popup_centered_minsize();
+ return;
+ }
+ Error err = ResourceSaver::save(lpath,scr,ResourceSaver::FLAG_CHANGE_PATH);
+ if (err!=OK) {
+ alert->set_text(TTR("Could not create script in filesystem."));
+ alert->popup_centered_minsize();
+ return;
+ }
+ }
+
+ hide();
+ emit_signal("script_created",scr);
+
+}
+
+void ScriptCreateDialog::_load_exist() {
+
+ String path=file_path->get_text();
+ RES p_script = ResourceLoader::load(path, "Script");
+ if (p_script.is_null()) {
+ alert->get_ok()->set_text(TTR("Ugh"));
+ alert->set_text(vformat(TTR("Error loading script from %s"), path));
+ alert->popup_centered_minsize();
+ return;
+ }
+
+ hide();
+ emit_signal("script_created",p_script.get_ref_ptr());
+
+}
+
+void ScriptCreateDialog::_lang_changed(int l) {
+
+ l=language_menu->get_selected();
+ if (ScriptServer::get_language( l )->has_named_classes()) {
+ class_name->set_editable(true);
+ } else {
+ class_name->set_editable(false);
+ }
+
+ String selected_ext="."+ScriptServer::get_language( l )->get_extension();
+ String path=file_path->get_text();
+ String extension="";
+ if (path.find(".")>=0) {
+ extension=path.get_extension();
+ }
+
+ if (extension.length()==0) {
+ // add extension if none
+ path+=selected_ext;
+ _path_changed(path);
+ } else {
+ // change extension by selected language
+ List<String> extensions;
+ // get all possible extensions for script
+ for (int l=0;l<language_menu->get_item_count();l++) {
+ ScriptServer::get_language( l )->get_recognized_extensions(&extensions);
+ }
+
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+ if (E->get().nocasecmp_to(extension)==0) {
+ path=path.get_basename()+selected_ext;
+ _path_changed(path);
+ break;
+ }
+ }
+ }
+ file_path->set_text(path);
+ _class_name_changed(class_name->get_text());
+
+}
+
+void ScriptCreateDialog::_built_in_pressed() {
+
+ if (internal->is_pressed()) {
+ path_vb->hide();
+ } else {
+ path_vb->show();
+ }
+
+}
+
+void ScriptCreateDialog::_browse_path() {
+
+ file_browse->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_browse->set_disable_overwrite_warning(true);
+ file_browse->clear_filters();
+ List<String> extensions;
+
+ // get all possible extensions for script
+ for (int l=0;l<language_menu->get_item_count();l++) {
+ ScriptServer::get_language( l )->get_recognized_extensions(&extensions);
+ }
+
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+ file_browse->add_filter("*."+E->get());
+ }
+
+ file_browse->set_current_path(file_path->get_text());
+ file_browse->popup_centered_ratio();
+
+}
+
+void ScriptCreateDialog::_file_selected(const String& p_file) {
+
+ String p = GlobalConfig::get_singleton()->localize_path(p_file);
+ file_path->set_text(p);
+ _path_changed(p);
+
+}
+
+void ScriptCreateDialog::_path_changed(const String& p_path) {
+
+ path_valid=false;
+ String p =p_path;
+
+ if (p=="") {
+
+ path_error_label->set_text(TTR("Path is empty"));
+ path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ return;
+
+ }
+
+ p = GlobalConfig::get_singleton()->localize_path(p);
+ if (!p.begins_with("res://")) {
+
+ path_error_label->set_text(TTR("Path is not local"));
+ path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ return;
+ }
+
+ if (p.find("/") || p.find("\\")) {
+ DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+
+ if (d->change_dir(p.get_base_dir())!=OK) {
+
+ path_error_label->set_text(TTR("Invalid base path"));
+ path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ memdelete(d);
+ return;
+
+ }
+ memdelete(d);
+ }
+
+ FileAccess *f = FileAccess::create(FileAccess::ACCESS_RESOURCES);
+ create_new=!f->file_exists(p);
+ memdelete(f);
+
+ String extension=p.get_extension();
+ List<String> extensions;
+
+ // get all possible extensions for script
+ for (int l=0;l<language_menu->get_item_count();l++) {
+ ScriptServer::get_language( l )->get_recognized_extensions(&extensions);
+ }
+
+ bool found=false;
+ int index=0;
+ for(List<String>::Element *E=extensions.front();E;E=E->next()) {
+ if (E->get().nocasecmp_to(extension)==0) {
+ language_menu->select(index); // change Language option by extension
+ found=true;
+ break;
+ }
+ index++;
+ }
+
+ if (!found) {
+ path_error_label->set_text(TTR("Invalid extension"));
+ path_error_label->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ return;
+ }
+
+ _update_controls();
+
+ path_error_label->add_color_override("font_color",Color(0,1.0,0.8,0.8));
+
+ path_valid=true;
+
+}
+
+void ScriptCreateDialog::_update_controls() {
+
+ if (create_new) {
+ path_error_label->set_text(TTR("Create new script"));
+ get_ok()->set_text(TTR("Create"));
+ } else {
+ path_error_label->set_text(TTR("Load existing script"));
+ get_ok()->set_text(TTR("Load"));
+ }
+ parent_name->set_editable(create_new);
+ internal->set_disabled(!create_new);
+
+}
+
+
+void ScriptCreateDialog::_bind_methods() {
+
+ ClassDB::bind_method("_class_name_changed",&ScriptCreateDialog::_class_name_changed);
+ ClassDB::bind_method("_lang_changed",&ScriptCreateDialog::_lang_changed);
+ ClassDB::bind_method("_built_in_pressed",&ScriptCreateDialog::_built_in_pressed);
+ ClassDB::bind_method("_browse_path",&ScriptCreateDialog::_browse_path);
+ ClassDB::bind_method("_file_selected",&ScriptCreateDialog::_file_selected);
+ ClassDB::bind_method("_path_changed",&ScriptCreateDialog::_path_changed);
+ ADD_SIGNAL(MethodInfo("script_created",PropertyInfo(Variant::OBJECT,"script",PROPERTY_HINT_RESOURCE_TYPE,"Script")));
+}
+
+ScriptCreateDialog::ScriptCreateDialog() {
+
+ /* SNAP DIALOG */
+
+ VBoxContainer *vb = memnew( VBoxContainer );
+ add_child(vb);
+ //set_child_rect(vb);
+
+
+ class_name = memnew( LineEdit );
+ VBoxContainer *vb2 = memnew( VBoxContainer );
+ vb2->add_child(class_name);
+ class_name->connect("text_changed", this,"_class_name_changed");
+ error_label = memnew(Label);
+ error_label->set_text("valid chars: a-z A-Z 0-9 _");
+ error_label->set_align(Label::ALIGN_CENTER);
+ vb2->add_child(error_label);
+ vb->add_margin_child(TTR("Class Name:"),vb2);
+
+ parent_name = memnew( LineEdit );
+ vb->add_margin_child(TTR("Inherits:"),parent_name);
+ parent_name->connect("text_changed", this,"_class_name_changed");
+
+ language_menu = memnew( OptionButton );
+ vb->add_margin_child(TTR("Language"),language_menu);
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+
+ language_menu->add_item(ScriptServer::get_language(i)->get_name());
+ }
+
+ editor_settings = EditorSettings::get_singleton();
+ String last_selected_language = editor_settings->get_project_metadata("script_setup", "last_selected_language", "");
+ if (last_selected_language != "")
+ for (int i = 0; i < language_menu->get_item_count(); i++)
+ if (language_menu->get_item_text(i) == last_selected_language)
+ {
+ language_menu->select(i);
+ break;
+ }
+ else language_menu->select(0);
+
+ language_menu->connect("item_selected",this,"_lang_changed");
+
+ //parent_name->set_text();
+
+ vb2 = memnew( VBoxContainer );
+ path_vb = memnew( VBoxContainer );
+ vb2->add_child(path_vb);
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ file_path = memnew( LineEdit );
+ file_path->connect("text_changed",this,"_path_changed");
+ hbc->add_child(file_path);
+ file_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ Button *b = memnew( Button );
+ b->set_text(" .. ");
+ b->connect("pressed",this,"_browse_path");
+ hbc->add_child(b);
+ path_vb->add_child(hbc);
+ path_error_label = memnew( Label );
+ path_vb->add_child( path_error_label );
+ path_error_label->set_text(TTR("Error!"));
+ path_error_label->set_align(Label::ALIGN_CENTER);
+
+
+ internal = memnew( CheckButton );
+ internal->set_text(TTR("Built-In Script"));
+ vb2->add_child(internal);
+ internal->connect("pressed",this,"_built_in_pressed");
+
+ vb->add_margin_child(TTR("Path:"),vb2);
+
+ set_size(Size2(200,150));
+ set_hide_on_ok(false);
+ set_title(TTR("Attach Node Script"));
+
+ file_browse = memnew( EditorFileDialog );
+ file_browse->connect("file_selected",this,"_file_selected");
+ add_child(file_browse);
+ get_ok()->set_text(TTR("Create"));
+ alert = memnew( AcceptDialog );
+ add_child(alert);
+ _lang_changed(0);
+
+ create_new=true;
+}
diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h
new file mode 100644
index 0000000000..ad9616c071
--- /dev/null
+++ b/editor/script_create_dialog.h
@@ -0,0 +1,79 @@
+/*************************************************************************/
+/* script_create_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCRIPT_CREATE_DIALOG_H
+#define SCRIPT_CREATE_DIALOG_H
+
+#include "scene/gui/dialogs.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/option_button.h"
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_settings.h"
+#include "scene/gui/check_button.h"
+
+class ScriptCreateDialog : public ConfirmationDialog {
+ GDCLASS(ScriptCreateDialog,ConfirmationDialog);
+
+ LineEdit *class_name;
+ Label *error_label;
+ Label *path_error_label;
+ LineEdit *parent_name;
+ OptionButton *language_menu;
+ LineEdit *file_path;
+ EditorFileDialog *file_browse;
+ CheckButton *internal;
+ VBoxContainer *path_vb;
+ AcceptDialog *alert;
+ bool path_valid;
+ bool create_new;
+ String initial_bp;
+ EditorSettings *editor_settings;
+
+
+ void _path_changed(const String& p_path=String());
+ void _lang_changed(int l=0);
+ void _built_in_pressed();
+ bool _validate(const String& p_strin);
+ void _class_name_changed(const String& p_name);
+ void _browse_path();
+ void _file_selected(const String& p_file);
+ virtual void ok_pressed();
+ void _create_new();
+ void _load_exist();
+ void _update_controls();
+protected:
+
+ static void _bind_methods();
+public:
+
+ void config(const String& p_base_name,const String&p_base_path);
+
+ ScriptCreateDialog();
+};
+
+#endif // SCRIPT_CREATE_DIALOG_H
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
new file mode 100644
index 0000000000..fa33ffe5c7
--- /dev/null
+++ b/editor/script_editor_debugger.cpp
@@ -0,0 +1,1998 @@
+/*************************************************************************/
+/* script_editor_debugger.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "script_editor_debugger.h"
+
+#include "scene/gui/separator.h"
+#include "scene/gui/label.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/texture_button.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/margin_container.h"
+#include "property_editor.h"
+#include "global_config.h"
+#include "editor_node.h"
+#include "main/performance.h"
+#include "editor_profiler.h"
+#include "editor_settings.h"
+
+class ScriptEditorDebuggerVariables : public Object {
+
+ GDCLASS( ScriptEditorDebuggerVariables, Object );
+
+ List<PropertyInfo> props;
+ Map<StringName,Variant> values;
+protected:
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ return false;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ if (!values.has(p_name))
+ return false;
+ r_ret=values[p_name];
+ return true;
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ for(const List<PropertyInfo>::Element *E=props.front();E;E=E->next() )
+ p_list->push_back(E->get());
+ }
+
+
+public:
+
+
+ void clear() {
+
+ props.clear();
+ values.clear();
+ }
+
+ String get_var_value(const String& p_var) const {
+
+ for(Map<StringName,Variant>::Element *E=values.front();E;E=E->next()) {
+ String v = E->key().operator String().get_slice("/",1);
+ if (v==p_var)
+ return E->get();
+ }
+
+ return "";
+ }
+
+ void add_property(const String &p_name, const Variant& p_value) {
+
+ PropertyInfo pinfo;
+ pinfo.name=p_name;
+ pinfo.type=p_value.get_type();
+ props.push_back(pinfo);
+ values[p_name]=p_value;
+
+ }
+
+ void update() {
+ _change_notify();
+ }
+
+
+ ScriptEditorDebuggerVariables() {
+
+ }
+};
+
+
+class ScriptEditorDebuggerInspectedObject : public Object {
+
+ GDCLASS( ScriptEditorDebuggerInspectedObject, Object);
+
+
+
+
+protected:
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ if (!prop_values.has(p_name))
+ return false;
+
+ emit_signal("value_edited",p_name,p_value);
+ prop_values[p_name]=p_value;
+ return true;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ if (!prop_values.has(p_name))
+ return false;
+
+ r_ret=prop_values[p_name];
+ return true;
+
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ p_list->clear(); //sorry, no want category
+ for (const List<PropertyInfo>::Element *E=prop_list.front();E;E=E->next()) {
+ p_list->push_back(E->get());
+ }
+ }
+
+
+ static void _bind_methods() {
+
+ ADD_SIGNAL(MethodInfo("value_edited"));
+ }
+
+public:
+
+ ObjectID last_edited_id;
+ List<PropertyInfo> prop_list;
+ Map<StringName,Variant> prop_values;
+
+ void update() {
+ _change_notify();
+ }
+
+ void update_single(const char* p_prop) {
+ _change_notify(p_prop);
+ }
+
+ ScriptEditorDebuggerInspectedObject() { last_edited_id=0; }
+
+
+};
+
+void ScriptEditorDebugger::debug_next() {
+
+ ERR_FAIL_COND(!breaked);
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+ Array msg;
+ msg.push_back("next");
+ ppeer->put_var(msg);
+ stack_dump->clear();
+ inspector->edit(NULL);
+
+}
+void ScriptEditorDebugger::debug_step() {
+
+ ERR_FAIL_COND(!breaked);
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ Array msg;
+ msg.push_back("step");
+ ppeer->put_var(msg);
+ stack_dump->clear();
+ inspector->edit(NULL);
+}
+
+void ScriptEditorDebugger::debug_break() {
+
+ ERR_FAIL_COND(breaked);
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ Array msg;
+ msg.push_back("break");
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::debug_continue() {
+
+ ERR_FAIL_COND(!breaked);
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ OS::get_singleton()->enable_for_stealing_focus(EditorNode::get_singleton()->get_child_process_id());
+
+ Array msg;
+ msg.push_back("continue");
+ ppeer->put_var(msg);
+
+
+}
+
+void ScriptEditorDebugger::_scene_tree_folded(Object* obj) {
+
+
+ if (updating_scene_tree) {
+
+ return;
+ }
+ TreeItem *item=obj->cast_to<TreeItem>();
+
+ if (!item)
+ return;
+
+ ObjectID id = item->get_metadata(0);
+ if (item->is_collapsed()) {
+ unfold_cache.erase(id);
+ } else {
+ unfold_cache.insert(id);
+ }
+
+
+}
+
+void ScriptEditorDebugger::_scene_tree_selected() {
+
+
+ if (updating_scene_tree) {
+
+ return;
+ }
+ TreeItem *item = inspect_scene_tree->get_selected();
+ if (!item) {
+
+ return;
+ }
+
+ inspected_object_id = item->get_metadata(0);
+
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::_scene_tree_property_value_edited(const String& p_prop,const Variant& p_value) {
+
+
+ Array msg;
+ msg.push_back("set_object_property");
+ msg.push_back(inspected_object_id);
+ msg.push_back(p_prop);
+ msg.push_back(p_value);
+ ppeer->put_var(msg);
+ inspect_edited_object_timeout=0.7; //avoid annoyance, don't request soon after editing
+}
+
+void ScriptEditorDebugger::_scene_tree_property_select_object(ObjectID p_object) {
+
+ inspected_object_id=p_object;
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::_scene_tree_request() {
+
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ Array msg;
+ msg.push_back("request_scene_tree");
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::_video_mem_request() {
+
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ Array msg;
+ msg.push_back("request_video_mem");
+ ppeer->put_var(msg);
+
+}
+
+Size2 ScriptEditorDebugger::get_minimum_size() const {
+
+ Size2 ms = Control::get_minimum_size();
+ ms.y = MAX(ms.y , 250 );
+ return ms;
+
+}
+void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_data) {
+
+
+
+ if (p_msg=="debug_enter") {
+
+ Array msg;
+ msg.push_back("get_stack_dump");
+ ppeer->put_var(msg);
+ ERR_FAIL_COND(p_data.size()!=2);
+ bool can_continue=p_data[0];
+ String error = p_data[1];
+ step->set_disabled(!can_continue);
+ next->set_disabled(!can_continue);
+ reason->set_text(error);
+ reason->set_tooltip(error);
+ breaked=true;
+ dobreak->set_disabled(true);
+ docontinue->set_disabled(false);
+ emit_signal("breaked",true,can_continue);
+ OS::get_singleton()->move_window_to_foreground();
+ if (error!="") {
+ tabs->set_current_tab(0);
+ }
+
+ profiler->set_enabled(false);
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(true);
+
+
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+
+ } else if (p_msg=="debug_exit") {
+
+ breaked=false;
+ step->set_disabled(true);
+ next->set_disabled(true);
+ reason->set_text("");
+ reason->set_tooltip("");
+ back->set_disabled(true);
+ forward->set_disabled(true);
+ dobreak->set_disabled(false);
+ docontinue->set_disabled(true);
+ emit_signal("breaked",false,false,Variant());
+ //tabs->set_current_tab(0);
+ profiler->set_enabled(true);
+ profiler->disable_seeking();
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+
+
+ } else if (p_msg=="message:click_ctrl") {
+
+ clicked_ctrl->set_text(p_data[0]);
+ clicked_ctrl_type->set_text(p_data[1]);
+
+ } else if (p_msg=="message:scene_tree") {
+
+ inspect_scene_tree->clear();
+ Map<int,TreeItem*> lv;
+
+ updating_scene_tree=true;
+
+ for(int i=0;i<p_data.size();i+=4) {
+
+ TreeItem *p;
+ int level = p_data[i];
+ if (level==0) {
+ p = NULL;
+ } else {
+ ERR_CONTINUE(!lv.has(level-1));
+ p=lv[level-1];
+ }
+
+
+ TreeItem *it = inspect_scene_tree->create_item(p);
+
+ ObjectID id = ObjectID(p_data[i+3]);
+
+ it->set_text(0,p_data[i+1]);
+ if (has_icon(p_data[i+2],"EditorIcons"))
+ it->set_icon(0,get_icon(p_data[i+2],"EditorIcons"));
+ it->set_metadata(0,id);
+ if (id==inspected_object_id) {
+ it->select(0);
+ }
+
+ if (p) {
+ if (!unfold_cache.has(id)) {
+ it->set_collapsed(true);
+ }
+ } else {
+ if (unfold_cache.has(id)) { //reverse for root
+ it->set_collapsed(true);
+ }
+ }
+ lv[level]=it;
+ }
+ updating_scene_tree=false;
+
+ le_clear->set_disabled(false);
+ le_set->set_disabled(false);
+ } else if (p_msg=="message:inspect_object") {
+
+
+ ObjectID id = p_data[0];
+ String type = p_data[1];
+ Variant path = p_data[2]; //what to do yet, i don't know
+ int prop_count=p_data[3];
+
+ int idx=4;
+
+
+ if (inspected_object->last_edited_id!=id) {
+ inspected_object->prop_list.clear();
+ inspected_object->prop_values.clear();
+ }
+
+ for(int i=0;i<prop_count;i++) {
+
+ PropertyInfo pinfo;
+ pinfo.name=p_data[idx++];
+ pinfo.type=Variant::Type(int(p_data[idx++]));
+ pinfo.hint=PropertyHint(int(p_data[idx++]));
+ pinfo.hint_string=p_data[idx++];
+ if (pinfo.name.begins_with("*")) {
+ pinfo.name=pinfo.name.substr(1,pinfo.name.length());
+ pinfo.usage=PROPERTY_USAGE_CATEGORY;
+ } else {
+ pinfo.usage=PROPERTY_USAGE_EDITOR;
+ }
+
+ if (inspected_object->last_edited_id!=id) {
+ //don't update.. it's the same, instead refresh
+ inspected_object->prop_list.push_back(pinfo);
+ }
+
+
+ inspected_object->prop_values[pinfo.name]=p_data[idx++];
+
+ if (inspected_object->last_edited_id==id) {
+ //same, just update value, don't rebuild
+ inspected_object->update_single(pinfo.name.ascii().get_data());
+ }
+
+ }
+
+
+
+ if (inspected_object->last_edited_id!=id) {
+ //only if different
+ inspected_object->update();
+ }
+
+ inspected_object->last_edited_id=id;
+
+
+ inspect_properties->edit(inspected_object);
+
+ } else if (p_msg=="message:video_mem") {
+
+ vmem_tree->clear();
+ TreeItem* root=vmem_tree->create_item();
+
+ int total=0;
+
+ for(int i=0;i<p_data.size();i+=4) {
+
+ TreeItem *it = vmem_tree->create_item(root);
+ String type=p_data[i+1];
+ int bytes=p_data[i+3].operator int();
+ it->set_text(0,p_data[i+0]); //path
+ it->set_text(1,type); //type
+ it->set_text(2,p_data[i+2]); //type
+ it->set_text(3,String::humanize_size(bytes)); //type
+ total+=bytes;
+
+ if (has_icon(type,"EditorIcons"))
+ it->set_icon(0,get_icon(type,"EditorIcons"));
+ }
+
+ vmem_total->set_tooltip(TTR("Bytes:")+" "+itos(total));
+ vmem_total->set_text(String::humanize_size(total));
+
+ } else if (p_msg=="stack_dump") {
+
+ stack_dump->clear();
+ TreeItem *r = stack_dump->create_item();
+
+ for(int i=0;i<p_data.size();i++) {
+
+ Dictionary d = p_data[i];
+ ERR_CONTINUE(!d.has("function"));
+ ERR_CONTINUE(!d.has("file"));
+ ERR_CONTINUE(!d.has("line"));
+ ERR_CONTINUE(!d.has("id"));
+ TreeItem *s = stack_dump->create_item(r);
+ d["frame"]=i;
+ s->set_metadata(0,d);
+
+ //String line = itos(i)+" - "+String(d["file"])+":"+itos(d["line"])+" - at func: "+d["function"];
+ String line = itos(i)+" - "+String(d["file"])+":"+itos(d["line"]);
+ s->set_text(0,line);
+
+ if (i==0)
+ s->select(0);
+ }
+ } else if (p_msg=="stack_frame_vars") {
+
+
+ variables->clear();
+
+
+
+ int ofs =0;
+ int mcount = p_data[ofs];
+
+ ofs++;
+ for(int i=0;i<mcount;i++) {
+
+ String n = p_data[ofs+i*2+0];
+ Variant v = p_data[ofs+i*2+1];
+
+ if (n.begins_with("*")) {
+
+ n=n.substr(1,n.length());
+ }
+
+ variables->add_property("members/"+n,v);
+ }
+ ofs+=mcount*2;
+
+ mcount = p_data[ofs];
+
+ ofs++;
+ for(int i=0;i<mcount;i++) {
+
+ String n = p_data[ofs+i*2+0];
+ Variant v = p_data[ofs+i*2+1];
+
+ if (n.begins_with("*")) {
+
+ n=n.substr(1,n.length());
+ }
+
+
+ variables->add_property("locals/"+n,v);
+ }
+
+ variables->update();
+ inspector->edit(variables);
+
+ } else if (p_msg=="output") {
+
+ //OUT
+ for(int i=0;i<p_data.size();i++) {
+
+ String t = p_data[i];
+ //LOG
+
+ if (!EditorNode::get_log()->is_visible()) {
+ if (EditorNode::get_singleton()->are_bottom_panels_hidden()) {
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log());
+ }
+ }
+ EditorNode::get_log()->add_message(t);
+
+ }
+
+ } else if (p_msg=="performance") {
+ Array arr = p_data[0];
+ Vector<float> p;
+ p.resize(arr.size());
+ for(int i=0;i<arr.size();i++) {
+ p[i]=arr[i];
+ if (i<perf_items.size()) {
+ perf_items[i]->set_text(1,rtos(p[i]));
+ if (p[i]>perf_max[i])
+ perf_max[i]=p[i];
+ }
+
+ }
+ perf_history.push_front(p);
+ perf_draw->update();
+
+ } else if (p_msg=="error") {
+
+ Array err = p_data[0];
+
+ Array vals;
+ vals.push_back(err[0]);
+ vals.push_back(err[1]);
+ vals.push_back(err[2]);
+ vals.push_back(err[3]);
+
+ bool warning = err[9];
+ bool e;
+ String time = String("%d:%02d:%02d:%04d").sprintf(vals,&e);
+ String txt=time+" - "+(err[8].is_zero()?String(err[7]):String(err[8]));
+
+ String tooltip=TTR("Type:")+String(warning?TTR("Warning"):TTR("Error"));
+ tooltip+="\n"+TTR("Description:")+" "+String(err[8]);
+ tooltip+="\n"+TTR("Time:")+" "+time;
+ tooltip+="\nC "+TTR("Error:")+" "+String(err[7]);
+ tooltip+="\nC "+TTR("Source:")+" "+String(err[5])+":"+String(err[6]);
+ tooltip+="\nC "+TTR("Function:")+" "+String(err[4]);
+
+
+
+ error_list->add_item(txt,EditorNode::get_singleton()->get_gui_base()->get_icon(warning?"Warning":"Error","EditorIcons"));
+ error_list->set_item_tooltip( error_list->get_item_count() -1,tooltip );
+
+ int scc = p_data[1];
+
+ Array stack;
+ stack.resize(scc);
+ for(int i=0;i<scc;i++) {
+ stack[i]=p_data[2+i];
+ }
+
+ error_list->set_item_metadata( error_list->get_item_count() -1,stack );
+
+ error_count++;
+ /*
+ int count = p_data[1];
+
+ Array cstack;
+
+ OutputError oe = errors.front()->get();
+
+ packet_peer_stream->put_var(oe.hr);
+ packet_peer_stream->put_var(oe.min);
+ packet_peer_stream->put_var(oe.sec);
+ packet_peer_stream->put_var(oe.msec);
+ packet_peer_stream->put_var(oe.source_func);
+ packet_peer_stream->put_var(oe.source_file);
+ packet_peer_stream->put_var(oe.source_line);
+ packet_peer_stream->put_var(oe.error);
+ packet_peer_stream->put_var(oe.error_descr);
+ packet_peer_stream->put_var(oe.warning);
+ packet_peer_stream->put_var(oe.callstack);
+ */
+
+ } else if (p_msg=="profile_sig") {
+ //cache a signature
+ print_line("SIG: "+String(Variant(p_data)));
+ profiler_signature[p_data[1]]=p_data[0];
+
+ } else if (p_msg=="profile_frame" || p_msg=="profile_total") {
+
+ EditorProfiler::Metric metric;
+ metric.valid=true;
+ metric.frame_number=p_data[0];
+ metric.frame_time=p_data[1];
+ metric.idle_time=p_data[2];
+ metric.fixed_time=p_data[3];
+ metric.fixed_frame_time=p_data[4];
+ int frame_data_amount = p_data[6];
+ int frame_function_amount = p_data[7];
+
+
+ if (frame_data_amount) {
+ EditorProfiler::Metric::Category frame_time;
+ frame_time.signature="category_frame_time";
+ frame_time.name="Frame Time";
+ frame_time.total_time=metric.frame_time;
+
+ EditorProfiler::Metric::Category::Item item;
+ item.calls=1;
+ item.line=0;
+ item.name="Fixed Time";
+ item.total=metric.fixed_time;
+ item.self=item.total;
+ item.signature="fixed_time";
+
+
+ frame_time.items.push_back(item);
+
+ item.name="Idle Time";
+ item.total=metric.idle_time;
+ item.self=item.total;
+ item.signature="idle_time";
+
+ frame_time.items.push_back(item);
+
+ item.name="Fixed Frame Time";
+ item.total=metric.fixed_frame_time;
+ item.self=item.total;
+ item.signature="fixed_frame_time";
+
+ frame_time.items.push_back(item);
+
+ metric.categories.push_back(frame_time);
+
+ }
+
+
+
+ int idx=8;
+ for(int i=0;i<frame_data_amount;i++) {
+
+ EditorProfiler::Metric::Category c;
+ String name=p_data[idx++];
+ Array values=p_data[idx++];
+ c.name=name.capitalize();
+ c.items.resize(values.size()/2);
+ c.total_time=0;
+ c.signature="categ::"+name;
+ for(int i=0;i<values.size();i+=2) {
+
+ EditorProfiler::Metric::Category::Item item;
+ item.name=values[i];
+ item.calls=1;
+ item.self=values[i+1];
+ item.total=item.self;
+ item.signature="categ::"+name+"::"+item.name;
+ item.name=item.name.capitalize();
+ c.total_time+=item.total;
+ c.items[i/2]=item;
+
+
+ }
+ metric.categories.push_back(c);
+ }
+
+ EditorProfiler::Metric::Category funcs;
+ funcs.total_time=p_data[5]; //script time
+ funcs.items.resize(frame_function_amount);
+ funcs.name="Script Functions";
+ funcs.signature="script_functions";
+ for(int i=0;i<frame_function_amount;i++) {
+
+ int signature = p_data[idx++];
+ int calls = p_data[idx++];
+ float total = p_data[idx++];
+ float self = p_data[idx++];
+
+
+
+ EditorProfiler::Metric::Category::Item item;
+ if (profiler_signature.has(signature)) {
+
+ item.signature=profiler_signature[signature];
+
+ String name = profiler_signature[signature];
+ Vector<String> strings = name.split("::");
+ if (strings.size()==3) {
+ item.name=strings[2];
+ item.script=strings[0];
+ item.line=strings[1].to_int();
+ }
+
+ } else {
+ item.name="SigErr "+itos(signature);
+ }
+
+
+
+
+ item.calls=calls;
+ item.self=self;
+ item.total=total;
+ funcs.items[i]=item;
+
+ }
+
+ metric.categories.push_back(funcs);
+
+ if (p_msg=="profile_frame")
+ profiler->add_frame_metric(metric,false);
+ else
+ profiler->add_frame_metric(metric,true);
+
+ } else if (p_msg=="kill_me") {
+
+ editor->call_deferred("stop_child_process");
+ }
+
+}
+
+
+void ScriptEditorDebugger::_performance_select(Object*,int,bool) {
+
+ perf_draw->update();
+
+}
+
+void ScriptEditorDebugger::_performance_draw() {
+
+
+ Vector<int> which;
+ for(int i=0;i<perf_items.size();i++) {
+
+
+ if (perf_items[i]->is_selected(0))
+ which.push_back(i);
+ }
+
+
+ if(which.empty())
+ return;
+
+ Ref<StyleBox> graph_sb = get_stylebox("normal","TextEdit");
+ Ref<Font> graph_font = get_font("font","TextEdit");
+
+ int cols = Math::ceil(Math::sqrt((float)which.size()));
+ int rows = (which.size()+1)/cols;
+ if (which.size()==1)
+ rows=1;
+
+
+ int margin =3;
+ int point_sep=5;
+ Size2i s = Size2i(perf_draw->get_size())/Size2i(cols,rows);
+ for(int i=0;i<which.size();i++) {
+
+ Point2i p(i%cols,i/cols);
+ Rect2i r(p*s,s);
+ r.pos+=Point2(margin,margin);
+ r.size-=Point2(margin,margin)*2.0;
+ perf_draw->draw_style_box(graph_sb,r);
+ r.pos+=graph_sb->get_offset();
+ r.size-=graph_sb->get_minimum_size();
+ int pi=which[i];
+ Color c = Color(0.7,0.9,0.5);
+ c.set_hsv(Math::fmod(c.get_h()+pi*0.7654,1),c.get_s(),c.get_v());
+
+ c.a=0.8;
+ perf_draw->draw_string(graph_font,r.pos+Point2(0,graph_font->get_ascent()),perf_items[pi]->get_text(0),c,r.size.x);
+ c.a=0.6;
+ perf_draw->draw_string(graph_font,r.pos+Point2(graph_font->get_char_size('X').width,graph_font->get_ascent()+graph_font->get_height()),perf_items[pi]->get_text(1),c,r.size.y);
+
+ float spacing=point_sep/float(cols);
+ float from = r.size.width;
+
+ List<Vector<float> >::Element *E=perf_history.front();
+ float prev=-1;
+ while(from>=0 && E) {
+
+ float m = perf_max[pi];
+ if (m==0)
+ m=0.00001;
+ float h = E->get()[pi]/m;
+ h=(1.0-h)*r.size.y;
+
+ c.a=0.7;
+ if (E!=perf_history.front())
+ perf_draw->draw_line(r.pos+Point2(from,h),r.pos+Point2(from+spacing,prev),c,2.0);
+ prev=h;
+ E=E->next();
+ from-=spacing;
+ }
+
+ }
+
+}
+
+void ScriptEditorDebugger::_notification(int p_what) {
+
+ switch(p_what) {
+
+ case NOTIFICATION_ENTER_TREE: {
+
+ inspector->edit(variables);
+
+ step->set_icon( get_icon("DebugStep","EditorIcons"));
+ next->set_icon( get_icon("DebugNext","EditorIcons"));
+ back->set_icon( get_icon("Back","EditorIcons"));
+ forward->set_icon( get_icon("Forward","EditorIcons"));
+ dobreak->set_icon( get_icon("Pause","EditorIcons"));
+ docontinue->set_icon( get_icon("DebugContinue","EditorIcons"));
+ //scene_tree_refresh->set_icon( get_icon("Reload","EditorIcons"));
+ le_set->connect("pressed",this,"_live_edit_set");
+ le_clear->connect("pressed",this,"_live_edit_clear");
+ error_list->connect("item_selected",this,"_error_selected");
+ error_stack->connect("item_selected",this,"_error_stack_selected");
+ vmem_refresh->set_icon( get_icon("Reload","EditorIcons"));
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+
+ if (connection.is_valid()) {
+ inspect_scene_tree_timeout-=get_process_delta_time();
+ if (inspect_scene_tree_timeout<0) {
+ inspect_scene_tree_timeout=EditorSettings::get_singleton()->get("debugger/scene_tree_refresh_interval");
+ if (inspect_scene_tree->is_visible_in_tree()) {
+ _scene_tree_request();
+
+ if (inspected_object_id!=0) {
+ //take the chance and re-inspect selected object
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+ }
+ }
+ }
+
+ inspect_edited_object_timeout-=get_process_delta_time();
+ if (inspect_edited_object_timeout<0) {
+ inspect_edited_object_timeout=EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval");
+ if (inspect_scene_tree->is_visible_in_tree() && inspected_object_id) {
+ //take the chance and re-inspect selected object
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+ }
+ }
+ }
+
+ if (error_count!=last_error_count) {
+
+ if (error_count==0) {
+ error_split->set_name(TTR("Errors"));
+ debugger_button->set_text(TTR("Debugger"));
+ debugger_button->set_icon(Ref<Texture>());
+ tabs->set_tab_icon(error_split->get_index(),Ref<Texture>());
+ } else {
+ error_split->set_name(TTR("Errors")+" ("+itos(error_count)+")");
+ debugger_button->set_text(TTR("Debugger")+" ("+itos(error_count)+")");
+ debugger_button->set_icon(get_icon("Error","EditorIcons"));
+ tabs->set_tab_icon(error_split->get_index(),get_icon("Error","EditorIcons"));
+ }
+ last_error_count=error_count;
+ }
+
+ if (connection.is_null()) {
+
+ if (server->is_connection_available()) {
+
+ connection = server->take_connection();
+ if (connection.is_null())
+ break;
+
+ EditorNode::get_log()->add_message("** Debug Process Started **");
+
+ ppeer->set_stream_peer(connection);
+
+ //EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+ //emit_signal("show_debugger",true);
+
+ dobreak->set_disabled(false);
+ tabs->set_current_tab(0);
+
+ reason->set_text(TTR("Child Process Connected"));
+ reason->set_tooltip(TTR("Child Process Connected"));
+ profiler->clear();
+
+ inspect_scene_tree->clear();
+ le_set->set_disabled(true);
+ le_clear->set_disabled(false);
+ error_list->clear();
+ error_stack->clear();
+ error_count=0;
+ profiler_signature.clear();
+ //live_edit_root->set_text("/root");
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(false);
+
+ update_live_edit_root();
+ if (profiler->is_profiling()) {
+ _profiler_activate(true);
+ }
+
+
+ } else {
+
+ break;
+ }
+ };
+
+ if (!connection->is_connected_to_host()) {
+ stop();
+ editor->notify_child_process_exited(); //somehow, exited
+ break;
+ };
+
+ if (ppeer->get_available_packet_count() <= 0) {
+ break;
+ };
+
+ while(ppeer->get_available_packet_count() > 0) {
+
+ if (pending_in_queue) {
+
+ int todo = MIN( ppeer->get_available_packet_count(), pending_in_queue );
+
+ for(int i=0;i<todo;i++) {
+
+ Variant cmd;
+ Error ret = ppeer->get_var(cmd);
+ if (ret!=OK) {
+ stop();
+ ERR_FAIL_COND(ret!=OK);
+ }
+
+ message.push_back(cmd);
+ pending_in_queue--;
+ }
+
+
+ if (pending_in_queue==0) {
+ _parse_message(message_type,message);
+ message.clear();
+
+ }
+
+
+ } else {
+
+ if (ppeer->get_available_packet_count()>=2) {
+
+
+ Variant cmd;
+ Error ret = ppeer->get_var(cmd);
+ if (ret!=OK) {
+ stop();
+ ERR_FAIL_COND(ret!=OK);
+ }
+ if (cmd.get_type()!=Variant::STRING) {
+ stop();
+ ERR_FAIL_COND(cmd.get_type()!=Variant::STRING);
+ }
+
+ message_type=cmd;
+ //print_line("GOT: "+message_type);
+
+ ret = ppeer->get_var(cmd);
+ if (ret!=OK) {
+ stop();
+ ERR_FAIL_COND(ret!=OK);
+ }
+ if (cmd.get_type()!=Variant::INT) {
+ stop();
+ ERR_FAIL_COND(cmd.get_type()!=Variant::INT);
+ }
+
+ pending_in_queue=cmd;
+
+ if (pending_in_queue==0) {
+ _parse_message(message_type,Array());
+ message.clear();
+ }
+
+ } else {
+
+
+ break;
+ }
+
+ }
+ }
+
+
+
+ } break;
+ }
+
+}
+
+
+void ScriptEditorDebugger::start() {
+
+ stop();
+
+ if (is_visible_in_tree()) {
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+ }
+
+ uint16_t port = GLOBAL_GET("network/debug/remote_port");
+ perf_history.clear();
+ for(int i=0;i<Performance::MONITOR_MAX;i++) {
+
+ perf_max[i]=0;
+ }
+
+ server->listen(port);
+ set_process(true);
+
+}
+
+void ScriptEditorDebugger::pause(){
+
+
+}
+
+void ScriptEditorDebugger::unpause(){
+
+
+}
+
+void ScriptEditorDebugger::stop(){
+
+
+ set_process(false);
+
+ server->stop();
+
+ ppeer->set_stream_peer(Ref<StreamPeer>());
+
+ if (connection.is_valid()) {
+ EditorNode::get_log()->add_message("** Debug Process Stopped **");
+ connection.unref();
+ }
+
+ pending_in_queue=0;
+ message.clear();
+
+ node_path_cache.clear();
+ res_path_cache.clear();
+ profiler_signature.clear();
+ le_clear->set_disabled(false);
+ le_set->set_disabled(true);
+ profiler->set_enabled(true);
+
+ inspect_properties->edit(NULL);
+ inspect_scene_tree->clear();
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
+
+
+
+ if (hide_on_stop) {
+ if (is_visible_in_tree())
+ EditorNode::get_singleton()->hide_bottom_panel();
+ emit_signal("show_debugger",false);
+ }
+
+}
+
+void ScriptEditorDebugger::_profiler_activate(bool p_enable) {
+
+ if (!connection.is_valid())
+ return;
+
+
+ if (p_enable) {
+ profiler_signature.clear();
+ Array msg;
+ msg.push_back("start_profiling");
+ int max_funcs = EditorSettings::get_singleton()->get("debugger/profiler_frame_max_functions");
+ max_funcs = CLAMP(max_funcs,16,512);
+ msg.push_back(max_funcs);
+ ppeer->put_var(msg);
+
+ print_line("BEGIN PROFILING!");
+
+ } else {
+ Array msg;
+ msg.push_back("stop_profiling");
+ ppeer->put_var(msg);
+
+ print_line("END PROFILING!");
+
+ }
+
+}
+
+void ScriptEditorDebugger::_profiler_seeked() {
+
+ if (!connection.is_valid() || !connection->is_connected_to_host())
+ return;
+
+ if (breaked)
+ return;
+ debug_break();
+}
+
+
+void ScriptEditorDebugger::_stack_dump_frame_selected() {
+
+ TreeItem *ti = stack_dump->get_selected();
+ if (!ti)
+ return;
+
+
+ Dictionary d = ti->get_metadata(0);
+
+ Ref<Script> s = ResourceLoader::load(d["file"]);
+ emit_signal("goto_script_line",s,int(d["line"])-1);
+
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+ ///
+
+ Array msg;
+ msg.push_back("get_stack_frame_vars");
+ msg.push_back(d["frame"]);
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::_output_clear() {
+
+ //output->clear();
+ //output->push_color(Color(0,0,0));
+
+}
+
+String ScriptEditorDebugger::get_var_value(const String& p_var) const {
+ if (!breaked)
+ return String();
+ return variables->get_var_value(p_var);
+}
+
+int ScriptEditorDebugger::_get_node_path_cache(const NodePath& p_path) {
+
+ const int *r = node_path_cache.getptr(p_path);
+ if (r)
+ return *r;
+
+ last_path_id++;
+
+ node_path_cache[p_path]=last_path_id;
+ Array msg;
+ msg.push_back("live_node_path");
+ msg.push_back(p_path);
+ msg.push_back(last_path_id);
+ ppeer->put_var(msg);
+
+
+ return last_path_id;
+}
+
+int ScriptEditorDebugger::_get_res_path_cache(const String& p_path) {
+
+ Map<String,int>::Element *E=res_path_cache.find(p_path);
+
+ if (E)
+ return E->get();
+
+ last_path_id++;
+
+ res_path_cache[p_path]=last_path_id;
+ Array msg;
+ msg.push_back("live_res_path");
+ msg.push_back(p_path);
+ msg.push_back(last_path_id);
+ ppeer->put_var(msg);
+
+
+ return last_path_id;
+}
+
+void ScriptEditorDebugger::_method_changed(Object*p_base,const StringName& p_name,VARIANT_ARG_DECLARE) {
+
+ if (!p_base || !live_debug || !connection.is_valid() || !editor->get_edited_scene())
+ return;
+
+ Node *node = p_base->cast_to<Node>();
+
+ VARIANT_ARGPTRS
+
+ for(int i=0;i<VARIANT_ARG_MAX;i++) {
+ //no pointers, sorry
+ if (argptr[i] && (argptr[i]->get_type()==Variant::OBJECT || argptr[i]->get_type()==Variant::_RID))
+ return;
+ }
+
+ if (node) {
+
+ NodePath path = editor->get_edited_scene()->get_path_to(node);
+ int pathid = _get_node_path_cache(path);
+
+
+
+ Array msg;
+ msg.push_back("live_node_call");
+ msg.push_back(pathid);
+ msg.push_back(p_name);
+ for(int i=0;i<VARIANT_ARG_MAX;i++) {
+ //no pointers, sorry
+ msg.push_back(*argptr[i]);
+ }
+ ppeer->put_var(msg);
+
+ return;
+
+ }
+
+ Resource *res = p_base->cast_to<Resource>();
+
+ if (res && res->get_path()!=String()) {
+
+ String respath = res->get_path();
+ int pathid = _get_res_path_cache(respath);
+
+ Array msg;
+ msg.push_back("live_res_call");
+ msg.push_back(pathid);
+ msg.push_back(p_name);
+ for(int i=0;i<VARIANT_ARG_MAX;i++) {
+ //no pointers, sorry
+ msg.push_back(*argptr[i]);
+ }
+ ppeer->put_var(msg);
+
+ return;
+ }
+
+ //print_line("method");
+}
+
+void ScriptEditorDebugger::_property_changed(Object*p_base,const StringName& p_property,const Variant& p_value){
+
+ if (!p_base || !live_debug || !connection.is_valid() || !editor->get_edited_scene())
+ return;
+
+ Node *node = p_base->cast_to<Node>();
+
+ if (node) {
+
+ NodePath path = editor->get_edited_scene()->get_path_to(node);
+ int pathid = _get_node_path_cache(path);
+
+
+ if (p_value.is_ref()) {
+ Ref<Resource> res = p_value;
+ if (res.is_valid() && res->get_path()!=String()) {
+
+ Array msg;
+ msg.push_back("live_node_prop_res");
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(res->get_path());
+ ppeer->put_var(msg);
+ }
+ } else {
+
+ Array msg;
+ msg.push_back("live_node_prop");
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(p_value);
+ ppeer->put_var(msg);
+ }
+
+
+ return;
+
+ }
+
+ Resource *res = p_base->cast_to<Resource>();
+
+ if (res && res->get_path()!=String()) {
+
+ String respath = res->get_path();
+ int pathid = _get_res_path_cache(respath);
+
+
+ if (p_value.is_ref()) {
+ Ref<Resource> res = p_value;
+ if (res.is_valid() && res->get_path()!=String()) {
+
+ Array msg;
+ msg.push_back("live_res_prop_res");
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(res->get_path());
+ ppeer->put_var(msg);
+ }
+ } else {
+
+ Array msg;
+ msg.push_back("live_res_prop");
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(p_value);
+ ppeer->put_var(msg);
+ }
+
+
+ return;
+ }
+
+
+ //print_line("prop");
+}
+
+void ScriptEditorDebugger::_method_changeds(void *p_ud,Object*p_base,const StringName& p_name,VARIANT_ARG_DECLARE) {
+
+ ScriptEditorDebugger *sed = (ScriptEditorDebugger*)p_ud;
+ sed->_method_changed(p_base,p_name,VARIANT_ARG_PASS);
+
+
+}
+
+void ScriptEditorDebugger::_property_changeds(void *p_ud,Object*p_base,const StringName& p_property,const Variant& p_value){
+
+ ScriptEditorDebugger *sed = (ScriptEditorDebugger*)p_ud;
+ sed->_property_changed(p_base,p_property,p_value);
+
+}
+
+void ScriptEditorDebugger::set_live_debugging(bool p_enable) {
+
+ live_debug=p_enable;
+}
+
+void ScriptEditorDebugger::_live_edit_set() {
+
+ if (!connection.is_valid())
+ return;
+
+ TreeItem* ti = inspect_scene_tree->get_selected();
+ if (!ti)
+ return;
+ String path;
+
+ while(ti) {
+ String lp=ti->get_text(0);
+ path="/"+lp+path;
+ ti=ti->get_parent();
+
+ }
+
+ NodePath np = path;
+
+ editor->get_editor_data().set_edited_scene_live_edit_root(np);
+
+ update_live_edit_root();
+
+
+}
+
+void ScriptEditorDebugger::_live_edit_clear() {
+
+ NodePath np = NodePath("/root");
+ editor->get_editor_data().set_edited_scene_live_edit_root(np);
+
+ update_live_edit_root();
+
+}
+
+void ScriptEditorDebugger::update_live_edit_root() {
+
+ NodePath np = editor->get_editor_data().get_edited_scene_live_edit_root();
+
+ if (connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_set_root");
+ msg.push_back(np);
+ if (editor->get_edited_scene())
+ msg.push_back(editor->get_edited_scene()->get_filename());
+ else
+ msg.push_back("");
+ ppeer->put_var(msg);
+ }
+ live_edit_root->set_text(np);
+
+}
+
+void ScriptEditorDebugger::live_debug_create_node(const NodePath& p_parent,const String& p_type,const String& p_name) {
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_create_node");
+ msg.push_back(p_parent);
+ msg.push_back(p_type);
+ msg.push_back(p_name);
+ ppeer->put_var(msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_instance_node(const NodePath& p_parent,const String& p_path,const String& p_name){
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_instance_node");
+ msg.push_back(p_parent);
+ msg.push_back(p_path);
+ msg.push_back(p_name);
+ ppeer->put_var(msg);
+ }
+
+}
+void ScriptEditorDebugger::live_debug_remove_node(const NodePath& p_at){
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_remove_node");
+ msg.push_back(p_at);
+ ppeer->put_var(msg);
+ }
+
+}
+void ScriptEditorDebugger::live_debug_remove_and_keep_node(const NodePath& p_at,ObjectID p_keep_id) {
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_remove_and_keep_node");
+ msg.push_back(p_at);
+ msg.push_back(p_keep_id);
+ ppeer->put_var(msg);
+ }
+
+}
+void ScriptEditorDebugger::live_debug_restore_node(ObjectID p_id, const NodePath& p_at, int p_at_pos){
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_restore_node");
+ msg.push_back(p_id);
+ msg.push_back(p_at);
+ msg.push_back(p_at_pos);
+ ppeer->put_var(msg);
+ }
+
+}
+void ScriptEditorDebugger::live_debug_duplicate_node(const NodePath& p_at,const String& p_new_name){
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_duplicate_node");
+ msg.push_back(p_at);
+ msg.push_back(p_new_name);
+ ppeer->put_var(msg);
+ }
+
+}
+void ScriptEditorDebugger::live_debug_reparent_node(const NodePath& p_at, const NodePath& p_new_place, const String &p_new_name, int p_at_pos){
+
+ if (live_debug && connection.is_valid()) {
+ Array msg;
+ msg.push_back("live_reparent_node");
+ msg.push_back(p_at);
+ msg.push_back(p_new_place);
+ msg.push_back(p_new_name);
+ msg.push_back(p_at_pos);
+ ppeer->put_var(msg);
+ }
+
+}
+
+void ScriptEditorDebugger::set_breakpoint(const String& p_path,int p_line,bool p_enabled) {
+
+ if (connection.is_valid()) {
+ Array msg;
+ msg.push_back("breakpoint");
+ msg.push_back(p_path);
+ msg.push_back(p_line);
+ msg.push_back(p_enabled);
+ ppeer->put_var(msg);
+ }
+}
+
+
+void ScriptEditorDebugger::reload_scripts() {
+
+ if (connection.is_valid()) {
+ Array msg;
+ msg.push_back("reload_scripts");
+ ppeer->put_var(msg);
+ }
+}
+
+
+void ScriptEditorDebugger::_error_selected(int p_idx) {
+
+ error_stack->clear();
+ Array st=error_list->get_item_metadata(p_idx);
+ for(int i=0;i<st.size();i+=2) {
+
+ String script=st[i];
+ int line=st[i+1];
+ Array md;
+ md.push_back(st[i]);
+ md.push_back(st[i+1]);
+
+ String str = script.get_file()+":"+itos(line);
+
+ error_stack->add_item(str);
+ error_stack->set_item_metadata(error_stack->get_item_count()-1,md);
+ error_stack->set_item_tooltip(error_stack->get_item_count()-1,TTR("File:")+" "+String(st[i])+"\n"+TTR("Line:")+" "+itos(line));
+ }
+}
+
+void ScriptEditorDebugger:: _error_stack_selected(int p_idx){
+
+ Array arr = error_stack->get_item_metadata(p_idx);
+ if (arr.size()!=2)
+ return;
+
+
+ Ref<Script> s = ResourceLoader::load(arr[0]);
+ emit_signal("goto_script_line",s,int(arr[1])-1);
+
+}
+
+void ScriptEditorDebugger::set_hide_on_stop(bool p_hide) {
+
+ hide_on_stop=p_hide;
+}
+
+void ScriptEditorDebugger::_paused() {
+
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected_to_host());
+
+ if (!breaked && EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
+ debug_break();
+ }
+
+ if (breaked && !EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
+ debug_continue();
+ }
+
+}
+
+void ScriptEditorDebugger::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_stack_dump_frame_selected"),&ScriptEditorDebugger::_stack_dump_frame_selected);
+ ClassDB::bind_method(D_METHOD("debug_next"),&ScriptEditorDebugger::debug_next);
+ ClassDB::bind_method(D_METHOD("debug_step"),&ScriptEditorDebugger::debug_step);
+ ClassDB::bind_method(D_METHOD("debug_break"),&ScriptEditorDebugger::debug_break);
+ ClassDB::bind_method(D_METHOD("debug_continue"),&ScriptEditorDebugger::debug_continue);
+ ClassDB::bind_method(D_METHOD("_output_clear"),&ScriptEditorDebugger::_output_clear);
+ ClassDB::bind_method(D_METHOD("_performance_draw"),&ScriptEditorDebugger::_performance_draw);
+ ClassDB::bind_method(D_METHOD("_performance_select"),&ScriptEditorDebugger::_performance_select);
+ ClassDB::bind_method(D_METHOD("_scene_tree_request"),&ScriptEditorDebugger::_scene_tree_request);
+ ClassDB::bind_method(D_METHOD("_video_mem_request"),&ScriptEditorDebugger::_video_mem_request);
+ ClassDB::bind_method(D_METHOD("_live_edit_set"),&ScriptEditorDebugger::_live_edit_set);
+ ClassDB::bind_method(D_METHOD("_live_edit_clear"),&ScriptEditorDebugger::_live_edit_clear);
+
+ ClassDB::bind_method(D_METHOD("_error_selected"),&ScriptEditorDebugger::_error_selected);
+ ClassDB::bind_method(D_METHOD("_error_stack_selected"),&ScriptEditorDebugger::_error_stack_selected);
+ ClassDB::bind_method(D_METHOD("_profiler_activate"),&ScriptEditorDebugger::_profiler_activate);
+ ClassDB::bind_method(D_METHOD("_profiler_seeked"),&ScriptEditorDebugger::_profiler_seeked);
+
+ ClassDB::bind_method(D_METHOD("_paused"),&ScriptEditorDebugger::_paused);
+
+ ClassDB::bind_method(D_METHOD("_scene_tree_selected"),&ScriptEditorDebugger::_scene_tree_selected);
+ ClassDB::bind_method(D_METHOD("_scene_tree_folded"),&ScriptEditorDebugger::_scene_tree_folded);
+
+
+ ClassDB::bind_method(D_METHOD("live_debug_create_node"),&ScriptEditorDebugger::live_debug_create_node);
+ ClassDB::bind_method(D_METHOD("live_debug_instance_node"),&ScriptEditorDebugger::live_debug_instance_node);
+ ClassDB::bind_method(D_METHOD("live_debug_remove_node"),&ScriptEditorDebugger::live_debug_remove_node);
+ ClassDB::bind_method(D_METHOD("live_debug_remove_and_keep_node"),&ScriptEditorDebugger::live_debug_remove_and_keep_node);
+ ClassDB::bind_method(D_METHOD("live_debug_restore_node"),&ScriptEditorDebugger::live_debug_restore_node);
+ ClassDB::bind_method(D_METHOD("live_debug_duplicate_node"),&ScriptEditorDebugger::live_debug_duplicate_node);
+ ClassDB::bind_method(D_METHOD("live_debug_reparent_node"),&ScriptEditorDebugger::live_debug_reparent_node);
+ ClassDB::bind_method(D_METHOD("_scene_tree_property_select_object"),&ScriptEditorDebugger::_scene_tree_property_select_object);
+ ClassDB::bind_method(D_METHOD("_scene_tree_property_value_edited"),&ScriptEditorDebugger::_scene_tree_property_value_edited);
+
+ ADD_SIGNAL(MethodInfo("goto_script_line"));
+ ADD_SIGNAL(MethodInfo("breaked",PropertyInfo(Variant::BOOL,"reallydid"),PropertyInfo(Variant::BOOL,"can_debug")));
+ ADD_SIGNAL(MethodInfo("show_debugger",PropertyInfo(Variant::BOOL,"reallydid")));
+}
+
+ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor){
+
+
+
+ ppeer = Ref<PacketPeerStream>( memnew( PacketPeerStream ) );
+ editor=p_editor;
+
+ tabs = memnew( TabContainer );
+ tabs->set_v_size_flags(SIZE_EXPAND_FILL);
+ tabs->set_area_as_parent_rect();
+ add_child(tabs);
+
+
+ { //debugger
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ vbc->set_name(TTR("Debugger"));
+ //tabs->add_child(vbc);
+ Control *dbg=vbc;
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+
+ reason = memnew( LineEdit );
+ reason->set_text("");
+ reason->set_editable(false);
+ hbc->add_child(reason);
+ reason->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ reason->set_h_size_flags(SIZE_EXPAND_FILL);
+ //reason->set_clip_text(true);
+
+ hbc->add_child( memnew( VSeparator) );
+
+ step = memnew( Button );
+ hbc->add_child(step);
+ step->set_tooltip(TTR("Step Into"));
+ step->connect("pressed",this,"debug_step");
+
+ next = memnew( Button );
+ hbc->add_child(next);
+ next->set_tooltip(TTR("Step Over"));
+ next->connect("pressed",this,"debug_next");
+
+ hbc->add_child( memnew( VSeparator) );
+
+ dobreak = memnew( Button );
+ hbc->add_child(dobreak);
+ dobreak->set_tooltip(TTR("Break"));
+ dobreak->connect("pressed",this,"debug_break");
+
+ docontinue = memnew( Button );
+ hbc->add_child(docontinue);
+ docontinue->set_tooltip(TTR("Continue"));
+ docontinue->connect("pressed",this,"debug_continue");
+
+ //hbc->add_child( memnew( VSeparator) );
+
+ back = memnew( Button );
+ hbc->add_child(back);
+ back->set_tooltip(TTR("Inspect Previous Instance"));
+ back->hide();
+
+ forward = memnew( Button );
+ hbc->add_child(forward);
+ forward->set_tooltip(TTR("Inspect Next Instance"));
+ forward->hide();
+
+
+ HSplitContainer *sc = memnew( HSplitContainer );
+ vbc->add_child(sc);
+ sc->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ stack_dump = memnew( Tree );
+ stack_dump->set_columns(1);
+ stack_dump->set_column_titles_visible(true);
+ stack_dump->set_column_title(0,TTR("Stack Frames"));
+ stack_dump->set_h_size_flags(SIZE_EXPAND_FILL);
+ stack_dump->set_hide_root(true);
+ stack_dump->connect("cell_selected",this,"_stack_dump_frame_selected");
+ sc->add_child(stack_dump);
+
+ inspector = memnew( PropertyEditor );
+ inspector->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspector->hide_top_label();
+ inspector->get_scene_tree()->set_column_title(0,TTR("Variable"));
+ inspector->set_capitalize_paths(false);
+ inspector->set_read_only(true);
+ sc->add_child(inspector);
+
+ server = TCP_Server::create_ref();
+
+ pending_in_queue=0;
+
+ variables = memnew( ScriptEditorDebuggerVariables );
+
+ breaked=false;
+
+ tabs->add_child(dbg);
+ //tabs->move_child(vbc,0);
+
+ hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+
+ }
+
+ { //errors
+
+
+ error_split = memnew( HSplitContainer );
+ VBoxContainer *errvb = memnew( VBoxContainer );
+ errvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ error_list = memnew( ItemList );
+ errvb->add_margin_child(TTR("Errors:"),error_list,true);
+ error_split->add_child(errvb);
+
+ errvb = memnew( VBoxContainer );
+ errvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ error_stack = memnew( ItemList );
+ errvb->add_margin_child(TTR("Stack Trace (if applicable):"),error_stack,true);
+ error_split->add_child(errvb);
+
+ error_split->set_name(TTR("Errors"));
+ tabs->add_child(error_split);
+ }
+
+
+ { // inquire
+
+
+ inspect_info = memnew( HSplitContainer );
+ inspect_info->set_name(TTR("Remote Inspector"));
+ tabs->add_child(inspect_info);
+
+ VBoxContainer *info_left = memnew(VBoxContainer);
+ info_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspect_info->add_child(info_left);
+
+ inspect_scene_tree = memnew( Tree );
+ info_left->add_margin_child(TTR("Live Scene Tree:"),inspect_scene_tree,true);
+ inspect_scene_tree->connect("cell_selected",this,"_scene_tree_selected");
+ inspect_scene_tree->connect("item_collapsed",this,"_scene_tree_folded");
+
+ //
+
+ VBoxContainer *info_right = memnew(VBoxContainer);
+ info_right->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspect_info->add_child(info_right);
+
+ inspect_properties = memnew( PropertyEditor );
+ inspect_properties->hide_top_label();
+ inspect_properties->set_show_categories(true);
+ inspect_properties->connect("object_id_selected",this,"_scene_tree_property_select_object");
+
+ info_right->add_margin_child(TTR("Remote Object Properties: "),inspect_properties,true);
+
+ inspect_scene_tree_timeout=EDITOR_DEF("debugger/scene_tree_refresh_interval",1.0);
+ inspect_edited_object_timeout=EDITOR_DEF("debugger/remote_inspect_refresh_interval",0.2);
+ inspected_object_id=0;
+ updating_scene_tree=false;
+
+ inspected_object = memnew( ScriptEditorDebuggerInspectedObject );
+ inspected_object->connect("value_edited",this,"_scene_tree_property_value_edited");
+ }
+
+ { //profiler
+ profiler = memnew( EditorProfiler );
+ profiler->set_name(TTR("Profiler"));
+ tabs->add_child(profiler);
+ profiler->connect("enable_profiling",this,"_profiler_activate");
+ profiler->connect("break_request",this,"_profiler_seeked");
+ }
+
+
+ { //monitors
+
+ HSplitContainer *hsp = memnew( HSplitContainer );
+
+ perf_monitors = memnew(Tree);
+ perf_monitors->set_columns(2);
+ perf_monitors->set_column_title(0,TTR("Monitor"));
+ perf_monitors->set_column_title(1,TTR("Value"));
+ perf_monitors->set_column_titles_visible(true);
+ hsp->add_child(perf_monitors);
+ perf_monitors->set_select_mode(Tree::SELECT_MULTI);
+ perf_monitors->connect("multi_selected",this,"_performance_select");
+ perf_draw = memnew( Control );
+ perf_draw->connect("draw",this,"_performance_draw");
+ hsp->add_child(perf_draw);
+ hsp->set_name(TTR("Monitors"));
+ hsp->set_split_offset(300);
+ tabs->add_child(hsp);
+ perf_max.resize(Performance::MONITOR_MAX);
+
+ Map<String,TreeItem*> bases;
+ TreeItem *root=perf_monitors->create_item();
+ perf_monitors->set_hide_root(true);
+ for(int i=0;i<Performance::MONITOR_MAX;i++) {
+
+ String n = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
+ String base = n.get_slice("/",0);
+ String name = n.get_slice("/",1);
+ if (!bases.has(base)) {
+ TreeItem *b = perf_monitors->create_item(root);
+ b->set_text(0,base.capitalize());
+ b->set_editable(0,false);
+ b->set_selectable(0,false);
+ bases[base]=b;
+ }
+
+ TreeItem *it = perf_monitors->create_item(bases[base]);
+ it->set_editable(0,false);
+ it->set_selectable(0,true);
+ it->set_text(0,name.capitalize());
+ perf_items.push_back(it);
+ perf_max[i]=0;
+
+ }
+ }
+
+ { //vmem inspect
+ VBoxContainer *vmem_vb = memnew( VBoxContainer );
+ HBoxContainer *vmem_hb = memnew( HBoxContainer );
+ Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:")+" ") );
+ vmlb->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmem_hb->add_child( vmlb );
+ vmem_hb->add_child( memnew(Label(TTR("Total:")+" ")) );
+ vmem_total = memnew( LineEdit );
+ vmem_total->set_editable(false);
+ vmem_total->set_custom_minimum_size(Size2(100,1)*EDSCALE);
+ vmem_hb->add_child(vmem_total);
+ vmem_refresh = memnew( Button );
+ vmem_hb->add_child(vmem_refresh);
+ vmem_vb->add_child(vmem_hb);
+ vmem_refresh->connect("pressed",this,"_video_mem_request");
+
+ MarginContainer *vmmc = memnew( MarginContainer );
+ vmem_tree = memnew( Tree );
+ vmem_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_tree->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmmc->add_child(vmem_tree);
+ vmmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_vb->add_child(vmmc);
+
+ vmem_vb->set_name(TTR("Video Mem"));
+ vmem_tree->set_columns(4);
+ vmem_tree->set_column_titles_visible(true);
+ vmem_tree->set_column_title(0,TTR("Resource Path"));
+ vmem_tree->set_column_expand(0,true);
+ vmem_tree->set_column_expand(1,false);
+ vmem_tree->set_column_title(1,TTR("Type"));
+ vmem_tree->set_column_min_width(1,100);
+ vmem_tree->set_column_expand(2,false);
+ vmem_tree->set_column_title(2,TTR("Format"));
+ vmem_tree->set_column_min_width(2,150);
+ vmem_tree->set_column_expand(3,false);
+ vmem_tree->set_column_title(3,TTR("Usage"));
+ vmem_tree->set_column_min_width(3,80);
+ vmem_tree->set_hide_root(true);
+
+ tabs->add_child(vmem_vb);
+ }
+
+ { // misc
+ VBoxContainer *info_left = memnew( VBoxContainer );
+ info_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ info_left->set_name(TTR("Misc"));
+ tabs->add_child(info_left);
+ clicked_ctrl = memnew( LineEdit );
+ info_left->add_margin_child(TTR("Clicked Control:"),clicked_ctrl);
+ clicked_ctrl_type = memnew( LineEdit );
+ info_left->add_margin_child(TTR("Clicked Control Type:"),clicked_ctrl_type);
+
+ live_edit_root = memnew( LineEdit );
+
+ {
+ HBoxContainer *lehb = memnew( HBoxContainer );
+ Label *l = memnew( Label(TTR("Live Edit Root:")) );
+ lehb->add_child(l);
+ l->set_h_size_flags(SIZE_EXPAND_FILL);
+ le_set = memnew( Button(TTR("Set From Tree")) );
+ lehb->add_child(le_set);
+ le_clear = memnew( Button(TTR("Clear")) );
+ lehb->add_child(le_clear);
+ info_left->add_child(lehb);
+ MarginContainer *mc = memnew( MarginContainer );
+ mc->add_child(live_edit_root);
+ info_left->add_child(mc);
+ le_set->set_disabled(true);
+ le_clear->set_disabled(true);
+ }
+
+ }
+
+
+
+ msgdialog = memnew( AcceptDialog );
+ add_child(msgdialog);
+
+ p_editor->get_undo_redo()->set_method_notify_callback(_method_changeds,this);
+ p_editor->get_undo_redo()->set_property_notify_callback(_property_changeds,this);
+ live_debug=false;
+ last_path_id=false;
+ error_count=0;
+ hide_on_stop=true;
+ last_error_count=0;
+
+ EditorNode::get_singleton()->get_pause_button()->connect("pressed",this,"_paused");
+
+
+}
+
+ScriptEditorDebugger::~ScriptEditorDebugger() {
+
+ //inspector->edit(NULL);
+ memdelete(variables);
+
+ ppeer->set_stream_peer(Ref<StreamPeer>());
+
+ server->stop();
+ memdelete(inspected_object);
+
+}
diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h
new file mode 100644
index 0000000000..a02934bbaf
--- /dev/null
+++ b/editor/script_editor_debugger.h
@@ -0,0 +1,226 @@
+/*************************************************************************/
+/* script_editor_debugger.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SCRIPT_EDITOR_DEBUGGER_H
+#define SCRIPT_EDITOR_DEBUGGER_H
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "core/io/tcp_server.h"
+#include "core/io/packet_peer.h"
+#include "property_editor.h"
+
+class Tree;
+class PropertyEditor;
+class EditorNode;
+class ScriptEditorDebuggerVariables;
+class LineEdit;
+class TabContainer;
+class RichTextLabel;
+class TextureButton;
+class AcceptDialog;
+class TreeItem;
+class HSplitContainer;
+class ItemList;
+class EditorProfiler;
+
+
+
+class ScriptEditorDebuggerInspectedObject;
+
+class ScriptEditorDebugger : public Control {
+
+ GDCLASS( ScriptEditorDebugger, Control );
+
+ AcceptDialog *msgdialog;
+
+
+ Button *debugger_button;
+
+ LineEdit *clicked_ctrl;
+ LineEdit *clicked_ctrl_type;
+ LineEdit *live_edit_root;
+ Button *le_set;
+ Button *le_clear;
+
+
+
+ Tree *inspect_scene_tree;
+ HSplitContainer *inspect_info;
+ PropertyEditor *inspect_properties;
+ float inspect_scene_tree_timeout;
+ float inspect_edited_object_timeout;
+ ObjectID inspected_object_id;
+ ScriptEditorDebuggerInspectedObject *inspected_object;
+ bool updating_scene_tree;
+ Set<ObjectID> unfold_cache;
+
+
+
+ HSplitContainer *error_split;
+ ItemList *error_list;
+ ItemList *error_stack;
+
+ int error_count;
+ int last_error_count;
+
+ bool hide_on_stop;
+
+
+
+ TabContainer *tabs;
+
+ LineEdit *reason;
+ ScriptEditorDebuggerVariables *variables;
+
+ Button *step;
+ Button *next;
+ Button *back;
+ Button *forward;
+ Button *dobreak;
+ Button *docontinue;
+
+ List<Vector<float> > perf_history;
+ Vector<float> perf_max;
+ Vector<TreeItem*> perf_items;
+
+ Map<int,String> profiler_signature;
+
+ Tree *perf_monitors;
+ Control *perf_draw;
+
+ Tree *vmem_tree;
+ Button *vmem_refresh;
+ LineEdit *vmem_total;
+
+ Tree *stack_dump;
+ PropertyEditor *inspector;
+
+ Ref<TCP_Server> server;
+ Ref<StreamPeerTCP> connection;
+ Ref<PacketPeerStream> ppeer;
+
+ String message_type;
+ Array message;
+ int pending_in_queue;
+
+ HashMap<NodePath,int> node_path_cache;
+ int last_path_id;
+ Map<String,int> res_path_cache;
+
+ EditorProfiler *profiler;
+
+ EditorNode *editor;
+
+ bool breaked;
+
+ bool live_debug;
+
+ void _performance_draw();
+ void _performance_select(Object *, int, bool);
+ void _stack_dump_frame_selected();
+ void _output_clear();
+
+
+ void _scene_tree_folded(Object* obj);
+ void _scene_tree_selected();
+ void _scene_tree_request();
+ void _parse_message(const String& p_msg,const Array& p_data);
+ void _scene_tree_property_select_object(ObjectID p_object);
+ void _scene_tree_property_value_edited(const String& p_prop,const Variant& p_value);
+
+ void _video_mem_request();
+
+ int _get_node_path_cache(const NodePath& p_path);
+
+ int _get_res_path_cache(const String& p_path);
+
+ void _live_edit_set();
+ void _live_edit_clear();
+
+ void _method_changed(Object*p_base,const StringName& p_name,VARIANT_ARG_DECLARE);
+ void _property_changed(Object*p_base,const StringName& p_property,const Variant& p_value);
+
+ static void _method_changeds(void *p_ud,Object*p_base,const StringName& p_name,VARIANT_ARG_DECLARE);
+ static void _property_changeds(void *p_ud,Object*p_base,const StringName& p_property,const Variant& p_value);
+
+ void _error_selected(int p_idx);
+ void _error_stack_selected(int p_idx);
+
+ void _profiler_activate(bool p_enable);
+ void _profiler_seeked();
+
+
+
+ void _paused();
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+
+ void start();
+ void pause();
+ void unpause();
+ void stop();
+
+ void debug_next();
+ void debug_step();
+ void debug_break();
+ void debug_continue();
+
+ String get_var_value(const String& p_var) const;
+
+ void set_live_debugging(bool p_enable);
+
+ void live_debug_create_node(const NodePath& p_parent,const String& p_type,const String& p_name);
+ void live_debug_instance_node(const NodePath& p_parent,const String& p_path,const String& p_name);
+ void live_debug_remove_node(const NodePath& p_at);
+ void live_debug_remove_and_keep_node(const NodePath& p_at,ObjectID p_keep_id);
+ void live_debug_restore_node(ObjectID p_id,const NodePath& p_at,int p_at_pos);
+ void live_debug_duplicate_node(const NodePath& p_at,const String& p_new_name);
+ void live_debug_reparent_node(const NodePath& p_at,const NodePath& p_new_place,const String& p_new_name,int p_at_pos);
+
+ void set_breakpoint(const String& p_path,int p_line,bool p_enabled);
+
+ void update_live_edit_root();
+
+ void set_hide_on_stop(bool p_hide);
+
+ void set_tool_button(Button *p_tb) { debugger_button=p_tb; }
+
+ void reload_scripts();
+
+ virtual Size2 get_minimum_size() const;
+ ScriptEditorDebugger(EditorNode *p_editor=NULL);
+ ~ScriptEditorDebugger();
+};
+
+#endif // SCRIPT_EDITOR_DEBUGGER_H
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
new file mode 100644
index 0000000000..7d8d6ffcec
--- /dev/null
+++ b/editor/settings_config_dialog.cpp
@@ -0,0 +1,415 @@
+/*************************************************************************/
+/* settings_config_dialog.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "settings_config_dialog.h"
+
+#include "editor_settings.h"
+#include "scene/gui/margin_container.h"
+#include "global_config.h"
+#include "editor_file_system.h"
+#include "editor_node.h"
+#include "os/keyboard.h"
+
+void EditorSettingsDialog::ok_pressed() {
+
+ if (!EditorSettings::get_singleton())
+ return;
+
+ _settings_save();
+ timer->stop();
+
+}
+
+void EditorSettingsDialog::_settings_changed() {
+
+ timer->start();
+}
+
+void EditorSettingsDialog::_settings_property_edited(const String& p_name) {
+
+ String full_name = property_editor->get_full_item_path(p_name);
+
+ // Small usability workaround to update the text color settings when the
+ // color theme is changed
+ if (full_name == "text_editor/theme/color_theme") {
+ property_editor->get_property_editor()->update_tree();
+ }
+}
+
+void EditorSettingsDialog::_settings_save() {
+
+
+ EditorSettings::get_singleton()->notify_changes();
+ EditorSettings::get_singleton()->save();
+
+}
+
+void EditorSettingsDialog::cancel_pressed() {
+
+ if (!EditorSettings::get_singleton())
+ return;
+
+ EditorSettings::get_singleton()->notify_changes();
+
+}
+
+
+void EditorSettingsDialog::popup_edit_settings() {
+
+ if (!EditorSettings::get_singleton())
+ return;
+
+ EditorSettings::get_singleton()->list_text_editor_themes(); // make sure we have an up to date list of themes
+
+ property_editor->edit(EditorSettings::get_singleton());
+ property_editor->get_property_editor()->update_tree();
+
+ search_box->select_all();
+ search_box->grab_focus();
+
+ _update_shortcuts();
+
+ // Restore valid window bounds or pop up at default size.
+ if (EditorSettings::get_singleton()->has("interface/dialogs/editor_settings_bounds")) {
+ popup(EditorSettings::get_singleton()->get("interface/dialogs/editor_settings_bounds"));
+ } else {
+ popup_centered_ratio(0.7);
+ }
+}
+
+void EditorSettingsDialog::_clear_search_box() {
+
+ if (search_box->get_text()=="")
+ return;
+
+ search_box->clear();
+ property_editor->get_property_editor()->update_tree();
+}
+
+void EditorSettingsDialog::_clear_shortcut_search_box() {
+ if (shortcut_search_box->get_text()=="")
+ return;
+
+ shortcut_search_box->clear();
+}
+
+void EditorSettingsDialog::_filter_shortcuts(const String& p_filter) {
+ shortcut_filter = p_filter;
+ _update_shortcuts();
+}
+
+void EditorSettingsDialog::_notification(int p_what) {
+
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ clear_button->set_icon(get_icon("Close", "EditorIcons"));
+ shortcut_clear_button->set_icon(get_icon("Close", "EditorIcons"));
+ } break;
+ case NOTIFICATION_POPUP_HIDE: {
+ EditorSettings::get_singleton()->set("interface/dialogs/editor_settings_bounds", get_rect());
+ } break;
+ }
+}
+
+
+void EditorSettingsDialog::_update_shortcuts() {
+
+ shortcuts->clear();
+
+ List<String> slist;
+ EditorSettings::get_singleton()->get_shortcut_list(&slist);
+ TreeItem *root = shortcuts->create_item();
+
+ Map<String,TreeItem*> sections;
+
+ for(List<String>::Element *E=slist.front();E;E=E->next()) {
+
+ Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(E->get());
+ if (!sc->has_meta("original"))
+ continue;
+
+ InputEvent original = sc->get_meta("original");
+
+ String section_name = E->get().get_slice("/",0);
+
+ TreeItem *section;
+
+ if (sections.has(section_name)) {
+ section=sections[section_name];
+ } else {
+ section = shortcuts->create_item(root);
+ section->set_text(0,section_name.capitalize());
+
+ sections[section_name]=section;
+ section->set_custom_bg_color(0,get_color("prop_subsection","Editor"));
+ section->set_custom_bg_color(1,get_color("prop_subsection","Editor"));
+ }
+
+ if (shortcut_filter.is_subsequence_ofi(sc->get_name())) {
+ TreeItem *item = shortcuts->create_item(section);
+
+ item->set_text(0,sc->get_name());
+ item->set_text(1,sc->get_as_text());
+ if (!sc->is_shortcut(original) && !(sc->get_shortcut().type==InputEvent::NONE && original.type==InputEvent::NONE)) {
+ item->add_button(1,get_icon("Reload","EditorIcons"),2);
+ }
+ item->add_button(1,get_icon("Edit","EditorIcons"),0);
+ item->add_button(1,get_icon("Close","EditorIcons"),1);
+ item->set_tooltip(0,E->get());
+ item->set_metadata(0,E->get());
+ }
+ }
+
+ // remove sections with no shortcuts
+ for(Map<String,TreeItem*>::Element *E=sections.front();E;E=E->next()) {
+ TreeItem *section = E->get();
+ if (section->get_children() == NULL) {
+ root->remove_child(section);
+ }
+ }
+}
+
+void EditorSettingsDialog::_shortcut_button_pressed(Object* p_item,int p_column,int p_idx) {
+
+ TreeItem *ti=p_item->cast_to<TreeItem>();
+ ERR_FAIL_COND(!ti);
+
+ String item = ti->get_metadata(0);
+ Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(item);
+
+ if (p_idx==0) {
+ press_a_key_label->set_text(TTR("Press a Key.."));
+ last_wait_for_key=InputEvent();
+ press_a_key->popup_centered(Size2(250,80)*EDSCALE);
+ press_a_key->grab_focus();
+ press_a_key->get_ok()->set_focus_mode(FOCUS_NONE);
+ press_a_key->get_cancel()->set_focus_mode(FOCUS_NONE);
+ shortcut_configured=item;
+
+ } else if (p_idx==1) {//erase
+ if (!sc.is_valid())
+ return; //pointless, there is nothing
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Erase Shortcut");
+ ur->add_do_method(sc.ptr(),"set_shortcut",InputEvent());
+ ur->add_undo_method(sc.ptr(),"set_shortcut",sc->get_shortcut());
+ ur->add_do_method(this,"_update_shortcuts");
+ ur->add_undo_method(this,"_update_shortcuts");
+ ur->add_do_method(this,"_settings_changed");
+ ur->add_undo_method(this,"_settings_changed");
+ ur->commit_action();
+ } else if (p_idx==2) {//revert to original
+ if (!sc.is_valid())
+ return; //pointless, there is nothing
+
+ InputEvent original = sc->get_meta("original");
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Restore Shortcut");
+ ur->add_do_method(sc.ptr(),"set_shortcut",original);
+ ur->add_undo_method(sc.ptr(),"set_shortcut",sc->get_shortcut());
+ ur->add_do_method(this,"_update_shortcuts");
+ ur->add_undo_method(this,"_update_shortcuts");
+ ur->add_do_method(this,"_settings_changed");
+ ur->add_undo_method(this,"_settings_changed");
+ ur->commit_action();
+ }
+}
+
+
+void EditorSettingsDialog::_wait_for_key(const InputEvent& p_event) {
+
+
+ if (p_event.type==InputEvent::KEY && p_event.key.pressed && p_event.key.scancode!=0) {
+
+ last_wait_for_key=p_event;
+ String str=keycode_get_string(p_event.key.scancode).capitalize();
+ if (p_event.key.mod.meta)
+ str=TTR("Meta+")+str;
+ if (p_event.key.mod.shift)
+ str=TTR("Shift+")+str;
+ if (p_event.key.mod.alt)
+ str=TTR("Alt+")+str;
+ if (p_event.key.mod.control)
+ str=TTR("Control+")+str;
+
+
+ press_a_key_label->set_text(str);
+ press_a_key->accept_event();
+
+ }
+}
+
+
+
+
+void EditorSettingsDialog::_press_a_key_confirm() {
+
+ if (last_wait_for_key.type!=InputEvent::KEY)
+ return;
+
+ InputEvent ie;
+ ie.type=InputEvent::KEY;
+ ie.key.scancode=last_wait_for_key.key.scancode;
+ ie.key.mod=last_wait_for_key.key.mod;
+
+ Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action("Change Shortcut '"+shortcut_configured+"'");
+ ur->add_do_method(sc.ptr(),"set_shortcut",ie);
+ ur->add_undo_method(sc.ptr(),"set_shortcut",sc->get_shortcut());
+ ur->add_do_method(this,"_update_shortcuts");
+ ur->add_undo_method(this,"_update_shortcuts");
+ ur->add_do_method(this,"_settings_changed");
+ ur->add_undo_method(this,"_settings_changed");
+ ur->commit_action();
+
+
+
+}
+
+void EditorSettingsDialog::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_settings_save"),&EditorSettingsDialog::_settings_save);
+ ClassDB::bind_method(D_METHOD("_settings_changed"),&EditorSettingsDialog::_settings_changed);
+ ClassDB::bind_method(D_METHOD("_settings_property_edited"),&EditorSettingsDialog::_settings_property_edited);
+ ClassDB::bind_method(D_METHOD("_clear_search_box"),&EditorSettingsDialog::_clear_search_box);
+ ClassDB::bind_method(D_METHOD("_clear_shortcut_search_box"),&EditorSettingsDialog::_clear_shortcut_search_box);
+ ClassDB::bind_method(D_METHOD("_shortcut_button_pressed"),&EditorSettingsDialog::_shortcut_button_pressed);
+ ClassDB::bind_method(D_METHOD("_filter_shortcuts"),&EditorSettingsDialog::_filter_shortcuts);
+ ClassDB::bind_method(D_METHOD("_update_shortcuts"),&EditorSettingsDialog::_update_shortcuts);
+ ClassDB::bind_method(D_METHOD("_press_a_key_confirm"),&EditorSettingsDialog::_press_a_key_confirm);
+ ClassDB::bind_method(D_METHOD("_wait_for_key"),&EditorSettingsDialog::_wait_for_key);
+
+}
+
+EditorSettingsDialog::EditorSettingsDialog() {
+
+ set_title(TTR("Editor Settings"));
+ set_resizable(true);
+
+ tabs = memnew( TabContainer );
+ add_child(tabs);
+ //set_child_rect(tabs);
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ tabs->add_child(vbc);
+ vbc->set_name(TTR("General"));
+
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ vbc->add_child(hbc);
+
+ Label *l = memnew( Label );
+ l->set_text(TTR("Search:")+" ");
+ hbc->add_child(l);
+
+ search_box = memnew( LineEdit );
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbc->add_child(search_box);
+
+ clear_button = memnew( ToolButton );
+ hbc->add_child(clear_button);
+ clear_button->connect("pressed",this,"_clear_search_box");
+
+ property_editor = memnew( SectionedPropertyEditor );
+ //property_editor->hide_top_label();
+ property_editor->get_property_editor()->set_use_filter(true);
+ property_editor->get_property_editor()->register_text_enter(search_box);
+ property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ vbc->add_child(property_editor);
+ property_editor->get_property_editor()->connect("property_edited", this, "_settings_property_edited");
+
+ vbc = memnew( VBoxContainer );
+ tabs->add_child(vbc);
+ vbc->set_name(TTR("Shortcuts"));
+
+ hbc = memnew( HBoxContainer );
+ hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ vbc->add_child(hbc);
+
+ l = memnew( Label );
+ l->set_text(TTR("Search:")+" ");
+ hbc->add_child(l);
+
+ shortcut_search_box = memnew( LineEdit );
+ shortcut_search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbc->add_child(shortcut_search_box);
+ shortcut_search_box->connect("text_changed", this, "_filter_shortcuts");
+
+ shortcut_clear_button = memnew( ToolButton );
+ hbc->add_child(shortcut_clear_button);
+ shortcut_clear_button->connect("pressed",this,"_clear_shortcut_search_box");
+
+ shortcuts = memnew( Tree );
+ vbc->add_margin_child("Shortcut List:",shortcuts,true);
+ shortcuts->set_columns(2);
+ shortcuts->set_hide_root(true);
+ //shortcuts->set_hide_folding(true);
+ shortcuts->set_column_titles_visible(true);
+ shortcuts->set_column_title(0,"Name");
+ shortcuts->set_column_title(1,"Binding");
+ shortcuts->connect("button_pressed",this,"_shortcut_button_pressed");
+
+ press_a_key = memnew( ConfirmationDialog );
+ press_a_key->set_focus_mode(FOCUS_ALL);
+ add_child(press_a_key);
+
+ l = memnew( Label );
+ l->set_text(TTR("Press a Key.."));
+ l->set_area_as_parent_rect();
+ l->set_align(Label::ALIGN_CENTER);
+ l->set_margin(MARGIN_TOP,20);
+ l->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_BEGIN,30);
+ press_a_key_label=l;
+ press_a_key->add_child(l);
+ press_a_key->connect("gui_input",this,"_wait_for_key");
+ press_a_key->connect("confirmed",this,"_press_a_key_confirm");
+ //Button *load = memnew( Button );
+
+ //load->set_text("Load..");
+ //hbc->add_child(load);
+
+
+ //get_ok()->set_text("Apply");
+ set_hide_on_ok(true);
+ //get_cancel()->set_text("Close");
+
+ timer = memnew( Timer );
+ timer->set_wait_time(1.5);
+ timer->connect("timeout",this,"_settings_save");
+ timer->set_one_shot(true);
+ add_child(timer);
+ EditorSettings::get_singleton()->connect("settings_changed",this,"_settings_changed");
+ get_ok()->set_text(TTR("Close"));
+
+ updating=false;
+
+}
diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h
new file mode 100644
index 0000000000..17a05c27d3
--- /dev/null
+++ b/editor/settings_config_dialog.h
@@ -0,0 +1,94 @@
+/*************************************************************************/
+/* settings_config_dialog.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SETTINGS_CONFIG_DIALOG_H
+#define SETTINGS_CONFIG_DIALOG_H
+
+
+#include "property_editor.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/rich_text_label.h"
+
+class EditorSettingsDialog : public AcceptDialog {
+
+ GDCLASS(EditorSettingsDialog,AcceptDialog);
+
+
+
+ bool updating;
+
+ TabContainer *tabs;
+
+ LineEdit *search_box;
+ LineEdit *shortcut_search_box;
+ ToolButton *clear_button;
+ ToolButton *shortcut_clear_button;
+ SectionedPropertyEditor *property_editor;
+
+ Timer *timer;
+
+ Tree *shortcuts;
+
+ ConfirmationDialog *press_a_key;
+ Label *press_a_key_label;
+ InputEvent last_wait_for_key;
+ String shortcut_configured;
+ String shortcut_filter;
+
+ virtual void cancel_pressed();
+ virtual void ok_pressed();
+
+ void _settings_changed();
+ void _settings_property_edited(const String& p_name);
+ void _settings_save();
+
+ void _notification(int p_what);
+
+
+ void _press_a_key_confirm();
+ void _wait_for_key(const InputEvent& p_event);
+
+ void _clear_shortcut_search_box();
+ void _clear_search_box();
+
+ void _filter_shortcuts(const String& p_filter);
+
+ void _update_shortcuts();
+ void _shortcut_button_pressed(Object* p_item,int p_column,int p_idx);
+
+protected:
+
+ static void _bind_methods();
+public:
+
+ void popup_edit_settings();
+
+ EditorSettingsDialog();
+};
+
+#endif // SETTINGS_CONFIG_DIALOG_H
diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp
new file mode 100644
index 0000000000..825db5356b
--- /dev/null
+++ b/editor/spatial_editor_gizmos.cpp
@@ -0,0 +1,3483 @@
+/*************************************************************************/
+/* spatial_editor_gizmos.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#include "spatial_editor_gizmos.h"
+
+#include "geometry.h"
+#include "scene/3d/camera.h"
+#include "scene/resources/surface_tool.h"
+#include "scene/resources/sphere_shape.h"
+#include "scene/resources/box_shape.h"
+#include "scene/resources/capsule_shape.h"
+#include "scene/resources/ray_shape.h"
+#include "scene/resources/convex_polygon_shape.h"
+#include "scene/resources/plane_shape.h"
+#include "quick_hull.h"
+
+// Keep small children away from this file.
+// It's so ugly it will eat them alive
+
+
+
+#define HANDLE_HALF_SIZE 0.05
+
+void EditorSpatialGizmo::clear() {
+
+ for(int i=0;i<instances.size();i++) {
+
+ if (instances[i].instance.is_valid())
+ VS::get_singleton()->free(instances[i].instance);
+
+
+ }
+
+ billboard_handle=false;
+ collision_segments.clear();
+ collision_mesh=Ref<TriangleMesh>();
+ instances.clear();
+ handles.clear();
+ secondary_handles.clear();
+}
+
+void EditorSpatialGizmo::redraw() {
+
+ if (get_script_instance() && get_script_instance()->has_method("redraw"))
+ get_script_instance()->call("redraw");
+
+
+}
+
+void EditorSpatialGizmo::Instance::create_instance(Spatial *p_base) {
+
+ instance = VS::get_singleton()->instance_create2(mesh->get_rid(),p_base->get_world()->get_scenario());
+ VS::get_singleton()->instance_attach_object_instance_ID(instance,p_base->get_instance_ID());
+ if (billboard)
+ VS::get_singleton()->instance_geometry_set_flag(instance,VS::INSTANCE_FLAG_BILLBOARD,true);
+ if (unscaled)
+ VS::get_singleton()->instance_geometry_set_flag(instance,VS::INSTANCE_FLAG_DEPH_SCALE,true);
+ if (skeleton.is_valid())
+ VS::get_singleton()->instance_attach_skeleton(instance,skeleton);
+ if (extra_margin)
+ VS::get_singleton()->instance_set_extra_visibility_margin(instance,1);
+ VS::get_singleton()->instance_geometry_set_cast_shadows_setting(instance,VS::SHADOW_CASTING_SETTING_OFF);
+ VS::get_singleton()->instance_set_layer_mask(instance,1<<SpatialEditorViewport::GIZMO_EDIT_LAYER); //gizmos are 26
+}
+
+
+
+void EditorSpatialGizmo::add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard, const RID &p_skeleton) {
+
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ ins.billboard=p_billboard;
+ ins.mesh=p_mesh;
+ ins.skeleton=p_skeleton;
+ if (valid) {
+ ins.create_instance(spatial_node);
+ VS::get_singleton()->instance_set_transform(ins.instance,spatial_node->get_global_transform());
+ }
+
+ instances.push_back(ins);
+
+}
+
+void EditorSpatialGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material,bool p_billboard){
+
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ Ref<Mesh> mesh = memnew( Mesh );
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+
+ a[Mesh::ARRAY_VERTEX]=p_lines;
+
+ PoolVector<Color> color;
+ color.resize(p_lines.size());
+ {
+ PoolVector<Color>::Write w = color.write();
+ for(int i=0;i<p_lines.size();i++) {
+ if (is_selected())
+ w[i]=Color(1,1,1,0.6);
+ else
+ w[i]=Color(1,1,1,0.25);
+ }
+
+ }
+
+ a[Mesh::ARRAY_COLOR]=color;
+
+
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES,a);
+ mesh->surface_set_material(0,p_material);
+
+ if (p_billboard) {
+ float md=0;
+ for(int i=0;i<p_lines.size();i++) {
+
+ md=MAX(0,p_lines[i].length());
+
+ }
+ if (md) {
+ mesh->set_custom_aabb(Rect3(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0));
+ }
+ }
+
+ ins.billboard=p_billboard;
+ ins.mesh=mesh;
+ if (valid) {
+ ins.create_instance(spatial_node);
+ VS::get_singleton()->instance_set_transform(ins.instance,spatial_node->get_global_transform());
+ }
+
+ instances.push_back(ins);
+
+}
+
+void EditorSpatialGizmo::add_unscaled_billboard(const Ref<Material>& p_material,float p_scale) {
+
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ Vector<Vector3 > vs;
+ Vector<Vector2 > uv;
+
+ vs.push_back(Vector3(-p_scale,p_scale,0));
+ vs.push_back(Vector3(p_scale,p_scale,0));
+ vs.push_back(Vector3(p_scale,-p_scale,0));
+ vs.push_back(Vector3(-p_scale,-p_scale,0));
+
+ uv.push_back(Vector2(1,0));
+ uv.push_back(Vector2(0,0));
+ uv.push_back(Vector2(0,1));
+ uv.push_back(Vector2(1,1));
+
+ Ref<Mesh> mesh = memnew( Mesh );
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[Mesh::ARRAY_VERTEX]=vs;
+ a[Mesh::ARRAY_TEX_UV]=uv;
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLE_FAN,a);
+ mesh->surface_set_material(0,p_material);
+
+ if (true) {
+ float md=0;
+ for(int i=0;i<vs.size();i++) {
+
+ md=MAX(0,vs[i].length());
+
+ }
+ if (md) {
+ mesh->set_custom_aabb(Rect3(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0));
+ }
+ }
+
+ ins.mesh=mesh;
+ ins.unscaled=true;
+ ins.billboard=true;
+ if (valid) {
+ ins.create_instance(spatial_node);
+ VS::get_singleton()->instance_set_transform(ins.instance,spatial_node->get_global_transform());
+ }
+
+ instances.push_back(ins);
+
+
+}
+
+void EditorSpatialGizmo::add_collision_triangles(const Ref<TriangleMesh>& p_tmesh) {
+
+ collision_mesh=p_tmesh;
+}
+
+void EditorSpatialGizmo::add_collision_segments(const Vector<Vector3> &p_lines) {
+
+ int from=collision_segments.size();
+ collision_segments.resize(from+p_lines.size());
+ for(int i=0;i<p_lines.size();i++) {
+
+ collision_segments[from+i]=p_lines[i];
+ }
+}
+
+
+void EditorSpatialGizmo::add_handles(const Vector<Vector3> &p_handles, bool p_billboard,bool p_secondary){
+
+ billboard_handle=p_billboard;
+
+ if (!is_selected())
+ return;
+
+ ERR_FAIL_COND(!spatial_node);
+
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+
+ Ref<Mesh> mesh = memnew( Mesh );
+#if 1
+
+ Array a;
+ a.resize(VS::ARRAY_MAX);
+ a[VS::ARRAY_VERTEX]=p_handles;
+ print_line("handles?: "+itos(p_handles.size()));
+ PoolVector<Color> colors;
+ {
+ colors.resize(p_handles.size());
+ PoolVector<Color>::Write w=colors.write();
+ for(int i=0;i<p_handles.size();i++) {
+
+ Color col(1,1,1,1);
+ if (SpatialEditor::get_singleton()->get_over_gizmo_handle()!=i)
+ col=Color(0.9,0.9,0.9,0.9);
+ w[i]=col;
+ }
+
+ }
+ a[VS::ARRAY_COLOR]=colors;
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS,a);
+ mesh->surface_set_material(0,SpatialEditorGizmos::singleton->handle2_material);
+
+ if (p_billboard) {
+ float md=0;
+ for(int i=0;i<p_handles.size();i++) {
+
+ md=MAX(0,p_handles[i].length());
+
+ }
+ if (md) {
+ mesh->set_custom_aabb(Rect3(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0));
+ }
+ }
+
+
+
+#else
+ for(int ih=0;ih<p_handles.size();ih++) {
+
+
+ Vector<Vector3> vertices;
+ Vector<Vector3> normals;
+
+ int vtx_idx=0;
+
+#define ADD_VTX(m_idx) \
+ vertices.push_back( (face_points[m_idx]*HANDLE_HALF_SIZE+p_handles[ih]) );\
+ normals.push_back( normal_points[m_idx] );\
+ vtx_idx++;\
+
+ for (int i=0;i<6;i++) {
+
+
+ Vector3 face_points[4];
+ Vector3 normal_points[4];
+ float uv_points[8]={0,0,0,1,1,1,1,0};
+
+ for (int j=0;j<4;j++) {
+
+ float v[3];
+ v[0]=1.0;
+ v[1]=1-2*((j>>1)&1);
+ v[2]=v[1]*(1-2*(j&1));
+
+ for (int k=0;k<3;k++) {
+
+ if (i<3)
+ face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ else
+ face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ }
+ normal_points[j]=Vector3();
+ normal_points[j][i%3]=(i>=3?-1:1);
+ }
+ //tri 1
+ ADD_VTX(0);
+ ADD_VTX(1);
+ ADD_VTX(2);
+ //tri 2
+ ADD_VTX(2);
+ ADD_VTX(3);
+ ADD_VTX(0);
+
+ }
+
+
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[VisualServer::ARRAY_NORMAL]= normals ;
+ d[VisualServer::ARRAY_VERTEX]= vertices ;
+
+ mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES,d);
+ mesh->surface_set_material(ih,SpatialEditorGizmos::singleton->handle_material);
+
+
+ }
+#endif
+ ins.mesh=mesh;
+ ins.billboard=p_billboard;
+ ins.extra_margin=true;
+ if (valid) {
+ ins.create_instance(spatial_node);
+ VS::get_singleton()->instance_set_transform(ins.instance,spatial_node->get_global_transform());
+ }
+ instances.push_back(ins);
+ if (!p_secondary) {
+ int chs=handles.size();
+ handles.resize(chs+p_handles.size());
+ for(int i=0;i<p_handles.size();i++) {
+ handles[i+chs]=p_handles[i];
+ }
+ } else {
+
+ int chs=secondary_handles.size();
+ secondary_handles.resize(chs+p_handles.size());
+ for(int i=0;i<p_handles.size();i++) {
+ secondary_handles[i+chs]=p_handles[i];
+ }
+
+ }
+
+}
+
+
+void EditorSpatialGizmo::set_spatial_node(Spatial *p_node){
+
+ ERR_FAIL_NULL(p_node);
+ spatial_node=p_node;
+
+}
+
+bool EditorSpatialGizmo::intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum) {
+
+ ERR_FAIL_COND_V(!spatial_node,false);
+ ERR_FAIL_COND_V(!valid,false);
+
+ if (collision_segments.size()) {
+
+ const Plane *p=p_frustum.ptr();
+ int fc=p_frustum.size();
+
+ int vc=collision_segments.size();
+ const Vector3* vptr=collision_segments.ptr();
+ Transform t = spatial_node->get_global_transform();
+
+ for(int i=0;i<vc/2;i++) {
+
+
+ Vector3 a=t.xform(vptr[i*2+0]);
+ Vector3 b=t.xform(vptr[i*2+1]);
+
+ bool any_out=false;
+ for(int j=0;j<fc;j++) {
+
+ if (p[j].distance_to(a) > 0 && p[j].distance_to(b) >0) {
+
+ any_out=true;
+ break;
+ }
+ }
+
+ if (!any_out)
+ return true;
+ }
+
+ return false;
+ }
+
+ return false;
+}
+
+
+bool EditorSpatialGizmo::intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle,bool p_sec_first) {
+
+ ERR_FAIL_COND_V(!spatial_node,false);
+ ERR_FAIL_COND_V(!valid,false);
+
+ if (r_gizmo_handle) {
+
+ Transform t = spatial_node->get_global_transform();
+ t.orthonormalize();
+ if (billboard_handle) {
+ t.set_look_at(t.origin,t.origin+p_camera->get_transform().basis.get_axis(2),p_camera->get_transform().basis.get_axis(1));
+ }
+
+ float min_d=1e20;
+ int idx=-1;
+
+ for(int i=0;i<secondary_handles.size();i++) {
+
+ Vector3 hpos = t.xform(secondary_handles[i]);
+ Vector2 p = p_camera->unproject_position(hpos);
+ if (p.distance_to(p_point)<SpatialEditorGizmos::singleton->handle_t->get_width()*0.6) {
+
+
+ real_t dp = p_camera->get_transform().origin.distance_to(hpos);
+ if (dp<min_d) {
+
+ r_pos=t.xform(hpos);
+ r_normal=p_camera->get_transform().basis.get_axis(2);
+ min_d=dp;
+ idx=i+handles.size();
+
+ }
+ }
+ }
+
+ if (p_sec_first && idx!=-1) {
+
+ *r_gizmo_handle=idx;
+ return true;
+ }
+
+ min_d=1e20;
+
+ for(int i=0;i<handles.size();i++) {
+
+ Vector3 hpos = t.xform(handles[i]);
+ Vector2 p = p_camera->unproject_position(hpos);
+ if (p.distance_to(p_point)<SpatialEditorGizmos::singleton->handle_t->get_width()*0.6) {
+
+
+ real_t dp = p_camera->get_transform().origin.distance_to(hpos);
+ if (dp<min_d) {
+
+ r_pos=t.xform(hpos);
+ r_normal=p_camera->get_transform().basis.get_axis(2);
+ min_d=dp;
+ idx=i;
+
+ }
+ }
+ }
+
+ if (idx>=0) {
+ *r_gizmo_handle=idx;
+ return true;
+ }
+
+
+ }
+
+ if (collision_segments.size()) {
+
+ Plane camp(p_camera->get_transform().origin,(-p_camera->get_transform().basis.get_axis(2)).normalized());
+
+ int vc=collision_segments.size();
+ const Vector3* vptr=collision_segments.ptr();
+ Transform t = spatial_node->get_global_transform();
+ if (billboard_handle) {
+ t.set_look_at(t.origin,t.origin+p_camera->get_transform().basis.get_axis(2),p_camera->get_transform().basis.get_axis(1));
+ }
+
+ Vector3 cp;
+ float cpd=1e20;
+
+ for(int i=0;i<vc/2;i++) {
+
+
+ Vector3 a=t.xform(vptr[i*2+0]);
+ Vector3 b=t.xform(vptr[i*2+1]);
+ Vector2 s[2];
+ s[0] = p_camera->unproject_position(a);
+ s[1] = p_camera->unproject_position(b);
+
+
+ Vector2 p = Geometry::get_closest_point_to_segment_2d(p_point,s);
+
+ float pd = p.distance_to(p_point);
+
+ if (pd<cpd) {
+
+
+ float d = s[0].distance_to(s[1]);
+ Vector3 tcp;
+ if (d>0) {
+
+ float d2=s[0].distance_to(p)/d;
+ tcp = a+(b-a)*d2;
+
+ } else {
+ tcp=a;
+
+ }
+
+ if (camp.distance_to(tcp)<p_camera->get_znear())
+ continue;
+ cp=tcp;
+ cpd=pd;
+ }
+ }
+
+ if (cpd<8) {
+
+ r_pos=cp;
+ r_normal=-p_camera->project_ray_normal(p_point);
+ return true;
+ }
+
+ return false;
+ }
+
+
+ if (collision_mesh.is_valid()) {
+ Transform gt = spatial_node->get_global_transform();
+
+ if (billboard_handle) {
+ gt.set_look_at(gt.origin,gt.origin+p_camera->get_transform().basis.get_axis(2),p_camera->get_transform().basis.get_axis(1));
+ }
+
+ Transform ai=gt.affine_inverse();
+ Vector3 ray_from = ai.xform(p_camera->project_ray_origin(p_point));
+ Vector3 ray_dir=ai.basis.xform(p_camera->project_ray_normal(p_point)).normalized();
+ Vector3 rpos,rnorm;
+
+
+ if (collision_mesh->intersect_ray(ray_from,ray_dir,rpos,rnorm)) {
+
+ r_pos=gt.xform(rpos);
+ r_normal=gt.basis.xform(rnorm).normalized();
+ return true;
+ }
+ }
+
+ return false;
+
+}
+
+
+
+void EditorSpatialGizmo::create() {
+
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(valid);
+ valid=true;
+
+ for(int i=0;i<instances.size();i++) {
+
+ instances[i].create_instance(spatial_node);
+ }
+
+ transform();
+
+}
+
+void EditorSpatialGizmo::transform(){
+
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(!valid);
+ for(int i=0;i<instances.size();i++) {
+ VS::get_singleton()->instance_set_transform(instances[i].instance,spatial_node->get_global_transform());
+ }
+
+}
+
+
+void EditorSpatialGizmo::free(){
+
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(!valid);
+
+ for(int i=0;i<instances.size();i++) {
+
+ if (instances[i].instance.is_valid())
+ VS::get_singleton()->free(instances[i].instance);
+ instances[i].instance=RID();
+ }
+
+ valid=false;
+
+
+}
+
+
+void EditorSpatialGizmo::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("add_lines","lines","material:Material","billboard"),&EditorSpatialGizmo::add_lines,DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("add_mesh","mesh:Mesh","billboard","skeleton"),&EditorSpatialGizmo::add_mesh,DEFVAL(false),DEFVAL(RID()));
+ ClassDB::bind_method(D_METHOD("add_collision_segments","segments"),&EditorSpatialGizmo::add_collision_segments);
+ ClassDB::bind_method(D_METHOD("add_collision_triangles","triangles:TriangleMesh"),&EditorSpatialGizmo::add_collision_triangles);
+ ClassDB::bind_method(D_METHOD("add_unscaled_billboard","material:Material","default_scale"),&EditorSpatialGizmo::add_unscaled_billboard,DEFVAL(1));
+ ClassDB::bind_method(D_METHOD("add_handles","handles","billboard","secondary"),&EditorSpatialGizmo::add_handles,DEFVAL(false),DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("set_spatial_node","node:Spatial"),&EditorSpatialGizmo::_set_spatial_node);
+ ClassDB::bind_method(D_METHOD("clear"),&EditorSpatialGizmo::clear);
+
+ BIND_VMETHOD( MethodInfo("redraw"));
+ BIND_VMETHOD( MethodInfo(Variant::STRING,"get_handle_name",PropertyInfo(Variant::INT,"index")));
+ BIND_VMETHOD( MethodInfo("get_handle_value:Variant",PropertyInfo(Variant::INT,"index")));
+ BIND_VMETHOD( MethodInfo("set_handle",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::OBJECT,"camera:Camera"),PropertyInfo(Variant::VECTOR2,"point")));
+ MethodInfo cm = MethodInfo("commit_handle",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::NIL,"restore:Variant"),PropertyInfo(Variant::BOOL,"cancel"));
+ cm.default_arguments.push_back(false);
+ BIND_VMETHOD( cm );
+}
+
+EditorSpatialGizmo::EditorSpatialGizmo() {
+ valid=false;
+ billboard_handle=false;
+ base=NULL;
+ spatial_node=NULL;
+}
+
+EditorSpatialGizmo::~EditorSpatialGizmo(){
+
+ clear();
+}
+
+Vector3 EditorSpatialGizmo::get_handle_pos(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,handles.size(),Vector3());
+
+ return handles[p_idx];
+
+}
+
+//// light gizmo
+
+
+String LightSpatialGizmo::get_handle_name(int p_idx) const {
+
+ if (p_idx==0)
+ return "Radius";
+ else
+ return "Aperture";
+}
+
+
+Variant LightSpatialGizmo::get_handle_value(int p_idx) const{
+
+ if (p_idx==0)
+ return light->get_param(Light::PARAM_RANGE);
+ if (p_idx==1)
+ return light->get_param(Light::PARAM_SPOT_ANGLE);
+
+ return Variant();
+}
+
+
+static float _find_closest_angle_to_half_pi_arc(const Vector3& p_from, const Vector3& p_to, float p_arc_radius,const Transform& p_arc_xform) {
+
+ //bleh, discrete is simpler
+ static const int arc_test_points=64;
+ float min_d = 1e20;
+ Vector3 min_p;
+
+
+ for(int i=0;i<arc_test_points;i++) {
+
+ float a = i*Math_PI*0.5/arc_test_points;
+ float an = (i+1)*Math_PI*0.5/arc_test_points;
+ Vector3 p=Vector3( Math::cos(a), 0, -Math::sin(a) )*p_arc_radius;
+ Vector3 n=Vector3( Math::cos(an), 0,- Math::sin(an) )*p_arc_radius;
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(p,n,p_from,p_to,ra,rb);
+
+ float d = ra.distance_to(rb);
+ if (d<min_d) {
+ min_d=d;
+ min_p=ra;
+ }
+
+ }
+
+ //min_p = p_arc_xform.affine_inverse().xform(min_p);
+ float a = Vector2(min_p.x,-min_p.z).angle();
+ return a*180.0/Math_PI;
+}
+
+
+void LightSpatialGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point) {
+
+ Transform gt = light->get_global_transform();
+ gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 s[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*4096)};
+ if (p_idx==0) {
+
+ if (light->cast_to<SpotLight>()) {
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),Vector3(0,0,-4096),s[0],s[1],ra,rb);
+
+ float d = -ra.z;
+ if (d<0)
+ d=0;
+
+ light->set_param(Light::PARAM_RANGE,d);
+ } else if (light->cast_to<OmniLight>()) {
+
+ Plane cp=Plane( gt.origin, p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+ if (cp.intersects_ray(ray_from,ray_dir,&inters)) {
+
+ float r = inters.distance_to(gt.origin);
+ light->set_param(Light::PARAM_RANGE,r);
+ }
+
+ }
+
+ } else if (p_idx==1) {
+
+ float a = _find_closest_angle_to_half_pi_arc(s[0],s[1],light->get_param(Light::PARAM_RANGE),gt);
+ light->set_param(Light::PARAM_SPOT_ANGLE,CLAMP(a,0.01,89.99));
+ }
+}
+
+void LightSpatialGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ if (p_cancel) {
+
+ light->set_param(p_idx==0?Light::PARAM_RANGE:Light::PARAM_SPOT_ANGLE,p_restore);
+
+ } else if (p_idx==0) {
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Light Radius"));
+ ur->add_do_method(light,"set_param",Light::PARAM_RANGE,light->get_param(Light::PARAM_RANGE));
+ ur->add_undo_method(light,"set_param",Light::PARAM_RANGE,p_restore);
+ ur->commit_action();
+ } else if (p_idx==1) {
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Light Radius"));
+ ur->add_do_method(light,"set_param",Light::PARAM_SPOT_ANGLE,light->get_param(Light::PARAM_SPOT_ANGLE));
+ ur->add_undo_method(light,"set_param",Light::PARAM_SPOT_ANGLE,p_restore);
+ ur->commit_action();
+
+ }
+}
+
+
+
+void LightSpatialGizmo::redraw() {
+
+
+ if (light->cast_to<DirectionalLight>()) {
+
+
+
+ const int arrow_points=5;
+ Vector3 arrow[arrow_points]={
+ Vector3(0,0,2),
+ Vector3(1,1,2),
+ Vector3(1,1,-1),
+ Vector3(2,2,-1),
+ Vector3(0,0,-3)
+ };
+
+ int arrow_sides=4;
+
+ Vector<Vector3> lines;
+
+
+ for(int i = 0; i < arrow_sides ; i++) {
+
+
+ Basis ma(Vector3(0,0,1),Math_PI*2*float(i)/arrow_sides);
+ Basis mb(Vector3(0,0,1),Math_PI*2*float(i+1)/arrow_sides);
+
+
+ for(int j=1;j<arrow_points-1;j++) {
+
+ if (j!=2) {
+ lines.push_back(ma.xform(arrow[j]));
+ lines.push_back(ma.xform(arrow[j+1]));
+ }
+ if (j<arrow_points-1) {
+ lines.push_back(ma.xform(arrow[j]));
+ lines.push_back(mb.xform(arrow[j]));
+ }
+
+ }
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->light_material);
+ add_collision_segments(lines);
+ add_unscaled_billboard(SpatialEditorGizmos::singleton->light_material_directional_icon,0.05);
+
+ }
+
+ if (light->cast_to<OmniLight>()) {
+
+ clear();
+
+
+ OmniLight *on = light->cast_to<OmniLight>();
+
+ float r = on->get_param(Light::PARAM_RANGE);
+
+ Vector<Vector3> points;
+
+ for(int i=0;i<=360;i++) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+1);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*r;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*r;
+
+ /*points.push_back(Vector3(a.x,0,a.y));
+ points.push_back(Vector3(b.x,0,b.y));
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));*/
+ points.push_back(Vector3(a.x,a.y,0));
+ points.push_back(Vector3(b.x,b.y,0));
+
+ }
+
+ add_lines(points,SpatialEditorGizmos::singleton->light_material,true);
+ add_collision_segments(points);
+
+ add_unscaled_billboard(SpatialEditorGizmos::singleton->light_material_omni_icon,0.05);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(r,0,0));
+ add_handles(handles,true);
+
+
+ }
+
+
+ if (light->cast_to<SpotLight>()) {
+
+ clear();
+
+ Vector<Vector3> points;
+ SpotLight *on = light->cast_to<SpotLight>();
+
+ float r = on->get_param(Light::PARAM_RANGE);
+ float w = r*Math::sin(Math::deg2rad(on->get_param(Light::PARAM_SPOT_ANGLE)));
+ float d = r*Math::cos(Math::deg2rad(on->get_param(Light::PARAM_SPOT_ANGLE)));
+
+
+
+ for(int i=0;i<360;i++) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+1);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*w;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*w;
+
+ /*points.push_back(Vector3(a.x,0,a.y));
+ points.push_back(Vector3(b.x,0,b.y));
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));*/
+ points.push_back(Vector3(a.x,a.y,-d));
+ points.push_back(Vector3(b.x,b.y,-d));
+
+ if (i%90==0) {
+
+ points.push_back(Vector3(a.x,a.y,-d));
+ points.push_back(Vector3());
+
+ }
+
+
+ }
+
+ points.push_back(Vector3(0,0,-r));
+ points.push_back(Vector3());
+
+ add_lines(points,SpatialEditorGizmos::singleton->light_material);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(0,0,-r));
+
+ Vector<Vector3> collision_segments;
+
+ for(int i=0;i<64;i++) {
+
+ float ra=i*Math_PI*2.0/64.0;
+ float rb=(i+1)*Math_PI*2.0/64.0;
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*w;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*w;
+
+ collision_segments.push_back(Vector3(a.x,a.y,-d));
+ collision_segments.push_back(Vector3(b.x,b.y,-d));
+
+ if (i%16==0) {
+
+ collision_segments.push_back(Vector3(a.x,a.y,-d));
+ collision_segments.push_back(Vector3());
+
+ }
+
+ if (i==16) {
+
+ handles.push_back(Vector3(a.x,a.y,-d));
+ }
+
+ }
+
+ collision_segments.push_back(Vector3(0,0,-r));
+ collision_segments.push_back(Vector3());
+
+
+ add_handles(handles);
+ add_collision_segments(collision_segments);
+ add_unscaled_billboard(SpatialEditorGizmos::singleton->light_material_omni_icon,0.05);
+
+ }
+
+}
+
+LightSpatialGizmo::LightSpatialGizmo(Light* p_light){
+
+ light=p_light;
+ set_spatial_node(p_light);
+
+}
+
+//////
+
+String CameraSpatialGizmo::get_handle_name(int p_idx) const {
+
+ if (camera->get_projection()==Camera::PROJECTION_PERSPECTIVE) {
+ return "FOV";
+ } else {
+ return "Size";
+ }
+}
+Variant CameraSpatialGizmo::get_handle_value(int p_idx) const{
+
+ if (camera->get_projection()==Camera::PROJECTION_PERSPECTIVE) {
+ return camera->get_fov();
+ } else {
+
+ return camera->get_size();
+ }
+}
+void CameraSpatialGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+
+ Transform gt = camera->get_global_transform();
+ gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 s[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*4096)};
+
+ if (camera->get_projection()==Camera::PROJECTION_PERSPECTIVE) {
+ Transform gt=camera->get_global_transform();
+ float a = _find_closest_angle_to_half_pi_arc(s[0],s[1],1.0,gt);
+ camera->set("fov",a);
+ } else {
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(0,0,-1),Vector3(4096,0,-1),s[0],s[1],ra,rb);
+ float d = ra.x * 2.0;
+ if (d<0)
+ d=0;
+
+ camera->set("size",d);
+ }
+
+}
+void CameraSpatialGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ if (camera->get_projection()==Camera::PROJECTION_PERSPECTIVE) {
+
+ if (p_cancel) {
+
+ camera->set("fov",p_restore);
+ } else {
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Camera FOV"));
+ ur->add_do_property(camera,"fov",camera->get_fov());
+ ur->add_undo_property(camera,"fov",p_restore);
+ ur->commit_action();
+ }
+
+ } else {
+
+ if (p_cancel) {
+
+ camera->set("size",p_restore);
+ } else {
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Camera Size"));
+ ur->add_do_property(camera,"size",camera->get_size());
+ ur->add_undo_property(camera,"size",p_restore);
+ ur->commit_action();
+ }
+
+ }
+
+}
+
+void CameraSpatialGizmo::redraw(){
+
+ clear();
+
+ Vector<Vector3> lines;
+ Vector<Vector3> handles;
+
+
+ switch(camera->get_projection()) {
+
+ case Camera::PROJECTION_PERSPECTIVE: {
+
+ float fov = camera->get_fov();
+
+ Vector3 side=Vector3( Math::sin(Math::deg2rad(fov)), 0, -Math::cos(Math::deg2rad(fov)) );
+ Vector3 nside=side;
+ nside.x=-nside.x;
+ Vector3 up=Vector3(0,side.x,0);
+
+
+#define ADD_TRIANGLE( m_a, m_b, m_c)\
+{\
+ lines.push_back(m_a);\
+ lines.push_back(m_b);\
+ lines.push_back(m_b);\
+ lines.push_back(m_c);\
+ lines.push_back(m_c);\
+ lines.push_back(m_a);\
+}
+
+ ADD_TRIANGLE( Vector3(), side+up, side-up );
+ ADD_TRIANGLE( Vector3(), nside+up, nside-up );
+ ADD_TRIANGLE( Vector3(), side+up, nside+up );
+ ADD_TRIANGLE( Vector3(), side-up, nside-up );
+
+ handles.push_back(side);
+ side.x*=0.25;
+ nside.x*=0.25;
+ Vector3 tup( 0, up.y*3/2,side.z);
+ ADD_TRIANGLE( tup, side+up, nside+up );
+
+ } break;
+ case Camera::PROJECTION_ORTHOGONAL: {
+
+#define ADD_QUAD( m_a, m_b, m_c, m_d)\
+{\
+ lines.push_back(m_a);\
+ lines.push_back(m_b);\
+ lines.push_back(m_b);\
+ lines.push_back(m_c);\
+ lines.push_back(m_c);\
+ lines.push_back(m_d);\
+ lines.push_back(m_d);\
+ lines.push_back(m_a);\
+}
+ float size = camera->get_size();
+
+ float hsize=size*0.5;
+ Vector3 right(hsize,0,0);
+ Vector3 up(0,hsize,0);
+ Vector3 back(0,0,-1.0);
+ Vector3 front(0,0,0);
+
+ ADD_QUAD( -up-right,-up+right,up+right,up-right);
+ ADD_QUAD( -up-right+back,-up+right+back,up+right+back,up-right+back);
+ ADD_QUAD( up+right,up+right+back,up-right+back,up-right);
+ ADD_QUAD( -up+right,-up+right+back,-up-right+back,-up-right);
+ handles.push_back(right+back);
+
+ right.x*=0.25;
+ Vector3 tup( 0, up.y*3/2,back.z );
+ ADD_TRIANGLE( tup, right+up+back, -right+up+back );
+
+ } break;
+
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->camera_material);
+ add_collision_segments(lines);
+ add_handles(handles);
+}
+
+
+CameraSpatialGizmo::CameraSpatialGizmo(Camera* p_camera){
+
+ camera=p_camera;
+ set_spatial_node(camera);
+}
+
+
+
+
+//////
+
+void MeshInstanceSpatialGizmo::redraw() {
+
+ Ref<Mesh> m = mesh->get_mesh();
+ if (!m.is_valid())
+ return; //none
+
+ Ref<TriangleMesh> tm = m->generate_triangle_mesh();
+ if (tm.is_valid())
+ add_collision_triangles(tm);
+}
+
+MeshInstanceSpatialGizmo::MeshInstanceSpatialGizmo(MeshInstance* p_mesh) {
+
+ mesh=p_mesh;
+ set_spatial_node(p_mesh);
+}
+
+/////
+
+
+void Position3DSpatialGizmo::redraw() {
+
+ clear();
+ add_mesh(SpatialEditorGizmos::singleton->pos3d_mesh);
+ Vector<Vector3> cursor_points;
+ float cs = 0.25;
+ cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));
+ cursor_points.push_back(Vector3(0,0,+cs));
+ cursor_points.push_back(Vector3(0,0,-cs));
+ add_collision_segments(cursor_points);
+
+}
+
+
+Position3DSpatialGizmo::Position3DSpatialGizmo(Position3D* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+
+/////
+
+void SkeletonSpatialGizmo::redraw() {
+
+ clear();
+
+ Ref<SurfaceTool> surface_tool( memnew( SurfaceTool ));
+
+
+ surface_tool->begin(Mesh::PRIMITIVE_LINES);
+ surface_tool->set_material(SpatialEditorGizmos::singleton->skeleton_material);
+ Vector<Transform> grests;
+ grests.resize(skel->get_bone_count());
+
+ Vector<int> bones;
+ Vector<float> weights;
+ bones.resize(4);
+ weights.resize(4);
+
+ for(int i=0;i<4;i++) {
+ bones[i]=0;
+ weights[i]=0;
+ }
+
+ weights[0]=1;
+
+
+ Rect3 aabb;
+
+ Color bonecolor = Color(1.0,0.4,0.4,0.3);
+ Color rootcolor = Color(0.4,1.0,0.4,0.1);
+
+ for (int i=0;i<skel->get_bone_count();i++) {
+
+ int parent = skel->get_bone_parent(i);
+
+ if (parent>=0) {
+ grests[i]=grests[parent] * skel->get_bone_rest(i);
+
+ Vector3 v0 = grests[parent].origin;
+ Vector3 v1 = grests[i].origin;
+ Vector3 d = (v1-v0).normalized();
+ float dist = v0.distance_to(v1);
+
+ //find closest axis
+ int closest=-1;
+ float closest_d = 0.0;
+
+ for(int j=0;j<3;j++) {
+ float dp = Math::abs(grests[parent].basis[j].normalized().dot(d));
+ if (j==0 || dp>closest_d)
+ closest=j;
+ }
+
+ //find closest other
+ Vector3 first;
+ Vector3 points[4];
+ int pointidx=0;
+ for(int j=0;j<3;j++) {
+
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(rootcolor);
+ surface_tool->add_vertex(v0-grests[parent].basis[j].normalized()*dist*0.05);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(rootcolor);
+ surface_tool->add_vertex(v0+grests[parent].basis[j].normalized()*dist*0.05);
+
+ if (j==closest)
+ continue;
+
+ Vector3 axis;
+ if (first==Vector3()) {
+ axis = d.cross(d.cross(grests[parent].basis[j])).normalized();
+ first=axis;
+ } else {
+ axis = d.cross(first).normalized();
+ }
+
+ for(int k=0;k<2;k++) {
+
+ if (k==1)
+ axis=-axis;
+ Vector3 point = v0+d*dist*0.2;
+ point+=axis*dist*0.1;
+
+
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(v0);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(point);
+
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(point);
+ bones[0]=i;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(v1);
+ points[pointidx++]=point;
+
+ }
+
+ }
+
+ SWAP( points[1],points[2] );
+ for(int j=0;j<4;j++) {
+
+
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(points[j]);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(points[(j+1)%4]);
+ }
+
+
+/*
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(0.4,1,0.4,0.4));
+ surface_tool->add_vertex(v0);
+ bones[0]=i;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(0.4,1,0.4,0.4));
+ surface_tool->add_vertex(v1);
+*/
+ } else {
+
+ grests[i]=skel->get_bone_rest(i);
+ bones[0]=i;
+ }
+/*
+ Transform t = grests[i];
+ t.orthonormalize();
+
+ for (int i=0;i<6;i++) {
+
+
+ Vector3 face_points[4];
+
+ for (int j=0;j<4;j++) {
+
+ float v[3];
+ v[0]=1.0;
+ v[1]=1-2*((j>>1)&1);
+ v[2]=v[1]*(1-2*(j&1));
+
+ for (int k=0;k<3;k++) {
+
+ if (i<3)
+ face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ else
+ face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ }
+ }
+
+ for(int j=0;j<4;j++) {
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
+ surface_tool->add_vertex(t.xform(face_points[j]*0.04));
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
+ surface_tool->add_vertex(t.xform(face_points[(j+1)%4]*0.04));
+ }
+
+ }
+ */
+ }
+
+ Ref<Mesh> m = surface_tool->commit();
+ add_mesh(m,false,skel->get_skeleton());
+
+}
+
+SkeletonSpatialGizmo::SkeletonSpatialGizmo(Skeleton* p_skel) {
+
+ skel=p_skel;
+ set_spatial_node(p_skel);
+}
+
+
+
+void RoomSpatialGizmo::redraw() {
+
+ clear();
+ Ref<RoomBounds> roomie = room->get_room();
+ if (roomie.is_null())
+ return;
+ PoolVector<Face3> faces = roomie->get_geometry_hint();
+
+ Vector<Vector3> lines;
+ int fc=faces.size();
+ PoolVector<Face3>::Read r =faces.read();
+
+ Map<_EdgeKey,Vector3> edge_map;
+
+ for(int i=0;i<fc;i++) {
+
+ Vector3 fn = r[i].get_plane().normal;
+
+ for(int j=0;j<3;j++) {
+
+ _EdgeKey ek;
+ ek.from=r[i].vertex[j].snapped(CMP_EPSILON);
+ ek.to=r[i].vertex[(j+1)%3].snapped(CMP_EPSILON);
+ if (ek.from<ek.to)
+ SWAP(ek.from,ek.to);
+
+ Map<_EdgeKey,Vector3>::Element *E=edge_map.find(ek);
+
+ if (E) {
+
+ if (E->get().dot(fn) >0.9) {
+
+ E->get()=Vector3();
+ }
+
+ } else {
+
+ edge_map[ek]=fn;
+ }
+
+ }
+ }
+
+ for(Map<_EdgeKey,Vector3>::Element *E=edge_map.front();E;E=E->next()) {
+
+ if (E->get()!=Vector3()) {
+ lines.push_back(E->key().from);
+ lines.push_back(E->key().to);
+ }
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->room_material);
+ add_collision_segments(lines);
+
+}
+
+RoomSpatialGizmo::RoomSpatialGizmo(Room* p_room){
+
+ set_spatial_node(p_room);
+ room=p_room;
+}
+
+/////
+
+
+void PortalSpatialGizmo::redraw() {
+
+ clear();
+
+ Vector<Point2> points = portal->get_shape();
+ if (points.size()==0) {
+ return;
+ }
+
+ Vector<Vector3> lines;
+
+ Vector3 center;
+ for(int i=0;i<points.size();i++) {
+
+ Vector3 f;
+ f.x=points[i].x;
+ f.y=points[i].y;
+ Vector3 fn;
+ fn.x=points[(i+1)%points.size()].x;
+ fn.y=points[(i+1)%points.size()].y;
+ center+=f;
+
+ lines.push_back(f);
+ lines.push_back(fn);
+ }
+
+ center/=points.size();
+ lines.push_back(center);
+ lines.push_back(center+Vector3(0,0,1));
+
+ add_lines(lines,SpatialEditorGizmos::singleton->portal_material);
+ add_collision_segments(lines);
+
+}
+
+PortalSpatialGizmo::PortalSpatialGizmo(Portal* p_portal){
+
+ set_spatial_node(p_portal);
+ portal=p_portal;
+}
+
+/////
+
+
+void RayCastSpatialGizmo::redraw() {
+
+ clear();
+
+
+ Vector<Vector3> lines;
+
+ lines.push_back(Vector3());
+ lines.push_back(raycast->get_cast_to());
+
+ add_lines(lines,SpatialEditorGizmos::singleton->raycast_material);
+ add_collision_segments(lines);
+
+}
+
+RayCastSpatialGizmo::RayCastSpatialGizmo(RayCast* p_raycast) {
+
+ set_spatial_node(p_raycast);
+ raycast=p_raycast;
+}
+
+
+
+/////
+
+
+void VehicleWheelSpatialGizmo::redraw() {
+
+ clear();
+
+
+ Vector<Vector3> points;
+
+ float r = car_wheel->get_radius();
+ const int skip=10;
+ for(int i=0;i<=360;i+=skip) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+skip);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*r;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*r;
+
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));
+
+ const int springsec=4;
+
+ for(int j=0;j<springsec;j++) {
+ float t = car_wheel->get_suspension_rest_length()*5;
+ points.push_back(Vector3(a.x,i/360.0*t/springsec+j*(t/springsec),a.y)*0.2);
+ points.push_back(Vector3(b.x,(i+skip)/360.0*t/springsec+j*(t/springsec),b.y)*0.2);
+ }
+
+
+ }
+
+ //travel
+ points.push_back(Vector3(0,0,0));
+ points.push_back(Vector3(0,car_wheel->get_suspension_rest_length(),0));
+
+ //axis
+ points.push_back(Vector3(r*0.2,car_wheel->get_suspension_rest_length(),0));
+ points.push_back(Vector3(-r*0.2,car_wheel->get_suspension_rest_length(),0));
+ //axis
+ points.push_back(Vector3(r*0.2,0,0));
+ points.push_back(Vector3(-r*0.2,0,0));
+
+ //forward line
+ points.push_back(Vector3(0,-r,0));
+ points.push_back(Vector3(0,-r,r*2));
+ points.push_back(Vector3(0,-r,r*2));
+ points.push_back(Vector3(r*2*0.2,-r,r*2*0.8));
+ points.push_back(Vector3(0,-r,r*2));
+ points.push_back(Vector3(-r*2*0.2,-r,r*2*0.8));
+
+ add_lines(points,SpatialEditorGizmos::singleton->car_wheel_material);
+ add_collision_segments(points);
+
+}
+
+VehicleWheelSpatialGizmo::VehicleWheelSpatialGizmo(VehicleWheel* p_car_wheel){
+
+ set_spatial_node(p_car_wheel);
+ car_wheel=p_car_wheel;
+}
+
+
+
+///
+
+void TestCubeSpatialGizmo::redraw() {
+
+ clear();
+ add_collision_triangles(SpatialEditorGizmos::singleton->test_cube_tm);
+}
+
+TestCubeSpatialGizmo::TestCubeSpatialGizmo(TestCube* p_tc) {
+
+ tc=p_tc;
+ set_spatial_node(p_tc);
+}
+
+
+///////////
+
+
+
+
+
+
+String CollisionShapeSpatialGizmo::get_handle_name(int p_idx) const {
+
+ Ref<Shape> s = cs->get_shape();
+ if (s.is_null())
+ return "";
+
+ if (s->cast_to<SphereShape>()) {
+
+ return "Radius";
+ }
+
+ if (s->cast_to<BoxShape>()) {
+
+ return "Extents";
+ }
+
+ if (s->cast_to<CapsuleShape>()) {
+
+ return p_idx==0?"Radius":"Height";
+ }
+
+ if (s->cast_to<RayShape>()) {
+
+ return "Length";
+ }
+
+ return "";
+}
+Variant CollisionShapeSpatialGizmo::get_handle_value(int p_idx) const{
+
+ Ref<Shape> s = cs->get_shape();
+ if (s.is_null())
+ return Variant();
+
+ if (s->cast_to<SphereShape>()) {
+
+ Ref<SphereShape> ss = s;
+ return ss->get_radius();
+ }
+
+ if (s->cast_to<BoxShape>()) {
+
+ Ref<BoxShape> bs = s;
+ return bs->get_extents();
+ }
+
+ if (s->cast_to<CapsuleShape>()) {
+
+ Ref<CapsuleShape> cs = s;
+ return p_idx==0?cs->get_radius():cs->get_height();
+ }
+
+ if (s->cast_to<RayShape>()) {
+
+ Ref<RayShape> cs = s;
+ return cs->get_length();
+ }
+
+ return Variant();
+}
+void CollisionShapeSpatialGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+ Ref<Shape> s = cs->get_shape();
+ if (s.is_null())
+ return;
+
+ Transform gt = cs->get_global_transform();
+ gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*4096)};
+
+ if (s->cast_to<SphereShape>()) {
+
+ Ref<SphereShape> ss = s;
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),Vector3(4096,0,0),sg[0],sg[1],ra,rb);
+ float d = ra.x;
+ if (d<0.001)
+ d=0.001;
+
+ ss->set_radius(d);
+ }
+
+ if (s->cast_to<RayShape>()) {
+
+ Ref<RayShape> rs = s;
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),Vector3(0,0,4096),sg[0],sg[1],ra,rb);
+ float d = ra.z;
+ if (d<0.001)
+ d=0.001;
+
+ rs->set_length(d);
+ }
+
+
+ if (s->cast_to<BoxShape>()) {
+
+ Vector3 axis;
+ axis[p_idx]=1.0;
+ Ref<BoxShape> bs = s;
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),axis*4096,sg[0],sg[1],ra,rb);
+ float d = ra[p_idx];
+ if (d<0.001)
+ d=0.001;
+
+ Vector3 he = bs->get_extents();
+ he[p_idx]=d;
+ bs->set_extents(he);
+
+ }
+
+ if (s->cast_to<CapsuleShape>()) {
+
+ Vector3 axis;
+ axis[p_idx==0?0:2]=1.0;
+ Ref<CapsuleShape> cs = s;
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),axis*4096,sg[0],sg[1],ra,rb);
+ float d = axis.dot(ra);
+ if (p_idx==1)
+ d-=cs->get_radius();
+ if (d<0.001)
+ d=0.001;
+
+ if (p_idx==0)
+ cs->set_radius(d);
+ else if (p_idx==1)
+ cs->set_height(d*2.0);
+
+ }
+
+}
+void CollisionShapeSpatialGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+ Ref<Shape> s = cs->get_shape();
+ if (s.is_null())
+ return;
+
+ if (s->cast_to<SphereShape>()) {
+
+ Ref<SphereShape> ss=s;
+ if (p_cancel) {
+ ss->set_radius(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Sphere Shape Radius"));
+ ur->add_do_method(ss.ptr(),"set_radius",ss->get_radius());
+ ur->add_undo_method(ss.ptr(),"set_radius",p_restore);
+ ur->commit_action();
+
+ }
+
+ if (s->cast_to<BoxShape>()) {
+
+ Ref<BoxShape> ss=s;
+ if (p_cancel) {
+ ss->set_extents(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Box Shape Extents"));
+ ur->add_do_method(ss.ptr(),"set_extents",ss->get_extents());
+ ur->add_undo_method(ss.ptr(),"set_extents",p_restore);
+ ur->commit_action();
+ }
+
+ if (s->cast_to<CapsuleShape>()) {
+
+ Ref<CapsuleShape> ss=s;
+ if (p_cancel) {
+ if (p_idx==0)
+ ss->set_radius(p_restore);
+ else
+ ss->set_height(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ if (p_idx==0) {
+ ur->create_action(TTR("Change Capsule Shape Radius"));
+ ur->add_do_method(ss.ptr(),"set_radius",ss->get_radius());
+ ur->add_undo_method(ss.ptr(),"set_radius",p_restore);
+ } else {
+ ur->create_action(TTR("Change Capsule Shape Height"));
+ ur->add_do_method(ss.ptr(),"set_height",ss->get_height());
+ ur->add_undo_method(ss.ptr(),"set_height",p_restore);
+
+ }
+
+ ur->commit_action();
+
+ }
+
+ if (s->cast_to<RayShape>()) {
+
+ Ref<RayShape> ss=s;
+ if (p_cancel) {
+ ss->set_length(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Ray Shape Length"));
+ ur->add_do_method(ss.ptr(),"set_length",ss->get_length());
+ ur->add_undo_method(ss.ptr(),"set_length",p_restore);
+ ur->commit_action();
+
+ }
+
+}
+void CollisionShapeSpatialGizmo::redraw(){
+
+ clear();
+
+ Ref<Shape> s = cs->get_shape();
+ if (s.is_null())
+ return;
+
+ if (s->cast_to<SphereShape>()) {
+
+ Ref<SphereShape> sp= s;
+ float r=sp->get_radius();
+
+ Vector<Vector3> points;
+
+ for(int i=0;i<=360;i++) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+1);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*r;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*r;
+
+ points.push_back(Vector3(a.x,0,a.y));
+ points.push_back(Vector3(b.x,0,b.y));
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));
+ points.push_back(Vector3(a.x,a.y,0));
+ points.push_back(Vector3(b.x,b.y,0));
+
+ }
+
+ Vector<Vector3> collision_segments;
+
+ for(int i=0;i<64;i++) {
+
+ float ra=i*Math_PI*2.0/64.0;
+ float rb=(i+1)*Math_PI*2.0/64.0;
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*r;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*r;
+
+ collision_segments.push_back(Vector3(a.x,0,a.y));
+ collision_segments.push_back(Vector3(b.x,0,b.y));
+ collision_segments.push_back(Vector3(0,a.x,a.y));
+ collision_segments.push_back(Vector3(0,b.x,b.y));
+ collision_segments.push_back(Vector3(a.x,a.y,0));
+ collision_segments.push_back(Vector3(b.x,b.y,0));
+ }
+
+ add_lines(points,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(collision_segments);
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(r,0,0));
+ add_handles(handles);
+
+ }
+
+ if (s->cast_to<BoxShape>()) {
+
+ Ref<BoxShape> bs=s;
+ Vector<Vector3> lines;
+ Rect3 aabb;
+ aabb.pos=-bs->get_extents();
+ aabb.size=aabb.pos*-2;
+
+ for(int i=0;i<12;i++) {
+ Vector3 a,b;
+ aabb.get_edge(i,a,b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ Vector<Vector3> handles;
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 ax;
+ ax[i]=bs->get_extents()[i];
+ handles.push_back(ax);
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(lines);
+ add_handles(handles);
+
+ }
+
+ if (s->cast_to<CapsuleShape>()) {
+
+ Ref<CapsuleShape> cs=s;
+ float radius = cs->get_radius();
+ float height = cs->get_height();
+
+
+ Vector<Vector3> points;
+
+ Vector3 d(0,0,height*0.5);
+ for(int i=0;i<360;i++) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+1);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*radius;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*radius;
+
+ points.push_back(Vector3(a.x,a.y,0)+d);
+ points.push_back(Vector3(b.x,b.y,0)+d);
+
+ points.push_back(Vector3(a.x,a.y,0)-d);
+ points.push_back(Vector3(b.x,b.y,0)-d);
+
+ if (i%90==0) {
+
+ points.push_back(Vector3(a.x,a.y,0)+d);
+ points.push_back(Vector3(a.x,a.y,0)-d);
+ }
+
+ Vector3 dud = i<180?d:-d;
+
+ points.push_back(Vector3(0,a.y,a.x)+dud);
+ points.push_back(Vector3(0,b.y,b.x)+dud);
+ points.push_back(Vector3(a.y,0,a.x)+dud);
+ points.push_back(Vector3(b.y,0,b.x)+dud);
+
+ }
+
+ add_lines(points,SpatialEditorGizmos::singleton->shape_material);
+
+ Vector<Vector3> collision_segments;
+
+ for(int i=0;i<64;i++) {
+
+ float ra=i*Math_PI*2.0/64.0;
+ float rb=(i+1)*Math_PI*2.0/64.0;
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*radius;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*radius;
+
+ collision_segments.push_back(Vector3(a.x,a.y,0)+d);
+ collision_segments.push_back(Vector3(b.x,b.y,0)+d);
+
+ collision_segments.push_back(Vector3(a.x,a.y,0)-d);
+ collision_segments.push_back(Vector3(b.x,b.y,0)-d);
+
+ if (i%16==0) {
+
+ collision_segments.push_back(Vector3(a.x,a.y,0)+d);
+ collision_segments.push_back(Vector3(a.x,a.y,0)-d);
+ }
+
+ Vector3 dud = i<32?d:-d;
+
+ collision_segments.push_back(Vector3(0,a.y,a.x)+dud);
+ collision_segments.push_back(Vector3(0,b.y,b.x)+dud);
+ collision_segments.push_back(Vector3(a.y,0,a.x)+dud);
+ collision_segments.push_back(Vector3(b.y,0,b.x)+dud);
+
+ }
+
+ add_collision_segments(collision_segments);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(cs->get_radius(),0,0));
+ handles.push_back(Vector3(0,0,cs->get_height()*0.5+cs->get_radius()));
+ add_handles(handles);
+
+
+ }
+
+ if (s->cast_to<PlaneShape>()) {
+
+ Ref<PlaneShape> ps=s;
+ Plane p = ps->get_plane();
+ Vector<Vector3> points;
+
+ Vector3 n1 = p.get_any_perpendicular_normal();
+ Vector3 n2 = p.normal.cross(n1).normalized();
+
+ Vector3 pface[4]={
+ p.normal*p.d+n1*10.0+n2*10.0,
+ p.normal*p.d+n1*10.0+n2*-10.0,
+ p.normal*p.d+n1*-10.0+n2*-10.0,
+ p.normal*p.d+n1*-10.0+n2*10.0,
+ };
+
+ points.push_back(pface[0]);
+ points.push_back(pface[1]);
+ points.push_back(pface[1]);
+ points.push_back(pface[2]);
+ points.push_back(pface[2]);
+ points.push_back(pface[3]);
+ points.push_back(pface[3]);
+ points.push_back(pface[0]);
+ points.push_back(p.normal*p.d);
+ points.push_back(p.normal*p.d+p.normal*3);
+
+ add_lines(points,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(points);
+
+ }
+
+
+ if (s->cast_to<ConvexPolygonShape>()) {
+
+ PoolVector<Vector3> points = s->cast_to<ConvexPolygonShape>()->get_points();
+
+ if (points.size()>3) {
+
+ QuickHull qh;
+ Vector<Vector3> varr = Variant(points);
+ Geometry::MeshData md;
+ Error err = qh.build(varr,md);
+ if (err==OK) {
+ Vector<Vector3> points;
+ points.resize(md.edges.size()*2);
+ for(int i=0;i<md.edges.size();i++) {
+ points[i*2+0]=md.vertices[md.edges[i].a];
+ points[i*2+1]=md.vertices[md.edges[i].b];
+ }
+
+
+ add_lines(points,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(points);
+
+ }
+ }
+
+ }
+
+
+ if (s->cast_to<RayShape>()) {
+
+ Ref<RayShape> rs=s;
+
+ Vector<Vector3> points;
+ points.push_back(Vector3());
+ points.push_back(Vector3(0,0,rs->get_length()));
+ add_lines(points,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(points);
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(0,0,rs->get_length()));
+ add_handles(handles);
+
+
+ }
+
+}
+CollisionShapeSpatialGizmo::CollisionShapeSpatialGizmo(CollisionShape* p_cs) {
+
+ cs=p_cs;
+ set_spatial_node(p_cs);
+}
+
+
+
+/////
+
+
+void CollisionPolygonSpatialGizmo::redraw() {
+
+ clear();
+
+ Vector<Vector2> points = polygon->get_polygon();
+ float depth = polygon->get_depth()*0.5;
+
+ Vector<Vector3> lines;
+ for(int i=0;i<points.size();i++) {
+
+ int n = (i+1)%points.size();
+ lines.push_back(Vector3(points[i].x,points[i].y,depth));
+ lines.push_back(Vector3(points[n].x,points[n].y,depth));
+ lines.push_back(Vector3(points[i].x,points[i].y,-depth));
+ lines.push_back(Vector3(points[n].x,points[n].y,-depth));
+ lines.push_back(Vector3(points[i].x,points[i].y,depth));
+ lines.push_back(Vector3(points[i].x,points[i].y,-depth));
+
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->shape_material);
+ add_collision_segments(lines);
+}
+
+CollisionPolygonSpatialGizmo::CollisionPolygonSpatialGizmo(CollisionPolygon* p_polygon){
+
+ set_spatial_node(p_polygon);
+ polygon=p_polygon;
+}
+///
+
+
+String VisibilityNotifierGizmo::get_handle_name(int p_idx) const {
+
+ switch(p_idx) {
+ case 0: return "X";
+ case 1: return "Y";
+ case 2: return "Z";
+ }
+
+ return "";
+}
+Variant VisibilityNotifierGizmo::get_handle_value(int p_idx) const{
+
+ return notifier->get_aabb();
+}
+void VisibilityNotifierGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+
+
+ Transform gt = notifier->get_global_transform();
+ //gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+ Rect3 aabb = notifier->get_aabb();
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*4096)};
+ Vector3 ofs = aabb.pos+aabb.size*0.5;
+
+ Vector3 axis;
+ axis[p_idx]=1.0;
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(ofs,ofs+axis*4096,sg[0],sg[1],ra,rb);
+ float d = ra[p_idx];
+ if (d<0.001)
+ d=0.001;
+
+ aabb.pos[p_idx]=(aabb.pos[p_idx]+aabb.size[p_idx]*0.5)-d;
+ aabb.size[p_idx]=d*2;
+ notifier->set_aabb(aabb);
+}
+
+void VisibilityNotifierGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+
+ if (p_cancel) {
+ notifier->set_aabb(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Notifier Extents"));
+ ur->add_do_method(notifier,"set_aabb",notifier->get_aabb());
+ ur->add_undo_method(notifier,"set_aabb",p_restore);
+ ur->commit_action();
+
+}
+
+void VisibilityNotifierGizmo::redraw(){
+
+ clear();
+
+ Vector<Vector3> lines;
+ Rect3 aabb = notifier->get_aabb();
+
+ for(int i=0;i<12;i++) {
+ Vector3 a,b;
+ aabb.get_edge(i,a,b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ Vector<Vector3> handles;
+
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 ax;
+ ax[i]=aabb.pos[i]+aabb.size[i];
+ handles.push_back(ax);
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->visibility_notifier_material);
+ //add_unscaled_billboard(SpatialEditorGizmos::singleton->visi,0.05);
+ add_collision_segments(lines);
+ add_handles(handles);
+
+}
+VisibilityNotifierGizmo::VisibilityNotifierGizmo(VisibilityNotifier* p_notifier){
+
+ notifier=p_notifier;
+ set_spatial_node(p_notifier);
+}
+
+////////
+
+
+///
+
+
+String ReflectionProbeGizmo::get_handle_name(int p_idx) const {
+
+ switch(p_idx) {
+ case 0: return "Extents X";
+ case 1: return "Extents Y";
+ case 2: return "Extents Z";
+ case 3: return "Origin X";
+ case 4: return "Origin Y";
+ case 5: return "Origin Z";
+ }
+
+ return "";
+}
+Variant ReflectionProbeGizmo::get_handle_value(int p_idx) const{
+
+ return Rect3(probe->get_extents(),probe->get_origin_offset());
+}
+void ReflectionProbeGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+
+ Transform gt = probe->get_global_transform();
+ //gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+
+ if (p_idx<3) {
+ Vector3 extents = probe->get_extents();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*16384)};
+
+ Vector3 axis;
+ axis[p_idx]=1.0;
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),axis*16384,sg[0],sg[1],ra,rb);
+ float d = ra[p_idx];
+ if (d<0.001)
+ d=0.001;
+
+ extents[p_idx]=d;
+ probe->set_extents(extents);
+ } else {
+
+ p_idx-=3;
+
+ Vector3 origin = probe->get_origin_offset();
+ origin[p_idx]=0;
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*16384)};
+
+ Vector3 axis;
+ axis[p_idx]=1.0;
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(origin-axis*16384,origin+axis*16384,sg[0],sg[1],ra,rb);
+ float d = ra[p_idx];
+ d+=0.25;
+
+ origin[p_idx]=d;
+ probe->set_origin_offset(origin);
+
+ }
+}
+
+void ReflectionProbeGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ Rect3 restore = p_restore;
+
+ if (p_cancel) {
+ probe->set_extents(restore.pos);
+ probe->set_origin_offset(restore.size);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Probe Extents"));
+ ur->add_do_method(probe,"set_extents",probe->get_extents());
+ ur->add_do_method(probe,"set_origin_offset",probe->get_origin_offset());
+ ur->add_undo_method(probe,"set_extents",restore.pos);
+ ur->add_undo_method(probe,"set_origin_offset",restore.size);
+ ur->commit_action();
+
+}
+
+void ReflectionProbeGizmo::redraw(){
+
+ clear();
+
+ Vector<Vector3> lines;
+ Vector<Vector3> internal_lines;
+ Vector3 extents = probe->get_extents();
+
+ Rect3 aabb;
+ aabb.pos=-extents;
+ aabb.size=extents*2;
+
+ for(int i=0;i<12;i++) {
+ Vector3 a,b;
+ aabb.get_edge(i,a,b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ for(int i=0;i<8;i++) {
+ Vector3 ep = aabb.get_endpoint(i);
+ internal_lines.push_back(probe->get_origin_offset());
+ internal_lines.push_back(ep);
+
+
+ }
+
+ Vector<Vector3> handles;
+
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 ax;
+ ax[i]=aabb.pos[i]+aabb.size[i];
+ handles.push_back(ax);
+ }
+
+ for(int i=0;i<3;i++) {
+
+
+ Vector3 orig_handle=probe->get_origin_offset();
+ orig_handle[i]-=0.25;
+ lines.push_back(orig_handle);
+ handles.push_back(orig_handle);
+
+ orig_handle[i]+=0.5;
+ lines.push_back(orig_handle);
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->reflection_probe_material);
+ add_lines(internal_lines,SpatialEditorGizmos::singleton->reflection_probe_material_internal);
+ //add_unscaled_billboard(SpatialEditorGizmos::singleton->visi,0.05);
+ add_collision_segments(lines);
+ add_handles(handles);
+
+}
+ReflectionProbeGizmo::ReflectionProbeGizmo(ReflectionProbe* p_probe){
+
+ probe=p_probe;
+ set_spatial_node(p_probe);
+}
+
+////////
+
+
+
+///
+
+
+String GIProbeGizmo::get_handle_name(int p_idx) const {
+
+ switch(p_idx) {
+ case 0: return "Extents X";
+ case 1: return "Extents Y";
+ case 2: return "Extents Z";
+ }
+
+ return "";
+}
+Variant GIProbeGizmo::get_handle_value(int p_idx) const{
+
+ return probe->get_extents();
+}
+void GIProbeGizmo::set_handle(int p_idx,Camera *p_camera, const Point2& p_point){
+
+ Transform gt = probe->get_global_transform();
+ //gt.orthonormalize();
+ Transform gi = gt.affine_inverse();
+
+
+ Vector3 extents = probe->get_extents();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2]={gi.xform(ray_from),gi.xform(ray_from+ray_dir*16384)};
+
+ Vector3 axis;
+ axis[p_idx]=1.0;
+
+ Vector3 ra,rb;
+ Geometry::get_closest_points_between_segments(Vector3(),axis*16384,sg[0],sg[1],ra,rb);
+ float d = ra[p_idx];
+ if (d<0.001)
+ d=0.001;
+
+ extents[p_idx]=d;
+ probe->set_extents(extents);
+
+}
+
+void GIProbeGizmo::commit_handle(int p_idx,const Variant& p_restore,bool p_cancel){
+
+ Vector3 restore = p_restore;
+
+ if (p_cancel) {
+ probe->set_extents(restore);
+ return;
+ }
+
+ UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Probe Extents"));
+ ur->add_do_method(probe,"set_extents",probe->get_extents());
+ ur->add_undo_method(probe,"set_extents",restore);
+ ur->commit_action();
+
+}
+
+void GIProbeGizmo::redraw(){
+
+ clear();
+
+ Vector<Vector3> lines;
+ Vector3 extents = probe->get_extents();
+
+ static const int subdivs[GIProbe::SUBDIV_MAX]={64,128,256,512};
+
+ Rect3 aabb = Rect3(-extents,extents*2);
+ int subdiv = subdivs[probe->get_subdiv()];
+ float cell_size = aabb.get_longest_axis_size()/subdiv;
+
+
+ for(int i=0;i<12;i++) {
+ Vector3 a,b;
+ aabb.get_edge(i,a,b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->gi_probe_material);
+ add_collision_segments(lines);
+
+ lines.clear();
+
+ for(int i=1;i<subdiv;i++) {
+
+ for(int j=0;j<3;j++) {
+
+
+
+ if (cell_size*i>aabb.size[j]) {
+ continue;
+ }
+
+ Vector2 dir;
+ dir[j]=1.0;
+ Vector2 ta,tb;
+ int j_n1=(j+1)%3;
+ int j_n2=(j+2)%3;
+ ta[j_n1]=1.0;
+ tb[j_n2]=1.0;
+
+
+ for(int k=0;k<4;k++) {
+
+ Vector3 from=aabb.pos,to=aabb.pos;
+ from[j]+= cell_size*i;
+ to[j]+=cell_size*i;
+
+ if (k&1) {
+ to[j_n1]+=aabb.size[j_n1];
+ } else {
+
+ to[j_n2]+=aabb.size[j_n2];
+ }
+
+ if (k&2) {
+ from[j_n1]+=aabb.size[j_n1];
+ from[j_n2]+=aabb.size[j_n2];
+ }
+
+ lines.push_back(from);
+ lines.push_back(to);
+ }
+
+ }
+
+ }
+
+ add_lines(lines,SpatialEditorGizmos::singleton->gi_probe_material_internal);
+
+ Vector<Vector3> handles;
+
+
+ for(int i=0;i<3;i++) {
+
+ Vector3 ax;
+ ax[i]=aabb.pos[i]+aabb.size[i];
+ handles.push_back(ax);
+ }
+
+
+ add_handles(handles);
+
+}
+GIProbeGizmo::GIProbeGizmo(GIProbe* p_probe){
+
+ probe=p_probe;
+ set_spatial_node(p_probe);
+}
+
+////////
+
+
+void NavigationMeshSpatialGizmo::redraw() {
+
+ clear();
+ Ref<NavigationMesh> navmeshie = navmesh->get_navigation_mesh();
+ if (navmeshie.is_null())
+ return;
+
+ PoolVector<Vector3> vertices = navmeshie->get_vertices();
+ PoolVector<Vector3>::Read vr=vertices.read();
+ List<Face3> faces;
+ for(int i=0;i<navmeshie->get_polygon_count();i++) {
+ Vector<int> p = navmeshie->get_polygon(i);
+
+ for(int j=2;j<p.size();j++) {
+ Face3 f;
+ f.vertex[0]=vr[p[0]];
+ f.vertex[1]=vr[p[j-1]];
+ f.vertex[2]=vr[p[j]];
+
+ faces.push_back(f);
+ }
+ }
+
+ if (faces.empty())
+ return;
+
+ Map<_EdgeKey,bool> edge_map;
+ PoolVector<Vector3> tmeshfaces;
+ tmeshfaces.resize(faces.size()*3);
+
+ {
+ PoolVector<Vector3>::Write tw=tmeshfaces.write();
+ int tidx=0;
+
+
+ for(List<Face3>::Element *E=faces.front();E;E=E->next()) {
+
+ const Face3 &f = E->get();
+
+ for(int j=0;j<3;j++) {
+
+ tw[tidx++]=f.vertex[j];
+ _EdgeKey ek;
+ ek.from=f.vertex[j].snapped(CMP_EPSILON);
+ ek.to=f.vertex[(j+1)%3].snapped(CMP_EPSILON);
+ if (ek.from<ek.to)
+ SWAP(ek.from,ek.to);
+
+ Map<_EdgeKey,bool>::Element *E=edge_map.find(ek);
+
+ if (E) {
+
+ E->get()=false;
+
+ } else {
+
+ edge_map[ek]=true;
+ }
+
+ }
+ }
+ }
+ Vector<Vector3> lines;
+
+ for(Map<_EdgeKey,bool>::Element *E=edge_map.front();E;E=E->next()) {
+
+ if (E->get()) {
+ lines.push_back(E->key().from);
+ lines.push_back(E->key().to);
+ }
+ }
+
+ Ref<TriangleMesh> tmesh = memnew( TriangleMesh );
+ tmesh->create(tmeshfaces);
+
+ if (lines.size())
+ add_lines(lines,navmesh->is_enabled()?SpatialEditorGizmos::singleton->navmesh_edge_material:SpatialEditorGizmos::singleton->navmesh_edge_material_disabled);
+ add_collision_triangles(tmesh);
+ Ref<Mesh> m = memnew( Mesh );
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[0]=tmeshfaces;
+ m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES,a);
+ m->surface_set_material(0,navmesh->is_enabled()?SpatialEditorGizmos::singleton->navmesh_solid_material:SpatialEditorGizmos::singleton->navmesh_solid_material_disabled);
+ add_mesh(m);
+ add_collision_segments(lines);
+
+}
+
+NavigationMeshSpatialGizmo::NavigationMeshSpatialGizmo(NavigationMeshInstance *p_navmesh){
+
+ set_spatial_node(p_navmesh);
+ navmesh=p_navmesh;
+}
+
+//////
+///
+///
+
+
+
+void PinJointSpatialGizmo::redraw() {
+
+ clear();
+ Vector<Vector3> cursor_points;
+ float cs = 0.25;
+ cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));
+ cursor_points.push_back(Vector3(0,0,+cs));
+ cursor_points.push_back(Vector3(0,0,-cs));
+ add_collision_segments(cursor_points);
+ add_lines(cursor_points,SpatialEditorGizmos::singleton->joint_material);
+
+}
+
+
+PinJointSpatialGizmo::PinJointSpatialGizmo(PinJoint* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+////
+
+void HingeJointSpatialGizmo::redraw() {
+
+ clear();
+ Vector<Vector3> cursor_points;
+ float cs = 0.25;
+ /*cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));*/
+ cursor_points.push_back(Vector3(0,0,+cs*2));
+ cursor_points.push_back(Vector3(0,0,-cs*2));
+
+ float ll = p3d->get_param(HingeJoint::PARAM_LIMIT_LOWER);
+ float ul = p3d->get_param(HingeJoint::PARAM_LIMIT_UPPER);
+
+ if (p3d->get_flag(HingeJoint::FLAG_USE_LIMIT) && ll<ul) {
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(ul-ll)/points;
+ float n = ll+(i+1)*(ul-ll)/points;
+
+ Vector3 from=Vector3( -Math::sin(s),Math::cos(s), 0 )*cs;
+ Vector3 to=Vector3( -Math::sin(n),Math::cos(n), 0 )*cs;
+
+ if (i==points-1) {
+ cursor_points.push_back(to);
+ cursor_points.push_back(Vector3());
+ }
+ if (i==0) {
+ cursor_points.push_back(from);
+ cursor_points.push_back(Vector3());
+ }
+
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+
+ }
+
+ cursor_points.push_back(Vector3(0,cs*1.5,0));
+ cursor_points.push_back(Vector3());
+
+ } else {
+
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(Math_PI*2.0)/points;
+ float n = ll+(i+1)*(Math_PI*2.0)/points;
+
+ Vector3 from=Vector3( -Math::sin(s),Math::cos(s), 0 )*cs;
+ Vector3 to=Vector3( -Math::sin(n),Math::cos(n), 0 )*cs;
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+ }
+
+ }
+ add_collision_segments(cursor_points);
+ add_lines(cursor_points,SpatialEditorGizmos::singleton->joint_material);
+
+}
+
+
+HingeJointSpatialGizmo::HingeJointSpatialGizmo(HingeJoint* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+///////
+///
+////
+
+void SliderJointSpatialGizmo::redraw() {
+
+ clear();
+ Vector<Vector3> cursor_points;
+ float cs = 0.25;
+ /*cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));*/
+ cursor_points.push_back(Vector3(0,0,+cs*2));
+ cursor_points.push_back(Vector3(0,0,-cs*2));
+
+ float ll = p3d->get_param(SliderJoint::PARAM_ANGULAR_LIMIT_LOWER);
+ float ul = p3d->get_param(SliderJoint::PARAM_ANGULAR_LIMIT_UPPER);
+ float lll = -p3d->get_param(SliderJoint::PARAM_LINEAR_LIMIT_LOWER);
+ float lul = -p3d->get_param(SliderJoint::PARAM_LINEAR_LIMIT_UPPER);
+
+ if (lll>lul) {
+
+ cursor_points.push_back(Vector3(lul,0,0));
+ cursor_points.push_back(Vector3(lll,0,0));
+
+ cursor_points.push_back(Vector3(lul,-cs,-cs));
+ cursor_points.push_back(Vector3(lul,-cs,cs));
+ cursor_points.push_back(Vector3(lul,-cs,cs));
+ cursor_points.push_back(Vector3(lul,cs,cs));
+ cursor_points.push_back(Vector3(lul,cs,cs));
+ cursor_points.push_back(Vector3(lul,cs,-cs));
+ cursor_points.push_back(Vector3(lul,cs,-cs));
+ cursor_points.push_back(Vector3(lul,-cs,-cs));
+
+
+ cursor_points.push_back(Vector3(lll,-cs,-cs));
+ cursor_points.push_back(Vector3(lll,-cs,cs));
+ cursor_points.push_back(Vector3(lll,-cs,cs));
+ cursor_points.push_back(Vector3(lll,cs,cs));
+ cursor_points.push_back(Vector3(lll,cs,cs));
+ cursor_points.push_back(Vector3(lll,cs,-cs));
+ cursor_points.push_back(Vector3(lll,cs,-cs));
+ cursor_points.push_back(Vector3(lll,-cs,-cs));
+
+
+ } else {
+
+ cursor_points.push_back(Vector3(+cs*2,0,0));
+ cursor_points.push_back(Vector3(-cs*2,0,0));
+
+ }
+
+ if (ll<ul) {
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(ul-ll)/points;
+ float n = ll+(i+1)*(ul-ll)/points;
+
+ Vector3 from=Vector3(0, Math::cos(s), -Math::sin(s) )*cs;
+ Vector3 to=Vector3(0,Math::cos(n), -Math::sin(n) )*cs;
+
+ if (i==points-1) {
+ cursor_points.push_back(to);
+ cursor_points.push_back(Vector3());
+ }
+ if (i==0) {
+ cursor_points.push_back(from);
+ cursor_points.push_back(Vector3());
+ }
+
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+
+ }
+
+ cursor_points.push_back(Vector3(0,cs*1.5,0));
+ cursor_points.push_back(Vector3());
+
+ } else {
+
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(Math_PI*2.0)/points;
+ float n = ll+(i+1)*(Math_PI*2.0)/points;
+
+ Vector3 from=Vector3(0,Math::cos(s),-Math::sin(s) )*cs;
+ Vector3 to=Vector3( 0,Math::cos(n),-Math::sin(n) )*cs;
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+ }
+
+ }
+ add_collision_segments(cursor_points);
+ add_lines(cursor_points,SpatialEditorGizmos::singleton->joint_material);
+
+}
+
+
+SliderJointSpatialGizmo::SliderJointSpatialGizmo(SliderJoint* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+///////
+///
+////
+
+void ConeTwistJointSpatialGizmo::redraw() {
+
+ clear();
+ Vector<Vector3> points;
+
+ float r = 1.0;
+ float w = r*Math::sin(p3d->get_param(ConeTwistJoint::PARAM_SWING_SPAN));
+ float d = r*Math::cos(p3d->get_param(ConeTwistJoint::PARAM_SWING_SPAN));
+
+
+ //swing
+ for(int i=0;i<360;i+=10) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+10);
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*w;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*w;
+
+ /*points.push_back(Vector3(a.x,0,a.y));
+ points.push_back(Vector3(b.x,0,b.y));
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));*/
+ points.push_back(Vector3(d,a.x,a.y));
+ points.push_back(Vector3(d,b.x,b.y));
+
+ if (i%90==0) {
+
+ points.push_back(Vector3(d,a.x,a.y));
+ points.push_back(Vector3());
+
+ }
+ }
+
+ points.push_back(Vector3());
+ points.push_back(Vector3(1,0,0));
+
+ //twist
+ /*
+ */
+ float ts=Math::rad2deg(p3d->get_param(ConeTwistJoint::PARAM_TWIST_SPAN));
+ ts=MIN(ts,720);
+
+
+ for(int i=0;i<int(ts);i+=5) {
+
+ float ra=Math::deg2rad((float)i);
+ float rb=Math::deg2rad((float)i+5);
+ float c = i/720.0;
+ float cn = (i+5)/720.0;
+ Point2 a = Vector2(Math::sin(ra),Math::cos(ra))*w*c;
+ Point2 b = Vector2(Math::sin(rb),Math::cos(rb))*w*cn;
+
+ /*points.push_back(Vector3(a.x,0,a.y));
+ points.push_back(Vector3(b.x,0,b.y));
+ points.push_back(Vector3(0,a.x,a.y));
+ points.push_back(Vector3(0,b.x,b.y));*/
+
+ points.push_back(Vector3(c,a.x,a.y));
+ points.push_back(Vector3(cn,b.x,b.y));
+
+ }
+
+
+ add_collision_segments(points);
+ add_lines(points,SpatialEditorGizmos::singleton->joint_material);
+
+}
+
+
+ConeTwistJointSpatialGizmo::ConeTwistJointSpatialGizmo(ConeTwistJoint* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+////////
+/// \brief SpatialEditorGizmos::singleton
+///
+///////
+///
+////
+
+void Generic6DOFJointSpatialGizmo::redraw() {
+
+ clear();
+ Vector<Vector3> cursor_points;
+ float cs = 0.25;
+
+ for(int ax=0;ax<3;ax++) {
+ /*cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));
+ cursor_points.push_back(Vector3(0,0,+cs*2));
+ cursor_points.push_back(Vector3(0,0,-cs*2)); */
+
+ float ll;
+ float ul;
+ float lll;
+ float lul;
+
+ int a1,a2,a3;
+ bool enable_ang;
+ bool enable_lin;
+
+ switch(ax) {
+ case 0:
+ ll = p3d->get_param_x(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT);
+ ul = p3d->get_param_x(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT);
+ lll = -p3d->get_param_x(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT);
+ lul = -p3d->get_param_x(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT);
+ enable_ang = p3d->get_flag_x(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT);
+ enable_lin = p3d->get_flag_x(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT);
+ a1=0;
+ a2=1;
+ a3=2;
+ break;
+ case 1:
+ ll = p3d->get_param_y(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT);
+ ul = p3d->get_param_y(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT);
+ lll = -p3d->get_param_y(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT);
+ lul = -p3d->get_param_y(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT);
+ enable_ang = p3d->get_flag_y(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT);
+ enable_lin = p3d->get_flag_y(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT);
+ a1=2;
+ a2=0;
+ a3=1;
+ break;
+ case 2:
+ ll = p3d->get_param_z(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT);
+ ul = p3d->get_param_z(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT);
+ lll = -p3d->get_param_z(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT);
+ lul = -p3d->get_param_z(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT);
+ enable_ang = p3d->get_flag_z(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT);
+ enable_lin = p3d->get_flag_z(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT);
+
+ a1=1;
+ a2=2;
+ a3=0;
+ break;
+ }
+
+#define ADD_VTX(x,y,z)\
+ {\
+ Vector3 v;\
+ v[a1]=(x);\
+ v[a2]=(y);\
+ v[a3]=(z);\
+ cursor_points.push_back(v);\
+ }
+
+#define SET_VTX(what,x,y,z)\
+ {\
+ Vector3 v;\
+ v[a1]=(x);\
+ v[a2]=(y);\
+ v[a3]=(z);\
+ what=v;\
+ }
+
+
+
+
+ if (enable_lin && lll>=lul) {
+
+ ADD_VTX(lul,0,0);
+ ADD_VTX(lll,0,0);
+
+ ADD_VTX(lul,-cs,-cs);
+ ADD_VTX(lul,-cs,cs);
+ ADD_VTX(lul,-cs,cs);
+ ADD_VTX(lul,cs,cs);
+ ADD_VTX(lul,cs,cs);
+ ADD_VTX(lul,cs,-cs);
+ ADD_VTX(lul,cs,-cs);
+ ADD_VTX(lul,-cs,-cs);
+
+
+ ADD_VTX(lll,-cs,-cs);
+ ADD_VTX(lll,-cs,cs);
+ ADD_VTX(lll,-cs,cs);
+ ADD_VTX(lll,cs,cs);
+ ADD_VTX(lll,cs,cs);
+ ADD_VTX(lll,cs,-cs);
+ ADD_VTX(lll,cs,-cs);
+ ADD_VTX(lll,-cs,-cs);
+
+
+ } else {
+
+ ADD_VTX(+cs*2,0,0);
+ ADD_VTX(-cs*2,0,0);
+
+ }
+
+ if (enable_ang && ll<=ul) {
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(ul-ll)/points;
+ float n = ll+(i+1)*(ul-ll)/points;
+
+ Vector3 from;
+ SET_VTX(from,0, Math::cos(s), -Math::sin(s) );
+ from*=cs;
+ Vector3 to;
+ SET_VTX(to,0,Math::cos(n), -Math::sin(n));
+ to*=cs;
+
+ if (i==points-1) {
+ cursor_points.push_back(to);
+ cursor_points.push_back(Vector3());
+ }
+ if (i==0) {
+ cursor_points.push_back(from);
+ cursor_points.push_back(Vector3());
+ }
+
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+
+ }
+
+ ADD_VTX(0,cs*1.5,0);
+ cursor_points.push_back(Vector3());
+
+ } else {
+
+
+ const int points = 32;
+
+ for(int i=0;i<points;i++) {
+
+ float s = ll+i*(Math_PI*2.0)/points;
+ float n = ll+(i+1)*(Math_PI*2.0)/points;
+
+ //Vector3 from=Vector3(0,Math::cos(s),-Math::sin(s) )*cs;
+ //Vector3 to=Vector3( 0,Math::cos(n),-Math::sin(n) )*cs;
+
+ Vector3 from;
+ SET_VTX(from,0, Math::cos(s), -Math::sin(s) );
+ from*=cs;
+ Vector3 to;
+ SET_VTX(to,0,Math::cos(n), -Math::sin(n));
+ to*=cs;
+
+ cursor_points.push_back(from);
+ cursor_points.push_back(to);
+
+ }
+
+ }
+ }
+
+#undef ADD_VTX
+#undef SET_VTX
+
+ add_collision_segments(cursor_points);
+ add_lines(cursor_points,SpatialEditorGizmos::singleton->joint_material);
+
+}
+
+
+Generic6DOFJointSpatialGizmo::Generic6DOFJointSpatialGizmo(Generic6DOFJoint* p_p3d) {
+
+ p3d=p_p3d;
+ set_spatial_node(p3d);
+}
+
+///////
+///
+////
+
+
+SpatialEditorGizmos *SpatialEditorGizmos::singleton=NULL;
+
+Ref<SpatialEditorGizmo> SpatialEditorGizmos::get_gizmo(Spatial *p_spatial) {
+
+ if (p_spatial->cast_to<Light>()) {
+
+ Ref<LightSpatialGizmo> lsg = memnew( LightSpatialGizmo(p_spatial->cast_to<Light>()) );
+ return lsg;
+ }
+
+
+
+ if (p_spatial->cast_to<Camera>()) {
+
+ Ref<CameraSpatialGizmo> lsg = memnew( CameraSpatialGizmo(p_spatial->cast_to<Camera>()) );
+ return lsg;
+ }
+
+ if (p_spatial->cast_to<Skeleton>()) {
+
+ Ref<SkeletonSpatialGizmo> lsg = memnew( SkeletonSpatialGizmo(p_spatial->cast_to<Skeleton>()) );
+ return lsg;
+ }
+
+
+ if (p_spatial->cast_to<Position3D>()) {
+
+ Ref<Position3DSpatialGizmo> lsg = memnew( Position3DSpatialGizmo(p_spatial->cast_to<Position3D>()) );
+ return lsg;
+ }
+
+ if (p_spatial->cast_to<MeshInstance>()) {
+
+ Ref<MeshInstanceSpatialGizmo> misg = memnew( MeshInstanceSpatialGizmo(p_spatial->cast_to<MeshInstance>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<Room>()) {
+
+ Ref<RoomSpatialGizmo> misg = memnew( RoomSpatialGizmo(p_spatial->cast_to<Room>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<NavigationMeshInstance>()) {
+
+ Ref<NavigationMeshSpatialGizmo> misg = memnew( NavigationMeshSpatialGizmo(p_spatial->cast_to<NavigationMeshInstance>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<RayCast>()) {
+
+ Ref<RayCastSpatialGizmo> misg = memnew( RayCastSpatialGizmo(p_spatial->cast_to<RayCast>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<Portal>()) {
+
+ Ref<PortalSpatialGizmo> misg = memnew( PortalSpatialGizmo(p_spatial->cast_to<Portal>()) );
+ return misg;
+ }
+
+
+ if (p_spatial->cast_to<TestCube>()) {
+
+ Ref<TestCubeSpatialGizmo> misg = memnew( TestCubeSpatialGizmo(p_spatial->cast_to<TestCube>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<CollisionShape>()) {
+
+ Ref<CollisionShapeSpatialGizmo> misg = memnew( CollisionShapeSpatialGizmo(p_spatial->cast_to<CollisionShape>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<VisibilityNotifier>()) {
+
+ Ref<VisibilityNotifierGizmo> misg = memnew( VisibilityNotifierGizmo(p_spatial->cast_to<VisibilityNotifier>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<ReflectionProbe>()) {
+
+ Ref<ReflectionProbeGizmo> misg = memnew( ReflectionProbeGizmo(p_spatial->cast_to<ReflectionProbe>()) );
+ return misg;
+ }
+ if (p_spatial->cast_to<GIProbe>()) {
+
+ Ref<GIProbeGizmo> misg = memnew( GIProbeGizmo(p_spatial->cast_to<GIProbe>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<VehicleWheel>()) {
+
+ Ref<VehicleWheelSpatialGizmo> misg = memnew( VehicleWheelSpatialGizmo(p_spatial->cast_to<VehicleWheel>()) );
+ return misg;
+ }
+ if (p_spatial->cast_to<PinJoint>()) {
+
+ Ref<PinJointSpatialGizmo> misg = memnew( PinJointSpatialGizmo(p_spatial->cast_to<PinJoint>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<HingeJoint>()) {
+
+ Ref<HingeJointSpatialGizmo> misg = memnew( HingeJointSpatialGizmo(p_spatial->cast_to<HingeJoint>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<SliderJoint>()) {
+
+ Ref<SliderJointSpatialGizmo> misg = memnew( SliderJointSpatialGizmo(p_spatial->cast_to<SliderJoint>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<ConeTwistJoint>()) {
+
+ Ref<ConeTwistJointSpatialGizmo> misg = memnew( ConeTwistJointSpatialGizmo(p_spatial->cast_to<ConeTwistJoint>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<Generic6DOFJoint>()) {
+
+ Ref<Generic6DOFJointSpatialGizmo> misg = memnew( Generic6DOFJointSpatialGizmo(p_spatial->cast_to<Generic6DOFJoint>()) );
+ return misg;
+ }
+
+ if (p_spatial->cast_to<CollisionPolygon>()) {
+
+ Ref<CollisionPolygonSpatialGizmo> misg = memnew( CollisionPolygonSpatialGizmo(p_spatial->cast_to<CollisionPolygon>()) );
+ return misg;
+ }
+
+
+ return Ref<SpatialEditorGizmo>();
+}
+
+
+Ref<FixedSpatialMaterial> SpatialEditorGizmos::create_line_material(const Color& p_base_color) {
+
+ Ref<FixedSpatialMaterial> line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ line_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ line_material->set_line_width(3.0);
+ line_material->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ //line_material->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ //->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
+ line_material->set_albedo(p_base_color);
+
+ return line_material;
+
+}
+
+Ref<FixedSpatialMaterial> SpatialEditorGizmos::create_solid_material(const Color& p_base_color) {
+
+ Ref<FixedSpatialMaterial> line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ line_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ line_material->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ line_material->set_albedo(p_base_color);
+
+ return line_material;
+
+}
+
+SpatialEditorGizmos::SpatialEditorGizmos() {
+
+ singleton=this;
+
+ handle_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ handle_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ handle_material->set_albedo(Color(0.8,0.8,0.8));
+
+ handle2_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ handle2_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ handle2_material->set_flag(FixedSpatialMaterial::FLAG_USE_POINT_SIZE, true);
+ handle_t = SpatialEditor::get_singleton()->get_icon("Editor3DHandle","EditorIcons");
+ handle2_material->set_point_size(handle_t->get_width());
+ handle2_material->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,handle_t);
+ handle2_material->set_albedo(Color(1,1,1));
+ handle2_material->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ handle2_material->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ handle2_material->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
+
+ light_material = create_line_material(Color(1,1,0.2));
+
+ light_material_omni_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ light_material_omni_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ light_material_omni_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ light_material_omni_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ light_material_omni_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ light_material_omni_icon->set_albedo(Color(1,1,1,0.9));
+ light_material_omni_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,SpatialEditor::get_singleton()->get_icon("GizmoLight","EditorIcons"));
+
+
+ light_material_directional_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ light_material_directional_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ light_material_directional_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ light_material_directional_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ light_material_directional_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ light_material_directional_icon->set_albedo(Color(1,1,1,0.9));
+ light_material_directional_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,SpatialEditor::get_singleton()->get_icon("GizmoDirectionalLight","EditorIcons"));
+
+ camera_material = create_line_material(Color(1.0,0.5,1.0));
+
+
+ navmesh_edge_material = create_line_material(Color(0.1,0.8,1.0));
+ navmesh_solid_material = create_solid_material(Color(0.1,0.8,1.0,0.4));
+ navmesh_edge_material->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, false);
+ navmesh_edge_material->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR, false);
+ navmesh_solid_material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+
+ navmesh_edge_material_disabled = create_line_material(Color(1.0,0.8,0.1));
+ navmesh_solid_material_disabled = create_solid_material(Color(1.0,0.8,0.1,0.4));
+ navmesh_edge_material_disabled->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, false);
+ navmesh_edge_material_disabled->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR, false);
+ navmesh_solid_material_disabled->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+
+ skeleton_material = create_line_material(Color(0.6,1.0,0.3));
+ skeleton_material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ skeleton_material->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
+ skeleton_material->set_flag(FixedSpatialMaterial::FLAG_ONTOP,true);
+ skeleton_material->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+
+ //position 3D Shared mesh
+
+ pos3d_mesh = Ref<Mesh>( memnew( Mesh ) );
+ {
+
+ PoolVector<Vector3> cursor_points;
+ PoolVector<Color> cursor_colors;
+ float cs = 0.25;
+ cursor_points.push_back(Vector3(+cs,0,0));
+ cursor_points.push_back(Vector3(-cs,0,0));
+ cursor_points.push_back(Vector3(0,+cs,0));
+ cursor_points.push_back(Vector3(0,-cs,0));
+ cursor_points.push_back(Vector3(0,0,+cs));
+ cursor_points.push_back(Vector3(0,0,-cs));
+ cursor_colors.push_back(Color(1,0.5,0.5,0.7));
+ cursor_colors.push_back(Color(1,0.5,0.5,0.7));
+ cursor_colors.push_back(Color(0.5,1,0.5,0.7));
+ cursor_colors.push_back(Color(0.5,1,0.5,0.7));
+ cursor_colors.push_back(Color(0.5,0.5,1,0.7));
+ cursor_colors.push_back(Color(0.5,0.5,1,0.7));
+
+ Ref<FixedSpatialMaterial> mat = memnew( FixedSpatialMaterial );
+ mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
+ mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT,true);
+ mat->set_line_width(3);
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[Mesh::ARRAY_VERTEX]=cursor_points;
+ d[Mesh::ARRAY_COLOR]=cursor_colors;
+ pos3d_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES,d);
+ pos3d_mesh->surface_set_material(0,mat);
+ }
+
+ listener_line_mesh = Ref<Mesh>(memnew(Mesh));
+ {
+
+ PoolVector<Vector3> cursor_points;
+ PoolVector<Color> cursor_colors;
+ cursor_points.push_back(Vector3(0, 0, 0));
+ cursor_points.push_back(Vector3(0, 0, -1.0));
+ cursor_colors.push_back(Color(0.5, 0.5, 0.5, 0.7));
+ cursor_colors.push_back(Color(0.5, 0.5, 0.5, 0.7));
+
+ Ref<FixedSpatialMaterial> mat = memnew(FixedSpatialMaterial);
+ mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
+ mat->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ mat->set_line_width(3);
+ Array d;
+ d.resize(VS::ARRAY_MAX);
+ d[Mesh::ARRAY_VERTEX] = cursor_points;
+ d[Mesh::ARRAY_COLOR] = cursor_colors;
+ listener_line_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, d);
+ listener_line_mesh->surface_set_material(0, mat);
+ }
+
+
+ sample_player_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ sample_player_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ sample_player_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ sample_player_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ sample_player_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ sample_player_icon->set_albedo(Color(1,1,1,0.9));
+ sample_player_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,SpatialEditor::get_singleton()->get_icon("GizmoSpatialSamplePlayer","EditorIcons"));
+
+ room_material = create_line_material(Color(1.0,0.6,0.9));
+ portal_material = create_line_material(Color(1.0,0.8,0.6));
+ raycast_material = create_line_material(Color(1.0,0.8,0.6));
+ car_wheel_material = create_line_material(Color(0.6,0.8,1.0));
+ visibility_notifier_material = create_line_material(Color(1.0,0.5,1.0));
+ reflection_probe_material = create_line_material(Color(0.5,1.0,0.7));
+ reflection_probe_material_internal = create_line_material(Color(0.3,0.8,0.5,0.15));
+ gi_probe_material = create_line_material(Color(0.7,1.0,0.5));
+ gi_probe_material_internal = create_line_material(Color(0.5,0.8,0.3,0.1));
+ joint_material = create_line_material(Color(0.6,0.8,1.0));
+
+ stream_player_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ stream_player_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ stream_player_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ stream_player_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ stream_player_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ stream_player_icon->set_albedo(Color(1,1,1,0.9));
+ stream_player_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,SpatialEditor::get_singleton()->get_icon("GizmoSpatialStreamPlayer","EditorIcons"));
+
+ visibility_notifier_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ visibility_notifier_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ visibility_notifier_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ visibility_notifier_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ visibility_notifier_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ visibility_notifier_icon->set_albedo(Color(1,1,1,0.9));
+ visibility_notifier_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO,SpatialEditor::get_singleton()->get_icon("Visible","EditorIcons"));
+
+ listener_icon = Ref<FixedSpatialMaterial>(memnew(FixedSpatialMaterial));
+ listener_icon->set_flag(FixedSpatialMaterial::FLAG_UNSHADED, true);
+ listener_icon->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
+ listener_icon->set_depth_draw_mode(FixedSpatialMaterial::DEPTH_DRAW_DISABLED);
+ listener_icon->set_feature(FixedSpatialMaterial::FEATURE_TRANSPARENT, true);
+ listener_icon->set_albedo( Color(1, 1, 1, 0.9));
+ listener_icon->set_texture(FixedSpatialMaterial::TEXTURE_ALBEDO, SpatialEditor::get_singleton()->get_icon("GizmoListener", "EditorIcons"));
+
+ {
+
+ PoolVector<Vector3> vertices;
+
+#undef ADD_VTX
+#define ADD_VTX(m_idx) \
+ vertices.push_back( face_points[m_idx] );
+
+ for (int i=0;i<6;i++) {
+
+
+ Vector3 face_points[4];
+
+ for (int j=0;j<4;j++) {
+
+ float v[3];
+ v[0]=1.0;
+ v[1]=1-2*((j>>1)&1);
+ v[2]=v[1]*(1-2*(j&1));
+
+ for (int k=0;k<3;k++) {
+
+ if (i<3)
+ face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ else
+ face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ }
+ }
+ //tri 1
+ ADD_VTX(0);
+ ADD_VTX(1);
+ ADD_VTX(2);
+ //tri 2
+ ADD_VTX(2);
+ ADD_VTX(3);
+ ADD_VTX(0);
+
+ }
+
+ test_cube_tm = Ref<TriangleMesh>( memnew( TriangleMesh ) );
+ test_cube_tm->create(vertices);
+ }
+
+ shape_material = create_line_material(Color(0.2,1,1.0));
+
+
+}
+
diff --git a/editor/spatial_editor_gizmos.h b/editor/spatial_editor_gizmos.h
new file mode 100644
index 0000000000..c44a987144
--- /dev/null
+++ b/editor/spatial_editor_gizmos.h
@@ -0,0 +1,521 @@
+/*************************************************************************/
+/* spatial_editor_gizmos.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
+#ifndef SPATIAL_EDITOR_GIZMOS_H
+#define SPATIAL_EDITOR_GIZMOS_H
+
+
+#include "editor/plugins/spatial_editor_plugin.h"
+#include "scene/3d/light.h"
+#include "scene/3d/listener.h"
+#include "scene/3d/camera.h"
+#include "scene/3d/position_3d.h"
+#include "scene/3d/test_cube.h"
+#include "scene/3d/mesh_instance.h"
+#include "scene/3d/body_shape.h"
+#include "scene/3d/room_instance.h"
+#include "scene/3d/visibility_notifier.h"
+#include "scene/3d/portal.h"
+#include "scene/3d/ray_cast.h"
+#include "scene/3d/navigation_mesh.h"
+#include "scene/3d/reflection_probe.h"
+#include "scene/3d/gi_probe.h"
+
+#include "scene/3d/vehicle_body.h"
+#include "scene/3d/collision_polygon.h"
+#include "scene/3d/physics_joint.h"
+
+
+class Camera;
+
+class EditorSpatialGizmo : public SpatialEditorGizmo {
+
+ GDCLASS(EditorSpatialGizmo,SpatialGizmo);
+
+ struct Instance{
+
+ RID instance;
+ Ref<Mesh> mesh;
+ RID skeleton;
+ bool billboard;
+ bool unscaled;
+ bool can_intersect;
+ bool extra_margin;
+ Instance() {
+
+ billboard=false;
+ unscaled=false;
+ can_intersect=false;
+ extra_margin=false;
+ }
+
+ void create_instance(Spatial *p_base);
+
+ };
+
+ Vector<Vector3> collision_segments;
+ Ref<TriangleMesh> collision_mesh;
+
+ struct Handle {
+ Vector3 pos;
+ bool billboard;
+ };
+
+ Vector<Vector3> handles;
+ Vector<Vector3> secondary_handles;
+ bool billboard_handle;
+
+ bool valid;
+ Spatial *base;
+ Vector<Instance> instances;
+ Spatial *spatial_node;
+
+ void _set_spatial_node(Node *p_node) { set_spatial_node(p_node->cast_to<Spatial>()); }
+protected:
+ void add_lines(const Vector<Vector3> &p_lines,const Ref<Material>& p_material,bool p_billboard=false);
+ void add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard=false,const RID& p_skeleton=RID());
+ void add_collision_segments(const Vector<Vector3> &p_lines);
+ void add_collision_triangles(const Ref<TriangleMesh>& p_tmesh);
+ void add_unscaled_billboard(const Ref<Material>& p_material,float p_scale=1);
+ void add_handles(const Vector<Vector3> &p_handles,bool p_billboard=false,bool p_secondary=false);
+
+ void set_spatial_node(Spatial *p_node);
+
+ static void _bind_methods();
+public:
+
+ virtual Vector3 get_handle_pos(int p_idx) const;
+ virtual bool intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum);
+ virtual bool intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle=NULL,bool p_sec_first=false);
+
+ void clear();
+ void create();
+ void transform();
+ virtual void redraw();
+ void free();
+
+ EditorSpatialGizmo();
+ ~EditorSpatialGizmo();
+};
+
+
+
+class LightSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(LightSpatialGizmo,EditorSpatialGizmo);
+
+ Light* light;
+
+public:
+
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ LightSpatialGizmo(Light* p_light=NULL);
+
+};
+
+class CameraSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(CameraSpatialGizmo,EditorSpatialGizmo);
+
+ Camera* camera;
+
+public:
+
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ CameraSpatialGizmo(Camera* p_camera=NULL);
+
+};
+
+
+
+class MeshInstanceSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(MeshInstanceSpatialGizmo,EditorSpatialGizmo);
+
+ MeshInstance* mesh;
+
+public:
+
+ void redraw();
+ MeshInstanceSpatialGizmo(MeshInstance* p_mesh=NULL);
+
+};
+
+class Position3DSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(Position3DSpatialGizmo,EditorSpatialGizmo);
+
+ Position3D* p3d;
+
+public:
+
+ void redraw();
+ Position3DSpatialGizmo(Position3D* p_p3d=NULL);
+
+};
+
+class SkeletonSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(SkeletonSpatialGizmo,EditorSpatialGizmo);
+
+ Skeleton* skel;
+
+public:
+
+ void redraw();
+ SkeletonSpatialGizmo(Skeleton* p_skel=NULL);
+
+};
+
+
+class TestCubeSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(TestCubeSpatialGizmo,EditorSpatialGizmo);
+
+ TestCube* tc;
+
+public:
+ void redraw();
+ TestCubeSpatialGizmo(TestCube* p_tc=NULL);
+
+};
+
+
+class RoomSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(RoomSpatialGizmo,EditorSpatialGizmo);
+
+
+ struct _EdgeKey {
+
+ Vector3 from;
+ Vector3 to;
+
+ bool operator<(const _EdgeKey& p_with) const { return from==p_with.from ? to < p_with.to : from < p_with.from; }
+ };
+
+
+
+ Room* room;
+
+public:
+
+ void redraw();
+ RoomSpatialGizmo(Room* p_room=NULL);
+
+};
+
+
+class PortalSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(PortalSpatialGizmo,EditorSpatialGizmo);
+
+ Portal* portal;
+
+public:
+
+ void redraw();
+ PortalSpatialGizmo(Portal* p_portal=NULL);
+
+};
+
+
+class VisibilityNotifierGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(VisibilityNotifierGizmo ,EditorSpatialGizmo);
+
+
+ VisibilityNotifier* notifier;
+
+public:
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ VisibilityNotifierGizmo(VisibilityNotifier* p_notifier=NULL);
+
+};
+
+
+class ReflectionProbeGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(ReflectionProbeGizmo ,EditorSpatialGizmo);
+
+
+ ReflectionProbe* probe;
+
+public:
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ ReflectionProbeGizmo(ReflectionProbe* p_notifier=NULL);
+
+};
+
+class GIProbeGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(GIProbeGizmo ,EditorSpatialGizmo);
+
+
+ GIProbe* probe;
+
+public:
+
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+
+ void redraw();
+ GIProbeGizmo(GIProbe* p_notifier=NULL);
+
+};
+
+
+class CollisionShapeSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(CollisionShapeSpatialGizmo,EditorSpatialGizmo);
+
+ CollisionShape* cs;
+
+public:
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx) const;
+ virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
+ virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
+ void redraw();
+ CollisionShapeSpatialGizmo(CollisionShape* p_cs=NULL);
+
+};
+
+
+class CollisionPolygonSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(CollisionPolygonSpatialGizmo,EditorSpatialGizmo);
+
+ CollisionPolygon* polygon;
+
+public:
+
+ void redraw();
+ CollisionPolygonSpatialGizmo(CollisionPolygon* p_polygon=NULL);
+
+};
+
+
+
+class RayCastSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(RayCastSpatialGizmo,EditorSpatialGizmo);
+
+ RayCast* raycast;
+
+public:
+
+ void redraw();
+ RayCastSpatialGizmo(RayCast* p_raycast=NULL);
+
+};
+
+
+
+class VehicleWheelSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(VehicleWheelSpatialGizmo,EditorSpatialGizmo);
+
+ VehicleWheel* car_wheel;
+
+public:
+
+ void redraw();
+ VehicleWheelSpatialGizmo(VehicleWheel* p_car_wheel=NULL);
+
+};
+
+
+class NavigationMeshSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(NavigationMeshSpatialGizmo,EditorSpatialGizmo);
+
+
+ struct _EdgeKey {
+
+ Vector3 from;
+ Vector3 to;
+
+ bool operator<(const _EdgeKey& p_with) const { return from==p_with.from ? to < p_with.to : from < p_with.from; }
+ };
+
+
+
+ NavigationMeshInstance* navmesh;
+
+public:
+
+ void redraw();
+ NavigationMeshSpatialGizmo(NavigationMeshInstance* p_navmesh=NULL);
+
+};
+
+
+class PinJointSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(PinJointSpatialGizmo,EditorSpatialGizmo);
+
+ PinJoint* p3d;
+
+public:
+
+ void redraw();
+ PinJointSpatialGizmo(PinJoint* p_p3d=NULL);
+
+};
+
+
+class HingeJointSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(HingeJointSpatialGizmo,EditorSpatialGizmo);
+
+ HingeJoint* p3d;
+
+public:
+
+ void redraw();
+ HingeJointSpatialGizmo(HingeJoint* p_p3d=NULL);
+
+};
+
+class SliderJointSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(SliderJointSpatialGizmo,EditorSpatialGizmo);
+
+ SliderJoint* p3d;
+
+public:
+
+ void redraw();
+ SliderJointSpatialGizmo(SliderJoint* p_p3d=NULL);
+
+};
+
+class ConeTwistJointSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(ConeTwistJointSpatialGizmo,EditorSpatialGizmo);
+
+ ConeTwistJoint* p3d;
+
+public:
+
+ void redraw();
+ ConeTwistJointSpatialGizmo(ConeTwistJoint* p_p3d=NULL);
+
+};
+
+
+class Generic6DOFJointSpatialGizmo : public EditorSpatialGizmo {
+
+ GDCLASS(Generic6DOFJointSpatialGizmo,EditorSpatialGizmo);
+
+ Generic6DOFJoint* p3d;
+
+public:
+
+ void redraw();
+ Generic6DOFJointSpatialGizmo(Generic6DOFJoint* p_p3d=NULL);
+
+};
+
+
+class SpatialEditorGizmos {
+public:
+
+ Ref<FixedSpatialMaterial> create_line_material(const Color& p_base_color);
+ Ref<FixedSpatialMaterial> create_solid_material(const Color& p_base_color);
+ Ref<FixedSpatialMaterial> handle2_material;
+ Ref<FixedSpatialMaterial> handle_material;
+ Ref<FixedSpatialMaterial> light_material;
+ Ref<FixedSpatialMaterial> light_material_omni_icon;
+ Ref<FixedSpatialMaterial> light_material_directional_icon;
+ Ref<FixedSpatialMaterial> camera_material;
+ Ref<FixedSpatialMaterial> skeleton_material;
+ Ref<FixedSpatialMaterial> reflection_probe_material;
+ Ref<FixedSpatialMaterial> reflection_probe_material_internal;
+ Ref<FixedSpatialMaterial> gi_probe_material;
+ Ref<FixedSpatialMaterial> gi_probe_material_internal;
+ Ref<FixedSpatialMaterial> room_material;
+ Ref<FixedSpatialMaterial> portal_material;
+ Ref<FixedSpatialMaterial> raycast_material;
+ Ref<FixedSpatialMaterial> visibility_notifier_material;
+ Ref<FixedSpatialMaterial> car_wheel_material;
+ Ref<FixedSpatialMaterial> joint_material;
+
+ Ref<FixedSpatialMaterial> navmesh_edge_material;
+ Ref<FixedSpatialMaterial> navmesh_solid_material;
+ Ref<FixedSpatialMaterial> navmesh_edge_material_disabled;
+ Ref<FixedSpatialMaterial> navmesh_solid_material_disabled;
+
+ Ref<FixedSpatialMaterial> listener_icon;
+
+ Ref<FixedSpatialMaterial> sample_player_icon;
+ Ref<FixedSpatialMaterial> stream_player_icon;
+ Ref<FixedSpatialMaterial> visibility_notifier_icon;
+
+ Ref<FixedSpatialMaterial> shape_material;
+ Ref<Texture> handle_t;
+
+ Ref<Mesh> pos3d_mesh;
+ Ref<Mesh> listener_line_mesh;
+ static SpatialEditorGizmos *singleton;
+
+ Ref<TriangleMesh> test_cube_tm;
+
+
+ Ref<SpatialEditorGizmo> get_gizmo(Spatial *p_spatial);
+
+ SpatialEditorGizmos();
+};
+#endif // SPATIAL_EDITOR_GIZMOS_H
diff --git a/editor/translations/Makefile b/editor/translations/Makefile
new file mode 100644
index 0000000000..4f5d9f165f
--- /dev/null
+++ b/editor/translations/Makefile
@@ -0,0 +1,20 @@
+# Makefile providing various facilities to manage translations
+
+TEMPLATE = editor.pot
+POFILES = $(wildcard *.po)
+LANGS = $(POFILES:%.po=%)
+
+all: update merge
+
+update:
+ @cd ../..; python2 editor/translations/extract.py
+
+merge:
+ @for po in $(POFILES); do \
+ echo -e "\nMerging $$po..."; \
+ msgmerge -w 79 -C $$po $$po $(TEMPLATE) > "$$po".new; \
+ mv -f "$$po".new $$po; \
+ done
+
+check:
+ @for po in $(POFILES); do msgfmt -c $$po -o /dev/null; done
diff --git a/editor/translations/README.md b/editor/translations/README.md
new file mode 100644
index 0000000000..351bc9e2d1
--- /dev/null
+++ b/editor/translations/README.md
@@ -0,0 +1,20 @@
+# How to contribute translations
+
+Godot's translation work is coordinated on
+[Hosted Weblate](https://hosted.weblate.org/projects/godot-engine/godot),
+an open source web-based translation platform, where contributors can work
+together on translations using various internationalization features.
+Creating an account there is free, and you can also login directly with
+your GitHub, BitBucket, Google or Facebook account.
+
+To avoid merge conflicts when syncing translations from Weblate (currently
+this is done manually), we ask all contributors to work there instead of
+making pull requests on this repository.
+
+Link if you missed it: https://hosted.weblate.org/projects/godot-engine/godot
+
+## Adding new languages
+
+If you want to translate for a language which is not featured yet on Weblate,
+open an issue on this repo to ask that the language is added, or contact
+Akien/@akien-mga directly on IRC (#godotengine channel on Freenode).
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
new file mode 100644
index 0000000000..539b94ab62
--- /dev/null
+++ b/editor/translations/ar.po
@@ -0,0 +1,6758 @@
+# Arabic translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-08 10:20+0000\n"
+"Last-Translator: Mohammmad Khashashneh <mohammad.rasmi@gmail.com>\n"
+"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ar/>\n"
+"Language: ar\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "لا تستند الى شفرة مصدرية"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Function"
+msgstr "عملية تحريك"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "نداء"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"ليتم إظهار الأطر (اللقطات) في الAnimatedSprite (النقوش المتحركة), يجب تكوين "
+"مصدر لها من نوع SpriteFrames و ضبط خاصية الFrames (الأطر) بها."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"يجب تزويد ال CollisionShape2D بإحدى الأشكال (من نوع Shape2D) لتعمل بالشكل "
+"المطلوب. الرجاء تكوين و ضبط الشكل لها اولا!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "جميع الأنواع المعتمدة"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "حذف الأطر الرئيسة"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "الموقع:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "مجتمع"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "ملف اصول مضغوطة"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "عمل اشتراك"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "عمل اشتراك"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "أبجد هوز حطي كلمن صعفص قرشت ثخذ ضظغ."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "عملية تحريك"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Move Mode"
+msgstr "عملية تحريك"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "عينات (صوتية)"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "عمل اشتراك"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "عمل اشتراك"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
new file mode 100644
index 0000000000..fe711e1b30
--- /dev/null
+++ b/editor/translations/bg.po
@@ -0,0 +1,6811 @@
+# Bulgarian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016.
+# Иван Пенев (Адмирал АнимЕ) <aeternus.arcis@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-20 16:42+0000\n"
+"Last-Translator: Иван Пенев (Адмирал АнимЕ) <aeternus.arcis@gmail.com>\n"
+"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/bg/>\n"
+"Language: bg\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"Невалиден агрумент тип на convert(), използвайте константите започващи с "
+"TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Недостатъчно байтове за разкодиране или недействителен формат."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "Стъпката на range() е нула!"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not a script with an instance"
+msgstr "Скриптът няма инстанция"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not based on a script"
+msgstr "Обектът не е базиран на скрипт"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not based on a resource file"
+msgstr "Обектът не е базиран на ресурсен файл"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Невалиден формат на инстанцията в речника (липсва @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Невалиден формат на инстанцията в речника (скриптът в @path не може да бъде "
+"зареден)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"Невалиден формат на инстанцията в речника (скриптът в @path е невалиден)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Невалиден формат на инстанцията в речника (невалиден подклас)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Преходи"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Cut Nodes"
+msgstr "Възел"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Поставяне"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the signature object."
+msgstr "Имаше грешка при изнасяне на проекта!"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"За да може AnimatedSprite да показва кадри, първо трябва да му се даде "
+"SpriteFrames ресурс в парамертъра 'Frames'."
+
+#: scene/2d/canvas_modulate.cpp
+#, fuzzy
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Може да има само един видим CanvasModulate на сцене (или няколко "
+"инстанцирани сцени). Само първият ще работи, а всички останали - игнорирани."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D служи само за да даде форма за колизии на "
+"CollisionObject2D. Моля, използвайте го само като наследник на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. за да им дадете форма."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Празен CollisionPolygon2D няма никакъв ефект на колизията."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D служи само за да даде форма за колизии на "
+"CollisionObject2D. Моля, използвайте го само като наследник на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. за да им дадете форма."
+
+#: scene/2d/collision_shape_2d.cpp
+#, fuzzy
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"За да работи CollisionShape2D, е нужно да му се даде форма. Моля, създайте "
+"му Shape2D ресурс."
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Тесктура с нужната форма на светлината трябва да бъде дадена в параметъра "
+"'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Затъмняващият многоъгълник трябва да бъде зададен (или нарисуван) за да може "
+"да работи тази сянка."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "Затъмняващият многоъгълник е празен. Моля, нарисувайте един."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"За този възел трябва да бъде зададен или създаден един ресурс "
+"NavigationPolygon. Моля, задайте или нарисувайте един многоъгълник."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance трябва да бъде наследник или наследник на "
+"наследник на Navigation2D. Той само дава навигационна информация."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr "ParallaxLayer работи само когато е наследник на ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Параметърът 'Path' трябва да сочи към действителен възел Particles2D, за да "
+"работи."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D работи само когато е наследник на Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Параметърът 'Path' трябва да сочи към действителен възел Node2D, за да "
+"работи."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"За да изпълнява звук, SamplePlayer трябва да има един SampleLibrary ресурс в "
+"параметъра 'samples'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Параметъра 'Path' трябва да сочи към валиден Viewport нод за да работи. Този "
+"Viewport трябва да бъде настройен в режим 'рендъринг цел'(render target)."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Параметърът 'Path' трябва да сочи към действителен възел Particles2D, за да "
+"работи."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Отказ"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Добре"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Тревога!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Моля, потвърдете..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Файлът съществува. Искате ли да го презапишете?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Запазване"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Запазване на файл"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Създаване на папка"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Път:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Папки и файлове:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Файл:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Име:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Неуспешно създаване на папка."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Трябва да се използва правилно разширение."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Устройство"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Копче"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Ляво копче."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Дясно копче."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Средно копче."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Колелцето нагоре."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Колелцето надолу."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Ос"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Изрязване"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Копиране"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Поставяне"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Избиране на всичко"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Изчистване"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Непознат формат за шрифтове."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Грешка при зареждането на шрифта."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Преходи"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Преход"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Любими:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Сцената не успя да се зареди заради липсващи зависимости:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Not in resource path."
+msgstr "Обектът не е базиран на ресурсен файл"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Обновяване на сцената"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Обновяване на сцената.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Изнасяне за %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Извършва се повторно внасяне"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Внасяне:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Запазване на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Отваряне на сцена"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Бързо отваряне на сцена.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Да се затвори ли сцената? (незаразените промени ще се загубят)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Запазване на сцената като.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Моля, първо запазете сцената."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Изход"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Бързо пускане на сцена.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Изберете главна сцена"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Имаше грешка при зареждане на сцената."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Сцената '%s' има нарушени зависимости:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Сцена"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Нова сцена"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Отваряне на сцена.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Запазване на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Запазване на всички сцени"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Затваряне на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Настройки на проекта"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Изход до списъка с проекти"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Внасяне на обекти в проекта."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Внасяне"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Изнасяне на проекта на много платформи."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Изнасяне"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Възпроизвеждане на проекта."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Преустановяване на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Преустановяване на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Спиране на сцената."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Възпроизвеждане на редактирана сцена."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Възпроизвеждане на сцената"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Възпроизвеждане на сцена по избор"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Възпроизвеждане на сцена по избор"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Настройки за отстраняване на грешки"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Настройки"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Настройки на редактора"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Относно"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Възел"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Повторно внасяне"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Внасяне на шаблони от архив във формат ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Изнасяне на проекта"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Изнасяне на библиотеката"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Инсталирани приставки:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+"За да се извърши повторното внасяне, текущата сцена трябва да бъде запазена."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Запазване и повторно внасяне"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Път на сцената:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Повторно внасяне.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Внасяне на шрифт"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Имаше грешка при внасянето на сцената."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Внасяне на триизмерна сцена"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Внасяне въпреки това"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Внасяне и отваряне"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Внасяне на сцена"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Внасяне на сцената.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Внасяне на изображение:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Имаше грешка при внасянето:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Внасяне на текстури за Атлас (двуизмерно)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Внасяне на големи текстури (двуизмерно)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Внасяне на текстури"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Двуизмерна текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Триизмерна текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Внасяне на голяма текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Няма артикули за внасяне!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Внасяне на преводи"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Неуспешно внасяне!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Внасяне на превода"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Внасяне на езици:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Внасяне на анимации.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Select Mode"
+msgstr "Избиране на всичко"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Внасяне от сцена"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Обновяване от сцена"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Имаше грешка при внасянето на сцената"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Имаше грешка при внасянето"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Внасяне на тема"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Избиране на всичко"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Отстраняване на грешки"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Отстранителя на грешки да седи отворен"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Отстранител на грешки"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Скорост (кадри в секунда):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Моля, изнесете извън папката на проекта!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Имаше грешка при изнасяне на проекта!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Създаване на папка"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Преходи"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Настройки за изнасяне на проекта"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Изнасяне към платформа"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Изнасяне на избраните ресурси (включително зависимостите)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Изнасяне на всички ресурси в проекта."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Изнасяне на всички файлове в папката на проекта."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Режим на изнасяне:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Ресурси за изнасяне:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Изнасяне.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Внесен проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Внасяне на съществуващ проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Настройките са запазени."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Приставки"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Нова сцена"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Избиране на всичко"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Избиране на всичко"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Настройки за пускане на сцена"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Нова сцена"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Нова сцена"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete (No Confirm)"
+msgstr "Моля, потвърдете..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Грешка при зареждането на шрифта."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Създаване на папка"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Нова сцена"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Грешки"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Грешки:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Стойност"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Разни"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
new file mode 100644
index 0000000000..0b1993caa0
--- /dev/null
+++ b/editor/translations/bn.po
@@ -0,0 +1,6935 @@
+# Bengali translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017.
+# Tahmid Karim <tahmidk15@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2017-01-07 04:19+0000\n"
+"Last-Translator: ABU MD. MARUF SARKER <maruf.webdev@gmail.com>\n"
+"Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/"
+"godot/bn/>\n"
+"Language: bn\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "অগ্রহণযোগ্য মান/আর্গুমেন্ট convert()-এ গিয়েছে, TYPE_* ধ্রুবক ব্যবহার করুন।"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "বিন্যাস জানার জন্য যথেষ্ট বাইট নেই, অথবা ভুল ফরম্যাট।"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "ধাপ মান/আর্গুমেন্ট শূন্য!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "ইনস্ট্যান্স বিহীন স্ক্রিপ্ট"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "স্ক্রিপ্ট নির্ভর নয়"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "রিসোর্স ফাইল ভিত্তিক নয়"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "ভুল dictionary ফরম্যাট (@path নেই)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "ভুল dictionary ফরম্যাট (@path-এ স্ক্রিপ্ট লোড অসম্ভব)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "ভুল dictionary ফরম্যাট (@path-এ ভুল স্ক্রিপ্ট)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "ভুল dictionary ফরম্যাট (ভুল subclasses)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"একটি নোড কার্যকর মেমোরি ছাড়াই উৎপন্ন হয়েছে, কি করে সঠিকভাবে সরবারহ করতে হয় তা "
+"অনুগ্রহ করে ডকুমেন্টেশনে পড়ুন!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"নোড ডাকা হয়েছে, কিন্তু প্রথম কার্যকর মেমোরিতে ফাংশনের কোনো অবস্থা ফেরত পাঠায়নি।"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"নোডের কার্যকর মেমোরির প্রাথমিক উপাদানে অবশ্যই ফিরতি মান নির্দিষ্ট করতে হবে! অনুগ্রহ "
+"করে আপনার নোডটি মেরামত করুন।"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "নোড অনিয়মিত ক্রমের ফলাফল পাঠিয়েছে: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"ক্রম বিট (bit) পাওয়া গিয়েছে কিন্তু নোডটি স্ট্যাক/তাক-এ নেই, সমস্যাটি রিপোর্ট করুন!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "স্ট্যাক/তাক-এর গভীরতায় স্ট্যাক/তাক অধিপ্রবাহিত/প্লাবিত হয়েছে: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "ফাংশনগুলি:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "ভেরিয়েবলস/চলকসমূহ:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "সিগন্যালস/সংকেতসমূহ:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "নামটি কার্যকর সনাক্তকারী নয়:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "নামটি ইতিমধ্যেই অপর ফাংশন/চলক(ভেরিয়েবল)/সংকেত(সিগন্যাল)-এ ব্যবহৃত হয়েছে:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "ফাংশনের (Function) নতুন নামকরণ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "চলক/ভেরিয়েবল-এর নামান্তর করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "সংকেত/সিগন্যাল-এর নামান্তর করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "ফাংশন সংযোজন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "চলক/ভেরিয়েবল সংযোজন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "সংকেত/সিগন্যাল সংযোজন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "ফাংশন (Function) অপসারণ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "চলক/ভেরিয়েবল অপসারণ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "চলক/ভেরিয়েবল সম্পাদন:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "সংকেত (Signal) অপসারণ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "সংকেত/সিগন্যাল সম্পাদন:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "অভিব্যক্তি (Expression) পরিবর্তন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "নোড সংযোজন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"গেটার (Getter) তৈরি করতে/নামাতে মেটা কী (Meta) চেপে রাখুন। জেনেরিক সিগনেচার "
+"(generic signature) তৈরি করতে/নামাতে শিফট কী (Shift) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"গেটার (Getter) তৈরি করতে/নামাতে কন্ট্রোল কী (Ctrl) চেপে রাখুন। জেনেরিক সিগনেচার "
+"(generic signature) তৈরি করতে/নামাতে শিফট কী (Shift) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+"নোডে সাধারণ সম্পর্ক (reference) তৈরি করতে/নামাতে মেটা কী (Meta) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+"নোডে সাধারণ সম্পর্ক (reference) তৈরি করতে/নামাতে কন্ট্রোল কী (Ctrl) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "চলক সেটার (Variable Setter) তৈরি করতে/নামাতে মেটা কী (Meta) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+"চলক সেটার (Variable Setter) তৈরি করতে/নামাতে কন্ট্রোল কী (Ctrl) চেপে রাখুন।"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "প্রিলোড নোড যুক্ত করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "শাখা (tree) হতে নোড (সমূহ) যুক্ত করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "গেটার (Getter) এর বৈশিষ্ট্যে যুক্ত করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "সেটার (Setter) এর বৈশিষ্ট্যে যুক্ত করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "শর্ত (Condition)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "ক্রম (Sequence)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "সুইচ (Switch)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "পুনরুক্তিকারী (Iterator)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "যতক্ষণ (While)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "ফেরৎ পাঠান (Return)"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "ডাকুন (Call)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "মান পান (Get)"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "নিযুক্ত করুন (Set)"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "সম্পাদন করুন (Edit)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "তলের ধরণ (Base Type):"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "সদস্যগণ (Members):"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "উপস্থিত নোডসমূহ:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "গ্রাফ সম্পাদন করতে ফাংশন নির্বাচন অথবা তৈরি করুন"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "বন্ধ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "সংকেত/সিগন্যাল-এর মান/আর্গুমেন্ট-সমূহ সম্পাদন করুন:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "চলক/ভেরিয়েবল সম্পাদন করুন:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "পরিবর্তন করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "নির্বাচিত সমূহ অপসারণ করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "ছেদবিন্দু অদলবদল করুন (টগল ব্রেকপয়েন্ট)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "নোডের ধরণ সন্ধান করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "নোড-সমূহ প্রতিলিপি/কপি করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "নোড-সমূহ কর্তন/কাট করুন"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "নোড-সমূহ প্রতিলেপন/পেস্ট করুন"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "যোগান/ইনপুট-এর ধরণ পুনরাবৃত্তিমূলক নয়: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "পুনরাবৃত্তকারী অকার্যকর হয়ে পড়েছে"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "পুনরাবৃত্তকারী অকার্যকর হয়ে পড়েছে: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "সূচক/ইনডেক্স মানের অগ্রহনযোগ্য নাম।"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "ভিত্তিটি (বেস) নোড নয়!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "পথটি নোডকে দিকনির্দেশ করে না!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "%s নোডে সূচক/ইনডেক্স মানের অগ্রহনযোগ্য নাম '%s'।"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": অগ্রহনযোগ্য মান/আর্গুমেন্ট-এর ধরণ: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": অগ্রহনযোগ্য মান/আর্গুমেন্ট-সমূহ: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "স্ক্রিপ্টে চলক-প্রাপক (VariableGet) পাওয়া যায়নি: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "স্ক্রিপ্টে চলক-স্থাপক (VariableSet) পাওয়া যায়নি: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "স্বনির্মিত (custom) নোডে কোনো _step() মেথড নেই, গ্রাফ প্রক্রিয়াকরণ অসম্ভব।"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"_step() হতে অগ্রহনযোগ্য মান ফেরৎ এসেছে, মান অবশ্যই পূর্ণসংখ্যা (integer) (ক্রমিক), "
+"অথবা শব্দমালা/বাক্য (string) (ভুল/সমস্যা) হতে হবে।"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "এইমাত্র চাপিত"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "এইমাত্র অব্যাহিত/মুক্ত"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"সার্টিফিকেট ফাইলটি পড়া সম্ভব হচ্ছে না। ফাইলের পথ এবং পাসওয়ার্ড দুটোই কি সঠিক দেয়া "
+"হয়েছে?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "স্বাক্ষরিত বস্তু (signature object) তৈরিতে সমস্যা হয়েছে।"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "প্যাকেজের স্বাক্ষর (package signature) তৈরিতে সমস্যা হয়েছে।"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"এক্সপোর্ট এর জন্য প্রয়োজণীয় টেমপ্লেট পাওয়া যায়নি।\n"
+"এক্সপোর্ট টেমপ্লেট-সমূহ ডাউনলোড করে ইন্সটল করুন।"
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "স্বনির্মিত ডিবাগ (debug) প্যাকেজ খুঁজে পাওয়া যায়নি।"
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "স্বনির্মিত রিলিস (release) প্যাকেজ খুঁজে পাওয়া যায়নি।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "একক (অনন্য) নামটি অগ্রহনযোগ্য।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "পণ্যের অগ্রহনযোগ্য GUID।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "প্রকাশকের অগ্রহনযোগ্য GUID।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "পটভূমির (background) অগ্রহনযোগ্য রঙ।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "স্টোর লোগোর (Store Logo) ছবির অগ্রহনযোগ্য মাত্রা (৫০x৫০ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "৪৪x৪৪ বর্গ লোগোর (logo) ছবির অগ্রহনযোগ্য মাত্রা (৪৪x৪৪ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "৭১x৭১ বর্গ লোগোর (logo) ছবির অগ্রহনযোগ্য মাত্রা (৭১x৭১ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "১৫০x১৫০ বর্গ লোগোর (logo) ছবির অগ্রহনযোগ্য মাত্রা (১৫০x১৫০ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "৩১০x৩১০ বর্গ লোগোর (logo) ছবির অগ্রহনযোগ্য মাত্রা (৩১০x৩১০ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "৩১০x১৫০ প্রশস্ত লোগোর (logo) ছবির অগ্রহনযোগ্য মাত্রা (৩১০x১৫০ হতে হবে)।"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "স্প্ল্যাশ পর্দার (splash screen) ছবির অগ্রহনযোগ্য মাত্রা (৬২০x৩০০ হতে হবে)।"
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"AnimatedSprite দ্বারা ফ্রেম দেখাতে SpriteFrames রিসোর্স অবশ্যই তৈরি করতে হবে "
+"অথবা 'Frames' এর মান-এ নির্ধারন করে দিতে হবে।"
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"প্রতি দৃশ্যে (অথবা ইন্সট্যান্সড দৃশ্যের সম্মেলনে) সর্বোচ্চ একটি দৃশ্যমান CanvasModulate "
+"সম্ভব। সর্বপ্রথমেরটি দৃশ্যত হলেও বাকিগুলো বাতিল হয়ে যাবে।"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D শুধুমাত্র CollisionObject2D হতে সৃষ্ট নোডের সংঘর্ষের আকৃতি প্রদান "
+"করে। Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, ইত্যাদিকে আকার দিতে "
+"অনুগ্রহ করে তা শুধুমাত্র তাদের অংশ হিসেবে ব্যবহার করুন।"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "সংঘর্ষে ফাঁকা/শুন্য CollisionPolygon2D-এর কোনো প্রভাব নেই।"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D শুধুমাত্র CollisionObject2D হতে সৃষ্ট নোডের সংঘর্ষের আকৃতি প্রদান "
+"করে। Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, ইত্যাদিকে আকার দিতে "
+"অনুগ্রহ করে তা শুধুমাত্র তাদের অংশ হিসেবে ব্যবহার করুন।"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"সফল্ভাবে কাজ করতে CollisionShape2D এর একটি আকৃতি প্রয়োজন। অনুগ্রহ করে তার জন্য "
+"একটি আকৃতি তৈরি করুন!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"অবশ্যই লাইটের আকৃতি সহ একটি গঠন 'texture' এর বৈশিষ্ট্যে হিসেবে প্রদান করতে হবে।"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Occluder এর প্রভাব ফেলতে একটি occluder বহুভুজ নির্ধারণ করা (বা, আঁকা) আবশ্যক।"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "এই occluder এর জন্য occluder পলিগনটি খালি। অনুগ্রহ করে একটি পলিগন আঁকুন!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"এই নোডটি সফল্ভাবে কাজ করার জন্য একটি NavigationPolygon রিসোর্স নির্ধারন বা তৈরি "
+"করতে হবে। অনুগ্রহ করে একটি বৈশিষ্ট্য নির্ধারন করুন বা একটি পলিগন/বহুভুজ আঁকুন।"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance-কে অবশ্যই Navigation2D-এর অংশ অথবা অংশের অংশ হতে "
+"হবে। এটা শুধুমাত্র ন্যাভিগেশনের তথ্য প্রদান করে।"
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer একমাত্র ParallaxBackground এর অংশ হিসেবে নির্ধারন করলেই কাজ করে।"
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "Path এর দিক অবশ্যই একটি কার্যকর Particles2D এর দিকে নির্দেশ করাতে হবে।"
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D একমাত্র Path2D এর অংশ হিসেবে নির্ধারন করালেই কাজ করে।"
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "Path এর দিক অবশ্যই একটি কার্যকর Node2D এর দিকে নির্দেশ করাতে হবে।"
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"SamplePlayer-এ শব্দ চালাতে এর 'samples'-এ একটি SampleLibrary তৈরি বা নির্ধারন "
+"করতে হবে।"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Path এর দিক অবশ্যই একটি কার্যকর Viewport এর দিকে নির্দেশ করাতে হবে। সেই "
+"Viewport অবশ্যই 'render target' মোডে নির্ধারন করতে হবে।"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"এই sprite টি কার্যকর করতে path প্রোপার্টিতে নির্ধারিত Viewport টি অবশ্যই 'render "
+"target' এ নির্ধারিত করতে হবে।"
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D সর্বোত্তম কার্যকর হয় যখন সম্পাদিত দৃশ্য মূল দৃশ্য হিসেবে সরাসরি "
+"ব্যবহৃত হয়।"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape শুধুমাত্র CollisionObject হতে সৃষ্ট নোডের সংঘর্ষের আকৃতি প্রদান করে। "
+"Area, StaticBody, RigidBody, KinematicBody, ইত্যাদিকে আকার দিতে অনুগ্রহ করে তা "
+"শুধুমাত্র তাদের অংশ হিসেবে ব্যবহার করুন।"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"সফল্ভাবে কাজ করতে CollisionShape এর একটি আকৃতি প্রয়োজন। অনুগ্রহ করে তার জন্য একটি "
+"আকৃতি তৈরি করুন!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon শুধুমাত্র CollisionObject হতে সৃষ্ট নোডের সংঘর্ষের আকৃতি প্রদান "
+"করে। Area, StaticBody, RigidBody, KinematicBody, ইত্যাদিকে আকার দিতে অনুগ্রহ "
+"করে তা শুধুমাত্র তাদের অংশ হিসেবে ব্যবহার করুন।"
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "সংঘর্ষে ফাঁকা/শুন্য CollisionPolygon-এর কোনো প্রভাব নেই।"
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"এই নোডটি সফল্ভাবে কাজ করার জন্য একটি NavigationMesh রিসোর্স নির্ধারন বা তৈরি "
+"করতে হবে।"
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance-কে অবশ্যই Navigation-এর অংশ অথবা অংশের অংশ হতে হবে। "
+"এটা শুধুমাত্র ন্যাভিগেশনের তথ্য প্রদান করে।"
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Path এর দিক অবশ্যই একটি কার্যকর Spatial নোডের এর দিকে নির্দেশ করাতে হবে।"
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"প্রতি দৃশ্যে (অথবা ইন্সট্যান্সড দৃশ্যের সম্মেলনে) সর্বোচ্চ একটি দৃশ্যমান WorldEnvironment "
+"সম্ভব।"
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"SpatialSamplePlayer-এ শব্দ চালাতে এর 'samples'-এ একটি SampleLibrary তৈরি বা "
+"নির্ধারন করতে হবে।"
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"AnimatedSprite3D দ্বারা ফ্রেম দেখাতে SpriteFrames রিসোর্স অবশ্যই তৈরি করতে হবে "
+"অথবা 'Frames' এর মান-এ নির্ধারন করে দিতে হবে।"
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "বাতিল"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "সঠিক"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "সতর্কতা!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "অনুগ্রহ করে নিশ্চিত করুন..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "একই নামের ফাইল উপস্থিত, তা মুছে লিখবেন?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "সব ফাইল পরিচিতি সম্পন্ন"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "সব ফাইল (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "খুলুন"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "একটি ফাইল খুলুন"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "এক বা একাধিক ফাইল খুলুন"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "পথ/ডিরেক্টরি খুলুন"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "ফাইল বা পথ/ডিরেক্টরি খুলুন"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "সংরক্ষন করুন"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "ফাইল সংরক্ষন করুন"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "ফোল্ডার তৈরি করুন"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "পথ:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "পথ এবং ফাইল:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "ফাইল:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "ফিল্টার:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "নাম:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "একটি কার্যকর এক্সটেনশন ব্যবহার করা আবশ্যক।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "ডিভাইস/যন্ত্র"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "বাটন/বোতাম"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "বাম বোতাম/বাটন।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "ডান বোতাম/বাটন।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "মাঝ বোতাম/বাটন।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "মাউসের চাকা উপরের দিকে চক্কর।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "মাউসের চাকা নিচের দিকে চক্কর।"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "অক্ষ"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "কর্তন/কাট করুন"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "প্রতিলিপি/কপি করুন"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "প্রতিলেপন/পেস্ট করুন"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "সবগুলি বাছাই করুন"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "পরিস্কার করুন/ক্লীয়ার"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "সাবেক অবস্থায় যান/আনডু"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"সাধারণত popups লুকিয়ে যাবে, যদি আপনি popup() বা popup*() এর যেকোনো ফাংশন "
+"ব্যবহার না করেন। যদিও সম্পাদনের কাজে তা গ্রহনযোগ্য, কিন্তু চালনার সময় তা লুকিয়ে "
+"যাবে।"
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"এই viewport টি render target হিসেবে নির্ধারন করা নেই। আপনি যদি এর বস্তু-সামগ্রী "
+"সরাসরি পর্দায় দেখাতে চান, এটিকে যেকোনো Control এর অংশভূত করুন যেনো এটি একটি "
+"আকার ধারণ করতে পারে। অন্যথায়, এটিকে একটি RenderTarget করুন এবং এর অভ্যন্তরীণ "
+"দৃশ্যাবলিকে (texture) দৃশ্যমান করতে কোনো নোডে হস্তান্তর করুন।"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "FreeType আরম্ভে সমস্যা হয়েছে।"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "অজানা ধরনের ফন্ট।"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "ফন্ট তুলতে/লোডে সমস্যা হয়েছে।"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "ফন্টের আকার অগ্রহনযোগ্য।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "অসমর্থ/অক্ষম"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "সকল বাছাইকৃত"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "সংযোগ (অ্যাড) বোতাম সরান"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "অ্যানিমেশনের (Anim) ট্র্যানজিশন/স্থানান্তরণ পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "অ্যানিমেশনের (Anim) ট্রান্সফর্ম/রুপান্তর পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "অ্যানিমেশনের (Anim) মান পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "অ্যানিমেশনের (Anim) ডাক পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "অ্যানিমেশনে (Anim) ট্র্যাক/পথ যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "অ্যানিমেশনের (Anim) চাবিগুলো অনুলিপি/নকল করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "অ্যানিমেশনের (Anim) ট্র্যাক/পথ উপরের দিকে তুলুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "অ্যানিমেশনের (Anim) ট্র্যাক/পথ নিচের দিকে নিয়ে যান"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "অ্যানিমেশনের (Anim) ট্র্যাক/পথ অপসারণ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "ট্র্যানজিশন/স্থানান্তরণ সেট/নির্ধারণ করুন:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "অ্যানিমেশন (Anim) ট্র্যাক/পথ-এর নাম পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "অ্যানিমেশন (Anim) ট্র্যাক/পথ-এর প্রক্ষেপ/নিবেশ পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "অ্যানিমেশন (Anim) ট্র্যাক/পথ-এর মানের ধরন/প্রকার পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "নোডের বাঁক/কার্ভ সম্পাদন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "নির্বাচন বাঁক/কার্ভ সম্পাদন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "অ্যানিমেশনের (Anim) চাবিগুলো অপসারণ করুন"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "নির্বাচিত সমূহ অনুলিপি করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "পক্ষান্তরিত (Transposed) সমূহ অনুলিপি করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "নির্বাচিত সমূহ অপসারণ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "অবিচ্ছিন্ন/নিরবচ্ছিন্ন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "স্বতন্ত্র/পৃথক্"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "ট্রিগার/চালনা করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "অ্যানিমেশনে (Anim) চাবি/কী যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "অ্যানিমেশনে (Anim) চাবি/কী-সমুহ সরান"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "নির্বাচিত সমূহের আকার পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "কার্সর হতে আকার পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "পরবর্তী ধাপে যান"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "পূর্ববর্তী ধাপে যান"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "রৈখিক/লিনিয়ার"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "ধ্রুবক/কন্সট্যান্ট"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "অভ্যন্তরে/ইন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "বাইরে/অউট"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "অভ্যন্তরে-বাইরে/ইন-অউট"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "বাইরে-অভ্যন্তরে/অউট-ইন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "অনুবাদসমূহ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "অ্যানিমেশন (Animation) উন্নত/নিখুঁত করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "অ্যানিমেশন (Animation) পরিচ্ছন্ন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "%s এর জন্য নতুন ট্র্যাক/পথ তৈরি করতে এবং চাবি প্রবেশ করাতে চান?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "%d এর জন্য নতুন ট্র্যাক/পথ-সমূহ তৈরি করতে এবং চাবিসমূহ প্রবেশ করাতে চান?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "তৈরি করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "অ্যানিমেশন (Anim) তৈরি এবং যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "অ্যানিমেশনে (Anim) ট্র্যাক/পথ এবং চাবি যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "অ্যানিমেশনে (Anim) চাবি যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "অ্যানিমেশনের (Anim) দৈর্ঘ্য পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "অ্যানিমেশনের (Anim) পুনরাবৃত্তি/লুপ পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "অ্যানিমেশনে (Anim) প্রতীকী মানের চাবি তৈরি করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "অ্যানিমেশনে (Anim) অন্তর্ভুক্ত করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "অ্যানিমেশনের (Anim) চাবিসমূহের আকার পরিবর্তন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "অ্যানিমেশনে (Anim) ডাকার ট্র্যাক/পথ যোগ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "অ্যানিমেশন (Animation) জুম (zoom) করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "দৈর্ঘ্য (দৈর্ঘ্যসমূহ):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "অ্যানিমেশনের (Animation) দৈর্ঘ্য (সময় সেকেন্ডে)।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "ধাপ (ধাপসমূহ):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "কার্সরের স্থানে/পদক্ষেপে ভাঙ্গুন (snap) (সময় সেকেন্ডে)।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "অ্যানিমেশনের পুনরাবৃত্তি/লুপ সক্ষম/অক্ষম করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "নতুন ট্র্যাক/পথ-সমূহ যোগ করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "বর্তমান ট্র্যাক/পথ উপরের দিকে তুলুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "বর্তমান ট্র্যাক/পথ নিচের দিকে নামান।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "নির্বাচিত ট্র্যাক/পথ অপসারণ করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "ট্র্যাক/পথের সরঞ্জামসমূহ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "প্রতিটি চাবির সম্পাদন-যোগ্যতা সক্রিয় করার জন্য তাদের নির্বাচন করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "অ্যানিমেশন পরিমার্জনকারী"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "সর্বোচ্চ রৈখিক ভুল/সমস্যা:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "সর্বোচ্চ কৌণিক ভুল/সমস্যা:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "সর্বোচ্চ পরিশোধনযোগ্য কোণ:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "পরিমার্জন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"অ্যানিমেশনসমূহ সম্পাদন করতে দৃশ্যের তালিকা থেকে একটি AnimationPlayer নির্বাচন করুন।"
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "চাবি"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "ট্র্যানজিশন/স্থানান্তরণ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "স্কেল/মাপের অনুপাত:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "কোন নোডে ফাংশন(সমূহ) ডাকবেন?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "অগ্রহনযোগ্য চাবিসমূহ অপসারণ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "অমীমাংসিত এবং খালি/অসার ট্র্যাক/পথসমূহ অপসারণ করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "সকল অ্যানিমেশনসমূহ পরিচ্ছন্ন করুন"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "সকল অ্যানিমেশনসমূহ পরিচ্ছন্ন করুন (অফেরৎযোগ্য!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "পরিচ্ছন্ন করুন"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "শ্রেণীবিন্যাস/সারি পুনর্মাপন করুন"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "শ্রেণীবিন্যাস/সারির মানের ধরণ পরিবর্তন করুন"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "শ্রেণীবিন্যাস/সারির মান পরিবর্তন করুন"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "অনুসন্ধান করুন:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "সাজান:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "উল্টান/বিপরীত দিকে ফিরান"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "বিভাগ:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "সকল"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "ওয়েবসাইট:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "সমর্থন.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "অফিসিয়াল/প্রাথমিক উৎস"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "কমিউনিটি/যৌথ-সামাজিক উৎস"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "পরীক্ষামূলক উৎস"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "প্রয়োজনীয় উপকরণসমূহের ZIP ফাইল"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "'%s' এর জন্য মেথডের তালিকা:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "মেথডের তালিকা:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "মান/আর্গুমেন্ট-সমূহ:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "প্রত্যাবর্তন:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "লাইন-এ যান"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "লাইন নাম্বার:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "কোনো মিল নেই"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d টি সংঘটন প্রতিস্থাপিত হয়েছে।"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "প্রতিস্থাপন করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "সমস্তগুলি প্রতিস্থাপন করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "অক্ষরের মাত্রা (বড়/ছোট-হাতের) মিল করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "সম্পূর্ণ শব্দ"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "শুধুমাত্র নির্বাচিতসমূহ"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "অনুসন্ধান করুন"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "সন্ধান করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "পরবর্তী"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d টি সংঘটন প্রতিস্থাপিত হয়েছে।"
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "খুঁজে পাওয়া যায়নি!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "এর দ্বারা প্রতিস্থাপন করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "অক্ষরের মাত্রা (বড়/ছোট-হাতের) সংবেদনশীল"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "পিছনের/অতীতের দিকে"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "প্রতিস্থাপনে অবহিত করুন"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "অতিক্রম করে যান"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "সম্প্রসারিত করুন (জুম্ ইন)"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "সংকুচিত করুন (জুম্ আউট)"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "সম্প্রসারন/সংকোচন অপসারণ করুন (রিসেট জুম্)"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "লাইন:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "কলাম:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "নির্দেশিত নোডের মেথড নির্দিষ্ট করতে হবে!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"উদ্দেশ্যিত মেথড পাওয়া যায়নি! উদ্দেশ্যিত নোডে একটি কার্যকর মেথড নির্দিষ্ট করুন অথবা "
+"একটি স্ক্রিপ্ট ফাইল সংযুক্ত করুন।"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "নোডের সাথে সংযুক্ত করুন:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "সংযোজন করুন"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "অপসারণ করুন"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "ডাকযোগ্য অতিরিক্ত মান/আর্গুমেন্ট সংযুক্ত করুন:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "ডাকযোগ্য অতিরিক্ত মান/আর্গুমেন্ট-সমূহ:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "নোডের পথ:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "নির্মাণ ফাংশন"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "বিলম্বিত"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "ওয়ান-শট"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "সংযোগ"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "'%s' এর সাথে '%s' সংযুক্ত করুন"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "সংযোজক সংকেত/সিগন্যাল:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "সদস্যতা/সাবস্ক্রিপশন তৈরি করুন"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "সংযোগ.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "সংযোগ বিচ্ছিন্ন করুন"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "সংকেতসমূহ"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "নতুন তৈরি করুন"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "ফেবরিট/প্রিয়-সমূহ:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "সাম্প্রতিক:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "মিলসমূহ:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "বর্ণনা:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "এর জন্য প্রতিস্থাপকের অনুসন্ধান করুন:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "এর জন্য নির্ভরতা-সমূহ:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"'%s' দৃশ্যটি এই-মুহূর্তে সম্পাদিত হচ্ছে।\n"
+"পুনরায়-লোড (রিলোড) না করা পর্যন্ত পরিবর্তন-সমূহ কার্যকর হবে না।"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"'%s' রিসোর্সটি ব্যবহৃত হচ্ছে।\n"
+"পুনরায়-লোড (রিলোড)-এর সময় পরিবর্তনসমূহ কার্যকর হবে।"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "নির্ভরতা-সমূহ"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "রিসোর্স"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "পথ"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "নির্ভরতা-সমূহ:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "ত্রুটিপূর্ণ/ভগ্ন-অংশসমূহ ঠিক করুন"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "নির্ভরতা-সমূহের এডিটর"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "প্রতিস্থাপক রিসোর্স-এর অনুসন্ধান করুন:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "স্বত্বাধিকারীসমূহ:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"যেসব ফাইল অপসারিত হচ্ছে তারা অন্যান্য রিসোর্স ফাইলের কার্যকররুপে কাজ করার জন্য "
+"দরকারি।\n"
+"তবুও তাদের অপসারণ করবেন? (অফেরৎযোগ্য)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "নির্বাচিত ফাইলসমূহ প্রকল্প হতে অপসারণ করবেন? (অফেরৎযোগ্য)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "লোডে সমস্যা হয়েছে:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "নির্ভরতা-সমূহের অনুপস্থিতিতে দৃশ্যের লোড ব্যর্থ হয়েছে:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "যেকোনো উপায়েই খুলুন"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "কোন সিধান্তটি নেয়া উচিত হবে?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "নির্ভরতা-সমূহ ঠিক করুন"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "লোডে একাধিক সমস্যা হয়েছে!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "%d -টি বস্তু(সমূহ) স্থায়ীভাবে মুছে ফেলবেন? (অফেরৎযোগ্য!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "আয়ত্তে"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "স্পষ্ট মালিকানা বিহীন রিসোর্সসমূহ:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "মালিকবিহীন রিসোর্সের অনুসন্ধানকারী"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "নির্বাচিত ফাইলসমূহ অপসারণ করবেন?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "অপসারণ করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "অগ্রহনযোগ্য নাম।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "গ্রহনযোগ্য অক্ষরসমূহ:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"অগ্রহনযোগ্য নাম। নামটি অবশ্যই ইঞ্জিনে বিদ্যমান ক্লাসের নামের সাথে পরম্পরবিরোধী হতে "
+"পারবে না।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"অগ্রহনযোগ্য নাম। নামটি অবশ্যই বিদ্যমান পূর্বনির্মিত ধরণের নামের সাথে পরম্পরবিরোধী "
+"হতে পারবে না।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"অগ্রহনযোগ্য নাম। নামটি অবশ্যই বিদ্যমান সার্বজনীন ধ্রুবকের নামের সাথে পরম্পরবিরোধী "
+"হতে পারবে না।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "অকার্যকর পথ।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "ফাইলটি বিদ্যমান নয়।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "রিসোর্সের পথে নয়।"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "AutoLoad সংযুক্ত করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "'%s' এর AutoLoad ইতিমধ্যেই বিদ্যমান!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Autoload পুনঃনামকরণ করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "AutoLoad এর সার্বজনীন মানসমূহ অদলবদল/টগল করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Autoload স্থানান্তর করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Autoload অপসারণ করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "সক্রিয় করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Autoload সমূহ পুনর্বিন্যস্ত করুন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "নোডের নাম:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "নাম"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "একক-বস্তু/সিঙ্গেলটোন"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "তালিকা:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "দৃশ্য হাল নাগাদ হচ্ছে"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "স্থানীয় পরিবর্তন-সমূহ সংরক্ষিত হচ্ছে.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "দৃশ্য হাল নাগাদ হচ্ছে.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "একটি স্থান পছন্দ করুন"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "পছন্দ করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "পিছনের দিকে যান"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "সামনের দিকে যান"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "উপরের দিকে যান"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "রিফ্রেস করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "অদৃশ্য ফাইলসমূহ অদলবদল/টগল করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "ফেবরিট/প্রিয়-সমূহ অদলবদল/টগল করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "মোড অদলবদল/টগল করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "পথের উপর ফোকাস করুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "ফেবরিট/প্রিয়কে উপরের দিকে তুলুন"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "ফেবরিট/প্রিয়কে নিচের দিকে নামান"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "প্রিভিউ:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "উৎসসমূহ স্ক্যান করুন"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "সাহায্য অনুসন্ধান করুন"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "ক্লাসের তালিকা:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "ক্লাসের অনুসন্ধান করুন"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "ক্লাস:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "গ্রহণ করে:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "গৃহীত হয়েছে:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "সংক্ষিপ্ত বর্ণনা:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "সর্বজনীন/প্রকাশ্য মেথডসমূহ:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "GUI থিম এর বস্তুসমূহ:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "ধ্রুবকসমূহ:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "সংক্ষিপ্ত বর্ণনা:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "মেথডের বর্ণ্না:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "টেক্সট অনুসন্ধান করুন"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "সংযোজিত:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "অপসারিত:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "এটলাস/মানচিত্রাবলী সংরক্ষণে সমস্যা হয়েছে:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "এটলাস/মানচিত্রাবলীর উপ-গঠনবিন্যাস (subtexture) সংরক্ষণ অসমর্থ হয়েছে:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "সংরক্ষিত ফাইল:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "প্যাক/গুচ্ছিত করা"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "%s এর জন্য এক্সপোর্ট (export) হচ্ছে"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "স্থাপিত/বিন্যস্ত হচ্ছে.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " আউটপুট/ফলাফল:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "পুনরায় ইম্পোর্ট হচ্ছে"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "ইম্পোর্ট হচ্ছে:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "দৃশ্য হতে নোড"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "রিসোর্স সংরক্ষণে সমস্যা হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "রিসোর্স এইরূপে সংরক্ষণ করুন.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "বুঝলাম.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "লেখার জন্য ফাইলটি খোলায় সমস্যা হয়েছে:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "আবেদনকৃত ফাইল ফরম্যাট/ধরণ অজানা:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "সংরক্ষণের সময় সমস্যা হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "দৃশ্য সংরক্ষিত হচ্ছে"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "বিশ্লেষণ হচ্ছে"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "থাম্বনেইল তৈরি হচ্ছে"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"দৃশ্যটি সংরক্ষণ করা সম্ভব হচ্ছে না। সম্ভবত যেসবের (ইন্সট্যান্স) উপর নির্ভর করছে তাদের "
+"সন্তুষ্ট করা সম্ভব হচ্ছে না।"
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "রিসোর্স লোড ব্যর্থ হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "একত্রিত করার জন্য প্রয়োজনীয় MeshLibrary লোড অসম্ভব হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "MeshLibrary সংরক্ষণে সমস্যা হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "একত্রিত করার জন্য প্রয়োজনীয় TileSet লোড অসম্ভব হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "TileSet সংরক্ষণে সমস্যা হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "এক্সপোর্ট টেমপ্লেটের zip খোলায় সমস্যা হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "এক্সপোর্ট টেমপ্লেটসমূহ লোড হচ্ছে"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "লেআউট/নকশা সংরক্ষণের চেষ্টায় সমস্যা হয়েছে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "এডিটরের সাধারণ লেআউট/নকশা পরিবর্তিত হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "লেআউট/নকশার নাম পাওয়া যায়নি!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "সাধারণ লেআউট/নকশা আদি সেটিংসে প্রত্যাবর্তিত হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "মানসমূহ প্রতিলিপি/কপি করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "মানসমূহ প্রতিলেপন/পেস্ট করুন"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "রিসোর্স প্রতিলেপন/পেস্ট করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "রিসোর্স প্রতিলিপি/কপি করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "পূর্বনির্মাণ হিসেবে তৈরি করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "উপ-রিসোর্সকে অনন্য হিসেবে তৈরি করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "সাহায্যের পাতায় খুলুন"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "চালানোর জন্য কোনো দৃশ্য নির্দিষ্ট করা নেই।"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"কোনো মুখ্য দৃশ্য নির্ধারণ করা হয়নি, নির্ধারণ করবেন?\n"
+"আপনি পরবর্তিতে তা 'অ্যাপ্লিকেশন (application)' বিভাগের \\\"প্রকল্পের সেটিংস "
+"(Project Settings)\\\"-এ পরিবর্তন করতে পারবেন।"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"নির্বাচিত '%s' দৃশ্যটি বিদ্যমান নয়, একটি কার্যকর দৃশ্য নির্ধারণ করবেন?\n"
+"আপনি পরবর্তিতে তা 'অ্যাপ্লিকেশন (application)' বিভাগের \\\"প্রকল্পের সেটিংস "
+"(Project Settings)\\\"-এ পরিবর্তন করতে পারবেন।"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"নির্বাচিত '%s' দৃশ্যটি কোনো দৃশ্যের ফাইল নয়, একটি কার্যকর দৃশ্যের ফাইল নির্ধারণ "
+"করবেন?\n"
+"আপনি পরবর্তিতে তা 'অ্যাপ্লিকেশন (application)' বিভাগের \\\"প্রকল্পের সেটিংস "
+"(Project Settings)\\\"-এ পরিবর্তন করতে পারবেন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"বর্তমান দৃশ্যটি কখনোই সংরক্ষণ করা হয় নি, অনুগ্রহ করে চালানোর পূর্বে এটি সংরক্ষণ করুন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "উপ-প্রক্রিয়াকে শুরু করা সম্ভব হয়নি!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "দৃশ্য খুলুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "গোড়ার দৃশ্য খুলুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "দ্রুত দৃশ্য খুলুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "দ্রুত স্ক্রিপ্ট খুলুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "হ্যাঁ"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "দৃশ্য বন্ধ করবেন? (অসংরক্ষিত পরিবর্তনসমূহ হারিয়ে যাবে)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "দৃশ্য এইরূপে সংরক্ষণ করুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "এই দৃশ্যটি কখনোই সংরক্ষণ করা হয় নি। চালানোর পূর্বে সংরক্ষণ করবেন?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "প্রথমে অনুগ্রহ করে দৃশ্যটি সংরক্ষণ করুন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "অনুবাদ-সম্ভব শব্দমালা/বাক্য-সমূহ সংরক্ষণ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Mesh Library এক্সপোর্ট করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Tile Set এক্সপোর্ট করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "প্রস্থান করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "এডিটর হতে প্রস্থান করবেন?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "বর্তমান দৃশ্যটি সংরক্ষিত হয়নি। তবুও খুলবেন?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "পূর্বে কখনোই সংরক্ষিত হয়নি এমন দৃশ্য পুনরায়-লোড (রিলোড) করা অসম্ভব।"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "প্রত্যাবর্তন করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "এই কাজটি অসম্পাদিত করা সম্ভব হবে না। তবুও প্রত্যাবর্তন করবেন?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "দ্রুত দৃশ্য চালান.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"প্রকল্প ম্যানেজার (Project Manager) খুলবেন? \n"
+"(অ-সংরক্ষিত পরিবর্তন-সমূহ হারিয়ে যাবে)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "একটি মুখ্য দৃশ্য মনোনীত করুন"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "আহ্‌"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"দৃশ্য লোডে সমস্যা হয়েছে, দৃশ্যটি অবশ্যই প্রকল্পের পথের ভিতরে হতে হবে। 'ইম্পোর্ট "
+"(Import)' ব্যবহার করে দৃশ্যটি খুলুন, তারপর তা প্রকল্পের পথের ভিতরে সংরক্ষণ করুন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "দৃশ্য লোডে সমস্যা হয়েছে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "'%s' দৃশ্যটির অসংলগ্ন নির্ভরতা রয়েছে:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "লেআউট/নকশা সংরক্ষণ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "লেআউট/নকশা অপসারণ করুন"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "সাধারণ/ডিফল্ট"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "দৃশ্যের ট্যাব পরিবর্তন করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d টি অধিক ফাইল(সমূহ)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d টি অধিক ফাইল(সমূহ) বা ফোল্ডার(সমূহ)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "দৃশ্য"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "পূর্বে খোলা দৃশ্যে যান।"
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "পরের ট্যাব"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "পূর্বের ট্যাব"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "দৃশ্যের ফাইলের সাথে কার্যকলাপসমূহ।"
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "নতুন দৃশ্য"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "নতুন উত্তরাধিকারী দৃশ্য.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "দৃশ্য খুলুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "দৃশ্য সংরক্ষণ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "সকল দৃশ্য সংরক্ষণ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "দৃশ্য বন্ধ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "বন্ধ করে পূর্বের দৃশ্যে যান"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "সাম্প্রতিকসমূহ খুলুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "দ্রুত ফাইলসমূহ ফিল্টার করুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "এতে রূপান্তর করুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "অনুবাদ-সম্ভব শব্দমালা/বাক্য-সমূহ.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary (মেস-লাইব্রেরি).."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet (টাইল-সেট).."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "পুনরায় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "স্ক্রিপ্ট চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "প্রকল্পের সেটিংস"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "দৃশ্য প্রত্যাবৃত্ত করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "প্রকল্পের তালিকায় প্রস্থান করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "বিক্ষেপ-হীন মোড"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "উপাদানসমূহ প্রকল্পে ইম্পোর্ট করুন।"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "ইম্পোর্ট"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "প্রকল্প অথবা দৃশ্যে-ব্যাপী বিবিধ সরঞ্জাম-সমূহ।"
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "সরঞ্জাম-সমূহ"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "প্রকল্পটি একাধিক প্লাটফর্মে এক্সপোর্ট করুন।"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "এক্সপোর্ট"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "প্রকল্পটি চালান।"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "দৃশ্যটিকে বিরতি দিন"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "দৃশ্যকে বিরতি দিন"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "দৃশ্যটিকে থামান।"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "থামান"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "সম্পাদিত দৃশ্যটি চালান।"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "দৃশ্য চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "স্বনির্বাচিত দৃশ্য চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "স্বনির্বাচিত দৃশ্য চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "ডিবাগের সিদ্ধান্তসমূহ"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "দূরবর্তী ডিবাগের সহিত ডিপ্লয় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"এক্সপোর্ট (Export) বা ডিপ্লয় (Deploy)-এর সময় প্রস্তুতকৃত এক্সিকিউটেবল (executable) "
+"ডিবাগ (debug)-এর উদ্দেশ্যে এই কম্পিউটারের আইপি (IP)-তে সংযোগ করার চেষ্টা করবে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "নেটওয়ার্ক ফাইল-সিস্টেমের সহিত ক্ষুদ্র-ডিপ্লয় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে, এক্সপোর্ট (Export) বা ডিপ্লয় (Deploy)-এ স্বল্পতম "
+"মানের এক্সিকিউটেবল (executable) উৎপাদন হবে।\n"
+"ফাইল-সিস্টেম (filesystem) প্রকল্প হতে এডিটর (editor) দিয়ে নেটওয়ার্ক-এর মাধ্যমে "
+"যোগান দেয়া হবে।\n"
+"অ্যান্ড্রয়েড ডিপ্লয়ে (deploy) দ্রুততর কর্মক্ষমতার জন্য ইউএসবি (USB) ক্যাবল ব্যবহৃত হবে। "
+"এই সিদ্ধান্তটি (অপশন) বৃহৎ মানের গেমের পরীক্ষা দ্রুততর করে তুলে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "দৃশ্যমান সাংঘর্ষিক আকারসমূহ (Collision Shapes)"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে চলমান গেমে কলিশ়ন (Collision) আকৃতি এবং রে-কাস্ট "
+"(RayCast) নোড (2D এবং 3D) দৃশ্যমান হবে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "দৃশ্যমান নেভিগেশন (Navigation)"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে চলমান গেমে ন্যাভিগেশন (Navigation) মেস এবং "
+"পলিগন-সমূহ দৃশ্যমান হবে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "দৃশ্যের পরিবর্তনসমূহ সুসংগত/সমন্বয় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"এই সিদ্ধান্তটি (অপশন) সক্রিয় থাকলে, এডিটরে কোনো দৃশ্যের পরিবর্তন করলে তা চলমান "
+"গেমে প্রতিফলিত হবে।\n"
+"রিমোট ডিভাইসে ব্যবহারের সময়, নেটওয়ার্ক ফাইল-সিস্টেম (filesystem) এটিকে আরো "
+"কার্যকর করবে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "স্ক্রিপ্টের পরিবর্তনসমূহ সুসংগত/সমন্বয় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"এই সিদ্ধান্তটি (অপশন) সক্রিয় থাকলে, কোনো স্ক্রিপ্টের পরিবর্তন সংরক্ষণে তা চলমান গেমে "
+"প্রতিফলিত হবে।\n"
+"রিমোট ডিভাইসে ব্যবহারের সময়, নেটওয়ার্ক ফাইল-সিস্টেম (filesystem) এটিকে আরো "
+"কার্যকর করবে।"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "সেটিংস"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "এডিটরের সেটিংস"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "এডিটরের লেআউট/নকশা"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "পূর্ণ-পর্দা অদলবদল/টগল করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "এক্সপোর্টের টেমপ্লেটসমূহ ইন্সটল করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "সম্বন্ধে/সম্পর্কে"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "বহি:স্থ রিসোর্সের পরিবর্তনে সতর্ক করে।"
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "এডিটরের পুন-অঙ্কনে এটি ঘূর্ণন করে!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "সর্বদা হাল-নাগাদ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "পরিবর্তনসমূহ হাল-নাগাদ করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "হাল-নাগাদকারী ঘূর্ণক নিষ্ক্রিয় করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "পরিদর্শক/পরীক্ষক"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "মেমোরিতে নতুন একটি রিসোর্স তৈরি করুন এবং সম্পাদন করুন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "ডিস্ক হতে একটি বিদ্যমান রিসোর্স লোড করুন এবং সম্পাদন করুন।"
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "এই-মুহূর্তে সম্পাদিত রিসোর্সটি সংরক্ষণ করুন।"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "এইরূপে সংরক্ষণ করুন.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "স্মৃতিতে অবস্থিত পূর্বে সম্পাদিত বস্তুতে যান।"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "স্মৃতিতে অবস্থিত পরবর্তিতে সম্পাদিত বস্তুতে যান।"
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "সাম্প্রতিক সময়ে সম্পাদিত বস্তুর স্মৃতি।"
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "বস্তুর বৈশিষ্ট্যসমূহ।"
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "ফাইলসিস্টেম"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "নোড"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "আউটপুট/ফলাফল"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "পুন-ইম্পোর্ট"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "হালনাগাদ"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Godot কমিউনিটি হতে আপনাকে ধন্যবাদ!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "ধন্যবাদ!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "ZIP ফাইল হতে টেমপ্লেট-সমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "প্রকল্প এক্সপোর্ট করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "লাইব্রেরি এক্সপোর্ট করুন"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "বিদ্যমানের সাথে একত্রিত করুন"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "পাসওয়ার্ড:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "একটি স্ক্রিপ্ট খুলুন এবং চালান"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "ভুল/সমস্যা-সমূহ লোড করুন"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "ইন্সটল-কৃত প্লাগইন-সমূহ:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "সংস্করণ:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "লেখক:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "অবস্থা:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "প্রোফাইলিং বন্ধ করুন"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "প্রোফাইলিং শুরু করুন"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "মাপ:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "ফ্রেম-এর সময় (সেঃ)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "গড় সময় (সেঃ)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "ফ্রেম %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "স্থির/বদ্ধ ফ্রেম %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "সময়:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "অন্তর্ভুক্ত"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "স্বীয়"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "ফ্রেম #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "স্ক্যান সম্পন্ন হওয়া পর্যন্ত অনুগ্রহ করে অপেক্ষা করুন।"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "পুনরায়-ইম্পোর্ট করতে বর্তমান দৃশ্যটিকে অবশ্যই সংরক্ষণ করতে হবে।"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "সংরক্ষণ এবং পুন-ইম্পোর্ট করুন"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "পুন-ইম্পোর্টে রিসোর্স-সমূহ পরিবর্তিত হয়েছে"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "আপনার লজিক/যুক্তি-সমূহ _run() মেথডে লিখুন।"
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "এখানে ইতিমধ্যেই একটি সম্পাদিত দৃশ্য রয়েছে।"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "স্ক্রিপ্ট ইনস্ট্যান্স করা সম্ভব হয়নি:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "আপনি কি 'tool' কীওয়ার্ড/শব্দটি দিতে ভুলেছেন?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "স্ক্রিপ্ট চালানো সম্ভব হয়নি:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "আপনি কি '_run' মেথডটি দিতে ভুলেছেন?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "ডিফল্ট/সাধারণ (এডিটরের মতোই)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "ইম্পোর্টের জন্য নোড(সমূহ) নির্বাচন করুন"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "দৃশ্যের পথ:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "নোড হতে ইম্পোর্ট করুন:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"লেখার জন্য file_type_cache.cch খোলা সম্ভব হচ্ছে না, ফাইলের ধরণ ক্যাশ (cache) "
+"সংরক্ষিত হচ্ছে না!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "ফাইল্গুলোর একই উৎস এবং গন্তব্যস্থান, কিছুই করা হচ্ছে না।"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "পথগুলোর একই উৎস এবং গন্তব্যস্থান, কিছুই করা হচ্ছে না।"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "স্থানসমূহকে তাদের মাঝেই স্থানান্তর করা সম্ভব নয়।"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "'..' তে পরিচালনা করা সম্ভব নয়"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "নতুন নাম এবং অবস্থান বাছাই করুন:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "কোনো ফাইল নির্বাচিত হয়নি!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "ইনস্ট্যান্স"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "নির্ভরতাসমূহ সম্পাদন করুন.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "স্বত্বাধিকারীদের দেখুন.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "পথ প্রতিলিপি/কপি করুন"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "পুনঃনামকরণ করুন অথবা সরান.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "এখানে সরান.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "তথ্য"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "ফাইল-ম্যানেজারে দেখুন"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "পুন-ইম্পোর্ট.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "পূর্বের স্থান"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "পরের স্থান"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "ফাইলসিস্টেম পুন-স্ক্যান করুন"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "ফোল্ডারের অবস্থা ফেবরিট/প্রিয় হিসেবে অদলবদল/টগল করুন"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "নির্বাচিত দৃশ্য(সমূহ)-কে নির্বাচিত নোডের অংশ হিসেবে ইনস্ট্যান্স করুন।"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "সরান"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "গ্রুপ/দলে যোগ করুন"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "গ্রুপ/দল হতে অপসারণ করুন"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "ইম্পোর্ট করার জন্য কোনো বিট মাস্ক নেই!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "উদ্দেশ্যিত পথটি খালি।"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "উদ্দেশ্যিত পথটি অবশ্যই একটি সম্পুর্ণ রিসোর্স পথ হতে হবে।"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "উদ্দেশ্যিত পথটি অবশ্যই বিদ্যমান হতে হবে।"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "সংরক্ষণের পথটি খালি!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "BitMasks ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "টেক্সার(সমূহ)-এর উৎস:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "উদ্দেশ্যিত পথ:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "গ্রহণ করুন"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "বিট-মাস্ক (Bit Mask)"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "ফন্টের কোনো উৎস ফাইল নেই!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "ফন্টের কোনো উদ্দেশ্যিত রিসোর্স নেই!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"ফাইলের অগ্রহনযোগ্য এক্সটেনশন।\n"
+"অনুগ্রহ করে .fnt ব্যবহার করুন।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "ফন্টের উৎস লোড/প্রসেস করা সম্ভব হচ্ছে না।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "ফন্ট সংরক্ষণ করা সম্ভব হয়নি।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "ফন্টের উৎস:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "উৎস ফন্টের আকার:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "রিসোর্সের গন্তব্যস্থান:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"বাদামী রঙ্গের দ্রুত শিয়ালটি অলস কুকুরের উপর দিয়ে লাফিয়ে যায় (The quick brown fox "
+"jumps over the lazy dog.)।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "পরীক্ষা:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "সিদ্ধান্তসমূহ (অপশন):"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "ফন্ট ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"এই ফাইলটি ইতিমধ্যেই একটি Godot ফন্ট ফাইল, পরিবর্তে অনুগ্রহ করে BMFont ধরণের ফাইল "
+"প্রদান করুন।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "BMFont ফাইল খোলা ব্যর্থ হয়েছে।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "স্বনির্মিত ফন্টের অগ্রহনযোগ্য উৎস।"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "ফন্ট"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "ইম্পোর্ট করার মতো কোনো মেস নেই!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "একক মেস ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "মেস(সমূহ)-এর উৎস:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "মেস"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "পৃষ্ঠতল %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "ইম্পোর্ট করার মতো কোনো নমুনা নেই!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "শব্দের নমুনাসমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "নমুনা(সমূহ)-এর উৎস:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "শব্দের নমুনা"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "নতুন ক্লিপ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "অ্যানিমেশনের সিদ্ধান্তসমূহ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "পতাকাসমূহ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "সিদ্ধ FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "পরিমার্জক"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "সর্বোচ্চ রৈখিক ভুল/সমস্যা"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "সর্বোচ্চ কৌণিক ভুল/সমস্যা"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "সর্বোচ্চ কোণ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "ক্লিপসমূহ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "আরম্ভ(সমূহ)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "সমাপ্তি(সমূহ)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "লুপ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "ফিল্টারসমূহ"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "উৎসের পথটি খালি।"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট লোড করা সম্ভব হয়নি।"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট অকার্যকর/ত্রুটিপূর্ণ।"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "দৃশ্য ইম্পোর্টে সমস্যা হয়েছে।"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "3D দৃশ্য ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "উৎস দৃশ্য:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "উদ্দেশ্যিত দৃশ্যের ন্যায়"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "শেয়ারকৃত"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "গঠনবিন্যাসের উদ্দেশ্যিত ফোল্ডার:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "প্রক্রিয়া-পরবর্তী স্ক্রিপ্ট:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "স্বনির্মিত মূল নোডের ধরণ:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "স্বয়ংক্রিয়"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "মূল নোডের নাম:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "নিম্নোক্ত ফাইলসমূহ অনুপস্থিত:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "যেকোনো উপায়েই ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "ইম্পোর্ট করুন এবং খুলুন"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr "সম্পাদিত দৃশ্য সংরক্ষণ করা হয়নি, তবুও ইম্পোর্ট করা দৃশ্যটি খুলবেন?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "দৃশ্য ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "দৃশ্য ইম্পোর্ট করা হচ্ছে.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "স্বনির্মিত স্ক্রিপ্ট চালানো হচ্ছে.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট লোড করা সম্ভব হয়নি:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট অকার্যকর/ত্রুটিপূর্ণ (কনসোল দেখুন):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট চালানোয় সমস্যা হয়েছে:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "ছবি ইম্পোর্ট করুন:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "ফাইলকে তার নিজের উপরেই ইম্পোর্ট করা সম্ভব নয়:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "পথ স্থানীয়করণ সম্ভব হচ্ছে না: %s (ইতিমধ্যেই স্থানীয়)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "সংরক্ষিত হচ্ছে.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "3D দৃশ্যের অ্যানিমেশন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "অসংকুচিত"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "ধ্বংসবিহীন সঙ্কোচন (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "ধ্বংসাত্মক সঙ্কোচন (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "সঙ্কোচন (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "গঠনবিন্যাসের ফরম্যাট"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "গঠনবিন্যাস সঙ্কোচনের গুণমান (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "গঠনবিন্যাসের সিদ্ধান্ত (অপশন)-সমূহ"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "অনুগ্রহ করে কিছু ফাইল নির্দিষ্ট করে দিন!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "এটলাস/মানচিত্রাবলীর জন্য কমপক্ষে একটি ফাইল প্রয়োজন।"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "ইম্পোর্টে সমস্যা হয়েছে:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "বৃহৎ গঠনবিন্যাসের জন্য শুধুমাত্র একটি ফাইল প্রয়োজন।"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "গঠনবিন্যাসের সর্বোচ্চ আকার:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "এটলাস/মানচিত্রাবলীর জন্য গঠনবিন্যাস ইম্পোর্ট করুন (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "সেল (Cell)-এর আকার:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "বৃহৎ গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "বৃহৎ গঠনবিন্যাস ইম্পোর্ট করুন (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "গঠনবিন্যাসের উৎস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "গোড়ার এটলাস/মানচিত্রাবলীর গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "গঠনবিন্যাস(সমূহ)-এর উৎস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "2D-এর জন্য গঠনবিন্যাসসমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "3D-এর জন্য গঠনবিন্যাসসমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "গঠনবিন্যাসসমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3D গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "এটলাস/মানচিত্রাবলীর গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"নোটিশ: 2D টেক্সচার (texture) ইম্পোর্ট (import) করা অত্যাবশ্যক নয়। শুধুমাত্র png/jpg "
+"ফাইলসমূহ প্রকল্পে প্রতিলিপি/কপি করুন।"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "খালি স্থান ছেঁটে ফেলুন।"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "গঠনবিন্যাস"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "বৃহৎ গঠনবিন্যাস ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "উৎস হতে ছবি লোড করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "টুকরো করুন"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "সন্নিবেশিত হচ্ছে"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "সংরক্ষিত হচ্ছে"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "বৃহৎ গঠনবিন্যাস সংরক্ষণ করা সম্ভব হচ্ছে না:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "এটলাস/মানচিত্রাবলী নির্মাণ করুন:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "ছবি লোড করা হচ্ছে:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "ছবি লোড করা সম্ভব হচ্ছে না:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "ছবিসমূহ রূপান্তর করা হচ্ছে"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "ছবিসমূহ ছাঁটা হচ্ছে"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "ছবিসমূহ ব্লিটিং (Blitting) করা হচ্ছে"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "এটলাস/মানচিত্রাবলীর ছবি সংরক্ষণ করা সম্ভব হচ্ছে না:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "রূপান্তরিত গঠনবিন্যাস সংরক্ষণ করা সম্ভব হচ্ছে না:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "অকার্যকর উৎস!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "অকার্যকর অনুবাদের উৎস!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "কলাম"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "ভাষা"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "ইম্পোর্ট করার মতো কোনো বস্তু নেই!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "কোনো উদ্দেশ্যিত পথ নেই!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "অনুবাদসমূহ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "ইম্পোর্ট করা সম্ভব হচ্ছে না!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "অনুবাদ ইম্পোর্ট করুন"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "CSV-এর উৎস:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "প্রথম সারি অগ্রাহ্য করুন"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "সঙ্কোচন করুন"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "প্রকল্পে সংযুক্ত করুন (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "ভাষাসমূহ ইম্পোর্ট করুন:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "অনুবাদ"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "মাল্টি-নোড স্থাপন করুন"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "দলসমূহ"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "সিগন্যাল-সমূহ এবং দলসমূহ সম্পাদন করতে একটি নোড নির্বাচন করুন।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "স্বয়ংক্রিয়ভাবে চালানো টগল করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "নতুন অ্যানিমেশনের নাম:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "নতুন অ্যানিমেশন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "অ্যানিমেশনের নাম পরিবর্তন করুন:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "অ্যানিমেশন অপসারণ করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ভুল: অগ্রহনযোগ্য অ্যানিমেশনের নাম!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ভুল: অ্যানিমেশনের নাম ইতিমধ্যেই বিদ্যমান!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "অ্যানিমেশন পুনঃনামকরণ করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "অ্যানিমেশন যুক্ত করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "পরবর্তী পরিবর্তনের সাথে ব্লেন্ড করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "ব্লেন্ড-এর সময় পরিবর্তন করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "অ্যানিমেশন লোড করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "অ্যানিমেশন প্রতিলিপি করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ভুল: প্রতিলিপি করার মতো কোনো অ্যানিমেশন নেই!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ভুল: ক্লীপবোর্ডে অ্যানিমেশনের কোনো রিসোর্স নেই!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "প্রতিলিপিত অ্যানিমেশন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "অ্যানিমেশন প্রতিলেপন করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ভুল: সম্পাদন করার মতো কোনো অ্যানিমেশন নেই!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে পিছনের দিকে চালান। (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "নির্বাচিত অ্যানিমেশনটি শেষ হতে পিছনের দিকে চালান। (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "অ্যানিমেশনের চালনা বন্ধ করুন। (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "নির্বাচিত অ্যানিমেশনটি শুরু হতে চালান। (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে চালান। (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "অ্যানিমেশনের স্থান (সেকেন্ডে)।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "নোডের অ্যানিমেশন চালনার স্কেল/মাপ সার্বজনীনভাবে পরিবর্তন করুন।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "প্লেয়ারে নতুন অ্যানিমেশন তৈরি করুন।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "ডিস্ক হতে অ্যানিমেশন লোড করুন।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "ডিস্ক হতে একটি অ্যানিমেশন লোড করুন।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "বর্তমান অ্যানিমেশন সংরক্ষণ করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "এইরূপে সংরক্ষণ করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "প্লেয়ারে অ্যানিমেশনসমূহের তালিকা দেখান।"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "লোডের পরেই স্বয়ংক্রিয়ভাবে চালান্‌"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "উদ্দেশ্যিত ব্লেন্ড-এর সময় সম্পাদন করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "অ্যানিমেশনের সরঞ্জামসমূহ"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "অ্যানিমেশন প্রতিলিপি করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "নতুন অ্যানিমেশন তৈরি করুন"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "অ্যানিমেশনের নাম:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "ভুল/সমস্যা!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "ব্লেন্ড-এর সময়সমূহ:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "পরবর্তী (স্বয়ংক্রিয়ভাবে সারিবদ্ধ করুন):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "আন্ত-অ্যানিমেশন ব্লেন্ড সময়"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "অ্যানিমেশন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "নতুন নাম:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "স্কেল/মাপ:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "অন্তঃস্থ ফেড/বিলীন (সেঃ):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "বহিঃস্থ ফেড/বিলীন (সেঃ):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "ব্লেন্ড/মিশ্রণ"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "মিশ্রিত করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "স্বয়ংক্রিয়ভাবে পুনরারম্ভ করুন:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "পুনরারম্ভ (সেঃ):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "যথেচ্ছ পুনরারম্ভ (সেঃ):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "আরম্ভ!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "পরিমাণ:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "ব্লেন্ড/মিশ্রণ:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "ব্লেন্ড/মিশ্রণ ০:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "ব্লেন্ড/মিশ্রণ ১:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "X-ফেড/বিলীন সময় (সেঃ):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "বর্তমান:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "ইনপুট যোগ করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "স্বয়ংক্রিয়-অগ্রগতি পরিষ্কার করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "স্বয়ংক্রিয়-অগ্রগতি স্থাপন করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "ইনপুট অপসারণ করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "পুনঃনামকরণ করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "অ্যানিমেশনের তালিকাটি কার্যকর।"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "অ্যানিমেশনের তালিকাটি অকার্যকর।"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "অ্যানিমেশনের নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "ওয়ান-শট নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "মিশ্র নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "ব্লেন্ড২ নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "ব্লেন্ড৩ নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "ব্লেন্ড৪ নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "টাইম-স্কেল নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "টাইম-সীক্‌ নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "ট্র্যানজিশন নোড"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "অ্যানিমেশনসমূহ ইম্পোর্ট করুন.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "নোড ফিল্টারসমূহ সম্পাদন করুন"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "ফিল্টারসমূহ.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "%d টি ত্রিভুজ বিশ্লেষণ করা হচ্ছে:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "ত্রিভুজ #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "লাইট্‌ সিদ্ধ/বেক্‌-এর সেটআপ:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "জ্যামিতিক-আকার বিশ্লেষণ করা হচ্ছে"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "লাইট্‌সমূহ ঠিক করা হচ্ছে"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "BVH তৈরি করা হচ্ছে"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "লাইটের ওকট্রী (octree) তৈরি করা হচ্ছে"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "ওকট্রী (octree) গঠনবিন্যাস তৈরি করা হচ্ছে"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "লাইট্ম্যাপে হস্তান্তর করুন:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "গঠনবিন্যাস বণ্টিত হচ্ছে #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "ত্রিভুজ সিদ্ধ/বেক্‌ করা হচ্ছে #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "গঠনবিন্যাসের প্রক্রিয়া-পরবর্তী প্রক্রিয়াকরণ #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "সিদ্ধ/বেক্‌!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+"লাইট্ম্যাপ ওকট্রীর (octree) সিদ্ধ/বেক্‌-এর প্রক্রিয়াকরণ পুন:স্থাপন করুন (পুনরারম্ভ)।"
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "প্রিভিউ"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "স্ন্যাপ কনফিগার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "গ্রিডের অফসেট/ভারসাম্য:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "গ্রিডের পদক্ষেপ:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "ঘূর্ণায়নের অফসেট/ভারসাম্য:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "ঘূর্ণায়নের পদক্ষেপ:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "কেন্দ্র স্থানান্তর করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "প্রক্রিয়া স্থানান্তর করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "IK চেইন সম্পাদন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "CanvasItem সম্পাদন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "অ্যাংকরসমূহ পরিবর্তন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "জুম্ (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "ভঙ্গি প্রতিলেপন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "মোড (Mode) বাছাই করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "টান: ঘূর্ণন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "অল্টার কী + টান: স্থানান্তর"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr "কেন্দ্র পরিবর্তন করতে 'v' চাপুন, কেন্দ্র টানতে 'Shift+v' চাপুন (যখন সরাচ্ছেন)।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "অল্টার কী + মাউসের ডান বোতাম: গভীর তালিকায় নির্বাচন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "মোড (Mode) সরান"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "ঘূর্ণায়ন মোড"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"ক্লিক-কৃত স্থানে সকল বস্তুর একটি তালিকা দেখুন\n"
+"(ঠিক যেমন সিলেক্ট মোডে অল্টার কী (Alt) + মাউসের ডান বোতাম (RMB))।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "বস্তুর ঘূর্ণায়ন কেন্দ্র পরিবর্তন করতে ক্লিক করুন।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "প্যান মোড"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "নির্বাচিত বস্তুটিকে এই স্থানে আটকিয়ে রাখুন (সরানো সম্ভব হবেনা)।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "নির্বাচিত বস্তুটিকে মুক্ত করুন (সরানো সম্ভব হবে)।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "বস্তুর অন্তর্ভুক্ত-সমূহ যাতে নির্বাচনযোগ্য না হয় তা নিশ্চিত করে।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "বস্তুর অন্তর্ভুক্ত-সমূহের নির্বাচনযোগ্যতা পুনরায় ফিরিয়ে আনে।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "স্ন্যাপ ব্যবহার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "গ্রিড দেখান"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "ঘূর্ণন স্ন্যাপ ব্যবহার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "আপেক্ষিক স্ন্যাপ"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "স্ন্যাপ কনফিগার করুন.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "পিক্সেল স্ন্যাপ ব্যবহার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "ধারক/বাহক পর্যন্ত বিস্তৃত করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "স্কেলেটন/কাঠাম.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "বোন্‌/হাড় তৈরি করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "বোন্‌/হাড় পরিষ্কার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "বোন্‌/হাড় দেখান"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "IK চেইন তৈরি করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "IK চেইন পরিষ্কার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "দৃশ্য/পরিদর্শন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "জুম্ পুন:স্থাপন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "জুম্ নির্ধারণ করুন.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "নির্বাচনকে কেন্দ্রীভূত করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "নির্বাচনকে ফ্রেমভূক্ত করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "অ্যাংকর"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "চাবিসমূহ সন্নিবেশ করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "চাবি সন্নিবেশ করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "চাবি সন্নিবেশ করুন (বিদ্যমান ট্র্যাক/পথসমূহ)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "ভঙ্গি প্রতিলিপি করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "ভঙ্গি পরিষ্কার করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "একটি মান নির্ধারণ করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "স্ন্যাপ (পিক্সেলসমূহ):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "%s সংযুক্ত করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "%s সংযুক্ত হচ্ছে..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "নোড তৈরি করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "%s হতে দৃশ্য ইনস্ট্যান্স করাতে সমস্যা হয়েছে"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "ঠিক আছে :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "ইনস্ট্যান্স করার জন্য প্রয়োজনীয় ধারক উপস্থিত নেই।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "এই কাজটি করার জন্য একটি একক নির্বাচিত নোড প্রয়োজন।"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "ডিফল্ট ধরণ পরিবর্তন করুন"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"টানুন এবং ফেলুন + শিফট কী (Shift) : সহোদর নোড সংযোজন করতে\n"
+"টানুন এবং ফেলুন + অল্টার কী (Alt) : নোডের ধরণ পরিবর্তন করতে"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Poly তৈরি করুন"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Poly সম্পাদন করুন"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Poly সম্পাদন করুন (বিন্দু অপসারণ করুন)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "আরম্ভ হতে নতুন polygon তৈরি করুন।"
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Poly3D তৈরি করুন"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "হ্যান্ডেল স্থাপন করুন"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "রঙ্গের র‍্যাম্প বিন্দু সংযোজন/বিয়োজন করুন"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "রঙ্গের র‍্যাম্প পরিবর্তন করুন"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "মেস লাইব্রেরি তৈরি হচ্ছে"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "থাম্বনেইল.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "%d টি বস্তু অপসারণ করবেন?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "বস্তু যোগ করুন"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "নির্বাচিত বস্তুটি অপসারণ করুন"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "দৃশ্য হতে ইম্পোর্ট করুন"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "দৃশ্য হতে হালনাগাদ করুন"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "বস্তু %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "বস্তুসমূহ"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "বস্তুর তালিকা এডিটর"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "অকলুডার (occluder) পলিগন তৈরি করুন"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "বিদ্যমান পলিগন সম্পাদন করুন:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "মাউসের বাম বোতাম: বিন্দু সরান।"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "কন্ট্রোল + মাউসের বাম বোতাম: অংশ বিভক্ত করুন।"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "মাউসের ডান বোতাম: বিন্দু মুছে ফেলুন।"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "মেসটি খালি!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "স্থিত-ট্রাইমেস বডি গঠন করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "স্থিত-কনভেক্স বডি গঠন করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "দৃশ্যের গোড়ায় এটি কাজ করেনা!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "ট্রাইমেস আকার তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "কনভেক্স আকার তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Navigation Mesh তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "MeshInstance-এ Mesh নেই!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "প্রান্তরেখা তৈরি করার জন্য প্রয়োজনীয় Mesh এর কোনো পৃষ্ঠতল নেই!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "প্রান্তরেখা তৈরি করা সম্ভব হয়নি!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "প্রান্তরেখা তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "স্থিত-ট্রাইমেস বডি তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "স্থিত-কনভেক্স বডি তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "ট্রাইমেস কলিশ়ন সহোদর তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "কনভেক্স কলিশ়ন সহোদর তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "প্রান্তরেখা মেস তৈরি করুন.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "প্রান্তরেখা মেস তৈরি করুন"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "প্রান্তরেখার আকার:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr "মেসের কোনো উৎস নির্দিষ্ট করা নেই (এবং নোডে কোনো মাল্টিমেস স্থাপন করা নেই)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "মেসের কোনো উৎস নির্দিষ্ট করা নেই (এবং মাল্টিমেসে কোনো মেস নেই)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "মেসের উৎস আকার্যকর (আকার্যকর পথ)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Mesh-এর উৎস অগ্রহণযোগ্য (MeshInstance নয়)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Mesh-এর উৎস অগ্রহণযোগ্য (কোনো Mesh রিসোর্স নেই)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "কোনো পৃষ্ঠতলের উৎস নির্দিষ্ট করা নেই।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "পৃষ্ঠতলের উৎস অকার্যকর (অকার্যকর পথ)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "পৃষ্ঠতলের উৎস অকার্যকর (কোনো জ্যামিতিক আকার নেই)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "পৃষ্ঠতলের উৎস অকার্যকর (কোনো ফোকাস নেই)।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "পপুলেট করার জন্য ধারকের কোনো নিরেট পৃষ্ঠ নেই।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "এলাকার নকশা করা সম্ভব হয়নি।"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Mesh-এর একটি উৎস নির্বাচন করুন:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "একটি উদ্দেশ্যিত পৃষ্ঠতল নির্বাচন করুন:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "পৃষ্ঠতল পপুলেট করুন"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "MultiMesh পপুলেট করুন"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "উদ্দেশ্যিত পৃষ্ঠতল:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "উৎস Mesh:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "X-অক্ষ"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Y-অক্ষ"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Z-অক্ষ"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "অক্ষতে Mesh দিন:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "যথেচ্ছ ঘূর্ণায়ন:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "যথেচ্ছ ঢাল:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "যথেচ্ছ মাপ:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "পপুলেট"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Navigation Polygon তৈরি করুন"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "পলি এবং বিন্দু অপসারণ করুন"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "ছবি লোডে সমস্যা হয়েছে:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "স্বচ্ছতাসহ কোনো পিক্সেল নেই > ছবিতে ১২৮.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Emission Mask স্থাপন করুন"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Emission Mask পরিস্কার করুন"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Emission Mask লোড করুন"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "উৎপাদিত বিন্দুর সংখ্যা:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "নোডে কোনো জ্যামিতিক আকার নেই।"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "নোডে কোনো জ্যামিতিক আকার নেই (পৃষ্ঠ)।"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "পৃষ্ঠসমূহ কোনো আকার নেই!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "কোনো পৃষ্ঠ নেই!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "AABB উৎপন্ন করুন"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Mesh হতে Emitter তৈরি করুন"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Node হতে Emitter তৈরি করুন"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Emitter পরিস্কার করুন"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Emitter তৈরি করুন"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Emission-এর স্থানসমূহ:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Emission পূরণ:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "পৃষ্ঠতল"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "আয়তন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "বক্ররেখা হতে বিন্দু অপসারণ করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "বক্ররেখায় বিন্দু যোগ করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "বক্ররেখায় বিন্দু সরান"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "বক্ররেখা আন্ত-নিয়ন্ত্রণে সরান"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "বক্ররেখা বহিঃ-নিয়ন্ত্রণে সরান"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "বিন্দুসমূহ নির্বাচন করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "শিফট + টান: নিয়ন্ত্রণ বিন্দুসমূহ নির্বাচন করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "ক্লিক: বিন্দু যোগ করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "ডান ক্লিক: বিন্দু অপসারণ করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "নিয়ন্ত্রণ বিন্দুসমূহ নির্বাচন করুন (শিফট + টান)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "বিন্দু যোগ করুন (শূন্যস্থানে)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "অংশ বিভক্ত করুন (বক্ররেখায়)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "বিন্দু অপসারণ করুন"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "বক্ররেখা বন্ধ করুন"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "বক্ররেখার বিন্দু #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "বক্ররেখার বিন্দুর স্থান নির্ধারণ করুন"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "আন্ত-বক্ররেখার স্থান নির্ধারণ করুন"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "বহিঃ-বক্ররেখার স্থান নির্ধারণ করুন"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "পথ বিভক্ত করুন"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "পথের বিন্দু অপসারণ করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "UV Map তৈরি করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "UV Map রুপান্তর করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Polygon 2D UV এডিটর"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "বিন্দু সরান"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "কন্ট্রোল বোতাম: ঘূর্ণন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "শিফট্‌: সবগুলি নড়ান"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "শিফট্‌ + কন্ট্রোল: মাপ"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "পলিগন সরান"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "পলিগন ঘুরান"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "পলিগন মাপ করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "পলিগন->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->পলিগন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "UV পরিস্কার করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "স্ন্যাপ"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "স্ন্যাপ সক্রিয় করুন"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "গ্রিড"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "সমস্যা: রিসোর্স লোড করা সম্ভব হয়নি!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "রিসোর্স যোগ করুন"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "রিসোর্স পুনঃনামকরণ করুন"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "রিসোর্স অপসারণ করুন"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "রিসোর্সের ক্লীপবোর্ড খালি!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "রিসোর্স লোড করুন"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "BBCode বিশ্লেষণ করুন"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "লম্বা:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "নমুনা ফাইল(সমূহ) খুলুন"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "সমস্যা: নমুনা লোড করা সম্ভব হয়নি!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "নমুনা যোগ করুন"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "নমুনা পুনঃনামকরণ করুন"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "নমুনা অপসারণ করুন"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "১৬ বিটস্‌"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "৮ বিটস্‌"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "স্টেরিও"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "মনো"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "ফরম্যাট"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "পিচ্‌"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "থিম সংরক্ষণে সমস্যা হয়েছে"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "সংরক্ষণে সমস্যা হয়েছে"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "থিম ইম্পোর্টে সমস্যা হয়েছে"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "ইম্পোর্টে সমস্যা হয়েছে"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "থিম ইম্পোর্ট করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "থিম এইরূপে সংরক্ষণ করুন.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "পরবর্তী স্ক্রিপ্ট"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "পূর্ববর্তী স্ক্রিপ্ট"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "ফাইল"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "নতুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "সকল্গুলি সংরক্ষণ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "স্বল্প-প্রভাবসহ স্ক্রিপ্ট রিলোড করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "পূর্বের ইতিহাস"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "পরের ইতিহাস"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "থিম রিলোড করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "থিম সংরক্ষণ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "থিম এইরূপে সংরক্ষণ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "ডকুমেন্টসমূহ বন্ধ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "সবগুলি বন্ধ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "খুঁজুন.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "পরবর্তী খুঁজুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "ডিবাগ"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "ধাপ লাফিয়ে যান"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "পদার্পণ করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "বিরতি/ভাঙ্গন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "সচল"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "ডিবাগার খোলা রাখুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "উইন্ডো"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "বামে সরান"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "ডানে সরান"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "টিউটোরিয়ালসমূহ"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "টিউটোরিয়ালের স্থানে https://godotengine.org খুলুন।"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "ক্লাসসমূহ"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "ক্লাসের ক্রমোচ্চতা খুঁজুন।"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "রেফারেন্সের ডকুমেন্টেশনে খুঁজুন।"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "পূর্বের সম্পাদিত ডকুমেন্টে যান।"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "পরের সম্পাদিত ডকুমেন্টে যান।"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "স্ক্রিপ্ট তৈরি করুন"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"নিম্নোক্ত ফাইলসমূহ ডিস্কে নতুনতর।\n"
+"কোন সিধান্তটি নেয়া উচিত হবে?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "রিলোড"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "পুনঃসংরক্ষণ"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "ডিবাগার"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr "পূর্বনির্মিত স্ক্রিপ্ট শুধুমাত্র তাদের অধিকারী দৃশ্য লোড করা হলেই সম্পাদন করা যাবে"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "রঙ পছন্দ করুন"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "উপরে যান"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "নীচে যান"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "বামে মাত্রা দিন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "ডানে মাত্রা দিন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "কমেন্ট টগল করুন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "ক্লোন করে নীচে নিন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "সিম্বল সম্পূর্ণ করুন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "শেষের হোয়াইটস্পেস ছেঁটে ফেলুন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "স্বয়ংক্রিয়ভাবে মাত্রা দিন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "সকল বিরতি-বিন্দু-সমূহ অপসারণ করুন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "পরের বিরতিবিন্দুতে যান"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "পূর্বের বিরতিবিন্দুতে যান"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "পূর্বে খুঁজুন"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "প্রতিস্থাপন.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "ফাংশনে যান.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "লাইনে যান.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "প্রাসঙ্গিক সাহায্য"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "স্কেলার ধ্রুবক পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "ভেক্টর ধ্রুবক পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "RGB ধ্রুবক পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "স্কেলার অপারেটর পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "ভেক্টর অপারেটর পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "ভেক্টর স্কেলার অপারেটর পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "RGB অপারেটর পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "শুধুমাত্র ঘূর্ণন টগল করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "স্কেলার ফাংশন পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "ভেক্টর ফাংশন পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "স্কেলার ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "ভেক্টর ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "RGB ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "প্রাথমিক মান পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "XForm ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "টেক্সার ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Cubemap ইউনিফর্ম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "কমেন্ট পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "রঙ্গের র‍্যাম্পে সংযোজন/বিয়োজন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Curve Map-এ সংযোজন/বিয়োজন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Curve Map পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "ইনপুট নাম পরিবর্তন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "গ্রাফের নোডসমূহ সংযুক্ত করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "গ্রাফের নোডসমূহ বিচ্ছিন্ন করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Shader Graph Node অপসারণ করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Shader Graph Node সরান"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "গ্রাফ নোড(সমূহ) প্রতিলিপি করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Shader Graph Node(s) অপসারণ করুন"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "সমস্যা: আবর্তনশীল সংযোগ লিঙ্ক"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "সমস্যা: ইনপুট সংযোগ নেই"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Shader Graph Node যোগ করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "সমকোণীয় (Orthogonal)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "পরিপ্রেক্ষিত (Perspective)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "রুপান্তর নিষ্ফলা করা হয়েছে।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "X-অক্ষ রুপান্তর।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Y-অক্ষ রুপান্তর।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Z-অক্ষ রুপান্তর।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "প্লেন-এর রুপান্তর দেখুন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "%s%% -এ মাপিত হচ্ছে।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "%s ডিগ্রি ঘূর্ণিত হচ্ছে।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "নিম্ন দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "নিম্ন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "শীর্ষ দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "শীর্ষ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "পশ্চাৎ দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "পশ্চাৎ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "সন্মুখ দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "সন্মুখ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "বাম দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "বাম"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "ডান দর্শন।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "ডান"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "চাবিসংযোক নিষ্ক্রিয় আছে (কোনো চাবি সংযুক্ত হয়নি)।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "অ্যানিমেশনের চাবি সন্নিবেশিত হয়েছে।"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "দর্শনের সাথে সারিবদ্ধ করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "পরিবেশ (Environment)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "অডিও শ্রোতা"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "গিজমোস"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "XForm এর সংলাপ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "ইন্সট্যান্স করার জন্য কোনো দৃশ্য নির্বাচন করা হয়নি!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "কার্সরের স্থানে ইন্সট্যান্স করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "দৃশ্য ইন্সট্যান্স করা সম্ভব হয়নি!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "সরানোর মোড (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "ঘোরানোর মোড (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "মাপের মোড করুন (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "নিম্ন দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "শীর্ষ দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "পশ্চাৎ দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "সন্মুখ দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "বাম দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "ডান দর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "পরিপ্রেক্ষিত/সমকোণীয় (Perspective/Orthogonal) দর্শন পরিবর্তন করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "অ্যানিমেশনের চাবি সন্নিবেশ করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "অরিজিনে ফোকাস করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "নির্বাচনে ফোকাস করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "নির্বাচনকে দর্শনের সাথে সারিবদ্ধ করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "রুপান্তর"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "স্থানীয় স্থানাঙ্কসমূহ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "রুপান্তরের এর সংলাপ.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "প্রাথমিক লাইট ব্যবহার করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "প্রাথমিক sRGB ব্যবহার করুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "১ টি Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "২ টি Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "২ টি Viewports (অল্টার)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "৩ টি Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "৩ টি Viewports (অল্টার)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "৪ টি Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Normal প্রদর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Wireframe প্রদর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Overdraw প্রদর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Shadeless প্রদর্শন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "অরিজিন দেখুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "গ্রিড দেখুন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "স্ন্যাপ সেটিংস"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "স্ন্যাপ-এর স্থানান্তর:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "স্ন্যাপ-এর ঘূর্ণন (ডিগ্রি):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "স্ন্যাপ-এর মাপন (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Viewport সেটিংস"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "লাইটের প্রাথমিক নরমাল:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "অ্যাম্বিয়েন্ট লাইটের রঙ:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "পরিপ্রেক্ষিত (Perspective) FOV (ডিগ্রি):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z-Near দেখুন:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z-Far দেখুন:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "রুপান্তরের পরিবর্তন"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "স্থানান্তর (Translate):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "ঘূর্ণন (ডিগ্রি):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "মাপন (অনুপাত):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "রুপান্তরের ধরণ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "পূর্ব (Pre)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "পরবর্তী (Post)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "সমস্যা: ফ্রেম রিসোর্স লোড করা সম্ভব হয়নি!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "ফ্রেম যোগ করুন"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "রিসোর্স ক্লীপবোর্ড খালি অথবা কোনো টেক্সার নয়!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "ফ্রেম প্রতিলেপন করুন"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "খালি বস্তু যোগ করুন"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "অ্যানিমেশনের লুপ পরিবর্তন করুন"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "অ্যানিমেশনের FPS পরিবর্তন করুন"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(খালি/শূন্য)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "অ্যানিমেশনসমূহ"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "গতি (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "অ্যানিমেশনের ফ্রেমসমূহ"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "খালি বস্তু যুক্ত করুন (পূর্বে)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "খালি বস্তু যুক্ত করুন (পরে)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "উপরে"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "নীচে"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox প্রিভিউ:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "স্ন্যাপ মোড:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<নান/কিছুই না>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "পিক্সেল স্ন্যাপ"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "গ্রিড স্ন্যাপ"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "স্বয়ংক্রিয় টুকরো"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "অফসেট/ভারসাম্য:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "পদক্ষেপ:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "বিচ্ছেদ:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "গঠনবিন্যাসের এলাকা"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "গঠনবিন্যাসের এলাকা এডিটর"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "থিমটি ফাইলে সংরক্ষণ করা সম্ভব হয়নি:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "সকল বস্তু যোগ করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "সবগুলি যোগ করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "বস্তু অপসারণ করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "থিম"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "ক্লাসের আইটেম যোগ করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "ক্লাসের আইটেম অপসারণ করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "খালি টেমপ্লেট তৈরি করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "এডিটরের খালি টেমপ্লেট তৈরি করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio১"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio২"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "বস্তু/আইটেম"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "আইটেম চিহ্নিত করুন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "চিহ্নিত আইটেম"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "আছে"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "অনেক"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "সিদ্ধান্তসমূহ"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "আছে,অনেক,একাধিক,সিদ্ধান্তসমূহ!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "ট্যাব ১"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "ট্যাব ২"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "ট্যাব ৩"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "ধরণ:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "ডাটার ধরণ:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "আইকন"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "স্টাইল"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "রঙ"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "TileMap আঁকুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "প্রতিলিপি"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "TileMap মুছে ফেলুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "নির্বাচিতসমূহ মুছে ফেলুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "টাইল খুঁজুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "পক্ষান্তরিত করুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "প্রতিবিম্ব X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "প্রতিবিম্ব Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "বাকেট্‌"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "টাইল পছন্দ করুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "নির্বাচন করুন"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "০ ডিগ্রি ঘোরান্"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "৯০ ডিগ্রি ঘোরান্"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "১৮০ ডিগ্রি ঘোরান্"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "২৭০ ডিগ্রি ঘোরান্‌"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "টাইলটি খুঁজে পাওয়া যায়নি:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "আইটেমের নাম বা আইডি:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "দৃশ্য হতে তৈরি করবেন?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "দৃশ্য হতে একত্রিত করবেন?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "দৃশ্য হতে তৈরি করবেন"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "দৃশ্য হতে একত্রিত করবেন"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "সমস্যা/ভুল"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "স্ক্রিপ্ট-এর সিদ্ধান্তসমূহ সম্পাদন করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "অনুগ্রহ করে প্রকল্পের ফোল্ডারের বাইরে এক্সপোর্ট করুন!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "প্রকল্প এক্সপোর্টে সমস্যা হয়েছে!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "প্রকল্পের PCK লিখতে সমস্যা হয়েছে!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "'%s' প্ল্যাটফর্মের জন্য এখনো কোনো এক্সপোর্টার নেই।"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "নতুন রিসোর্স তৈরি করুন"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "গ্রহণযোগ্য নাম"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "ট্র্যানজিশন/স্থানান্তরণ"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "অবস্থা:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "পাসওয়ার্ড:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "গ্রহনযোগ্য অক্ষরসমূহ:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "নতুন নাম:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "অন্তর্ভুক্ত করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "ছবির গ্রুপ পরিবর্তন করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "গ্রুপের নাম খালি হতে পারবে না!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "গ্রুপের নামে অগ্রহনযোগ্য অক্ষর!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "গ্রুপের নাম ইতিমধ্যেই আছে!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "ছবির গ্রুপ যোগ করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "ছবির গ্রুপ অপসারণ করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "এটলাস/মানচিত্রাবলী প্রিভিউ"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "প্রকল্প এক্সপোর্ট-এর সেটিংস"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "টার্গেট"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "প্লাটফর্মে এক্সপোর্ট করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "রিসোর্সসমূহ"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "নির্বাচিত রিসোর্সসমূহ এক্সপোর্ট করুন (ডিপেন্ডেন্সী সহ)।"
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "প্রকল্পের সকল রিসোর্স এক্সপোর্ট করুন।"
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "প্রকল্পের পথে সকল ফাইল এক্সপোর্ট করুন।"
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "এক্সপোর্ট মোড:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "এক্সপোর্টের জন্য রিসোর্স:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "প্রক্রিয়া/অ্যাকশন"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"রিসোর্স-নয় এমন ফাইল এক্সপোর্ট করার ফিল্টারসমূহ (কমা-বিভক্ত, যেমন: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"এক্সপোর্ট (export) হতে বর্জনকৃত ফিল্টারসমূহ (filter) (কমা-বিভক্ত, যেমন: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "এক্সপর্টের সময় টেক্সট দৃশ্যগুলোকে বাইনারিতে রুপান্তর করুন।"
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "ছবিসমূহ"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "মূলটিই (অরিজিনাল) রাখুন"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "ডিস্কের জন্য সংকুচিত করুন (ধ্বংসাত্মক, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "RAM-এর জন্য সংকুচিত করুন (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "ছবিসমূহ রূপান্তর করুন (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "ডিস্ক-এর জন্য সংকুচিত করুন (ধ্বংসাত্মক গুণের):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "সকল ছবি সংকুচিত করুন:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "ধরণসমূহ সংকোচন করুন:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "ছবির গ্রুপসমূহ"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "গ্রুপসমূহ:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "ডিস্ক সঙ্কোচন"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "RAM সঙ্কোচন"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "সঙ্কোচন মোড:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "ধ্বংসাত্মক গুণের:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "এটলাস/মানচিত্রাবলী:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "সঙ্কোচন দ্বারা:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "এটলাস/মানচিত্রাবলী প্রিভিউ"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "ছবির ফিল্টার:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "ছবিসমূহ:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "কোনোটাই নির্বাচন করবেন না"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "গ্রুপ"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "নমুনাসমূহ"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "নমুনা রূপান্তর মোড: (.wav ফাইল):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "রাখুন"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "সঙ্কোচন (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "আদর্শ রেট লিমিট (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "ছাঁটা"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "পরিশিষ্ট নীরবতা:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "স্ক্রিপ্ট"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "স্ক্রিপ্ট এক্সপোর্ট মোড:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "টেক্সট"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "কম্পাইল্ড"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "এনক্রিপ্ট করুন (নীচে কী/চাবি দিন)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "স্ক্রিপ্ট এনক্রিপশন কী/চাবি (২৫৬-বিটস হেক্স):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "এক্সপোর্ট PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "প্রকল্পের PCK এক্সপোর্ট করুন"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "এক্সপোর্ট.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "এক্সপোর্ট প্রকল্প"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "এক্সপোর্টের প্রিসেট:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "অকার্যকর প্রকল্পের পথ, পথটি অবশ্যই বিদ্যমান হতে হবে!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "অকার্যকর প্রকল্পের পথ, godot.cfg অবশ্যই অনুপস্থিত হতে হবে।"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "অকার্যকর প্রকল্পের পথ, godot.cfg অবশ্যই উপস্থিত হতে হবে।"
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "প্রকল্প ইম্পোর্ট করা হয়েছে"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "অকার্যকর প্রকল্পের পথ (কোনোকিছু পরিবর্তন করেছেন?)।"
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "প্রকল্পের পথে godot.cfg তৈরি করা সম্ভব হয়নি।"
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "প্যাকেজ হতে নীম্নোক্ত ফাইলসমূহ এক্সট্রাক্ট করা অসফল হয়েছে:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "প্যাকেজ ইন্সটল সফল হয়েছে!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "বিদ্যমান প্রকল্প ইম্পোর্ট করুন"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "প্রকল্পের পথ (অবশ্যই বিদ্যমান হতে হবে):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "প্রকল্পের নাম:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "নতুন প্রকল্প তৈরি করুন"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "প্রকল্পের পথ:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "প্রকল্প ইন্সটল করুন:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "ইন্সটল"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "ব্রাউস"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "নতুন গেম প্রকল্প"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "দারুণ খবর!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "নামহীন প্রকল্প"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "একধিক প্রকল্প খোলায় আপনি সুনিশ্চিত?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "একধিক প্রকল্প চালানোয় আপনি সুনিশ্চিত?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr "তালিকা হতে প্রকল্প অপসারণ করবেন? (ফোল্ডারের বিষয়াদি পরিবর্তন হবে না)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"বিদ্যমান Godot প্রজেক্টের খোঁজে আপনি %s ফোল্ডারসমূহ স্ক্যান করতে যাচ্ছেন। আপনি কি "
+"সুনিশ্চিত?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "প্রকল্প ম্যানেজার"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "প্রকল্পের তালিকা"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "চালান"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "স্ক্যান"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "স্ক্যান করার জন্য ফোল্ডার নির্বাচন করুন"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "নতুন প্রকল্প"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "প্রস্থান করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "কী/চাবি "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "জয়স্টিক বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "জয়স্টিক অক্ষ"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "মাউসের বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "অকার্যকর অ্যাকশন ('/' বা ':' ছাড়া কিছুই যাবে না)।"
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "'%s' অ্যাকশন ইতিমধ্যেই বিদ্যমান!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "ইনপুট অ্যাকশন ইভেন্ট পুনঃনামকরণ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "ইনপুট অ্যাকশন ইভেন্ট যোগ করুন"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "কন্ট্রোল+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "যেকোনো কী/চাবি চাপুন.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "মাউসের বোতাম ইন্ডেক্স:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "বাম বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "ডান বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "মধ্য বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "চাকা উপরে তোলার বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "চাকা নিচে নামানোর বোতাম"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "বোতাম ৬"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "বোতাম ৭"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "বোতাম ৮"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "বোতাম ৯"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "জয়স্টিক অক্ষ ইন্ডেক্স:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "জয়স্টিক বোতাম ইন্ডেক্স:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "ইনপুট অ্যাকশন যোগ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "ইনপুট অ্যাকশন ইভেন্ট মুছে ফেলুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "সংরক্ষণে সমস্যা হয়েছে।"
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "সেটিংস সংরক্ষণ সফল হয়েছে।"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "অনুবাদ সংযোগ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "অনুবাদ অপসারণ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "পুনঃ-চিত্রাঙ্কিত পথ যোগ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "রিসোর্স পুনঃ-চিত্রাঙ্কিত করে যুক্ত করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "রিসোর্স পুনঃ-নকশার ভাষা পরিবর্তন করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "রিসোর্সের পুনঃ-নকশা অপসারণ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "রিসোর্সের পুনঃ-নকশার সিদ্ধান্ত অপসারণ করুন"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "প্রকল্পের সেটিংস (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "জেনেরাল"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "প্রপার্টি:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "ডিলিট/অপসারণ"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "প্লাটফর্মে প্রতিলিপি করুন.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "ইনপুট ম্যাপ/নকশা"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "অ্যাকশন:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "ডিভাইস:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "ইন্ডেক্স:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "স্থানীয়করণ"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "অনুবাদসমূহ"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "অনুবাদসমূহ:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "সংযোগ.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "পুনঃনকশাসমূহ"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "রিসোর্সসমূহ:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "ঘটনাস্থল দ্বারা পুনঃনকশা:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "ঘটনাস্থল"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "স্বয়ংক্রিয়-লোড"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "প্লাগইন-সমূহ"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "প্রিসেট.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "আন্ত-সহজাগমন"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "বহিঃ-সহজাগমন"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "শূন্য"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "আগমন-গমন সহজ/আলগা করন"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "গমন-আগমন সহজ/আলগা করন"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "ফাইল.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "পথ.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "লোড"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "নিযুক্ত"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "নতুন স্ক্রিপ্ট"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "ফাইল লোডে সমস্যা: রিসোর্স নয়!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "ছবি লোড অসম্ভব হয়েছে"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "বিট %d, মান %d।"
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "চালু"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "প্রোপার্টি-সমূহ:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "অংশাদি:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "গুণাগুণ/বৈশিষ্ট্য বাছাই করুন"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "মেথড/পদ্ধতি বাছাই করুন"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "PVRTC সরঞ্জাম এক্সিকিউট করা সম্ভব হচ্ছে না:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "PVRTC সরঞ্জাম দ্বারা রূপান্তরিত ছবি পুনরায় লোড করা সম্ভব নয়:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "নোডের নতুন অভিভাবক দান করুন"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "নতুন অভিভাবকের স্থান (নতুন অভিভাবক নির্বাচন করুন):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "সার্বজনীন রূপান্তর রাখুন"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "নতুন অভিভাবক দান করুন"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "নতুন রিসোর্স তৈরি করুন"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "রিসোর্স খুলুন"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "রিসোর্স সংরক্ষণ করুন"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "রিসোর্স-এর সরঞ্জামসমূহ"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "স্থানীয় করুন"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "চালানোর মোড:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "বর্তমান দৃশ্য"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "প্রধান দৃশ্য"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "প্রধান দৃশ্যের মান/আর্গুমেন্ট-সমূহ:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "দৃশ্য চালানোর সেটিংস"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "দৃশ্যসমূহ ইন্সট্যান্স করার মতো কোনো অভিভাবক নেই।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "%s হতে দৃশ্য লোড করতে সমস্যা হয়েছে"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "ঠিক আছে"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"বর্তমান দৃশ্যটি '%s' দৃশ্যের একটি নোডের মাঝে অবস্থান করায় দৃশ্যটিকে ইনস্ট্যান্স করা "
+"সম্ভব হচ্ছে না।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "দৃশ্য(সমূহ) ইন্সট্যান্স করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "শাখার মূলে এটি করা সম্ভব হবে না।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "অভিভাবকে নোড সরান"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "অভিভাবকে নোডসমূহ সরান"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "নোড(সমূহ) প্রতিলিপি করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "নোড(সমূহ) অপসারণ করবেন?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "দৃশ্য ছাড়া এটি করা সম্ভব হবে না।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "ইন্সট্যান্স করা দৃশ্যে এটি করা সম্ভব হবে না।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "নতুন দৃশ্য এইরূপে সংরক্ষণ করুন.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "অর্থপূর্ন!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "বাহিরের দৃশ্যের নোডে এটি করা সম্ভব হবে না!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "বর্তমান দৃশ্য যার হতে উৎপত্তি হয় তার নোডে এটি করা সম্ভব হবে না!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "নোড(সমূহ) অপসারণ করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"নতুন দৃশ্যটি সংরক্ষণ করা সম্ভব হচ্ছে না। সম্ভবত যেসবের (ইন্সট্যান্স) উপর নির্ভর করছে "
+"তাদের সন্তুষ্ট করা সম্ভব হচ্ছে না।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "দৃশ্য সংরক্ষণে সমস্যা হয়েছে।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "দৃশ্য প্রতিলিপি করে সংরক্ষণে সমস্যা হয়েছে।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "গ্রুপসমূহ সম্পাদন করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "সংযোগসমূহ সম্পাদন করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "নোড(সমূহ) অপসারণ করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "শীষ্য নোড তৈরি করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "শীষ্য নোড ইন্সট্যান্স করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "ধরণ পরিবর্তন করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "স্ক্রিপ্ট সংযুক্ত করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "স্ক্রিপ্ট পরিস্কার করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "দৃশ্য হতে একত্রিত করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "প্রশাখাকে দৃশ্য হিসেবে সংরক্ষণ করুন"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "অপসারণ করুন (নিশ্চয়তাকরণ নেই)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "অপসারণ করুন (নিশ্চয়তাকরণ নেই)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"একটি দৃশ্য ফাইলকে নোড হিসেবে ইন্সট্যান্স করুন। যদি কোনো মূল নোড না থাকে একটি "
+"উত্তরাধিকারী দৃশ্য তৈরি করে।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "একটি নতুন বা বিদ্যমান স্ক্রিপ্ট নির্বাচিত নোডে সংযুক্ত করুন।"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "নির্বাচিত নোড হতে একটি স্ক্রিপ্ট পরিস্কার করুন।"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Spatial দৃশ্যমানতা টগল করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "CanvasItem দৃশ্যমানতা টগল করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "ইন্সট্যান্স:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "অগ্রহণযোগ্য নোডের নাম, নীম্নোক্ত অক্ষরসমূহ গ্রহণযোগ্য নয়:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "নোড পুনঃনামকরণ করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "দৃশ্যের শাখা (নোডসমূহ):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "সম্পাদনযোগ্য অংশীদারীসমূহ"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "প্লেসহোল্ডার হিসেবে লোড করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "ইন্সট্যান্স করা বাতিল করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "এডিটরে খুলুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "উত্তরাধিকারত্ব পরিস্কার করুন"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "উত্তরাধিকারত্ব পরিস্কার করবেন? (ফেরৎ পাবেন না!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "পরিস্কার করুন!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "একটি নোড নির্বাচন করুন"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "অভিভাবকের অগ্রহণযোগ্য ক্লাস নাম"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "গ্রহণযোগ্য অক্ষরসমূহ:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "অগ্রহণযোগ্য ক্লাস নাম"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "গ্রহণযোগ্য নাম"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "না/আ"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "ক্লাস নাম অগ্রহণযোগ্য!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "অভিভাবকের ক্লাস নাম অগ্রহণযোগ্য!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "অগ্রহণযোগ্য পথ!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "ফাইলসিস্টেমে স্ক্রিপ্ট তৈরি করা সম্ভব হয়নি।"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "%s হতে স্ক্রিপ্ট তুলতে/লোডে সমস্যা হয়েছে"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "পথটি খালি"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "পথটি স্থানীয় নয়"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "বেস পথ অগ্রহণযোগ্য"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "অগ্রহণযোগ্য এক্সটেনশন"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "নতুন স্ক্রিপ্ট তৈরি করুন"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "বিদ্যমান স্ক্রিপ্ট লোড করুন"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "ক্লাস নাম:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "পূর্বনির্মিত স্ক্রিপ্ট"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "নোড স্ক্রিপ্ট সংযুক্ত করুন"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "বাইটস:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "সতর্কতা"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "সমস্যা:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "উৎস:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "ফাংশন:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "সমস্যাসমূহ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "চাইল্ড প্রসেস সংযুক্ত হয়েছে"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "পূর্ববর্তী ইন্সট্যান্স পরীক্ষা করুন"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "পরবর্তী ইন্সট্যান্স পরীক্ষা করুন"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "ফ্রেমসমূহ স্তূপ করুন"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "চলক/ভেরিয়েবল"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "সমস্যাসমূহ:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "পদাঙ্ক স্তূপ করুন (প্রযোজ্য হলে):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "রিমোট পরীক্ষক"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "দৃশ্যের সক্রিয় শাখা:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "রিমোট বস্তুর প্রোপার্টিস: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "প্রোফাইলার"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "মনিটর"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "মান"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "মনিটরস"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "রিসোর্স অনুসারে ভিডিও মেমোরির ব্যবহারের তালিকা করুন:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "সর্বমোট:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "ভিডিও মেমোরি"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "রিসোর্স-এর পথ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "ধরণ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "ব্যবহার"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "বিবিধ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "ক্লিক-কৃত কন্ট্রোল:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "ক্লিক-কৃত কন্ট্রোলের ধরণ:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "সক্রিয়ভাবে মূল সম্পাদন করুন:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "শাখা হতে স্থাপন করুন"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "শর্টকাটসমূহ"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Light এর ব্যাসার্ধ পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Camera এর ভিউ (FOV) পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Camera এর আকার পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Sphere Shape এর ব্যাসার্ধ পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Box Shape এর সীমা পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Capsule Shape এর ব্যাসার্ধ পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Capsule Shape এর উচ্চতা পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Ray Shape এর দৈর্ঘ্য পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Notifier এর সীমা পরিবর্তন করুন"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Notifier এর সীমা পরিবর্তন করুন"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance কোনো BakedLight রিসোর্স ধারণ করে না।"
+
+#~ msgid "Vertex"
+#~ msgstr "ভারটেক্স"
+
+#~ msgid "Fragment"
+#~ msgstr "ফ্রাগমেন্ট"
+
+#~ msgid "Lighting"
+#~ msgstr "লাইটিং"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "স্থায়ীয়তা টগল করুন"
+
+#~ msgid "Global"
+#~ msgstr "সার্বজনীন"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "এর ধারক/বাহক অদৃশ্য হওয়ায় এই বস্তুটি দৃশ্যমান করা সম্ভব নয়। প্রথমে ধারক/বাহককে "
+#~ "দৃশ্যমান করুন।"
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
new file mode 100644
index 0000000000..c45cad964b
--- /dev/null
+++ b/editor/translations/ca.po
@@ -0,0 +1,6942 @@
+# Catalan translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Roger BR <drai_kin@hotmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-10-11 08:26+0000\n"
+"Last-Translator: Roger BR <drai_kin@hotmail.com>\n"
+"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ca/>\n"
+"Language: ca\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Argument de tipus invàlid per a convert(), utilitzi constants TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Nombre insuficient de bytes per a descodificar els bytes, o el format és "
+"invàlid."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "L'argument pas (step) és zero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Script sense instància"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "No basat en un script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "No basat en un arxiu de recursos"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Format del diccionari d'instàncies invàlid (manca @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Format del diccionari d'instàncies invàlid (no es pot carregar l'script a "
+"@path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Format del diccionari d'instàncies invàlid (script invàlid a @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Diccionari d'instàncies invàlid (subclasses invàlides)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Node cedit sense memòria de treball. Llegiu la documentació per cedir "
+"(yield) nodes correctament!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Node cedit, però no ha retornat cap estat de funció en la primera memòria de "
+"treball."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"El valor de retorn s'ha d'assignar al primer element de la memòria de "
+"treball de nodes! Repareu el node."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "El node ha retornat un seqüencia de sortida invàlida: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"S'ha trobat un bit de seqüencia però cap node en la pila (stack), reporteu "
+"el bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Pila desbordada (stack overflow) amb profunditat de Pila: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funcions:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variables:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Senyals:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "El nom no és un identificador vàlid:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Nom usat en un altra funció/variable/senyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Reanomena Funció"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Reanomena Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Reanomena Senyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Afegeix Funció"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Afegeix Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Afegeix Senyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Treu Funció"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Treu Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Editant Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Treu Senyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Editant Senyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Canvia Transició"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Afegeix Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Retén Meta per dipositar un mètode Accessor (Getter). Retén Maj per "
+"dipositar una firma genèrica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Retén Ctrl per dipositar un mètode Accessor (Getter). Retén Maj per "
+"dipositar una firma genèrica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Retén Meta per dipositar una referència simple al node."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Retén Ctrl per dipositar una referència simple al node."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Retén Meta per dipositar una variable d'Actualització (Setter)."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Retén Ctrl per dipositar una Variable d'Actualització (Setter)."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Afegeix Node de Precàrrega"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Afegeix Node(s) des d'Arbre"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Afegeix Propietat d'Accés (Getter)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Afegeix Propietat d'Actualització (Setter)"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Transició"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Seqüència"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "commutador"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Iterador"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Mentre"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Retorn:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Crida"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Obtenir"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Especifica"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Edita"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipus Base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Membres:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nodes disponibles:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Selecciona o crea una funció per editar la corba"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Tanca"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Edita els Arguments del Senyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Edita Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Canvia"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Elimina Seleccionats"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Commuta el punt d'Interrupció"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Troba el Tipus del Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Copia Nodes"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Talla els Nodes"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Camí al Node:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Tipus d'entrada no iterable: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "L'Iterador ha esdevingut invàlid"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "L'Iterador ha esdevingut invàlid: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "El Nom de la propietat index és invàlid."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "L'objecte de Base no és un Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "El camí no condueix a cap Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "El nom de la propietat index '%s' és invàlid en el node %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argument invàlid del tipus: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Arguments invàlids: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "Variable Get no trobada en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "Variable Set no trobada en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"El node personalitzat no té cap mètode _step(), no es pot processar la corba."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Valor de retorn de _step() invàlid. Ha de ser un nombre enter (seq out), o "
+"una cadena de text (error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "premut"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "alliberat"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"No s'ha pogut llegir el certificat. Comproveu que tant el camí com la "
+"contrasenya són correctes"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "No s'ha pogut l'objecte signatura."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "No s'ha pogut crear el paquet signatura."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"No s'ha trobat cap plantilla.\n"
+"Descarregueu i instal·leu alguna plantilla d'exportació."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "No s'ha trobat cap paquet de depuració personalitzat."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "No s'ha trobat cap paquet de llançament personalitzat."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Nom no vàlid."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "La mida de la lletra no és vàlida."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "GUID d'editor no vàlid."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid background color."
+msgstr "Lletra personalitzada no vàlida."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Imatge Store Logo no vàlida. La mida hauria de ser 50x50 ."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "Imatge Logo quadrat 44x44 no vàlida. La mida hauria de ser 44x44."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "Imatge Logo quadrat 71x71 no vàlida. La mida hauria de ser 71x71 ."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "Imatge logo quadrat 150x150 no vàlida. La mida hauria de ser 150x150 ."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "Imatge logo quadrat 310x310 no vàlida. La mida hauria de ser 310x310."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "Imatge logo quadrat 310x150 no vàlida. La mida hauria de ser 310x150."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+"Imatge de la pantalla de presentació no vàlida. La mida hauria de ser "
+"620x300."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Un recurs del tipus SpriteFrames s'ha de crear or especificar en la "
+"propietat \"Fotogrames (Frames)\" perquè AnimatedSprite pugui mostrar els "
+"quadres."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Només es permet un sol CanvasModulate per escena (o conjunt d'escenes "
+"instanciades). El primer funcionarà, mentre que la resta seran ignorats."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D només proporciona formes de col·lisió a nodes derivats de "
+"CollisionObject2D. Utilitzeu-lo només per donar una forma a nodes com "
+"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Un CollisionPolygon2D buit no té cap efecte en la col·lisió."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D només proporciona formes de col·lisió nodes de derivats de "
+"CollisionObject2D. Utilitzeu-lo només per donar una forma a nodes com "
+"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"S'ha de proporcionar una forma perquè *CollisionShape2D pugui funcionar. "
+"Creeu-li un recurs de forma (shape)!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"S'ha de proveir la propietat 'textura' amb una textura amb la forma de la "
+"llum."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Cal establir (o dibuixar) un polígon oclusiu perquè aquest oclusor "
+"(occluder) faci efecte."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "El polígon oclusiu és buit. Dibuixeu un polígon!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Cal especificar un recurs de tipus NavigationPolygon per al correcte "
+"funcionament del Node. Si us plau especifiqueu una propietat o dibuixeu un "
+"polígon."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance ha de ser fill o nét d'un node Navigation2D. Només "
+"proporciona dades de navegació."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Un node ParallaxLayer només funciona quan s'estableix com a fill d'un node "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Cal que la propietat Camí (Path) assenyali cap a un node Particles2D vàlid."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D només funciona si s'estableix com a fill d'un node Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "Cal que la propietat Camí (Path) assenyali un Node2D vàlid."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Cal crear o especificar un recurs SampleLibrary en la propietat 'samples' "
+"perquè SamplePlayer pugui reproduir so."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Cal que la propietat Camí (Path) assenyali un node de Vista (Viewport) "
+"vàlid. Aquest ha de ser especificat en el mode \"destinació de renderització"
+"\" (render target)."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"La Vista (Viewport) especificada en la propietat \"Camí\" (Path) ha "
+"d'utilitzar el mode 'Destinació de renderització' (render target) perquè "
+"l'sprite funcioni."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funciona millor quan l'arrel de l'escena editada "
+"s'utilitza com a pare."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape només proporciona formes de col·lisió a nodes derivats de "
+"CollisionObject. Utilitzeu-lo només per donar una forma a nodes com Area, "
+"StaticBody, RigidBody, KinematicBody, etc."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Cal proveir una forma perquè CollisionShape funcioni. Creeu-li un recurs de "
+"forma!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon només proporciona formes de col·lisió a nodes derivats de "
+"CollisionObject. Utilitzeu-lo només per donar una forma a nodes com Area, "
+"StaticBody, RigidBody, KinematicBody, etc."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Un CollisionPolygon buit no afecta les col·lisions."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Cal crear o establir un recurs de tipus NavigationMesh per al correcte "
+"funcionament d'aquest node."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance ha de ser fill o nét d'un node Navigation. Només "
+"proporciona dades de navegació."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Cal que la propietat Camí (Path) assenyali cap a un node Particles2D vàlid."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Només es permet un sol WorldEnvironment per escena ( o conjunt d'escenes "
+"instanciades)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Cal crear o establir un recurs SampleLibrary en la propietat 'samples' "
+"perquè SpatialSamplePlayer pugui reproduir so."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Cal crear o establir un recurs SpriteFrames en la propietat 'Frames' perquè "
+"AnimatedSprite3D dibuixi els quadres."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "D'acord"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Ep!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Confirmeu..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Fitxer Existent, Sobreescriure?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Tots Reconeguts"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Tots els Fitxers (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Obre"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Obre un Fitxer"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Obre Fitxer(s)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Obre un Directori"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Obre un Fitxer o Directori"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Desa"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Desa un Fitxer"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Crea una Carpeta"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Camí:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Directoris i Fitxers:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Fitxer:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtre:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nom:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "No s'ha pogut crear la carpeta."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Cal utilitzar una extensió vàlida."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Maj +"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt +"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl +"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta +"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Dispositiu"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Botó"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Botó Esquerre."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Botó Dret."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Botó del Mig."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Roda Amunt."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Roda Avall."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Eix"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Talla"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copia"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Enganxa"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Selecciona-ho Tot"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Neteja"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Desfés"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Les finestres emergents s'oculten per defecte tret que s'invoqui popup() o "
+"qualsevol de les funcions popup*(). És possible fer-les visibles mentre "
+"s'edita, però s'ocultaran durant l'execució."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"La Vista (Viewport) no és la Destinació de Renderització (render target). "
+"Per mostrar-ne el contingut, especifiqueu-la com a filla d'un Control de "
+"forma per tal d'obtenir-ne la mida. Altrament, establiu-la com a Destinació "
+"de Renderització i assigneu-ne la textura interna a algun node."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Error inicialitzant FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Format de lletra desconegut."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Error carregant lletra."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "La mida de la lletra no és vàlida."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Desactivat"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Tota la Selecció"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Mou Afegir Clau"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Canvia Transició"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Canvia Transformació"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Canvia Valor"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Call"
+msgstr "Canvia Crida (Call)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Afegeix Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplica Claus"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Mou Pista Amunt"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Mou Pista Avall"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Treu Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Posa les Transicions a:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Reanomena Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Canvia Interpolació de Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Canvia Valor del Mode de Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Edita Corba del Node"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Edita Corba de Selecció"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Esborra Claus"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplica la Selecció"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplica Transposats"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Treu la Selecció"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Continu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discret"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Activador"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Afegeix Clau"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Mou Claus"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Escala la Selecció"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Escala des del Cursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Vés al Pas Següent"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Vés al Pas Previ"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineal"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constant"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "Entrada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Sortida"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Entrada-Sortida"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Sortida-Entrada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transicions"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimitza l'Animació"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Poleix l'Animació"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Vol crear una NOVA pista per a %s i inserir-hi una clau?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Vol crear %d noves pistes i inserir-hi claus?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Crea"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Crea i Insereix"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Insereix Pista i Clau"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Insereix Clau"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Canvia durada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Canvia bucle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Crea Clau de Valor Tipat"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Insereix Animació"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Escala Claus"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Afegeix Pista de Crida"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom d'animació."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Durada (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Durada de l'Animació (en segons)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Pas (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Pas de desplaçament del cursor (s)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Activa/Desactiva el bucle de l'animació."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Afegeix noves pistes."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Mou amunt la pista actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Mou avall la pista actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Treu la pista seleccionada."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Eines de Pista"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Activa l'editatge individual de claus en clicar-hi."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optimitzador d'Animació"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Error Lineal Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Error Angular Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Max. Angle Optimitzable:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimitza"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Selecciona un AnimationPlayer a l'Arbre de l'Escena per editar-ne l'animació."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Clau"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transició"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Relació d'Escala:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Cridar Funcions en el Node \"Which\"?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Treu claus invàlides"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Treu pistes buides o sense resoldre"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Poleix totes les animacions"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Poleix la/les Animació/ns (NO ES POT DESFER!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Poleix"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimensiona Matriu"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Canvia Tipus de la Matriu"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Canvia Valor de la Matriu"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Cerca:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Ordena:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Inverteix"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Categoria:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Tot"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Lloc:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Suport..."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficial"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunitat"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Provant"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Arxiu ZIP d'Actius"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Llista de mètodes de '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Llista de mètodes:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Arguments:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Retorn:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Vés a la Línia"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Línia:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Cap Coincidència"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Substituïdes %d ocurrència/es."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Reemplaça"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Reemplaça-hoTot"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Distingeix entre majúscules i minúscules"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Paraules senceres"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Selecció Només"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Cerca"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Troba"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Següent"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Reemplaçades %d ocurrència/es."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "No s'ha trobat!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Reemplaça per"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Majúscules i minúscules"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Enrere"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Indica en reemplaçar"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Omet"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Apropa"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Allunya"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Reinicia el Zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Línia:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Col:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Cal especificar un mètode per al Node objectiu!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Connecta al Node:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Afegeix"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Treu"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Afegeix Argument de Crida Extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Arguments de Crida Extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Camí al Node:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Crea Funció"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Diferit"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Oneshot"
+msgstr "D'un cop"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Connecta"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Connecta '%s' amb '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Connectant Senyal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Crea Subscripció"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Connecta.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Desconnecta"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Senyals"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Crea Nou"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favorits:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recents:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Coincidències:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Descripció:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Cerca Reemplaçant per a:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dependències per a:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"S'està editant l'Escena '%s'.\n"
+"Els canvis s'actualitzaran recarregar."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"S'està usant el Recurs '%s'.\n"
+"Els canvis s'actualitzaran en recarregar."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dependències"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Recurs"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Camí"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dependències:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Arregla Trencats"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor de Dependències"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Cerca Recurs Reemplaçant:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Propietaris de:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Els fitxers eliminats son necessaris per a altres recursos.\n"
+"Eliminar de totes formes? (No es pot desfer)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Elimina fitxer seleccionats del project? (no es pot desfer)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Error en carregar:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "No s'ha pogut carregar l'escena. Manquen dependències:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Obre igualment"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Amb quina acció s'ha de procedir?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Arregla Dependències"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Errors de càrrega!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Eliminar permanentment %d element(s)? (No es pot desfer!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Posseeix"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Recursos Sense Propietat Explícita:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Navegador de Recursos Orfes"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Esborra fitxers seleccionats?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Esborra"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nom no vàlid."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caràcters vàlids:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Nom no vàlid. No pot coincidir amb noms de classe del motor ja existents."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Nom no vàlid. No pot coincidir amb noms de tipus integrats ja existents."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nom no vàlid. No pot coincidir amb noms de constants globals ja existents."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Camí no vàlid."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "El Fitxer no existeix."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Fora del camí dels recursos."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Afegeix AutoCàrrega"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "l'AutoCàrrega '%s' ja existeix!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Reanomena AutoCàrrega"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Commuta les Globals d'AutoCàrrega"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Mou AutoCàrrega"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Treure Autocàrrega"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Activa"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Reorganitza AutoCàrregues"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nom del node:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nom"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Llista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Actualitzant Escena"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Emmagatzemant canvis locals.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Actualitzant escena.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Tria un Directori"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Tria"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Enrere"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Endavant"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Puja"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Refresca"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Commuta Fitxers Ocults"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Commuta Favorit"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Commuta Mode"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Enfoca Camí"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Mou Favorit Amunt"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Mou Favorit Avall"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Previsualització:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Escaneja Fonts"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Cerca Ajuda"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Llista de Classes:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Cerca Classes"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Classe:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Hereta:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Heretat per:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Descripció breu:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Mètodes públics:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Elements del Tema de la GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Constants:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Descripció breu:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Descripció del mètode:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Cerca Text"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Afegit:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Eliminat:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Error en desar atles:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "No s'ha pogut desar la subtextura de l'atles:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Emmagatzemant Fitxer:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Compressió"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportació per a %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Instal·lant.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Sortida:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Re-Importació"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importació:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Node de l'Escena"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Error en desar recurs!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Desar Recurs com..."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Vaja..."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "No s'ha pogut escriure en el fitxer:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Format de fitxer desconegut:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Error en desar."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Desant Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analitzant"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Creant Miniatura"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"No s'ha pogut desar l'escena. Probablement, no s'han pogut establir totes "
+"les dependències (instàncies)."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "No s'ha pogut carregar el recurs."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "No s'ha pogut carregar MeshLibrary per combinar les dades!!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Error en desar MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "No s'ha pogut carregar TileSet per combinar les dades!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Error en desar TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "No s'ha pogut obrir el zip amb les plantilles d'exportació."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Carregant Plantilles d'Exportació"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Error en desar els canvis!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "S'han sobreescrit els Ajustos Predeterminats de l'Editor."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "No s'ha trobat el nom de l'ajust!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "S'ha restaurat la configuració predeterminada."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copia Paràmetres"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Enganxa Paràmetres"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Enganxa Recurs"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copia Recurs"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Crea'l Integrat"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Crea SubRecurs Únic"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Obre dins l'Ajuda"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "No s'ha definit cap escena per executar."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"No s'ha definit cap escena principal. Seleccioneu-ne una.\n"
+"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" "
+"en la categoria \"aplicació\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"L'escena '%s' no existeix. Seleccioneu-ne una de vàlida.\n"
+"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" "
+"en la categoria \"aplicació\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"L'escena '%s' seleccionada no és un fitxer d'escena. Seleccioneu-ne un de "
+"vàlid.\n"
+"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" "
+"en la categoria \"aplicació\"."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"L'escena actual no s'ha desat encara. Desa l'escena abans d'executar-la."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "No s'ha pogut començar el subprocés!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Obre Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Obre Escena Base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Obertura Ràpida d'Escenes..."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Obertura Ràpida d'Scripts..."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Sí"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Tanca l'Escena? (Es perdran els canvis sense desar)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Desa Escena com..."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+"Aquesta Escena no s'ha desat mai encara. Voleu desar-la abans d'executar-la?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Desa l'escena abans."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Desa els texts Traduïbles"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exporta Biblioteca de Models"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exporta el joc de Mosaics (Tiles)"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Surt"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Voleu Sortir de l'editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "L'escena actual no s'ha desat. Vol obrir igualment?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "No es pot recarregar una escena no desada."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Reverteix"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "No es pot desfer aquesta acció. Vol revertir igualament?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Execució Ràpida de l'Escena..."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Vol Obrir el Gestor de Projectes?\n"
+"(Es perdran els canvis sense desar)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Tria una Escena Principal"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Uf..."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"No s'ha pogut carregar l'escena: No es troba dins del camí del projecte. "
+"Utilitzeu 'Importa' per obrir l'escena i deseu-la dins del camí del projecte."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "No s'ha pogut carregar l'escena."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Escena '%s' té dependències no vàlides:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Desar Disposició (Layout)"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Elimina Disposició (Layout)"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Predeterminat"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Canvia la pestanya d'escena"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d fitxer(s) més"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d fitxer(s) o directori(s) més"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Vés a l'escena oberta anteriorment."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Pestanya Següent"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Pestanya Anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operacions amb fitxers d'escena."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nova Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nova Escena heretada..."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Obre Escena..."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Desa Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Desa Totes les Escenes"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Tanca l'Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Tanca i Vés a l'Escena anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Obre Recent"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtrat Ràpid de Fitxers..."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Converteix a..."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Cadenes Traduïbles..."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "Biblioteca de Models (MeshLibrary)..."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "Joc de Mosaics (TileSet)..."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Refés"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Executa Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Configuració del Projecte"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Reverteix Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Surt a la Llista de Projectes"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Mode Lliure de Distraccions"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importa actius al projecte."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importa"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Eines vàries o d'escena."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Eines"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exporta el projecte a diverses plataformes."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exporta"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Reprodueix el projecte."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Reprodueix"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Pausa l'escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausa Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Atura l'escena."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Atura"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Reprodueix l'escena editada."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Reprodueix Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Reprodueix escena personalitzada"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Reprodueix Escena Personalitzada"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opcions de Depuració (Debug)"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Desplega amb Depuració Remota"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"En ser exportat o desplegat, l'executable resultant intenta connectar-se a "
+"l'IP d'aquest equip per iniciar-ne la depuració."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Desplegament Reduït amb Sistema de Fitxers en Xarxa"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Amb aquesta opció activada, 'Exportar' o 'Desplegar' generen un executable "
+"reduït.\n"
+"L'Editor proveeix el sistema de fitxers del projecte a través de la xarxa.\n"
+"En sistemes Android, 'Desplegar' utilitzarà el cable USB per millorar-ne el "
+"rendiment. Aquesta opció ajuda a accelerar els cicles de prova i verificació "
+"en jocs de gran mida."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Formes de Col·lisió Visibles"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Les formes de col·lisió i nodes de difusió de raigs (raycast) (per a 2D i "
+"3D), son visibles durant l'execució del joc quan s'activa aquesta opció."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navegació Visible"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Les malles i polígons de Navegació són visibles durant l'execució del joc "
+"quan s'activa aquesta opció."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sincronitza Canvis en Escenes"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"En activar aquesta opció, els canvis fets en l'Editor es repliquen en el joc "
+"en execució.\n"
+"En usar-se remotament en un dispositiu, un sistema de fitxers en xarxa en "
+"millora el rendiment."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Sincronitza Canvis en Scripts"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"En activar aquesta opció, els scripts, en ser desats, es recarreguen en el "
+"joc en execució.\n"
+"En usar-se remotament en un dispositiu, un sistema de fitxers en xarxa en "
+"millora el rendiment."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Configuració"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configuració de l'Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Disposició de l'Editor"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "Mode Pantalla completa"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Instal·la Plantilles d'Exportació"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Quant a"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Alerta en canviar un recurs extern."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Gira en repintar-se la finestra de l'editor!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Actualitza Sempre"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Actualitza Canvis"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Crea un nou recurs en memòria i edita'l."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Carrega un recurs des del disc i edita'l."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Desa el recurs editat ara."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Desa Com..."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Vés a l'anterior objecte editat de l'historial."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Vés al següent objecte editat de l'historial."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Historial d'objectes editats recentment."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Propietats de l'objecte."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "SistemaDeFitxers"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Sortida"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "ReImporta"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Actualitza"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Gràcies de la part de la Comunitat del Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Gràcies!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importa Plantilles des d'un Fitxer ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exporta Projecte"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Exporta Biblioteca"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Combina amb Existents"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Contrasenya:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Obre i Executa un Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Errors de Càrrega"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Connectors Instal·lats:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Versió:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Estat:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Atura Perfilació"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Comença Perfilació"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Mesura:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Duració del Fotograma (s)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Temps Mitjà (s)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "% del Fotograma"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "% del Fotograma Fix"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Temps:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusiu"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Propi"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Fotograma núm.:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Espera que s'acabi l'anàlisi."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "S'ha de desar l'escena abans de reimportar-la."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Desa i ReImporta"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "ReImporta Recursos Modificats"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Escriu la lògica en el mètode _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Ja hi ha un escena editada."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "No s'ha pogut instanciar l'script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Podria mancar la paraula clau 'tool'?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "No s'ha pogut executar l'script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Podria mancar el mètode '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Predeterminat (Idèntic a l'Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selecciona Node(s) per Importar"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Camí de l'Escena:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importa des del Node:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"No s'ha pogut escriure el fitxer file_type_cache.cch. No es desara el cau de "
+"tipus de fitxers!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+"Els fitxers d'origen i destinació són els mateixos. No s'ha produït cap "
+"acció."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "El camí d'origen i destinació es idèntic. No s'ha produït cap acció."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "No es poden moure directoris en si mateixos."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "No es pot operar en '..'"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Tria un Nou Nom i Ubicació per a:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Cap fitxer seleccionat!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instància"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Edita Dependències..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Mostra Propietaris..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copia Camí"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Renomena o Mou..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Mou cap a..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Informació"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Mostra en el Gestor de Fitxers"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "ReImporta..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Directori Anterior"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Directori Següent"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "ReAnalitza Sistema de Fitxers"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Canvia l'estat del directori a Preferit"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Instancia les escenes seleccionades com a filles del node seleccionat."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Mou"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Afegeix al Grup"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Treu del Grup"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Cap màscara de bits per importar!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "El camí de Destinació és buit."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "El camí de Destinació ha de ser un camí de recursos complet."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "El camí de Destinació ha d'existir."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "El camí per desar és buit!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importa Màscares de Bit"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Textures Font:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Camí de Destinació:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Accepta"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Màscara de bits"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Cap fitxer de lletra font!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Cap recurs de Lletra!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Extensió de fitxer no vàlida.\n"
+"Utilitzeu .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "No es pot carregar/processar la lletra."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "No s'ha pogut desar la lletra."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Lletra:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Mida de la lletra:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Recurs Objectiu:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"«Dóna amor que seràs feliç!». Això, il·lús veí i company geniüt, ja és un "
+"lluït rètol d'onze kWh."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Prova:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opcions:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importa lletra"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Aquest fitxer ja és un fitxer de lletra de Godot. Proveïu un fitxer de tipus "
+"BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "No s'ha pogut obrir com a fitxer BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Lletra personalitzada no vàlida."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Lletra"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Cap malla per importar!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importa una Malla"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Malla/es :"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Malla"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Superfície %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "No s'ha trobat cap mostra d'Àudio per importar!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importa Mostra d'Àudio"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Mostra/es d'Origen:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Mostra d'Àudio"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nou Clip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opcions d'Animació"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Flags"
+msgstr "Indicadors (flags)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "Fer Bake dels FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optimitzador"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Error Lineal Màxim"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Error Angular Màxim"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Angle Màxim"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Clips"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Inici/s"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Final/s"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Bucle"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtres"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "El camí d'origen és buit."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "No s'ha pogut carregar l'script de post-importació."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "L'script de post-importació no és vàlid ."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "No s'ha pogut importar l'escena."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importa Escena 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Escena d'Origen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Igual que l'Escena de Destinació"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Compartit"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Directori per a Textures escollit:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script de Post-Processat:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Tipus de Node Arrel Personalitzat:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nom del node:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Manquen els següents Fitxers:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importa Igualment"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importa i Obre"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"No s'ha desat l'escena editada. Vol obrir l'escena importada igualment?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importa Escena"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Important Escena..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Executant Script Personalitzat..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "No s'ha pogut carregar l'script de post-importació:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "L'script de post-importació no és vàlid (comprova el terminal):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Error en l'execució de l'script de post-importació:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importa Imatge:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "No es pot importar un fitxer dins de si mateix:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "No s'ha pogut localitzar el camí: %s (ja és local)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Desant..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animació d'Escenes 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Sense Compressió"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Compressió sense Pèrdua (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Compressió amb Pèrdua (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Compressió (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Format de Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Qualitat de Compressió de Textura (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opcions de Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Cal especificar algun fitxer!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Es necessita com a mínim un fitxer per a l'Atles."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Canvia Tipus de la Matriu"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Tanca"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Vistes"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Vistes (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Vistes"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Vistes (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Vistes"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Configuració de Desplaçament"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Configuració de la Vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Crea una Carpeta"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transició"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Estat:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Contrasenya:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Caràcters vàlids:"
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Configuració d'Exportació de Projectes"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "No s'ha pogut desar la configuració."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Configuració desada correctament."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Configuració del Projecte (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Executa Script"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Afegeix Col.locador de Proprietat (Setter)"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Mètodes públics:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Configuració d'Execució d'Escenes"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Executa Script"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Executa Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Error carregant lletra."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Crea Subscripció"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "No s'ha pogut instanciar l'script:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Executa Script"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance no conté cap recurs BakedLight."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "No es pot començar un camí per '/'. Els camins absoluts han de començar "
+#~ "per 'res://', 'user://' o 'local://'"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "El node personalitzat no té _get_output_port_unsequenced(idx,wmem), però "
+#~ "s'han especificat ports sense seqüenciar."
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
new file mode 100644
index 0000000000..3dc52fa536
--- /dev/null
+++ b/editor/translations/cs.po
@@ -0,0 +1,6839 @@
+# Czech translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>, 2016.
+# Luděk Novotný <gladosicek@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-11 15:01+0000\n"
+"Last-Translator: Luděk Novotný <gladosicek@gmail.com>\n"
+"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
+"cs/>\n"
+"Language: cs\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Skript nemá instanci"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Není založeno na skriptu"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Není založeno na zdrojovém souboru"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Neplatná instance slovníkového formátu (chybí @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "Neplatná instance slovníkového formátu (nemohu nahrát skript na @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Neplatná instance slovníkového formátu (nemohu nahrát skript na @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Neplatná instance slovníku (neplatné podtřídy)"
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Uzel zavolal yield bez pracovní paměti. Přečtěte si prosím v dokumentaci, "
+"jak správně používat yield!"
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr "Uzel zavolal yield, ale nevrátil stav funkce v první pracovní paměti."
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Návratová hodnota musí být přiřazena prvnímu prvku uzlu pracovní paměti. "
+"Opravte prosím váš uzel."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Uzel vrátil neplatnou posloupnost výstupu: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "Nalezen bit posloupnosti ale ne uzel v zásobníku. Nahlaste chybu!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Přetečení zásobníku s hloubkou: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funkce:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Proměnné:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signály:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Jméno není platný identifikátor:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Jméno už je použito jinou funkcí/proměnnou/signálem:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Přejmenovat funkci"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Přejmenovat proměnnou"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Přejmenovat signál"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Přidat funkci"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Přidat proměnnou"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Přidat signál"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Odstranit funkci"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Odstranit proměnnou"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Úprava proměnné:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Odstranit signál"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Úprava signálu:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Animace: změna přechodu"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Přidat uzel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Přidat uzel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Přidat uzel (uzly) ze stromu"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Přidat vlastnost getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Přidat vlastnost setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Přechod"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Vrátit:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Volat"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Upravit"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Základní typ:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Členové:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Dostupné uzly:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Pro úpravu grafu vyber nebo vytvoř funkci"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Zavřít"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Upravit argumenty signálu:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Upravit proměnnou:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Změnit"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Smazat vybraný"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Přepnout breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Vyhledat typ uzlu"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Cesta k uzlu:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Neplatné jméno vlastnosti."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Základní objekt není Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Cesta nevede k uzlu!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Neplatné jméno vlastnosti '%s' v uzlu %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Neplatný argument typu: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Neplatné argumenty: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "Proměnná pro získání nebyla ve skriptu nalezena: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "Proměnná pro nastavení nebyla ve skriptu nalezena: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "Vlastní uzel nemá metodu _step(), takže nelze postupovat grafem."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Neplatný název."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Neplatná velikost fontu."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D slouží pouze jako kontejner tvarů objektu "
+"CollissionObject2D a od něj odvozených uzlů. Použijte ho pouze jako potomka "
+"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D a dalších, pro určení "
+"jejich tvaru."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Prázdný CollisionPolygon2D nemá žádný efekt na kolizích."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D slouží pouze jako kontejner tvarů objektu "
+"CollissionObject2D a od něj odvozených uzlů. Použijte ho pouze jako potomka "
+"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D a dalších, pro určení "
+"jejich tvaru."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "Textura světla musí být nastavena vlastností 'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Polygon stínítka musí být nastaven (nebo namalován), aby stínítko fungovalo."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Aby mohl tento uzel fungovat, musí mít vytvořen nebo nastaven zdroj "
+"NavigationPolygon. Nastavte prosím vlastnost nebo nakreslete mnohoúhelník."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance musí být dítětem nebo vnoučetem uzlu Navigation2D. "
+"Poskytuje pouze data pro navigaci."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Uzel ParallaxLayer funguje pouze když je dítětem uzlu ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Aby ParticleAttractor2D fungoval, musí vlastnost path ukazovat na platný "
+"uzel Particles2D."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D funguje pouze když je dítětem uzlu Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Pro zajištění funkčnosti musí vlastnost path ukazovat na platný uzel Node2D."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Zdroj SampleLibrary musí být vytvořen nebo nastaven jako vlastnost "
+"'samples', aby mohl SamplePlayer přehrát zvuk."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Pro zajištění funkčností musí vlastnost path ukazovat na platný uzel "
+"Viewport. Takový Viewport musí být nastaven do módu 'render target'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Aby tento sprite mohl fungovat, Viewport nastavený ve vlastnosti path musí "
+"být nastaven do módu 'render target'."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape pouze poskytuje tvar kolize uzlům odvozeným z "
+"CollisionObject. Použijte ho jen jako dítě uzlů Area, StaticBody, RigidBody "
+"a KinematicBody, abyste jim dali tvar."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Aby CollisionShape mohl fungovat, musí mu být poskytnut tvar. Vytvořte mu "
+"prosím zdroj tvar!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon pouze poskytuje tvar kolize uzlům odvozeným z "
+"CollisionObject. Použijte ho jen jako dítě uzlů Area, StaticBody, RigidBody "
+"a KinematicBody, abyste jim dali tvar."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Prázdný CollisionPolygon nemá na kolize žádný efekt."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Aby tento uzel mohl fungovat, musí mít nastaven nebo vytvořen zdroj "
+"NavigationMesh."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance musí být dítětem nebo vnoučetem uzlu Navigation. "
+"Poskytuje pouze data pro navigaci."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Aby ParticleAttractor2D fungoval, musí vlastnost path ukazovat na platný "
+"uzel Particles2D."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Na každou scénu (nebo skupinu instancovaných scén) je povolen pouze jeden "
+"WorldEnvironment."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Zdroj SampleLibrary musí být vytvořen nebo nastaven jako vlastnost "
+"'samples', aby mohl SpatialSamplePlayer přehrát zvuk."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Zdroj SpriteFrames musí být vytvořen nebo nastaven ve vlastnosti 'Frames', "
+"aby mohl AnimatedSprite3D zobrazit rámečky."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Pozor!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Potvrďte prosím..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Soubor už existuje. Přepsat?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Všechny rozpoznatelné"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Všechny soubory (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Otevřít"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Otevřít soubor"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Otevřít soubor(y)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Otevřít složku"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Otevřít soubor nebo složku"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Uložit"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Uložit soubor"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Vytvořit složku"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Cesta:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Složky a soubory:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Soubor:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtr:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Jméno:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Nelze vytvořit složku."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Je nutné použít platnou příponu."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Zařízení"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Tlačítko"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Levé tlačítko."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Pravé tlačítko."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Prostřední tlačítko."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Kolečko nahoru."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Kolečko dolů."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Osa"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Vyjmout"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopírovat"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Vložit"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Vybrat vše"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Vyčistit"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Zpět"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popupy budou standardně skryty, dokud nezavoláte popup() nebo některou z "
+"popup*() funkcí. I když je jejich zviditelnění pro úpravu v pořádku, za běhu "
+"budou skryty."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Tento viewport není nastaven jako render target. Pokud chcete jeho obsah "
+"zobrazit přímo na obrazovku, musíte ho nastavit jako dítě uzlu Control, aby "
+"mohl získat velikost. Jinak ho nastavte jako render target a přiřaďte jeho "
+"vnitřní texturu nějakému uzlu k zobrazení."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Chyba při inicializaci FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Neznámý formát fontu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Chyba nahrávání fontu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Neplatná velikost fontu."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Vypnuto"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Všechny vybrané"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Animace: změna přechodu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Animace: změna transformace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Animace: změna hodnoty"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Animace: změna volání"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Animace: přidat stopu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Animace: duplikovat klíče"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Posun stopy animace nahoru"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Posun stopy animace dolů"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Odstranit stopu animace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Změna přechodů na:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Animace: přejmenování stopy"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Animace: změna interpolace stopy"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Animace: změna typu hodnot"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Úprava křivky uzlu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Úprava vybraných křivek"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Animace: smazat klíče"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplikovat výběr"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Odstranit výběr"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Spojité"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Diskrétní"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Spoušť"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Animace: přidat klíč"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Animace: přesunout klíče"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Změnit měřítko výběru"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Změnit měřítko od kurzoru"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Jít k dalšímu kroku"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Jít k předchozímu kroku"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineární"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Konstantní"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Přechody"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimalizovat animaci"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Pročistit animaci"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Vytvořit NOVOU stopu pro %s a vložit klíč?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Vytvořit %d NOVÝCH stop a vložit klíče?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Vytvořit"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Animace: Vytvořit a vložit"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Animace: Vložit stopu a klíč"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Animace: vložit klíč"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Změnit délku animace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Změnit opakování animace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Animace: vložit"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Animace: změnit měřítko klíčů"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Animace: přidat stopu volání"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Přiblížení animace."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Délka (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Délka animace (v sekundách)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Krok (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Krokování kurzoru (v sekundách)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Zapnout/vypnout opakování animace."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Přidat nové stopy."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Posunout aktuální stopu nahoru."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Posunout aktuální stopu dolů."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Odstranit vybranou stopu."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Nástroje stopy"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Kliknutím na klíče zapnete jejich individuální úpravu."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optimalizátor animace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Maximální lineární chyba:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Maximální úhlová chyba:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Maximální optimalizovatelný úhel:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimalizuj"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "Pro úpravu animací vyberte ze stromu scény uzel AnimationPlayer."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Klíč"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Přechod"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Ze kterého uzlu volej funkce?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Odstranit neplatné klíče"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Pročistit všechny animace"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Pročistit animaci (NELZE VZÍT ZPĚT!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Pročistit"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Změnit velikost pole"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Změnit typ hodnot pole"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Změnit hodnotu pole"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Hledat:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Řadit:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Naopak"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Všechny"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Web:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Podpora.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficiální"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Z komunity"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Testované"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "ZIP soubor asetů"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Seznam metod '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Seznam metod:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumenty:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Vrátit:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Běž na řádek"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Číslo řádku:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Žádné shody"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Nahrazeno %d výskytů."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Nahradit"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Nahradit všechny"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Rozlišovat malá/velká"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Celá slova"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Pouze výběr"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Hledat"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Najít"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Další"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Nahrazeno %d výskytů."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Nenalezeno!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Nahradit"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Potvrzovat nahrazení"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Přeskočit"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Přiblížit"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Oddálit"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Obnovit původní přiblížení"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Řádek:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Sloupec:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Je nutné zadat metodu v cílovém uzlu!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Připojit k uzlu:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Přidat"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Odebrat"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Přidat další argument volání:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Další argumenty volání:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Cesta k uzlu:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Vytvořit funkci"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Odloženě"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Jednorázově"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Připojit"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Připojit '%s' k '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Připojuji signál:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Vytvořit odběr"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Připojit.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Odpojit"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Signály"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Vytvořit nový"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Shody:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Hledat náhradu za:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Závislosti na:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Scéna '%s' se právě upravuje.\n"
+"Změny se projeví po opětovném načtení."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Zdroj '%s' se právě používá.\n"
+"Změny se projeví po opětovném načtení."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Závislosti"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Zdroj"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Cesta"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Závislosti:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Opravit nefunkční"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor závislostí"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Hledat náhradní zdroj:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Vlastníci:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Soubory ke smazání potřebují jiné zdroje ke své činnosti.\n"
+"Přesto je chcete smazat? (nelze vrátit zpět)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Odebrat vybrané soubory z projektu? (nelze vrátit zpět)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Chyba při načítání:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Scénu se nepodařilo načíst kvůli chybějícím závislostem:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Přesto otevřít"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Jaká akce by se měla provést?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Opravit závislosti"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Chyby při načítání!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Permanentně smazat %d položek? (nelze vrátit zpět!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Vlastní"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Průzkumník sirotků zdrojů"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Odstranit vybrané soubory?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Odstranit"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Neplatný název."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Platné znaky:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "Neplatný název. Nesmí kolidovat s existující názvem třídy enginu."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Neplatný název. Nesmí kolidovat s existujícím jménem zabudovaného typu."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Neplatný název. Nesmí kolidovat s existujícím názvem globální konstanty."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Neplatná cesta."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Soubor neexistuje."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Není v cestě ke zdroji."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Přidat AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload '%s' už existuje!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Přejmenovat AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Vytvořit odběr"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Select Mode"
+msgstr "Vybrat vše"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Změnit typ hodnot pole"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Zavřít"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Vytvořit složku"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Přechod"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Platné znaky:"
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Přidat vlastnost setter"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Vybrat vše"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Vytvořit odběr"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete (No Confirm)"
+msgstr "Potvrďte prosím..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Chyba nahrávání fontu."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Vytvořit odběr"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance neobsahuje zdroj BakedLight."
diff --git a/editor/translations/da.po b/editor/translations/da.po
new file mode 100644
index 0000000000..6148d0b82d
--- /dev/null
+++ b/editor/translations/da.po
@@ -0,0 +1,6845 @@
+# Danish translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# David Lamhauge <davidlamhauge@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-27 07:06+0000\n"
+"Last-Translator: David Lamhauge <davidlamhauge@gmail.com>\n"
+"Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/"
+"godot/da/>\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Ugyldigt type argument til convert(), brug TYPE_* konstanter."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Ikke nok bytes til afkodning af bytes, eller ugyldigt format."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "trin argument er nul!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Ikke et script med en instans"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Ikke baseret på et script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Ikke baseret på en ressource fil"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Ugyldig instans ordbogs format (mangler @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "Ugyldig instans ordbogs format (kan ikke indlæse script ved @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Ugyldig forekomst ordbog format (ugyldigt script på @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Ugyldig forekomst ordbog (ugyldige underklasser)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"En node yielded uden arbejdshukommelse, læs venligst dokumenterne for at se "
+"hvordan man yielder rigtigt!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Node givet, men returnerede ikke en funktion tilstand i den første "
+"arbejdshukommelse."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Returværdien skal tildeles første element af nodens arbejdshukommelse! Fix "
+"din node venligst."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Node returnerede en ugyldig sekvens output: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "Fundet sekvens bit men ikke noden i stakken, reporter bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Stakoverløb med stak dybde: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funktioner:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signaler:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Navnet er ikke et gyldigt id:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Navnet allerede bruges af en anden func/var/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Omdøb Funktion"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Omdøbe variablen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Omdøb Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Tilføj Funktion"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Tilføj variabel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Tilføj Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Fjern Funktion"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Fjern Variabel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Redigerer Variabel:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Fjern Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Redigerer Signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Anim Skift Overgang"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Tilføj Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Tilføj Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Tilføj Node(r) fra Tree"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Tilføj Getter Egenskab"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Tilføj Setter Egenskab"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Overgang"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Tilbage:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Kald"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Rediger"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Basis Type:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Medlemmer:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Tilgængelige Noder:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Vælg eller Opret en funktion til at redigere graf"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Luk"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Rediger Signal argumenter:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Rediger Variabel:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Skift"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Slet Valgte"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Skift/Toggle Breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Find Node Type"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Sti til Node:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Input type ikke iterabel: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Iterator blev ugyldig"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Iterator blev ugyldig: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Ugyldigt index egenskabsnavn."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Base-objekt er ikke en Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Stien fører ikke til Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Ugyldigt indeks egenskabsnavn '%s' i noden %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Ugyldigt argument af typen: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Ugyldige argumenter: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet blev ikke fundet i scriptet: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet blev ikke fundet i scriptet: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Brugerdefinerede node har ingen _step() metode, kan ikke behandle graf."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Ugyldig retur værdi fra _step(), skal være heltal (seq ud), eller en streng "
+"(fejl)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Ugyldigt index egenskabsnavn."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Ugyldig skriftstørrelse."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"En SpriteFrames ressource skal oprettes eller angives i egenskaben 'Frames' "
+"for at AnimatedSprite kan vise frames."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Kun et synligt CanvasModulate er tilladt pr. scene (eller et sæt af "
+"instanserede scener). Den første vil blive brugt, mens resten vil blive "
+"ignoreret."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D tjener kun til at give en kollisionsfigur til et "
+"CollisionObject2D afledte node. Du skal kun bruge det som et barn af Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. til at give dem en form."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "En tom CollisionPolygon2D har ingen effekt på kollision."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D tjener kun til at give en kollision figur til en "
+"CollisionObject2D afledte node. Du skal kun bruge det som et barn af Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. til at give dem en form."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"En figur skal gives CollisionShape2D for at det fungerer. Opret venligst en "
+"figur ressource for den!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "En tekstur med formen på lyset skal gives til egenskaben 'teksture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"En occluder polygon skal angives (eller tegnes) for at denne occluder træder "
+"i kraft."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "Occluder polygon for denne occluder er tom. Tegn venligst en polygon!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"En NavigationPolygon ressource skal sættes eller laves for at denne node kan "
+"virke. Sæt venligst en egenskab eller tegn en polygon."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance skal være et barn eller barnebarn til en "
+"Navigation2D node. Det giver kun navigationsdata."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer node virker kun, når den angives som barn af en "
+"ParallaxBackground node."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "Egenskaben Path skal pege på en gyldig Particles2D node for at virke."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D virker kun, når den angives som et barn af en Path2D node."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "Egenskaben Path skal pege på en gyldig Node2D node for at virke."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"En SampleLibrary ressource skal oprettes eller angives i egenskaben "
+"'samples' for at SamplePlayer kan afspille lyd."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Egenskaben Path skal pege på en gyldig Viewport node for at virke. Sådan en "
+"Viewport skal indstilles til 'render target' tilstand."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Viewport angivet i egenskaben path skal indstilles som 'render target' for "
+"at denne sprite kan virke."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D fungerer bedst, når det bruges med den redigerede "
+"scenerod direkte som parent."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape tjener kun til at give en kollision figur til en "
+"CollisionObject afledte node. Du skal kun bruge det som et barn af Area, "
+"StaticBody, RigidBody, KinematicBody, etc. til at give dem en form."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"En figur skal gives for at CollisionShape fungerer. Opret en figur ressource "
+"til det!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon tjener kun til at give en kollision figur til en "
+"CollisionObject afledte node. Du skal kun bruge det som et barn af Area, "
+"StaticBody, RigidBody, KinematicBody, etc. til at give dem en form."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "En tom CollisionPolygon har ingen effekt på kollision."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"En NavigationMesh ressource skal laves eller oprettes for at denne node kan "
+"fungere."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance skal være et barn eller barnebarn til en Navigation "
+"node. Det giver kun navigationsdata."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Egenskaben Path skal pege på en gyldig Particles2D node for at virke."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Kun én WorldEnvironment er tilladt pr. scene (eller et sæt af instanserede "
+"scener)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"En SampleLibrary ressource skal oprettes eller angives i egenskaben "
+"'samples' for at SpatialSamplePlayer kan afspille lyd."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"En SpriteFrames ressource skal oprettes eller angivets i egenskaben 'Frames' "
+"for at AnimatedSprite3D kan vise frames."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Annuller"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Ok"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Advarsel!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Bekræft venligst..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Filen findes, overskrives?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Alle Genkendte"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Alle filer (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Åben"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Åben en Fil"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Åben fil(er)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Åbn en mappe"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Åbne en fil eller mappe"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Gem"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Gem en fil"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Opret mappe"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Sti:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Mapper & filer:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Fil:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filter:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Navn:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Kunne ikke oprette mappe."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Skal bruge en gyldig udvidelse."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt +"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "CTRL +"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta +"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Enhed"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Knap"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Venstre knap."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Højre knap."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Midterste knap."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Hjulet op."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Hjulet ned."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Akse"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Cut"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopier"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Indsæt"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Vælg alle"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Clear"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Fortryd"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popups er skjulte som standard, medmindre du kalder popup() eller nogen af "
+"popup*() funktionerne. At gøre dem synlige for redigering er fint, men de "
+"bliver skjult under afvikling."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Denne viewport er ikke angivet som render target. Hvis du har tænkt dig for "
+"at vise dens indhold direkte til skærmen, gør det til et barn af Control, så "
+"den kan opnå en størrelse. Ellers gør den til en RenderTarget og tildel dens "
+"indre textur til en node så den kan vises."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Fejl under initialisering af FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Ukendt skrifttypeformat."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Error loading skrifttype."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Ugyldig skriftstørrelse."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Deaktiveret"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "All selection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Flyt Add Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Anim Skift Overgang"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Anim Skift transformering"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Anim Skift værdi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Anim Skift Call"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Anim tilføj spor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Anim Dubliker Keys"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Flyt Anim spor op"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Flyt Anim spor ned"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Fjern Anim spor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Sæt overgange til:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Anim spor Omdøb"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Anim spor Skift Interpolation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Anim spor Skift værdi Mode"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Redigere Node kurve"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Rediger udvalg kurve"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim slet Keys"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Dubler valg"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplicate transposed"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Fjern markering"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Kontinuerlig"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Diskret"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Udløser"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Anim Tilføj Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Anim Flyt Keys"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Skalering Valg"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Skaler fra Cursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Goto næste skridt"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Goto forrige trin"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineær"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Konstant"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "I"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Ud"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Ind-Ud"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-in"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Overgange"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimer Animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Clean-up Animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Oprette nye spor til %s og indsætte key?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Oprette %d nye numre og indsætte nøgler?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Opret"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Anim opret & indsæt"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim Indsæt spor & key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim Indsæt key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Ændre Anim Len"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Ændre Anim løkke"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Anim opret indtastet Value key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim Indsæt"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Anim Skaler keys"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Anim tilføj Call Track"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Animation Zoom."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Længde (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Animation Længde (i sekunder)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Trin (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Cursor trin snap (i sekunder)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Aktiver/Deaktiver løkker i animation."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Tilføje nye tracks."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Flyt aktuelle spor op."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Flyt aktuelle spor ned."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Fjern markerede spor."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Spor værktøjer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Aktivere redigering af individuelle keys ved at klikke på dem."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Anim. optimizer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Max. Lineær fejl:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Max. Azimutal fejl:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Max optimerbar vinkel:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "Vælg en AnimationPlayer fra Scene Tree for at redigere animationer."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Key/Nøgle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Overgang"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Skala forholdet:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Kald funktioner i hvilken Node?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Fjerne ugyldige keys"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Fjerne uløste og tomme spor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Clean-up alle animationer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Clean-Up Animation(-er) (ingen FORTRYD!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Clean-up"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Ændre størrelsen på Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Skift Array værditype"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Ændre Array-værdi"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Søgning:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Sorter:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Omvendt"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Kategori:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Alle"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Websted:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Støtte..."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Officiel"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Fællesskabet"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Tester"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Assets zipfil"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Metode liste For '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Metode liste:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumenter:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Tilbage:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Gå til linje"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Linjenummer:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Ingen Match"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Erstattede %d tilfælde."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Erstat"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Erstat alle"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Match stor/lille"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Hele ord"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Kun Valgte"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Søg"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Find"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Næste"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Erstattede %d tilfælde."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Ikke fundet!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Erstattes af"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Baglæns"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Spørg ved Erstat"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Spring over"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Zoom ind"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Zoom ud"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Nulstil Zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Linje:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Kol:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Metode i target Node skal angives!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Opret forbindelse til Node:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Tilføj"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Fjern"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Tilføje ekstra Call Argument:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Ekstra call argumenter:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Sti til Node:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Lav funktion"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Udskudt"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "OneShot"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Tilslut"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Tilslut '%s' til '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Forbindelses signal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Opret abonnement"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Forbind..."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Afbryd"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Signaler"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Opret en ny"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Matches:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Søg erstatning For:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Afhængigheder For:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Scene '%s' er i øjeblikket ved at blive redigeret.\n"
+"Ændringer træder ikke i kraft, medmindre reloaded."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Ressource '%s' er i brug.\n"
+"Ændringer træder i kraft når genindlæses."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Afhængigheder"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Ressource"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Sti"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Afhængigheder:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Fix brudt"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Afhængigheds Editor"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Opret abonnement"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Skift Array værditype"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Luk"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Opret mappe"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Overgang"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Tilføj Setter Egenskab"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Vælg alle"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Opret abonnement"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Error loading skrifttype."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Opret abonnement"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance indeholder ikke en BakedLight ressource."
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Brugerdefineret node har ingen _get_output_port_unsequenced(idx,wmem), "
+#~ "men unsequenced porte blev angivet."
diff --git a/editor/translations/de.po b/editor/translations/de.po
new file mode 100644
index 0000000000..0545ea2f21
--- /dev/null
+++ b/editor/translations/de.po
@@ -0,0 +1,7036 @@
+# German translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Alexander Mahr <alex.mahr@gmail.com>, 2016.
+# Andreas Esau <andreasesau@gmail.com>, 2016.
+# Andreas Haas <liu.gam3@gmail.com>, 2016.
+# Andreas Hirschauer <andreas@hirschauer-it.de>, 2016.
+# Christian Fisch <christian.fiesel@gmail.com>, 2016.
+# danjo <atze@libra.uberspace.de>, 2016.
+# hyperglow <greensoma@web.de>, 2016.
+# Jan Groß <jan@grossit.de>, 2016.
+# Oliver Ruehl <oliver@ruehldesign.co>, 2016.
+# Paul-Vincent Roll <paviro@me.com>, 2016.
+# Peter Friedland <peter_friedland@gmx.de>, 2016.
+# No need for a name <endoplasmatik@gmx.net>, 2016.
+# So Wieso <sowieso@dukun.de>, 2016.
+# Timo Schwarzer <account@timoschwarzer.com>, 2016.
+# viernullvier <hannes.breul+github@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-12-10 04:27+0000\n"
+"Last-Translator: So Wieso <sowieso@dukun.de>\n"
+"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
+"godot/de/>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"Ungültiger Parametertyp in convert()-Aufruf, TYPE_*-Konstanten benötigt."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Nicht genügend Bytes zum dekodieren des Byte-Strings, oder ungültiges Format."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "Schrittargument ist null!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Skript hat keine Instanz"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Nicht auf einem Skript basierend"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Nicht auf einer Ressourcendatei basierend"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Ungültiges Instanz-Verzeichnisformat (@path fehlt)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Ungültiges Instanz-Verzeichnisformat (Skript in @path kann nicht geladen "
+"werden)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Ungültiges Instanz-Verzeichnisformat (ungültiges Skript in @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Ungültiges Instanz-Verzeichnisformat (ungültige Unterklasse)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Ein Node wurde übergeben ohne nötigen Speicher bereitzustellen, korrektes "
+"Vorgehen wird in der Dokumentation beschrieben (Stichwort ‚yield‘)!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Node wurde übergeben, gab aber keinen Funktionszustand am Anfang des Node-"
+"Speichers zurück."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Zurückgegebener Wert muss dem ersten Element im Node-Speicher zugewiesen "
+"sein! Bitte entsprechendes Node anpassen."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Node gab ungültige Sequenzausgabe zurück: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Sequenzbit gefunden, aber kein entsprechendes Node auf dem Stack, bitte "
+"melden Sie den Bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Stack-Overflow mit Stack-Tiefe: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funktionen:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variablen:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signale:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Name ist kein gültiger Bezeichner:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Name wird schon von anderer Funktion, Variablen oder Signal verwendet:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Funktion umbenennen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Variable umbenennen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Signal umbenennen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Funktion hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Variable hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Signal hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Funktion entfernen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Variable entfernen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "bearbeite Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Signal entfernen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "bearbeite Signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Ausdruck ändern"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Node hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Alt-Taste gedrückt halten, um einen Getter zu setzen. Umschalt-Taste halten, "
+"um eine allgemeine Signatur zu setzen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Strg-Taste halten um einen Getter zu setzen. Umschalt-Taste halten um eine "
+"allgemeine Signatur zu setzen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Alt-Taste halten um einfache Referenz zu Node hinzuzufügen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Strg-Taste halten um einfache Referenz zu Node hinzuzufügen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Alt-Taste halten um einen Variablen-Setter zu setzen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Strg-Taste halten um einen Variablen-Setter zu setzen."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Preload-Node hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Node(s) aus Szenenbaum hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Getter-Eigenschaft hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Setter-Eigenschaft hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Bedingung"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Sequenz"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Schalter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Iterator"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Während"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Rückgabe"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Aufruf"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Abfragen"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Setzen"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Basistyp:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Mitglieder:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Verfügbare Nodes:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+"Zum bearbeiten des Graphen muss eine Funktion ausgewählt oder erstellt weden"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Schließen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Signalparameter bearbeiten:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Variable bearbeiten:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Ändern"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Ausgewähltes löschen"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Haltepunkt umschalten"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Node-Typ finden"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Nodes kopieren"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Nodes trennen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Nodes einfügen"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Eingabetyp nicht wiederholbar: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Iterator wurde ungültig"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Iterator wurde ungültig: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Ungültiger Name der Index-Eigenschaft."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Basis-Objekt ist kein Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Pfad führt nicht zu einem Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Ungültiger Indexeigenschaftsname ‚%s‘ in Node %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Ungültiger Parameter vom Typ: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Ungültige Parameter: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet nicht im Skript gefunden: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet nicht im Skript gefunden: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Eigens erstelltes Node hat keine _step()-Methode, Graph kann nicht "
+"verarbeitet werden."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Ungültiger Rückgabewert von _step(), muss Integer (für Sequenzausgabe) oder "
+"String (für Fehler) sein."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "gerade gedrückt"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "gerade losgelassen"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"Zertifikat-Datei konnte nicht gelesen werden. Sind Pfad und Passwort beide "
+"korrekt?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "Fehler beim erstellen des Signaturobjekts."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Fehler beim erstellen der Paketsignatur."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"Keine Exportvorlagen gefunden.\n"
+"Laden Sie Exportvorlagen ggf. von der offiziellen Webseite herunter und "
+"installieren Sie diese."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Selbst konfiguriertes Debug-Paket nicht gefunden."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Selbst konfiguriertes Release-Paket nicht gefunden."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Ungültiger einzigartiger Name."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "Ungültige Produkt-GUID."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "Ungültige Verleger-GUID."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Ungültige Hintergrundfarbe."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Ungültige Abmessungen des Store-Logos (sollte 50x50 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "Ungültige Abmessungen für 44x44-Quadratlogo (sollte 44x44 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "Ungültige Abmessungen für 71x71-Quadratlogo (sollte 71x71 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "Ungültige Abmessungen für 150x150-Quadratlogo (sollte 150x150 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "Ungültige Abmessungen für 310x310-Quadratlogo (sollte 310x310 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "Ungültige Abmessungen für 310x150-Breitlogo (sollte 310x150 sein)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "Ungültige Abmessungen für Startbildschirm (sollte 620x300 sein)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Eine SpriteFrames-Ressource muss in der ‚Frames‘-Eigenschaft erstellt oder "
+"gesetzt werden, damit AnimatedSprite Einzelbilder darstellen kann."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Nur ein sichtbares CanvasModulate-Node ist pro Szene (oder einem Satz von "
+"instantiierten Szenen) erlaubt. Der zuerst erstellte wird verwendet, der "
+"Rest wird ignoriert."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D liefert nur eine Kollisionsform für ein von "
+"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden um diesen "
+"eine Form zu geben."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Ein leeres CollisionPolygon2D hat keinen Effekt auf Kollisionen."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D liefert nur eine Kollisionsform für ein von "
+"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden um diesen "
+"eine Form zu geben."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Damit CollisionShape2D funktionieren kann, muss eine Form angegeben werden. "
+"Bitte erzeuge eine Shape-Ressource dafür!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Eine Textur mit der Form des Lichtkegels muss in der ‚Texture‘-Eigenschaft "
+"angegeben werden."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Ein Occluder Polygon muss gesetzt oder gezeichnet werden, damit dieser "
+"Occluder funktioniert."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Das Occluder-Polygon für diesen Occluder ist leer. Bitte zeichne ein Polygon!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Eine NavigationPolygon-Ressource muss für dieses Node erstellt oder ihm "
+"zugewiesen. Bitte trage die entsprechende Eigenschaft ein oder zeichne ein "
+"Polygon."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"Eine NavigationPolygon-Instanz muss ein Unterobjekt erster oder zweiter "
+"Ordnung unterhalb eines Navigation2D-Node sein. Sie liefert nur "
+"Navigationsdaten."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Das ParallaxLayer-Node lässt sich nur als Unterobjekt eines "
+"ParallaxBackground-Node verwenden."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "Die Pfad-Eigenschaft muss auf ein gültiges Particles2D-Node verweisen."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D funktioniert nur, wenn es als Unterobjekt eines Path2D-Nodes "
+"gesetzt wird."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Die Pfad-Eigenschaft muss auf ein gültiges Node2D-Node zeigen um zu "
+"funktionieren."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Eine SampleLibrary-Ressource muss unter der Eigenschaft ‚Samples‘ erzeugt "
+"oder ausgewählt werden, damit SamplePlayer Ton abspielen kann."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Die Pfad Eigenschaft muss auf eine gültige Viewport Node verweisen um zu "
+"funktionieren. Dieser Viewport muss in 'render target' Modus gesetzt werden."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Der Viewport, der in der Pfad-Eigenschaft gesetzt wurde, muss als ‚Render "
+"Target‘ definiert sein, damit das Sprite funktioniert."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funktioniert am besten, wenn es ein Unterobjekt erster "
+"Ordnung der bearbeiteten Szene ist."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape liefert nur eine Kollisionsform für ein von CollisionObject "
+"abgeleitetes Node. Es kann nur als Unterobjekt von Area, StaticBody, "
+"RigidBody, KinematicBody usw. eingehängt werden um diesen eine Form zu geben."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Damit CollisionShape funktionieren kann, muss eine Form vorhanden sein. "
+"Bitte erzeuge eine shape Ressource dafür!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon liefert nur eine Kollisionsform für ein von CollisionObject "
+"abgeleitetes Node. Es kann nur als Unterobjekt von Area, StaticBody, "
+"RigidBody, KinematicBody usw. eingehängt werden um diesen eine Form zu geben."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Ein leeres CollisionPolygon hat keinen Effekt auf die Kollision."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Damit dieser Node funktionieren kann, muss eine NavigationMesh Ressource "
+"erzeugt oder gesetzt werden."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"Eine NavigationMesh-Instanz muss ein Unterobjekt erster oder höherer Ordnung "
+"eines Navigation-Nodes sein. Es liefert nur Navigationsdaten."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Die Pfad-Eigenschaft muss auf ein gültiges Spatial-Node verweisen."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Pro Szene (oder einem Satz von instanzierten Szenen) ist nur ein einziges "
+"WorldEnvironment erlaubt."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Eine SampleLibrary-Ressource muss unter der ‚Samples‘-Eigenschaft erzeugt "
+"oder ausgewählt werden, damit SpatialSamplePlayer Ton abspielen kann."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Eine SpriteFrames-Ressource muss in der ‚Frames‘-Eigenschaft erzeugt oder "
+"definiert werden, damit AnimatedSprite3D Einzelbilder anzeigen kann."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Warnung!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Bitte bestätigen..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Datei existiert bereits. Überschreiben?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Alle bekannte Dateitypen"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Alle Dateien (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Datei öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Datei(en) öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Verzeichnis wählen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Datei oder Verzeichnis öffnen"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Speichern"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Datei speichern"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Ordner erstellen"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Pfad:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Verzeichnisse & Dateien:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Datei:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filter:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Name:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Ordner konnte nicht erstellt werden."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Eine gültige Datei-Endung muss verwendet werden."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Umschalt+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Strg+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Gerät"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Schaltfläche"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Linke Taste."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Rechte Taste."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Mittlere Taste."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Mausrad hoch."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Mausrad runter."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Achse"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Ausschneiden"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopieren"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Einfügen"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Alles auswählen"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Löschen"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Rückgängig machen"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popups werden standardmäßig versteckt, es sei denn Sie rufen popup() oder "
+"irgendeine der popup*() Funktionen auf. Sie für die Bearbeitung sichtbar zu "
+"machen ist in Ordnung, aber sie werden zur Laufzeit automatisch wieder "
+"versteckt."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Dieser Viewport ist nicht als Render-Ziel eingestellt. Soll sein Inhalt "
+"direkt auf dem Bildschirm angezeigt werden, muss er als Unterobjekt eines "
+"Controls eingehängt werden um dessen Größe zu erben. Andernfalls sollte die "
+"Eigenschaft ‚Render Target‘ des Viewports aktiviert und seine Textur "
+"irgendeinem Node zum Anzeigen zugewiesen werden."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Fehler beim initialisieren von FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Unbekanntes Schriftformat."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Fehler beim Laden der Schriftart."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Ungültige Schriftgröße."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Deaktiviert"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Alle auswählen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Schlüsselbild bewegen hinzufügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Übergang beim Animationswechsel"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Anim ändere Transformation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Anim Wert ändern"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Animation Änderungsaufruf"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Anim Spur hinzufügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Anim doppelte Schlüsselbilder"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Anim Spur nach oben verschieben"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Anim Spur nach unten verschieben"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Anim Spur entfernen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Setze Übergänge auf:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Anim Spur umbenennen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Anim Spur Interpolation ändern"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Anim Spur ändere Wert Modus"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Node Kurve bearbeiten"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Selektions-Kurve bearbeiten"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim Schlüsselbilder löschen"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Auswahl duplizieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Transponierte duplizieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Auswahl entfernen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Fortlaufend"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Einzeln"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Auslöser"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Anim Schlüsselszene hinzufügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Schlüsselbilder bewegen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Auswahl skalieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Vom Cursor skalieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Gehe zum nächsten Schritt"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Gehe zum vorherigen Schritt"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linear"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Konstante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "Rein"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Raus"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Rein-Raus"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Raus-Rein"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Übergänge"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Animation optimieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Animation aufräumen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Erstelle eine NEUE Spur für %s und füge ein Schlüsselbild hinzu?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Erstelle %d NEUE Spuren und füge Schlüsselbilder hinzu?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Erstellen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Animation Erstellen & Einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Spur & Schlüsselbild einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Schlüsselbild einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Ändere Animationslänge"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Ändere Animationswiederholung"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Animation Erstelle Typed Value Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Skaliere Schlüsselbilder"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Aufruf-Spur zu Animation hinzufügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Animation zoomen."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Länge (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Länge der Animation (in Sekunden)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Schritte (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Cursor Schritt Raster (in Sekunden)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Aktivieren / Deaktivieren der Schleife (Loop)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Neue Spuren hinzufügen."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Aktuelle Spur hochschieben."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Aktuelle Spur runterschieben."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Ausgewählte Spur entfernen."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Spur-Werkzeuge"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Aktiviere individuelle Schlüsselbildbearbeitung durch Anklicken."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Anim. Optimierer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Max. Linearer Fehler:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Max. Winkel Fehler:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Maximal optimierbarer Winkel:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Wähle einen AnimationPlayer aus dem Szenenbaum um Animationen zu bearbeiten."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Schlüsselbild"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Übergang"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Skalierungsverhältnis:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Rufe Funktion auf in welchem Node?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Ungültige Schlüsselbilder entfernen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Ungelöste und leere Spuren entfernen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Alle Animationen aufräumen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Alle Animationen aufräumen (Nicht rückgängig zu machen!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Aufräumen"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Größe des Arrays ändern"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Wertetyp des Arrays ändern"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Array-Wert ändern"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Suche:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Sortiere:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Umkehren"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Alle"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Seite:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Unterstützung.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Offiziell"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Gemeinschaft"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Testphase"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Projektdaten als ZIP-Datei"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Methodenliste für '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Methodenliste:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumente:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Rückgabe:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Gehe zu Zeile"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Zeilennummer:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Keine Übereinstimmungen"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Suchbegriff wurde %d mal ersetzt."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Ersetzen"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Alles ersetzen"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Groß-/Kleinschreibung berücksichtigen"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Ganze Wörter"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Nur Auswahl"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Suche"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Finde"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Nächste"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Suchbegriff wurde %d mal ersetzt."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Nicht gefunden!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Ersetzen durch"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Fallunterscheidung"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Rückwärts"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Aufforderung beim Ersetzen"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Überspringen"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Vergrößern"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Verkleinern"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Vergrößerung zurücksetzen"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Zeile:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Spalte:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Methode in Ziel-Node muss angegeben werden!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"Zielmethode nicht gefunden! Bitte gültige Methode angeben oder Skript an "
+"Zielnode anhängen."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Verbinde mit Node:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Entfernen"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Zusätzlichen Aufrufparameter hinzufügen:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "zusätzliche Aufrufparameter:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Pfad zu Node:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Funktion erstellen"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Verzögert"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Einmalig"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Verbinden"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Verbinde '%s' zu '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Verbinde Signal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Erstelle Subscription"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Verbinde.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Trennen"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Signale"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Neu erstellen"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoriten:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Kürzlich:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Treffer:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Suche Ersatz für:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Abhängigkeiten Für:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Szene '%s' wird momentan bearbeitet.\n"
+"Änderungen werden nicht vorgenommen, bis neu geladen wird."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Ressource '%s' wird momentan benutzt.\n"
+"Änderungen werden erst dann aktiv, nachdem neu geladen wurde."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Ressource"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Pfad"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Abhängigkeiten:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Defekte reparieren"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Abhängigkeiteneditor"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Ersatz-Ressource suchen:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Besitzer von:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Die zu entfernenden Dateien werden von anderen Ressourcen gebraucht damit "
+"sie richtig funktionieren können.\n"
+"Trotzdem entfernen? (Nicht Wiederherstellbar)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Lösche ausgewählte Dateien aus dem Projekt? (nicht umkehrbar)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Ladefehler:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Szene konnte aufgrund fehlender Abhängigkeiten nicht geladen werden:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Trotzdem öffnen"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Welche Aktion soll ausgeführt werden?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Abhängigkeiten reparieren"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Fehler beim laden!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Entferne %d Datei(en) dauerhaft? (Nicht Wiederherstellbar)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Besitzt"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Ressource ohne direkte Zugehörigkeit:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Ressourcenauflistung verwaister Dateien"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Ausgewählte Dateien löschen?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Löschen"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Ungültiger Name."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Gültige Zeichen:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Ungültiger Name. Darf nicht mit existierenden Klassennamen der Engine "
+"übereinstimmen."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Ungültiger Name. Darf nicht mit existierenden eingebauten Typnamen "
+"übereinstimmen."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Ungültiger Name. Darf nicht mit Namen existierender globaler Konstanten "
+"übereinstimmen."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Ungültiger Pfad."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Datei existiert nicht."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Nicht im Ressourcen-Pfad."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Autoload hinzufügen"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload '%s' existiert bereits!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Autoload umbenennen"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Autoload-Globals umschalten"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Autoload verschieben"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Autoload entfernen"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Aktivieren"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Autoloads neu anordnen"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Node-Name:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Name"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Liste:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Aktualisiere Szene"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Speichere lokale Änderungen.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Aktualisiere Szene..."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Wähle ein Verzeichnis"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Wählen"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Zurück"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Vor"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Hoch"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Versteckte Dateien ein- und ausblenden"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Favoriten ein- und ausblenden"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Modus umschalten"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Zu Pfad springen"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Favorit nach oben schieben"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Favorit nach unten schieben"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Vorschau:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Lese Quellen"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Hilfe durchsuchen"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Klassenliste:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Klassen suchen"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Klasse:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Erbt:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Geerbt von:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Kurze Beschreibung:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Öffentliche Methoden:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "GUI-Theme-Elemente:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Konstanten:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Kurze Beschreibung:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Methoden Beschreibung:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Suchtext"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Hinzugefügt:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Entfernt:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Fehler beim speichern des Atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Atlas Untertextur konnte nicht gespeichert werden:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Speichere Datei:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Packe"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportiere für %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Bereite vor..."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Ausgabe:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Importiere erneut"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importiere:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Node aus Szene"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Fehler beim speichern der Ressource!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Speichere Ressource als.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Verstehe..."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Datei kann nicht zum schreiben geöffnet werden:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Angefordertes Dateiformat unbekannt:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Fehler beim speichern."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Speichere Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analysiere"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Erzeuge Miniaturansicht"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Szene konnte nicht gespeichert werden. Wahrscheinlich werden Abhängigkeiten "
+"(Instanzen) nicht erfüllt."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Laden der Ressource gescheitert."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "MeshLibrary konnte nicht zum vereinen geladen werden!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Fehler beim speichern der MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "TileSet konnte nicht zum vereinen geladen werden!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Fehler beim speichern des TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Exportvorlagen-ZIP-Datei konnte nicht geöffnet werden."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Lade Exportvorlagen"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Fehler beim speichern des Layouts!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Standard-Editorlayout überschrieben."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Layout Name nicht gefunden!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Layout wurde auf die Standardeinstellungen zurückgesetzt."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Parameter kopieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Parameter einfügen"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Ressource einfügen"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Ressource kopieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Einbetten"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Unter-Ressource Einzigartig Machen"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "In Hilfe öffnen"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Es ist keine zu startende Szene definiert."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Es ist keine Hauptszene definiert worden.\n"
+"Wähle eine in den Projekteinstellungen unter der Kategorie „Anwendung“."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Die ausgewählte Szene ‚%s‘ existiert nicht.\n"
+"Wähle eine gültige Szene in den Projekteinstellungen unter der Kategorie "
+"„Anwendung“."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Die ausgewählte Szene ‚%s‘ ist keine gültige Datei für eine Szene.\n"
+"Wähle eine gültige Szene in den Projekteinstellungen unter der Kategorie "
+"„Anwendung“."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"Die aktuelle Szene wurde noch nicht gespeichert, bitte speichere sie vor dem "
+"Starten."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Unterprozess konnte nicht gestartet werden!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Szene öffnen"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Basisszene öffnen"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Schnell Szenen öffnen.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Schnell Skripte öffnen.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Ja"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Szene schließen? (Nicht gespeicherte Änderungen gehen verloren)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Szene speichern als.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Diese Szene wurde nie gespeichert. Speichern vorm Starten?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Bitte speichere die Szene zuerst."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Speichere übersetzbare Zeichenketten"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "MeshLibrary exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Tileset exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Verlassen"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Editor verlassen?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Die aktuelle Szene ist nicht gespeichert. Trotzdem öffnen?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+"Szene kann nicht neu geladen werden, wenn sie vorher nicht gespeichert wurde."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Zurücksetzen"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+"Diese Aktion kann nicht rückgängig gemacht werden. Trotzdem zurücksetzen?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Schnell Szene starten.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Projektverwaltung öffnen?\n"
+"(Nicht gespeicherte Änderungen gehen verloren)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Wähle eine Hauptszene"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Ähm"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Fehler beim Laden der Szene. Sie muss innerhalb des Projektpfads liegen. Zum "
+"Beheben kann ‚Import→Szene‘ verwendet werden um sie zu öffnen. Danach sollte "
+"die Szene innerhalb des Projektpfades gespeichert werden."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Fehler beim laden der Szene."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Szene '%s' hat defekte Abhängigkeiten:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Layout speichern"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Layout löschen"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Standard"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Szenentab wechseln"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d weitere Datei(en)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d weitere Datei(en) oder Ordner"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Gehe zu vorher geöffneter Szene."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Nächster Tab"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Vorheriger Tab"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operationen mit Szenen Dateien."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Neue Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Neue gererbte Szene.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Szene öffnen.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Szene speichern"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Alle Szenen speichern"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Szene schließen"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Schließen und zur letzten Szene wechseln"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Zuletzt benutzte Szenen"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Schnell Dateien filtern.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Umwandeln zu.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Übersetzbare Textbausteine.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Wiederherstellen"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Skript ausführen"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Projekteinstellungen"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Szene zurücksetzen"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Verlasse zur Projektverwaltung"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Ablenkungsfreier Modus"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importiere Medieninhalte ins Projekt."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Import"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Werkzeuge"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exportiere das Projekt für viele Plattformen."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Projekt abspielen."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Abspielen"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Szene pausieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Szene pausieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Szene stoppen."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Stop"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Spiele die bearbeitete Szene."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Szene starten"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Spiele angepasste Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Spiele angepasste Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Fehlerbehebungsoptionen"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Mit Fern-Fehlerbehebung starten"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Beim Exportieren oder Starten wird das Programm versuchen, sich mit der IP-"
+"Adresse dieses Computers zu verbinden, um Fehler beheben zu können."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Kleine Programmdatei über ein Netzwerkdateisystem"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Wenn diese Option aktiviert ist, wird das Exportieren bzw. Starten nur eine "
+"kleine Programmdatei erzeugen.\n"
+"Die Projektdaten werden vom Editor über das Netzwerk bereitgestellt.\n"
+"Bei Android wird hierbei das USB Kabel wegen der schnelleren "
+"Übertragungsgeschwindigkeit benutzt. Diese Option beschleunigt das Testen "
+"von Spielen mit großen Projektdaten."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Collision Shapes sichtbar"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Collision-Formen und Raycast Nodes (für 2D und 3D) werden im laufenden Spiel "
+"angezeigt, falls diese Option aktiviert ist."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navigation sichtbar"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Navigations- Meshes und Polygone werden im laufenden Spiel sichtbar sein "
+"wenn diese Option gewählt ist."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Szenenänderungen synchronisieren"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Wenn diese Option gewählt ist, werden jegliche Änderungen der Szene im "
+"Editor im laufenden Spiel dargestellt.\n"
+"Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am "
+"effizientesten das Netzwerk-Dateisystem zu nutzen."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Skriptänderungen synchronisieren"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Wenn diese Option gewählt ist, werden erneut gespeicherte Skripte während "
+"des laufenden Spiels neu geladen.\n"
+"Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am "
+"effizientesten das Netzwerk-Dateisystem zu nutzen."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Editoreinstellungen"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Editorlayout"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Vollbildmodus umschalten"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Exportvorlagen installieren"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Über"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Signalisiert, wenn sich eine externe Ressource verändert hat."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Dreht sich, wenn das Editorfenster neu gezeichnet wird!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Immer aktualisieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Änderungen aktualisieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "Update-Anzeigerad deaktivieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspektor"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Erstelle eine neue Ressource im Speicher und bearbeite sie."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Lade eine bestehende Ressource von der Festplatte und bearbeite sie."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Speichere die so eben bearbeitete Ressource."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Speichern als.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Gehe zum vorherigen bearbeiteten Objekt im Verlauf."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Gehe zum nächsten bearbeiteten Objekt im Verlauf."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Verlauf der zuletzt bearbeiteten Objekte."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Objekteigenschaften."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "Dateisystem"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Node"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Ausgabe"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Neuimport"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Update"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Danke von der Godot-Gemeinschaft!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Danke!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Vorlagen aus ZIP-Datei importieren"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Projekt exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Bibliothek exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Mit existierendem vereinen"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Passwort:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Skript öffnen und ausführen"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Ladefehler"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Installierte Erweiterungen:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Version:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Status:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Laufzeitanalyse beenden"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Laufzeitanalyse starten"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Messung:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Bild Zeit (Sek)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Durchschnittszeit (Sek)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Bild %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "Fixiertes Bild %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Zeit:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inklusive"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Selbst"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Bild #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Bitte warten bis Operation abgeschlossen ist."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "Aktuelle Szene muss gespeichert sein um sie erneut zu importieren."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Speichern & neu importieren"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Veränderte Ressourcen neu importieren"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Spiellogik sollte mit der _run()-Methode beginnen."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Es besteht bereits eine bearbeitete Szene."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Skript konnte nicht instanziert werden:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Hast du das 'tool' Schlüsselwort vergessen?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Skript konnte nicht ausgeführt werden:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Hast du die '_run' Methode vergessen?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Standard (wie Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selektiere Node(s) für den Import"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Szenenpfad:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Aus Node importieren:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Die Datei 'file_type_cache.cch' konnte nicht zum schreiben geöffnet werden. "
+"Der Dateityp-Cache wird nicht gespeichert!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Quell- und Zieldatei sind gleich, ignoriere Anweisung."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Quell- und Zielpfad sind gleich, ignoriere Anweisung."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Verzeichnisse lassen sich nicht in sich selbst verschieben."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "Kann mit ‚..‘ nicht arbeiten"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Wähle neuen Namen und Ort für:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Keine Dateien ausgewählt!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instanz"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Abhängigkeiten bearbeiten.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Zeige Besitzer.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Pfad kopieren"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Umbenennen oder Verschieben.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Verschiebe zu.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Info"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Zeige im Dateimanager"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Neuimport.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Vorheriges Verzeichnis"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Nächstes Verzeichnis"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Dateisystem erneut einlesen"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Favoriten-Verzeichnisstatus umschalten"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Instantiiere gewählte Szene(n) als Unterobjekt des ausgewählten Nodes."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Verschieben"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Zu Gruppe hinzufügen"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Aus Gruppe entfernen"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Keine Bitmasken zu importieren!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Zielpfad ist leer."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "Zielpfad muss ein kompletter Ressourcenpfad sein."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Zielpfad muss existieren."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Speicherpfad ist leer!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "BitMasks importieren"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Quelltextur(en):"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Zielpfad:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Akzeptieren"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Bitmaske"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Keine Quellschriftart-Datei gefunden!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Keine Zielschriftart-Ressource!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Ungültige Dateiendung.\n"
+"Nutze .fnt als Dateiendung."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Quellschriftart kann nicht geladen/verarbeitet werden."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Schriftart konnte nicht gespeichert werden."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Quellschriftart:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Quellschriftgröße:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Ziel-Ressource:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Test:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Optionen:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Schriftart importieren"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Diese Datei ist bereits eine Godot Schriftart. Bitte stattdessen eine Datei "
+"im BMFont-Format angeben."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Öffnen der BMFont-Datei fehlgeschlagen."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Eigene Schriftart-Quelle ist ungültig."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Schriftart"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Keine Meshes zu importieren!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Einzelnes Mesh importieren"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Quell Mesh(es):"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Oberfläche %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Keine Samples zu importieren!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Audio-Samples importieren"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Quell Sample(s):"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Audio-Sample"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Neuer Clip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Animationseinstellungen"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Flags"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "FPS fixieren:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optimierung"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Obere lineare Fehlergrenze"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Obere Winkelfehlergrenze"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Maximaler Winkel"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Ausschnitte"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Start"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Ende"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Wiederholung"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filter"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Quellpfad ist leer."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Post-Import Skript konnte nicht geladen werden."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Ungültiges / Fehlerhaftes Skript für Post-Import."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Fehler beim importieren der Szene."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "3D-Szene importieren"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Quellszene:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Dieselbe wie die Zielszene"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Geteilt"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Ziel-Texturenordner:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Post-Process Skript:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Angepasster Stamm-Node Typ:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "Name des Root-Node:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Die folgenden Dateien fehlen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Trotzdem importieren"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importieren & Öffnen"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"Bearbeitete Szene wurde nicht gespeichert, trotzdem importierte Szene öffnen?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Szene importieren"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Szene wird importiert.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Angepasstes Skript wird ausgeführt.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Post-Import Skript konnte nicht geladen werden:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Ungültiges oder fehlerhaftes Skript für Post-Import (siehe Konsole):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Fehler beim ausführen des Post-Import Skripts:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Bild importieren:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Datei kann nicht in sich selbst importiert werden:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Pfad konnte nicht gefunden werden: %s (bereits lokal)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Speichere.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "3D-Szenenanimation"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Unkomprimiert"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Verlustfrei komprimieren (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Verlustbehaftet komprimieren (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Komprimieren (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Texturformat"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Texturkompressionsqualität (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Textureinstellungen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Bitte gib einige Dateien an!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Es wird zumindest eine Datei für den Atlas benötigt."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Fehler beim importieren:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Es ist nur eine Datei für eine große Textur erforderlich."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Maximale Texturgröße:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Texturen für Atlas (2D) importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Zellgröße:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Große Textur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Große Texturen (2D) importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Quelltextur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Basis-Atlastextur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Quelltextur(en)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Texturen für 2D importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Texturen für 3D importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Texturen importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D-Textur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3D-Textur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Atlastextur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"MERKE: Das importieren von 2D Texturen ist nicht zwingend notwendig. Kopiere "
+"einfach png/jpg Dateien in das Projekt."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Leere Bereiche beschneiden."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Textur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Große Textur importieren"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Quellbild laden"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Teile"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Füge Ein"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Speichere"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Große Textur konnte nicht gespeichert werden:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Erstelle Atlas für:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Lade Bild:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Bild konnte nicht geladen werden:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Bilder werden konvertiert"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Bilder werden beschnitten"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Blitting Bilder"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Atlas-Bild konnte nicht gespeichert werden:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Konvertierte Textur konnte nicht gespeichert werden:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Fehlerhafte Quelle!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Fehlerhafte Übersetzungsquelle!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Reihe"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Sprache"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Keine Elemente zu importieren!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Kein Zielpfad!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Übersetzungen importieren"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Konnte nicht importiert werden!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Übersetzung importieren"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "Quell-CSV:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Erste Zeile ignorieren"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Komprimieren"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Zu Projekt hinzufügen (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Sprachen importieren:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Übersetzung"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "MultiNode setzen"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Gruppen"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Wähle ein Node um Signale und Gruppen zu bearbeiten."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Automatisches Abspielen umschalten"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Neuer Animationsname:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Neue Animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Animationsname ändern:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Animation entfernen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "FEHLER: ungültiger Animationsname!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "FEHLER: Animationsname existiert bereits!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Animation umbenennen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Animation hinzufügen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Überblende nächste Bearbeitung"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Überblendungszeit ändern"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Animation laden"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Animation duplizieren"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "Fehler: Keine Animation zum kopieren!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "FEHLER: Keine Animations-Ressource im Zwischenspeicher!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Eingefügte Animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Animation einfügen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "FEHLER: Keine Animation zum bearbeiten!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Spiele ausgewählte Animation rückwärts vom Ende. (Umschalt+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Stoppe Animations-Wiedergabe. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Spiele ausgewählte Animation vom Start. (Umschalt+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Ausgewählte Animation von aktueller Position aus abspielen. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Position der Animation (in Sekunden)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Animationsablauf für dieses Node global skalieren."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Neue Animation im Player erstellen."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Animation von der Festplatte laden."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Eine Animation von der Festplatte laden."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Aktuelle Animation speichern"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Speichern als"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Liste der Animationen im Player anzeigen."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Beim Laden automatisch abspielen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Ziel-Übergangszeiten bearbeiten"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Animationswerkzeuge"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Animation kopieren"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Neue Animation erstellen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Animationsname:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Fehler!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Übergangszeiten:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Nächste (Automatische Warteschlange):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Übergangszeiten kreuzender Animationen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animation"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Neuer Name:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Skalierung:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Einblenden (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Ausblenden (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Blenden"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mischen"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Automatisch neu starten:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Neu starten (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Zufällig neu starten (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Start!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Menge:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blende:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Blende 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Blende 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Überblendungszeit (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Laufend:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Eingang hinzufügen"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Lösche Auto-Fortschritt"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Setze Auto-Fortschritt"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Eingang löschen"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Umbenennen"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Animationsbaum ist gültig."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Animationsbaum ist ungültig."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Animations-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Einfach-Aufruf-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Misch-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Blende2-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Blende3-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Blende4-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Zeitskalier-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Zeitsuch-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Übergangs-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Animationen importieren.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Nodefilter bearbeiten"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filter.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Analysiere %d Dreiecke:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Dreieck #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Light-Baker einrichten:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Analysiere Geometrie"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Fixiere Lampen"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Erstelle BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "erstelle Licht-Octree"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Erstelle Octree-Textur"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "übertrage zu Lightmaps:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Zuweisen von Textur #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Baking von Dreieck #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Nachbearbeiten von Textur #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Backen!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Lightmap-Octree-Backing-Prozess zurücksetzen (neu starten)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Vorschau"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Einrasten konfigurieren"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Gitterversatz:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Gitterabstand:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Rotationsversatz:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Rotationsabstand:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Mittelpunkt bewegen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Aktion verschieben"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "IK-Kette bearbeiten"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "CanvasItem bearbeiten"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Ankerpunkte ändern"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Vergrößerung (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Pose einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Auswahlmodus"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Ziehen = Rotieren"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Ziehen = Verschieben"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"‚V‘ drücken um Angelpunkt auf Mausposition zu setzen, ‚Umschalt+V‘ drücken "
+"um das Objekt ohne seinen Angelpunkt zu verschieben."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+Rechtsklick: Listenauswahl nach Tiefe"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Bewegungsmodus"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Rotationsmodus"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Zeige eine Liste aller Objekte, die sich an der angeklickten Position "
+"befinden\n"
+"(equivalent zu Alt+RMT im Auswahlmodus)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Klicken um Angelpunkt des Objekts zu ändern."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Schwenkmodus"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+"Das ausgewählte Objekt an seiner Position sperren (kann nicht bewegt werden)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Das ausgewählte Objekt entsperren (kann bewegt werden)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Verhindert das Auswählen von Unterobjekten dieses Nodes."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Macht Unterobjekte dieses Objekts wieder auswählbar."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Einrasten aktivieren"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Raster anzeigen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Rotationsraster benutzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Relatives Einrasten benutzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Einrasten konfigurieren.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Pixelraster benutzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Auf übergeordnetes Node ausdehnen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Skelett.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Knochen erstellen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Knochen entfernen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Knochen anzeigen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "IK-Kette erzeugen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "IK-Kette zurücksetzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Ansicht"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Vergrößerung zurücksetzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Vergrößerung setzen.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Auswahl zentrieren"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Auswahl einrahmen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Anker"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Schlüsselbilder einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Schlüsselbild einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Schlüsselbild einfügen (in existierende Spuren)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Pose kopieren"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Pose zurücksetzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Einen Wert setzen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Einrasten (Pixel):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "%s hinzufügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "%s hinzufügen…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Erzeuge Node"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Fehler beim Instanziieren von %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "Verstehe"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Kein Node unter dem Unterobjekt instantiiert werden könnte vorhanden."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Diese Aktion benötigt ein einzelnes ausgewähltes Node."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "Standardtyp ändern"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Ziehen + Umschalt: Node in gleicher Hierarchie einfügen\n"
+"Ziehen + Alt: Nodetyp ändern"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Polygon erstellen"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Polygon bearbeiten"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Polygon bearbeiten (Punkt entfernen)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Polygon von Grund auf neu erstellen."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Polygon3D erstellen"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Wähle Griff"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Farbverlaufspunkt hinzufügen/entfernen"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Farbverlauf anpassen"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Erzeuge MeshLibrary"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Vorschau.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Element %d entfernen?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Element hinzufügen"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Ausgewähltes Element entfernen"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Aus Szene importieren"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Aus Szene aktualisieren"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Element %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Elemente"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Auflistungseditor"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Occluder-Polygon erzeugen"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Bestehendes Polygon bearbeiten:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "LMT: Punkt verschieben."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Strg+LMT: Segment aufteilen."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "RMT: Punkt entfernen."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Mesh ist leer!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Statischen Trimesh-Körper erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Statischen Konvex-Körper erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Das geht nicht an der Wurzel der Szene!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Trimesh-Form erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Konvexe Form erstellen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Navigations-Mesh erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "Mesh-Instanz fehlt ein Mesh!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "Mesh hat keine Oberfläche von der Umrisse erzeugt werden könnten!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Konnte keinen Umriss erzeugen!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Umriss erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Statischen Trimesh-Körper erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Statischen Konvex-Körper erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Trimesh Kollisionselement erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Konvexes Kollisionselement erzeugen"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Umriss-Mesh erzeugen.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Erzeuge Umriss-Mesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Umrissgröße:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"Keine Mesh-Quelle angegeben (und kein MultiMesh-Eintrag im Node gesetzt)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "Keine Mesh-Quelle angegeben (und MultiMesh enthält kein Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Mesh-Quelle ist ungültig (ungültiger Pfad)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Mesh-Quelle ist ungültig (keine Mesh-Instanz)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Mesh-Quelle ist ungültig (enthält keine Mesh-Ressource)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Keine Quelle für Oberfläche angegeben."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Oberflächen-Quelle ist ungültig (ungültiger Pfad)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Quelle für Oberfläche ist ungültig (keine Geometrie)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "Quelle für Oberfläche ist ungültig (keine Faces)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Elternelement hat keine soliden Faces zu besetzen."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Bereich konnte nicht abgebildet werden."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Quell-Mesh auswählen:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Ziel-Oberfläche auswählen:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Oberfläche füllen"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "MultiMesh füllen"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Ziel-Oberfläche:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Quell-Mesh:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "X-Achse"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Y-Achse"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Z-Achse"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Aufwärts-Achse des Meshs:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Zufällige Rotation:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Zufälliges Kippen:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Zufällige Skalieren:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Füllen"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Erzeuge Navigationspolygon"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Polygon und Punkt entfernen"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Fehler beim Laden des Bilds:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Keine Pixel mit einer Transzparenz > 128 im Bild.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Emissionsmaske setzen"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Emissionsmaske leeren"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Emissionsmaske laden"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Anzahl generierter Punkte:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "Knoten enthält keine Geometrie."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Knoten enthält keine Geometrie (Flächen)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Flächen enthalten keinen Bereich!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Keine Flächen!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Erzeuge AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Erzeuge Emittent aus Mesh"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Erzeuge Emittent aus Node"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Leere Emittent"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Erzeuge Emittent"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Emissionsorte:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Emissionsfüllung:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Oberfläche"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volumen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Punkt von Kurve entfernen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Punkt zu Kurve hinzufügen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Punkt auf Kurve verschieben"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Eingangsgriff auf Kurve verschieben"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Ausgangsgriff auf Kurve verschieben"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Punkte auswählen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Ziehen: Kontrollpunkte auswählen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Klicken: Punkt hinzufügen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Rechtsklick: Punkt löschen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Kontrollpunkte auswählen (Shift+Ziehen)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Punkt hinzufügen (in leerem Raum)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Segment aufteilen (in Kurve)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Punk löschen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Kurve schließen"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Kurvenpunkt #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Position des Kurvenpunkts setzen"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Position der Eingangskurve setzen"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Position der Ausgangskurve setzen"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Pfad aufteilen"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Pfadpunkt entfernen"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Erzeuge UV-Map"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformiere UV-Map"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Polygon2D-UV-Editor"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Punkt verschieben"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Strg: Rotieren"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Alle verschieben"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Strg: Skalieren"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Polygon verschieben"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Polygon rotieren"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Polygon skalieren"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polygon→UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV→Polygon"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Leere UV-Map"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Einrasten"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Einrasten aktivieren"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Raster"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "FEHLER: Ressource konnte nicht geladen werden!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Ressource hinzufügen"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Ressource umbenennen"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Ressource löschen"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Zwischenablage für Ressourcen ist leer!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Ressource laden"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "BBCode parsen"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Länge:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Audiodatei(en) öffnen"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "Fehler: Konnte Audio nicht laden!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Sample hinzufügen"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Sample umbenennen"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Sample löschen"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 Bit"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bit"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Stereo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Format"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Tonhöhe"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Fehler beim Speichern des Motivs"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Fehler beim Speichern"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Fehler beim importieren des Motivs"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Fehler beim Importieren"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Motiv importieren"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Motiv speichern als.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Nächstes Skript"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Vorheriges Skript"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Datei"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Neu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Alle speichern"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Zaghaftes Skript-Neuladen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Zurück im Verlauf"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Vorwärts im Verlauf"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Motiv neu laden"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Motiv speichern"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Motiv speichern als"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Dokumentation schließen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Alle schließen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Finde.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Finde Nächstes"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Debuggen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Überspringen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Hineinspringen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Unterbrechung"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Fortfahren"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Debugger offen halten"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Fenster"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "nach links"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "nach rechts"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Anleitungen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Öffnet https://godotengine.org im Abschnitt ‚Tutorials‘."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Klassen"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Durchsuche die Klassenhierarchie."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Durchsuche die Referenzdokumentation."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Springe zum zuvor bearbeiteten Dokument."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Springe zum nächsten bearbeiteten Dokument."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Erstelle Skript"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Die folgenden Dateien wurden im Dateisystem verändert.\n"
+"Wie soll weiter vorgegangen werden?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Neu laden"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Erneut speichern"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Debugger"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Eingebettete Skripte können nur bearbeitet werden wenn die entsprechende "
+"Szene geladen ist"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Farbe auswählen"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Schiebe hoch"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Schiebe herunter"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Nach links einrücken"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Nach rechts einrücken"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Kommentar umschalten"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Klone herunter"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Symbol vervollständigen"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "kürze Leerraum am Zeilenende"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Automatische Einrückung"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Lösche alle Haltepunkte"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Springe zum nächsten Haltepunkt"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Springe zum vorigen Haltepunkt"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Finde Vorheriges"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Ersetzen.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Springe zu Funktion.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Springe zu Zeile.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Kontexthilfe"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Ändere skalare Konstante"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Ändere Vektorkonstante"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Ändere RGB-Konstante"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Ändere skalaren Operator"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Ändere Vektoroperator"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Ändere Vektor-Skalar-Operator"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Ändere RGB-Operator"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "schalte exklusive Rotation um"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Ändere skalare Funktion"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Ändere Vektorfunktion"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Ändere Skalar-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Ändere Vektor-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Ändere RGB-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Ändere Standardwert"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Ändere XForm-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Ändere Textur-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Ändere Cubemap-Uniform"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Ändere Kommentar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Hinzufügen/Entfernen zum Farbgradienten"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Hinzfügen/Entfernen zum Curve-Map"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Verändere Curve-Map"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Ändere Eingabename"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Verbinde Graph-Nodes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Trenne Graph-Nodes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Entferne Shader-Graph-Node"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Verschiebe Shader-Graph-Node"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Dupliziere Graph-Node(s)"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Entferne Shade-Graph-Node(s)"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Fehler: Zyklische Verbindung"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Fehler: Fehlende Eingangsverbindung"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Shader-Graph-Node hinzufügen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Orthogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspektive"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transformation abgebrochen."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "X-Achsen-Transformation."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Y-Achsen-Transformation."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Z-Achsen-Transformation."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Zeige Flächentransformation."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Skaliere auf %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Rotiere %s Grad."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Sicht von unten."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Unten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Sicht von oben."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Oben"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Sicht von hinten."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Hinten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Sicht von Vorne."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Vorne"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Sicht von links."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Links"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Sicht von Rechts."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Rechts"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Schlüsselbildeinfügen ist deaktiviert (kein Schlüsselbild eingefügt)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Animationsschlüsselbild eingefügt."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Auf Sicht ausrichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Umgebung"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Audiosenke"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Transformationsdialog"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Keine Szene für Instanz ausgewählt!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Instanz am Mauszeiger"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Konnte Szene nicht instantiieren!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Bewegungsmodus (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Rotationsmodus (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Skalierungsmodus (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Sicht von unten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Sicht von oben"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Sicht von hinten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Sicht von Vorne"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Sicht von links"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Sicht von rechts"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Wechsle zwischen perspektivischer und orthogonaler Sicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Animations-Schlüsselbild einfügen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Auf Ursprung zentrieren"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Auswahl fokussieren"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Auswahl auf Ansicht ausrichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Lokale Koordinaten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Transformationsdialog.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Nutze Standardlicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Nutze Standard-sRGB"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "Eine Ansicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "Zwei Ansichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "Zwei Ansichten (alternativ)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "Drei Ansichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "Drei Ansichten (alternativ)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "Vier Ansichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Normale Ansicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Wireframe-Ansicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Overdraw-Ansicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Shadeless-Ansicht"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Zeige Ursprung"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Zeige Gitter"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Einrasteinstellungen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Einrasten verschieben:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Einrasten rotieren (Grad):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Einrasten skalieren (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Einstellungen für Ansichten"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Standardlichtnormale:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Umgebungslichtfarbe:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "Perspektivisches FOV (Grad):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z-Anzeige nah:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z-Anzeige fern:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Transformationsänderung"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Translation:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Rotation (Grad):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Skalierung (Verhältnis):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Typ der Transformation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Vorher"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Nachher"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "Fehler: Konnte Frame-Ressource nicht laden!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Frame hinzufügen"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Zwischenablage der Ressourcen ist leer oder enthält keine Textur!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Frame einfügen"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Empty einfügen"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Bearbeite Animationsschleife"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Ändere FPS-Wert der Animation"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(leer)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animationen"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Geschwindigkeit (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Animationsframes"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Empty einfügen (davor)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Empty einfügen (danach)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Hoch"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Herunter"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox-Vorschau:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Einrastmodus:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Nichts>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Pixel-Einrasten"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Gitter-Einrasten"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Autoschnitt"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Versatz:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Schritt:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Trennung:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Texturbereich"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Texturbegrenzungseditor"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Kann Motiv nicht speichern in Datei:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Alle Elemente hinzufügen"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Alle hinzufügen"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Entferne Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Motiv"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Füge Klassen-Element hinzu"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Entferne Klassen-Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Leeres Template erstellen"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Leeres Editor-Template erstellen"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "Kontrollkasten Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "Kontrollkasten Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Überprüfe Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Überprüftes Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Enthält"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Viele"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Optionen"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Enthalten,Viele,Einige,Optionen!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Tab 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Tab 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Tab 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Typ:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Datentyp:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Symbol"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Stil"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Farbe"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Zeichne TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplizieren"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Lösche TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Lösche Auswahl"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Finde Kachel"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transponieren"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "X-Koordinaten spiegeln"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Y-Koordinaten spiegeln"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Eimer"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Wähle Kachel"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Auswählen"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Drehe auf 0 Grad"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Drehe auf 90 Grad"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Drehe auf 180 Grad"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Drehe auf 270 Grad"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Konnte Kachel nicht finden:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Elementname oder ID:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Von Szene erstellen?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Aus Szene vereinen?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Von Szene erstellen"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Aus Szene vereinen"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Fehler"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Skriptoptionen bearbeiten"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Bitte außerhalb des Projektordners exportieren!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Fehler beim Exportieren des Projekts!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Fehler beim Schreiben des Projekt-PCK!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Kein Exporter für Plattform ‚%s‘ verfügbar."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Erstelle neue Ressource"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Gültiger Name"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Übergang"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Status:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Passwort:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Gültige Zeichen:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Neuer Name:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Einbeziehen"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Ändere Bildergruppe"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Gruppenname muss vorhanden sein!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Ungültiges Zeichen in Gruppenname!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Gruppenname existiert bereits!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Füge Bildergruppe hinzu"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Lösche Bildergruppe"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Atlas-Vorschau"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Projektexporteinstellungen"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Ziel"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Export zu Plattform"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Ressourcen"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Exportiere ausgewählte Ressourcen (inklusive Abhängigkeiten)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Exportiere alle Ressourcen des Projekts."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exportiere alle Dateien im Projektverzeichnis."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Export-Modus:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Zu exportierende Ressourcen:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Aktion"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filter um Nicht-Ressourcendateien zu exportieren (durch Kommata getrennt, z."
+"B.: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filter um vom Export auszuschließen (durch Kommata getrennt, z.B.: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Konvertiere Textszenen in Binärformat beim Exportieren."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Bilder"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Original behalten"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Komprimiere für Festplattenspeicher (verlustbehaftet, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Komprimiere für Arbeitsspeicher (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Konvertiere Bilder (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+"Qualitätseinstellungen für Kompression (verlustbehaftet, auf Festplatte):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Alle Bilder verkleinern:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Komprimierungsformate:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Bildergruppen"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Gruppen:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Komprimiere für Festplatte"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Komprimiere für Arbeitsspeicher"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Kompressionsmodus:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Verlustbehaftete Qualität:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Verkleinern nach:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Zeige Atlas-Vorschau"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Bildfilter:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Bilder:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Nichts auswählen"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Gruppe"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Samples"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Audio-Umwandlungs-Modus: (.wav-Dateien):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Behalten"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Komprimieren (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Grenze der Abtastrate (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Zuschneiden"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Auslaufende Stille:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Skript"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Skript-Exportmodus:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Text"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Kompiliert"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Verschlüsselt (Schlüssel unten angeben)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Skript-Schlüssel (256 Bit hexadezimal):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exportiere PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exportiere Projekt-PCK"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Exportieren.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Projekt exportieren"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Exportvorlage:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Ungültiger Projektpfad, der Pfad muss existieren!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Ungültiger Projektpfad, godot.cfg darf nicht existieren."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Ungültiger Projektpfad, godot.cfg muss existieren."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Importiertes Projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Ungültiger Projektpfad (etwas geändert?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Konnte godot.cfg in Projektpfad nicht erzeugen."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Die folgenden Dateien ließen sich nicht aus dem Paket extrahieren:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Paket erfolgreich installiert!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Existierendes Projekt importieren"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Projektpfad (muss existieren):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Projektname:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Erstelle neues Projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Projektpfad:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Installiere Projekt:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Installieren"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Durchstöbern"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Neues Spiel"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "Aber klar :-) !"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Unbenanntes Projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Sollen wirklich mehrere Projekte geöffnet werden?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "Sollen wirklich mehrere Projekte ausgeführt werden?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"Das Projekt aus der Liste entfernen? (Inhalte des Projektordners werden "
+"nicht geändert)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr "Sollen wirklich %s Ordner nach Godot-Projekten durchsucht werden?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Projektverwaltung"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Projektliste"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Ausführen"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Scannen"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Wähle zu durchsuchenden Ordner"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Neues Projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Verlassen"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Taste "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Joysticktaste"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Joystickachse"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Maustaste"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Ungültiger Name für Aktion (alle Zeichen außer ‚/‘ und ‚:‘ möglich)."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "Aktion ‚%s‘ existiert bereits!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Eingabeaktionsereignis umbenennen"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Eingabeaktionsereignis hinzufügen"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Steuerung+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Drücke eine Taste.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Maustasten-Index:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Linke Taste"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Rechte Taste"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Mittlere Taste"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Mausrad hoch"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Mausrad herunter"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Taste 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Taste 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Taste 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Taste 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Joystickachsen-Index:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Joysticktasten-Index:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Füge Eingabeaktion hinzu"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Lösche Eingabeaktionsereignis"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Fehler beim Speichern der Einstellungen."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Einstellungen gespeichert OK."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Übersetzung hinzufügen"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Übersetzung entfernen"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Remap-Pfad hinzufügen"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Ressourcen-Remap hinzufügen"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Ändere Zielsprache des Ressourcen-Remaps"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Ressourcen-Remap entfernen"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Ressourcen-Remap-Option entfernen"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Projekteinstellungen (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Allgemein"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Eigenschaft:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Entfernen"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Kopiere zu Plattform.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Eingabe Zuordnung"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Aktion:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Gerät:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Index:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Lokalisierung"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Übersetzungen"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Übersetzungen:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Hinzufügen.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Neu zuweisen"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Ressourcen:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remaps nach Lokalisierung:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Lokalisierung"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "Autoload"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Erweiterungen"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Voreinstellungen.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Einblenden"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ausblenden"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Null"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Glätten Ein-Aus"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Glätten Aus-Ein"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Datei.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Verzeichnis.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Lade"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Zuweisen"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Neues Skript"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Fehler beim Laden der Datei: Keine Ressource!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Konnte Bild nicht laden"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, Wert %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "An"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Eigenschaften:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Abschnitte:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Eigenschaft auswählen"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Methode auswählen"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "Konnte PVRTC-Werkzeug nicht ausführen:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+"Konnte PVRTC-Werkzeug nicht benutzen um konvertiertes Bild zurück zu laden:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Node umhängen"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Ort umhängen (neue Eltern auswählen):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Behalte globale Transformation"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Umhängen"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Erstelle neue Ressource"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Ressource öffnen"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Ressource speichern"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Ressourcenwerkzeuge"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Lokal machen"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Ausführungsmodus:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Aktuelle Szene"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Hauptszene"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Hauptszenen Parameter:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Szenenausführungseinstellungen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+"Kein Eltern-Node unter dem Szenen instantiiert werden könnten vorhanden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Fehler beim Laden der Szene von %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Kann Szene %s nicht instanziieren da die aktuelle Szene in einer ihrer Nodes "
+"existiert."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instanz-Szene(n)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+"Diese Aktion kann nicht in der Wurzel des Szenenbaums ausgeführt werden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Bewege Node innerhalb des Eltern-Nodes"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Bewege Nodes innerhalb des Eltern-Nodes"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Dupliziere Node(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Lösche Node(s)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Diese Aktion kann nicht ohne eine Szene ausgeführt werden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Diese Aktion kann nicht auf instantiierten Szenen ausgeführt werden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Speichere neue Szene als.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Verstehe!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Kann nicht an Nodes von fremden Szenen arbeiten!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Kann nicht an Nodes von denen die aktuelle Szene erbt arbeiten!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Entferne Node(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Konnte neue Szene nicht speichern. Wahrscheinlich konnten (Instanz-) "
+"Abhängigkeiten nicht erfüllt werden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Fehler beim Speichern der Szene."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Fehler beim Duplizieren der Szene zum Speichern."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Gruppen bearbeiten"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Verbindungen bearbeiten"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Node(s) löschen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Node hier anhängen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Szene hier instantiieren"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Typ ändern"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Skript hinzufügen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "Skript leeren"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Aus Szene zusammenführen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Speichere Verzweigung als Szene"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Löschen (keine Bestätigung)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Hinzufügen/Erstellen eines neuen Nodes"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instantiiere eine Szenendatei als Node. Erzeugt eine geerbte Szene falls "
+"keine Root-Node existiert."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "Ein neues oder existierendes Skript zum ausgewählten Node hinzufügen."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "Leere ein Skript für das ausgewählte Node."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Spatial-Sichtbarkeit umschalten"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "CanvasItem-Sichtbarkeit umschalten"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instanz:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+"Ungültiger Name für ein Node, die folgenden Zeichen sind nicht gestattet:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Node umbenennen"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Szenenbaum (Nodes):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "bearbeitbare Unterobjekte"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Als Platzhalter laden"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Instantiierung verwerfen"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Im Editor öffnen"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Leere Vererbung"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Vererbung wirklich leeren? (Lässt sich nicht rückgängig machen!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Leeren!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Wähle ein Node"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Ungültiger Name für Elternklasse"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Gültige Zeichen:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Ungültiger Klassenname"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Gültiger Name"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "Nicht verfügbar"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Name der Klasse ist ungültig!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Name der Elternklasse ist ungültig!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Ungültiger Pfad!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Skript konnte nicht im Dateisystem erstellt werden."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Fehler beim Laden des Skripts von %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Pfad ist leer"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Pfad ist nicht lokal"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Ungültiger Pfad"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Ungültige Erweiterung"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "Neues Skript erstellen"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "Lade bestehendes Skript"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Klassenname:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Built-In-Skript"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Node-Skript hinzufügen"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Warnung"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Fehler:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Quelle:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Funktion:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Fehler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Unterprozess verbunden"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Vorherige Instanz untersuchen"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Nächste Instanz untersuchen"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Einzelbilder stapeln"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Variable"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Fehler:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Stack Trace (falls geeignet):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Remote Inspektor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Echtzeit Szenenbaum:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Eigenschaften entfernter Objekte: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Wert"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitore"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Auflistung der Grafikspeichernutzung nach Ressource:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Insgesamt:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Grafikspeicher"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Ressourcenpfad"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Art"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Nutzung"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Verschiedenes"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Angeklicktes Control-Node:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Typ des angeklickten Control-Nodes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Wurzel der Echtzeitbearbeitung:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Nach Szenenbaum einstellen"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Tastenkürzel"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Ändere Lichtradius"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Ändere FOV der Kamera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Ändere Kameragröße"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Ändere Radius der Kugelform"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Ändere Ausmaße der Kastenform"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Ändere Radius der Kapselform"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Ändere Höhe der Kapselform"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Ändere Länge der Strahlenform"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Ändere Ausmaße des Benachrichtigers"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Ändere Ausmaße des Benachrichtigers"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance enthält keine BakedLight-Ressource."
+
+#~ msgid "Vertex"
+#~ msgstr "Vertex"
+
+#~ msgid "Fragment"
+#~ msgstr "Fragment"
+
+#~ msgid "Lighting"
+#~ msgstr "Belichtung"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Persistente an- und ausschalten"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Diese Element kann nicht sichtbar gemacht werden solange das "
+#~ "Elternelement versteckt ist. Elternelement zuerst sichtbar machen."
+
+#~ msgid "File exists"
+#~ msgstr "Datei existiert"
+
+#~ msgid "Valid path"
+#~ msgstr "Gültiger Pfad"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Eigens erstelltes Node hat keine Methode _get_output_port_unsequenced(idx,"
+#~ "wmem), jedoch wurden unsequenzierte Ports angegeben."
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Unterordner kann nicht geöffnet werden:"
+
+#~ msgid "Help"
+#~ msgstr "Hilfe"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Importierte Ressourcen"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Schlüsselbilder einfügen (Einfg)"
+
+#, fuzzy
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Ändere Animationswiederholung"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Aktivieren/Deaktivieren Interpolation, wenn Schleife aktiviert."
+
+#~ msgid "Load Layout"
+#~ msgstr "Layout Laden"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Skalierungsbegrenzungseditor"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Bindungen (Extra Parameter):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Methode in Node:"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Bearbeite Verbindungen.."
+
+#~ msgid "Plugin List:"
+#~ msgstr "Plugin Liste:"
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
new file mode 100644
index 0000000000..0420d3fc97
--- /dev/null
+++ b/editor/translations/de_CH.po
@@ -0,0 +1,6823 @@
+# Swiss High German translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Christian Fisch <christian.fiesel@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-07-17 23:44+0000\n"
+"Last-Translator: Christian Fisch <christian.fiesel@gmail.com>\n"
+"Language-Team: Swiss High German <https://hosted.weblate.org/projects/godot-"
+"engine/godot/de_CH/>\n"
+"Language: de_CH\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Signal"
+msgstr "Script hinzufügen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Variable"
+msgstr "Ungültige Bilder löschen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Signal"
+msgstr "Ungültige Bilder löschen"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Typ ändern"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Node"
+msgstr "Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Node(s) From Tree"
+msgstr "Node von Szene"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Base Type:"
+msgstr "Typ ändern"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Available Nodes:"
+msgstr "TimeScale-Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change"
+msgstr "Typ ändern"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Cut Nodes"
+msgstr "Node erstellen"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Node erstellen"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the signature object."
+msgstr "Fehler beim Schreiben des Projekts PCK!"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Damit AnimatedSprite Frames anzeigen kann, muss eine SpriteFrame Resource "
+"unter der 'Frames' Property erstellt oder gesetzt sein."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Nur ein sichtbares CanvasModulate ist pro Szene (oder ein Satz von "
+"instanzierten Szenen) erlaubt. Das erste erstellte gewinnt der Rest wird "
+"ignoriert."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Ein leeres CollisionPolygon2D hat keinen Einfluss au die Kollision."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Ein Okkluder Polygon muss gesetzt oder gezeichnet werden, damit dieser "
+"Okkluder funktioniert."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Das Okkluder Polygon für diesen Okkluder ist leer. Bitte zeichne ein Polygon!"
+
+#: scene/2d/navigation_polygon.cpp
+#, fuzzy
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Eine NavigationPolygon Ressource muss für diesen Node gesetzt oder erstellt "
+"werden, damit er funktioniert. Bitte setze eine Variable oder zeichne ein "
+"Polygon."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance muss ein Kind oder Grosskind vom Navigation2D Node "
+"sein. Es liefert nur Navigationsdaten."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D Nodes "
+"gesetzt wird."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Die Pfad-Variable muss auf einen gültigen Node2D Node zeigen um zu "
+"funktionieren."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Damit SamplePlayer einen Sound abspielen kann, muss eine SampleLibrary "
+"Ressource in der 'samples' Property erzeugt oder definiert werden."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+#, fuzzy
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funktioniert am besten, wenn es ein Unterobjekt erster "
+"Ordnung der bearbeiteten Hauptszene ist."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Damit SpatialSamplePlayer einen Sound abspielen kann, muss eine "
+"SampleLibrary Ressource in der 'samples' Eigenschaft erzeugt oder definiert "
+"werden."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Okay"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alert!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Bitte bestätigen..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Datei existiert, Überschreiben?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Alle Dateien (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Datei öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Datei(en) öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Verzeichnis öffnen"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Datei oder Verzeichnis öffnen"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Speichern"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Datei speichern"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#, fuzzy
+msgid "Error initializing FreeType."
+msgstr "Fehler bei der FreeType Inizialisierung."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Bild bewegen/einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Anim Bilder duplizieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Node Kurve editieren"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim Bilder löschen"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Anim Bild hinzufügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Anim Bilder bewegen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Willst du eine neue Ebene inklusiv Bild in %s einfügen?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Erstelle %d in neuer Ebene inklusiv Bild?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim Ebene und Bild einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim Bild einfügen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Anim verlängern"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Aktivieren des Bildeditors mit einem click auf die jenigen."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Bild"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Im welchem Node soll die Funktion aufgerufen werden?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Ungültige Bilder löschen"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Die Methode muss im Ziel Node definiert werden!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Connect To Node:"
+msgstr "Verbindung zu Node:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Pfad zum Node:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Node von Szene"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Ja"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Szene '%s' hat kapute Abhängigkeiten:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Save all Scenes"
+msgstr "Neue Szene speichern als..."
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Projekteinstellungen"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Zurück zur Projektliste"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Assets zum Projekt importieren."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Verschiedene Projekte oder Szenenweite Werkzeuge."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exportiere das Projekt für viele Plattformen."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Projekt starten."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Abspielen"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Spiele die editierte Szene."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Szene starten"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Spiele angepasste Szene"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Play Custom Scene"
+msgstr "Spiele angepasste Szene"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Collision-Formen und Raycast Nodes (für 2D und 3D) werden im laufenden Spiel "
+"angezeigt, falls diese Option aktiviert ist."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Node"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Projekt exportieren"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Sieht so aus als hättest du das Schlüsselwort \"tool\" vergessen?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selektiere Node(s) zum Importieren aus"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importiere von folgendem Node:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Oberfläche %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importiere Texturen für Atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importiere Große Texturen (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importiere Texturen für 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D-Textur"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#, fuzzy
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"MERKE: Das importieren von 2D Texturen ist nicht zwingend notwendig. Kopiere "
+"einfach png/jpg Dateien in das Projekt."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Zum Projekt hinzufügen (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+#, fuzzy
+msgid "MultiNode Set"
+msgstr "MultiNode Set"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+#, fuzzy
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Selektiere ein Node um deren Signale und Gruppen zu ändern."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Autoplay Umschalten"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Spiele ausgewählte Animation rückwärts vom Ende. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Stoppe Animations-Wiedergabe. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Spiele ausgewählte Animation vom Start. (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation from current pos. (D)"
+msgstr "Ausgewählte Animation von der aktueller Position aus abspielen. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Neue Animation erstellen."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Liste der Animationen anzeigen."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Beim Laden automatisch abpielen"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Animations-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "OneShot-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Mix-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Blend2-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Blend3-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Blend4-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "TimeScale-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "TimeSeek-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Transition-Node"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Node Filter editieren"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Move Mode"
+msgstr "Bild bewegen/einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate Mode"
+msgstr "Node erstellen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Insert Keys"
+msgstr "Bild einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Bild einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Bild in bestehende Ebene einfügen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Node erstellen"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Fehler beim Instanzieren der %s Szene"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "Okay :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Bitte nur ein Node selektieren."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Typ ändern"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Keine Oberflächen Quelle spezifiziert."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Oberflächen Quelle is invalid (invalider Pfad)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Oberflächen Quelle is invalid (keine Form)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+#, fuzzy
+msgid "Surface source is invalid (no faces)."
+msgstr "Oberflächen Quelle is invalid (kein Face)"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Wähle eine Ziel Oberfläche aus:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Ziel Oberfläche:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Emissions-Maske setzen"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Clear Emission Mask"
+msgstr "Inhalt der Emissions-Masken löschen"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Emissions-Maske laden"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Node enthält keine Geometrie (Flächen)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Flächen enthalten keinen Bereich!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Keine Flächen!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Oberfläche"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Polygon 2D UV Editor"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "\"keying\" ist deaktiviert (Bild nicht hinzugefügt)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Animationsbild eingefügt."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Insert Animation Key"
+msgstr "Bild einfügen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Transformationstyp"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Bitte ausserhalb des Projekt Verzeichnis exportieren!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Fehler beim Exportieren des Projekts!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Fehler beim Schreiben des Projekts PCK!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Projektexport Einstellungen"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Export all resources in the project."
+msgstr "Exportiere alle Resources des Projekts."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exportiere alle Dateien in das Projektverzeichnis."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exportiere das Projekt PCK"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Projekt exportieren"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Ungültiger Projektpfad, Pfad existiert nicht!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Ungültiger Projektpfad, godot.cfg vorhanden!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Ungültiger Projektpfad, godot.cfg nicht vorhanden!"
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Importierte Projekte"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Ungültiger Projektpfad, (wurde was geändert?)!"
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Die godot.cfg kann im Projektverzeichnis nicht erstellt werden."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Existierendes Projekt importieren"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Projektpfad (muss existieren):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Projektname:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Neues Projekt erstellen"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Taste "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Taste drücken.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Script hinzufügen"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Okay"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instanziere Szene(n)"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "This operation can't be done on the tree root."
+msgstr "Das funktioniert nicht beim obersten Node. (tree root)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Node(s) duplizieren"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Node(s) löschen?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Ohne eine Szene kann das nicht funktionieren."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Das funktioniert nicht bei einer instanzierten Szene."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Neue Szene speichern als..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Node(s) entfernen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Szene kann nicht gespeichert werden."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Connections editieren"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Node(s) löschen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Typ ändern"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Script hinzufügen"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Script hinzufügen"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete (No Confirm)"
+msgstr "Bitte bestätigen..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Fehler beim Instanzieren der %s Szene"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Neues Projekt erstellen"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Script hinzufügen"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Bilder (innerhalb) einfügen"
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
new file mode 100644
index 0000000000..8e54d88989
--- /dev/null
+++ b/editor/translations/editor.pot
@@ -0,0 +1,6742 @@
+# LANGUAGE translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/es.po b/editor/translations/es.po
new file mode 100644
index 0000000000..a1108822fa
--- /dev/null
+++ b/editor/translations/es.po
@@ -0,0 +1,7161 @@
+# Spanish translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Carlos López <genetita@gmail.com>, 2016.
+# Ismael Ferreras Morezuelas <swyterzone+mame@gmail.com>, 2016.
+# Lisandro Lorea <lisandrolorea@gmail.com>, 2016.
+# Roger BR <drai_kin@hotmail.com>, 2016.
+# Sebastian Silva <sebastian@fuentelibre.org>, 2016.
+# Swyter <swyterzone@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-11-22 16:41+0000\n"
+"Last-Translator: Swyter <swyterzone@gmail.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
+"godot/es/>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"El argumento para convert() no es correcto, prueba utilizando constantes "
+"TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"O no hay suficientes bytes para decodificar bytes o el formato no es "
+"correcto."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "¡El argumento «step» es cero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "No es un script con una instancia"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "No está basado en un script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "No está basado en un archivo de recursos"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "El formato de diccionario de instancias no es correcto (falta @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"El formato de diccionario de instancias no es correcto (no se puede cargar "
+"el script en @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"El formato de diccionario de instancias no es correcto (script incorrecto en "
+"@path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "El diccionario de instancias no es correcto (subclases erróneas)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"¡Un nodo ejecutó un «yield» sin memoria de trabajo. Prueba leyendo la "
+"documentación sobre cómo utilizar yield!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Un nodo ejecutó un «yield» pero no devolvió un estado de función en la "
+"memoria de trabajo original."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"El valor de retorno debe asignarse al primer elemento de la memoria de "
+"trabajo de nodos. Prueba arreglando el nodo."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "El nodo devolvió una secuencia de salida incorrecta: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"¡Se encontró un bit de secuencia pero no el nodo en la pila, informa del "
+"problema!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Desbordamiento de pila en el nivel: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funciones:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variables:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Señales:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "El nombre no es un identificador válido:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Otra función/variable/señal ya utiliza este nombre:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Renombrar función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Renombrar variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Renombrar señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Añadir función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Añadir variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Añadir señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Quitar función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Quitar variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Editando variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Quitar señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Editando señal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Cambiar tipo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Añadir nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantén pulsado Meta para quitar un «Setter». Mantén pulsado Mayús para "
+"quitar una firma genérica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantén pulsado Ctrl para quitar un «Getter». Mantén pulsado Mayús para "
+"quitar una firma genérica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Mantén pulsado Meta para quitar una referencia simple del nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Mantén pulsado Ctrl para quitar una referencia simple del nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Mantén pulsado Meta para quitar un «Setter» de variable."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Mantén pulsado Ctrl para quitar un «Setter» de variable."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Añadir nodo «Preload»"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Añadir nodo/s desde árbol"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Añadir propiedad «Getter»"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Añadir propiedad «Setter»"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Copiar animación"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Sequence"
+msgstr "Secuencia"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Switch"
+msgstr "Altura"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Iterador"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Mientras"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Devuelve:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Llamada"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Get"
+msgstr "Establecer"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Establecer"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Editar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipo base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Miembros:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nodos disponibles:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Selecciona o crea una función para editar el grafo"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Cerrar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Editar argumentos de señal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Editar variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Cambiar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Quitar seleccionados"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Des/activar «breakpoint»"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Buscar por tipo de nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Copy Nodes"
+msgstr "Copiar pose"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Cut Nodes"
+msgstr "Crear nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Pegar pose"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "El tipo de entrada no es iterable: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "El iterador ya no es correcto"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "El iterador ya no es correcto: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "El nombre de la propiedad índice no es correcto."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "¡El objeto base no es un nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "¡La ruta no apunta a un nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "El nombre de la propiedad índice en el nodo %s no es correcto."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argumento incorrecto de tipo: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumentos incorrectos: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet no encontrado en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet no encontrado en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"El nodo personalizado no tiene ningún método _step(), no se puede procesar "
+"el grafo."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"El valor devuelto por _step() no es correcto, debe ser un entero (seq out), "
+"o string/cadena (error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "se presione"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "se levante"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"No se ha podido leer el archivo de certificación. ¿Seguro que la ruta y "
+"contraseña son correctas?"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the signature object."
+msgstr "¡Error al escribir el PCK de proyecto!"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the package signature."
+msgstr "Se produjo un error al firmar el paquete."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"No se han encontrado plantillas de exportación.\n"
+"Tienes que descargar e instalarlas para continuar."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Custom debug package not found."
+msgstr "No se ha encontrado ningún paquete de depuración personalizado."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "No se ha encontrado ningún paquete final personalizado."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "El nombre no es correcto."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Tamaño de tipografía incorrecto."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid publisher GUID."
+msgstr "Ruta base incorrecta"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid background color."
+msgstr "El origen personalizado de tipografía no es correcto."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "El logo de la tienda no es del tamaño adecuado (debe ser de 50x50)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+"El logo cuadrado de 44x44 no es del tamaño adecuado (debe ser de 44x44)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+"El logo cuadrado de 71x71 no es del tamaño adecuado (debe ser de 71x71)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+"El logo cuadrado de 150x150 no es del tamaño adecuado (debe ser de 150x150)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+"El logo cuadrado de 310x310 no es del tamaño adecuado (debe ser de 310x310)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+"El logo ancho de 310x150 no es del tamaño adecuado (debe ser de 310x150)."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+"El tamaño de la imagen de arranque no es correcto (debe ser de 620x300)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Un recurso SpriteFrames debe ser creado o seteado en la propiedad 'Frames' "
+"para que AnimatedSprite pueda mostrar frames."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Solo se permite un CanvasModulate visible por escena (o set de escenas "
+"instanciadas). El primero creado va a funcionar, mientras que el resto van a "
+"ser ignorados."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolylgon2D solo sirve para proveer de un collision shape a un nodo "
+"derivado de CollisionObject2D. Favor de usarlo solo como un hijo de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para darles un shape."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Un CollisionPolygon2D vacío no tiene efecto en la colisión."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D solo sirve para proveer de un collision shape a un nodo "
+"derivado de CollisionObject2D. Favor de usarlo solo como un hijo de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para darles un shape."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
+"recurso shape!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Se debe proveer una textura con la forma de la luz a la propiedad 'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Se debe establecer (o dibujar) un polígono oclusor para que la oclusión "
+"tenga efecto."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "El polígono de este oclusor esta vacío. Dibujá un polígono!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Se debe crear o establecer un recurso NavigationPolygon para que este nodo "
+"funcione. Prueba estableciendo una propiedad o dibuja un polígono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance debe ser un hijo o nieto de un nodo Navigation2D. "
+"Solo provee datos de navegación."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer node solo funciona cuando esta seteado como hijo de un nodo "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Particles2D valido para funcionar."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D solo funciona cuando está seteado como hijo de un nodo Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Tienes que crear o establecer un recurso de tipo SampleLibrary con la "
+"propiedad 'samples' para que SamplePlayer pueda reproducir el sonido."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Viewport válido para funcionar. "
+"Dicho Viewport debe ser seteado a modo 'render target'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"El Viewport seteado en la propiedad path debe ser seteado como 'render "
+"target' para que este sprite funcione."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funciona mejor cuando se usa con la raíz de escena "
+"editada directamente como padre."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape solo sirve para proveer un collision shape a un nodo derivado "
+"de un CollisionObject. Favor de usarlo solo como hijo de Area, StaticBody, "
+"RigidBody, KinematicBody, etc. para darles un shape."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Se debe proveer un shape para que CollisionShape funcione. Creale un recurso "
+"shape!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon solo sirve para proveer un collision shape a un nodo "
+"derivado de un CollisionObject. Favor de usarlo solo como hijo de Area, "
+"StaticBody, RigidBody, KinematicBody, etc. para darles un shape."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Un CollisionPolygon vacio no tiene ningún efecto en la colisión."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Se debe crear o establecer un recurso NavigationMesh para que este nodo "
+"funcione."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance debe ser un hijo o nieto de un nodo Navigation. Ya "
+"que sólo proporciona los datos de navegación."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Particles2D valido para funcionar."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Solo se permite un WorldEnvironment por escena (o conjunto de escenas "
+"instanciadas)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Tienes que crear o establecer un recurso de tipo SampleLibrary con la "
+"propiedad «samples» para que SpatialSamplePlayer pueda reproducir el sonido."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' "
+"para que AnimatedSprite3D pueda mostrar frames."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Aceptar"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Notificación"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Confirmar decisión…"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "El archivo ya existe, ¿quieres sobreescribirlo?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Reconocidos"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Todos los archivos (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Abrir"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Abrir un archivo"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Abrir archivo/s"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Abrir una carpeta"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Abrir un archivo o carpeta"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Guardar"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Guardar un archivo"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Crear carpeta"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Ruta:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Carpetas y archivos:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Archivo:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nombre:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "No se pudo crear la carpeta."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Debe ser una extensión válida."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Mayús+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Dispositivo"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Botón"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Botón izquierdo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Botón derecho."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Botón central."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Rueda hacia arriba."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Rueda hacia abajo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Eje"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Cortar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copiar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Pegar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Seleccionar todo"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Borrar todo"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Deshacer"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Los popups se esconderán por defecto a menos que llames a popup() o "
+"cualquiera de las funciones popup*(). Sin embargo, no hay problema con "
+"hacerlos visibles para editar, aunque se esconderán al ejecutar."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Este viewport no está seteado como render target. Si tenés intención de que "
+"muestre contenidos directo a la pantalla, hacelo un hijo de un Control para "
+"que pueda obtener un tamaño. Alternativamente, hacelo un RenderTarget y "
+"asigná su textura interna a algún otro nodo para mostrar."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Error al arrancar FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Formato de tipografía desconocido."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Error al cargar la tipografía."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Tamaño de tipografía incorrecto."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Desactivado"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Toda la selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Mover o añadir clave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Cambiar transición de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Cambiar transformación de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Cambiar valor de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Cambiar llamada de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Añadir pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplicar claves de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Subir pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Bajar pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Quitar pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Establecer transiciones en:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Renombrar pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Cambiar interpolación de pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Cambiar modo de valor de pista de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Editar nodo de curva"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Editar curva de selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Borrar claves de animación"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplicar selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplicar transpuesto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Quitar selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Continuo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discreto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Trigger"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Añadir clave de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Mover claves de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Escalar selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Escalar desde cursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Ir al siguiente paso"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Ir al paso anterior"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineal"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "Entrada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Salida"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Entrada-salida"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Salida-entrada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transiciones"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimizar animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Limpiar animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "¿Quieres crear una NUEVA pista para %s e insertar clave?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "¿Quieres crear %d NUEVOS pistas e insertar claves?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Crear"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Crear e insertar animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Insertar pista y clave de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Insertar clave de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Cambiar duración de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Cambiar repeticiones de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Crear clave de valor de tipo para animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Insertar animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Escalar claves de animación"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Add Call Track"
+msgstr "Añadir «call track» de animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom de animación."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Duración (seg.):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Duración de animación (en segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Paso (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Fijado de cursor por pasos (en segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Repetir o no la animación."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Añadir nuevas pistas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Subir la pista actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Bajar la pista actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Quitar el pista seleccionada."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Herramientas de pistas"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Editar claves individuales al hacer clic."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optimizar animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Máximo error lineal:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Máximo error angular:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Máximo ángulo optimizable:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimizar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Selecciona un AnimationPlayer desde el árbol de escenas para editar "
+"animaciones."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Clave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transición"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Relación de escalado:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "¿En qué nodo quieres llamar funciones?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Quitar claves incorrectas"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Quitar pistas vacías y sin resolver"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Limpiar todas las animaciones"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Limpiar todas las animaciones (IRREVERSIBLE)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Limpiar"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimensionar «array»"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Cambiar tipo de valor del «array»"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Cambiar valor del «array»"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Buscar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Ordenar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Invertir"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Categoría:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Todos"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Sitio:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Ayuda…"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficial"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunidad"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Prueba"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Archivo ZIP de elementos"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Lista de métodos Para '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Lista de métodos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumentos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Devuelve:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Ir a línea"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Número de línea:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Sin soincidencias"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d ocurrencias reemplazadas."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Reemplazar"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Reemplazar todo"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Coincidir mayús/minúsculas"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Palabras completas"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Sólo selección"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Buscar"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Búsqueda"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Siguiente"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d ocurrencias reemplazadas."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "¡No se ha encontrado!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Reemplazar por"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Respetar mayús/minúsculas"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Hacia atrás"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Preguntar antes de reemplazar"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Saltar"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Acercar"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Alejar"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Restablecer zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Línea:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Columna:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "¡Debes establecer un método en el nodo seleccionado!"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"No se ha encontrado el método objetivo. Especifica un método válido o ancla "
+"un script en el nodo objetivo."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Conectar a nodo:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Añadir"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Quitar"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Add Extra Call Argument:"
+msgstr "Añadir argumento de llamada extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argumentos de llamada extras:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Ruta al nodo:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Crear runción"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Diferido"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Una vez"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Conectar"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Conectar «%s» a «%s»"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Conectando señal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Crear suscripción"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Conectar…"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Desconectar"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Señales"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Crear nuevo"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoritos:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recientes:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Coincidencias:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Descripción:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Buscar reemplazo para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dependencias para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Estás editando la escena «%s».\n"
+"Por lo que los cambios no tendrán efecto hasta que recargues."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Se está usando el recurso «%s».\n"
+"Por lo que los cambios no tendrán efecto hasta que recargues."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Recursos"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Ruta"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dependencias:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Arreglar rota(s)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor de dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Buscar reemplazo de recurso:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Dueños de:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Otros recursos necesitan los archivos que estás intentando quitar para "
+"funcionar.\n"
+"¿Seguro que quieres quitarlos? (No puedes deshacerlo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+"¿Quieres quitar los archivos seleccionados del proyecto? (No puedes "
+"deshacerlo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Error al cargar:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "La escena no se pudo cargar porque faltan las siguientes dependencias:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Abrir de todos modos"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "¿Qué es lo que quieres hacer?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Arreglar dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "¡Hubo errores al cargar!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "¿Quieres eliminar permanentemente %d elementos? (Irreversible)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Es dueño de"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Recursos sin propietario explícito:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Explorador de recursos huérfanos"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "¿Quieres eliminar los archivos seleccionados?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Eliminar"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "El nombre no es correcto."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Letras válidas:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"El nombre no es correcto. No puede coincidir con un nombre de clase que ya "
+"existe en el motor gráfico."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"El nombre no es correcto. No puede coincidir con un nombre de tipo "
+"predeterminado que ya existe en el motor gráfico."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"El nombre no es correcto. No puede coincidir con un nombre de constante "
+"global que ya existe en el motor gráfico."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Ruta incorrecta."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "El archivo existe."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "No está en la ruta de recursos."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Añadir «AutoLoad»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "¡El Autoload «%s» ya existe!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Renombrar «Autoload»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Des/activar globales de «Autoload»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Mover «Autoload»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Quitar «Autoload»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Activar"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Reordenar «Autoloads»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nombre del nodo:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nombre"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "«Singleton»"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Lista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Actualizando escena"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Guardando cambios locales…"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Actualizando escena…"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Elige una carpeta"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Elegir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Retroceder"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Avanzar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Subir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Recargar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Ver/ocultar archivos ocultos"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Añadir/quitar favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Cambiar modo"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Seleccionar ruta"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Subir favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Bajar favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Vista previa:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "AnalizandoFuentes"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Ayuda de búsqueda"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Lista de clases:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Buscar clases"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Clase:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Hereda:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Heredada por:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Descripción breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Métodos públicos:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Elementos de tema de interfaz:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Constantes:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Descripción breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Descripción de métodos:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Texto de búsqueda"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Añadido:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Eliminado:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Error al guardar atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "No se pudo guardar la subtextura del altas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Almacén de archivo:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Empaquetando"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportando para %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Configurando…"
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Salida:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Reimportando"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importando:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Nodo desde escena"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "¡Hubo un error al guardar el recurso!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Guardar recurso como…"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Muy bien…"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "No se puede abrir el archivo para escribir:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Formato de archivo desconocido:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Error al guardar."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Guardar escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analizando"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Creando miniatura"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"No se pudo guardar la escena. Es posible que no se hayan podido satisfacer "
+"las dependencias (instancias)."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Hubo un problema al cargar el recurso."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "¡No se puede cargar MeshLibrary para poder unir los datos!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "¡Error al guardar la MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "¡No se puede cargar TileSet para poder unir los datos!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "¡Error al guardar el TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "No se puede abir el zip de plantillas de exportación."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Cargando plantillas de exportación"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "¡Hubo un problema al intentar guardar los ajustes!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Se han sobrescrito los ajustes predeterminados del editor."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "¡No se encuentra el nombre del ajuste!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Se han restaurado los ajustes predeterminados."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copiar parámetros"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Pegar parámetros"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Pegar recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copiar recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Hacerlo integrado"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Crear subrecurso único"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Abrir en la ayuda"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "No hay escena definida para ejecutar."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"No se ha definido ninguna escena principal, ¿quieres elegir alguna?\n"
+"Es posible cambiarla más tarde en «Ajustes del proyecto» bajo la categoría "
+"«aplicación»."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La escena '%s' seleccionada no existe, ¿seleccionar una válida?\n"
+"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria "
+"'aplicacion'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La escena '%s' seleccionada no es un archivo de escena, ¿seleccionar uno "
+"válido?\n"
+"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria "
+"'aplicacion'."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"La escena actual nunca se guardó. Favor de guardarla antes de ejecutar."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "¡No se pudo comenzar el subproceso!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Abrir escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Abrir escena base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Apertura rápida de escena…"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Apertura rápida de script…"
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Sí"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "¿Quieres cerrar la escena? (Los cambios sin guardar se perderán)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Guardar escena como…"
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+"Esta escena nunca se ha guardado. ¿Quieres guardarla antes de ejecutarla?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Prueba guardando la escena primero."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Guardar cadenas traducibles"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exportar biblioteca de modelos"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exportar Tile Set"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Salir"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "¿Quieres salir del editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "La escena actual no se ha guardado. ¿Quieres abrirla de todos modos?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "No se puede volver a cargar una escena que nunca se guardó."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Revertir"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Esta acción es irreversible. ¿Quieres revertirla de todos modos?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Ejecución rápida de escena…"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"¿Quieres abrir el el administrador de proyectos?\n"
+"(Los cambios sin guardar se perderán)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Elige una escena principal"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Vaya"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Hubo un error al cargar la escena, debe estar dentro de la ruta del "
+"proyecto. Utiliza «Importar» para abrir la escena, luego guárdala dentro de "
+"la ruta del proyecto."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Hubo un error al cargar la escena."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "La escena «%s» tiene dependencias rotas:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Guardar ajustes"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Borrar ajustes"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Predeterminado"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Cambiar pestaña de escena"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d archivos más"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d archivos o carpetas más"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Ir a la escena abierta previamente."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Pestaña siguiente"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Pestaña anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operaciones con archivos de escena."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nueva escena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nueva escena heredada…"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Abrir escena.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Guardar escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Guardar todas las escenas"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Cerrar escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Cerrar e ir a escena anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Abrir reciente"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtrado rápido de archivos…"
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Convertir a…"
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Cadenas traducibles…"
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary…"
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet…"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Rehacer"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Ejecutar script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Ajustes del proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Revertir escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Salir al listado del proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Modo sin distracciones"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importar elementos al proyecto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importar"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Herramientas varias o de escenas."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Herramientas"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exportar el proyecto a varias plataformas."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exportar"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Inicia el proyecto para poder jugarlo."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Reproducir"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Pausar la escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausar la escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Detener la escena."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Detener"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Reproducir la escena editada."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Reproducir escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Reproducir escena personalizada"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Reproducir escena personalizada"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opciones de depuración"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Exportar con depuración remota"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Al exportar o publicarlo, el ejecutable tratará de conectarse a la IP de "
+"este equipo para iniciar la depuración."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Exportación mini con recursos en red"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Cuando esta opción está activa, al exportar o publicar se producirá un "
+"ejecutable mínimo.\n"
+"El sistema de archivos del proyecto se pasará desde el editor por la red.\n"
+"En Android, publicar utilizará el cable USB para un mejor rendimiento. Esta "
+"opción acelera los ciclos de prueba de juegos grandes."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Ver formas de colisión"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Los Collision shapes y nodos raycast (para 2D y 3D) seran visibiles durante "
+"la ejecución del juego cuando esta opción queda activada."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navegación visible"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Si activas esta opción podrás ver los modelos y polígonos de navegación "
+"durante la ejecución del juego."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sincronizar cambios de escena"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Cuando esta opción este encendida, cualquier cambio hecho a la escena en el "
+"editor sera replicado en el juego en ejecución.\n"
+"Cuando se usa remotamente en un dispositivo, esto es mas eficiente con un "
+"sistema de archivos remoto."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Actualizar cambios en scripts"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Cuando esta opción esta activa, cualquier script que se guarde sera vuelto a "
+"cargar en el juego en ejecución.\n"
+"Cuando se use remotamente en un dispositivo, esto es mas eficiente con un "
+"sistema de archivos de red."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Ajustes"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Ajustes del editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Ajustes de diseño del editor"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "Modo pantalla completa"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Instalar plantillas de exportación"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Acerca de"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Alerta cuando un recurso externo haya cambiado."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Gira cuando la ventana del editor repinta!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Actualizar siempre"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Actualizar cambios"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Disable Update Spinner"
+msgstr "Desactivar la animación al actualizar"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Crear un nuevo recurso en memoria y editarlo."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Cargar un recurso existente desde disco y editarlo."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Guardar el recurso editado actualmente."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Guardar como…"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Ir al objeto editado previo en el historial."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Ir al siguiente objeto editado en el historial."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Historial de objetos recientemente editados."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Propiedades del objeto."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "SistDeArchivos"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Nodo"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Salida"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Reimportar"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Actualizar"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "¡Muchas gracias de parte de la comunidad de Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "¡Gracias!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importar plantillas desde un archivo ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exportar proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Exportar biblioteca"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Unir con existentes"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Abrir y ejecutar un script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Errores de carga"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Plugins instalados:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Versión:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Estado:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Parar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Iniciar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Medida:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Duracion de cuadro (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Tiempo promedio (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "% de cuadro"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "% de cuadro fijo"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Tiempo:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusivo"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Propio"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Nº de cuadro:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Espera a que termine el análisis."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "La escena actual debe ser guardada para reimportar."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Guardar y reimportar"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Reimportar recursos cambiados"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Escribe tu lógica en el método _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Ya hay una escena editada."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "No se pudo instanciar el script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Te olvidaste de la palabra clave 'tool'?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "No se pudo ejecutar el script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Te olvidaste del método '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Predeterminado (Igual que el editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selecciona nodos a importar"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Ruta a la escena:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importar desde nodo:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"No se puede abrir file_type_cache.cch para escribir, no se guardará el cache "
+"de tipos de archivo!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+"Los archivos de origen y destino son iguales, no se realizará ninguna acción."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+"Las rutas de origen y destino son iguales, no se realizará ninguna acción."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "No se pueden mover carpetas dentro de si mismas."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "No se puede operar en «…»"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Elige un nombre nuevo y ubicación para:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "¡No has seleccionado ningún archivo!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instanciar"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Editar dependencias…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Ver dueños…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copiar ruta"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Renombrar o mover…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Mover a…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Info"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Mostrar en el navegador de archivos"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Reimportando…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Carpeta anterior"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Carpeta siguiente"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Reanalizar sistema de archivos"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Act/Desact. estado de carpeta como Favorito"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+"Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Mover"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Añadir al grupo"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Quitar del grupo"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "¡Sin máscaras de bits para importar!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "La ruta de destino está vacía."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "La ruta de destino debe ser una ruta de recursos completa."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "La ruta de destino debe existir."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "La ruta de guardado esta vacía!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importar BitMasks"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Texturas de origen:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Ruta de destino:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Aceptar"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Máscara de bits"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "¡No se ha elegido ningún archivo de tipografías!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "¡No se ha elegido ningún recurso de tipografías!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"La extensión del archivo no es correcta.\n"
+"Prueba con la extensión .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "No se puede cargar/procesar la tipografía elegida."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "No se pudo guardar la tipografía."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Tipografía elegida:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Tamaño de la tipografía elegida:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Recurso de destino:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "El veloz murciélago hindú comía feliz cardillo y kiwi."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Prueba:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opciones:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importar tipografías"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Este archivo ya es un archivo de tipografías de Godot, tienes que utilizar "
+"un archivo de tipo BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Error al abrir como archivo BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "El origen personalizado de tipografía no es correcto."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Tipografía"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "¡No hay ningún modelo que se pueda importar!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importar modelo individual"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Modelo/s elegidos:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Modelos 3D"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Superficie %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "¡No hay ningún sonido a importar!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importar archivo de sonido"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Muestra(s) de Origen:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Archivo de sonido"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nuevo clip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opciones de Animación"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Identificadores"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "Hacer Bake de FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optimizar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Error lineal máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Error angular máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Ángulo máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Clips"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Inicios"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Finales"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Repetir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtros"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "La ruta de origen esta vacía."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "No se pudo cargar el script post-importación."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "El script de postimportación no es correcto o está roto."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Error al importar escena."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importar escena 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Escena de origen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Igual que escena de destino"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Compartido"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Carpeta de texturas elegida:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script de posprocesado:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Tipo de Nodo Raiz Customizado:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nombre del nodo:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Faltan los siguientes archivos:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importar de todos modos"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importar y abrir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"La escena editada no se ha guardado, ¿Quieres abrir la escena importada de "
+"todos modos?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importar escena"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importando escena…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Ejecutando script personalizado…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "No se pudo cargar el script posimportación:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+"El script de posimportación no es correcto o está roto. (revisa la consola):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Error ejecutando el script de posimportacion:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importar imagen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "No se puede importar un archivo sobre si mismo:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "No se pudo encontrar la ruta: %s (ya es local)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Guardando…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animación de escena 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Sin comprimir"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Compresión sin pérdidas (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Compresión con pérdidas (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Comprimir (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Formato de textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Calidad de compresión de textura (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opciones de textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "¡Selecciona algunos archivos!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Se necesita al menos un archivo para el atlas."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Hubo un error al importar:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Solo se requiere un archivo para textura grande."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Tamaño máximo de textura:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importar texturas para atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Tamaño de celda:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Textura grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importar texturas grandes (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Textura de origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Textura base de atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Texturas de origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importar texturas para 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importar texturas para 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Importar texturas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Textura 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Textura 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Textura de atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"AVISO: No es necesario importar texturas 2D. Limítate a copia los archivos "
+"png/jpg al proyecto."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Recortar espacio vacío."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importar textura grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Cargar imagen de origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Troceando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Insertando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Guardando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "No se pudo guardar la textura grande:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Construir atlas para:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Cargando imagen:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "No se pudo cargar la imagen:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Convirtiendo imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Recortando imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Copiando datos de imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "No se pudo guardar la imagen de atlas:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "No se pudo guardar la textura convertida:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "¡Origen incorrecto!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "¡Origen de traducción incorrecto!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Columna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Idioma"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Sin elementos para importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "¡El objetivo no tiene ruta!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importar traducciones"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "¡No se pudo importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importar traducción"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "CSV de origen:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignorar Primera Columna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Comprimir"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Añadir al proyecto (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Importar idiomas:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Traducción"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "Establecer multinodo"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Grupos"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Selecciona un nodo para editar señales y grupos."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Des/activar reproducción automática"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Nombre de animación nueva:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nueva animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Cambiar nombre de animación:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Quitar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ERROR: ¡El nombre de animación no es correcto!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ERROR: ¡El nombre de animación ya existe!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Renombrar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Añadir animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Mezclar el siguiente cambio"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Cambiar tiempo de mezcla"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Cargar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplicar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ERROR: ¡No hay animaciones para copiar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ERROR: ¡No hay recursos de animación en el portapapeles!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animación pegada"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Pegar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ERROR: ¡No hay animación que editar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Reproducir hacia atrás la animación seleccionada desde la posición actual (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+"Reproducir hacia atrás la animación seleccionada desde el final. (Mayús + A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Detener la reproducción de la animación. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Reproducir animación seleccionada desde el principio. (Mayús + D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Reproducir animación seleccionada desde la posicion actual. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Posición de animación (en segundos)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Escalar la reproducción de la animación globalmente para el nodo."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Crear nueva animación en el reproductor."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Cargar una animación desde disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Cargar una animación desde disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Guardar la animación actual"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Guardar como"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Lista de animaciones en el reproductor."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Autoreproducir al cargar"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Editar Blend Times Objetivo"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Herramientas de animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Copiar animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Crear animación nueva"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nombre de Animación:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "¡Error!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Tiempos de mezcla:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Siguiente (Auto enfilar):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Cross-Animation Blend Times"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animación"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Nuevo nombre:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Escala:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Aparición (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Desaparición (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Mezclar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mezclar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Autoreiniciar:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Reiniciar (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Reiniciar al azar (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "¡Iniciar!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Cantidad:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blend:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Blend 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Blend 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Tiempo de Crossfade (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Actual:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Añadir entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Borrar autoavanzar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Establecer autoavanzar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Eliminar entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Renombrar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "El árbol de animación es correcto."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "El árbol de animación no es correcto."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nodo de animación"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nodo UnaVez"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Nodo Mezcla"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nodo Blend2"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nodo Blend3"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nodo Blend4"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nodo TimeScale"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nodo TimeSeek"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nodo de transición"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Importar animaciones…"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Editar filtros de nodo"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtros…"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Leyendo %d triángulos:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Nº de triángulos"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Configuración de Baker de Luces:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Leyendo geometría"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Procesando luces"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Creando BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Creando octree de luces"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Creando octree de texturas"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Transfiriendo a «lightmaps»:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Asignando nº de textura"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Quemando nº de triángulo"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Posprocesando nº de textura"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "¡Quemar!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+"Restablece el proceso de «bake» del «octree» del «lightmap» (empezar de "
+"nuevo)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Vista previa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Ajustes de fijado"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Desplazamiento de rejilla:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Pasos de rejilla:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Desplazamiento de rotación:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Cantidad de rotaciones:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Mover pivote"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Mover acción"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Editar Cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Editar CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Cambiar anclas"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Zoom (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Pegar pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Modo de selección"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Arrastrar: Rotar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Arrastrae: Mover"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Presioná 'v' para Cambiar el Pivote, 'Shift+v' para Arrastrar el Pivote (al "
+"mover)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+Click Der.: Selección en depth list"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Modo movimiento"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Modo rotación"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Mostrar una lista de todos los objetos en la posicion cliqueada\n"
+"(igual que Alt+Click Der. en modo selección)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Click para cambiar el pivote de rotación de un objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Modo desplazamiento lateral"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Inmovilizar el objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Liberar el objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Asegurarse que los hijos de un objeto no sean seleccionables."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Restaurar la habilidad de seleccionar los hijos de un objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Fijar a cuadrícula"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Mostrar rejilla"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Fijar rotación"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Fijado relativo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Configurar fijado…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Adherir a píxeles"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Expandir al padre"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Esqueleto…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Crear huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Reestablecer huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Show Bones"
+msgstr "Crear huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Crear cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Reestrablecer cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Ver"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Restablecer zoom"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Ajustar zoom…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centrar selección"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Encuadrar selección"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Ancla"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Insertar claves"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Insertar clave"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Insertar clave (pistas existentes)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copiar pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Restablecer pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Establecer valor"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Fijar (Pixeles):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Add %s"
+msgstr "Añadir todos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Adding %s..."
+msgstr "Añadiendo %s..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Crear nodo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Error al instanciar escena desde %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "Muy bien :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "No hay padre al que instanciarle un hijo."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Esta operación requiere un solo nodo seleccionado."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Cambiar Valor por Defecto"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Arrastrar y soltar + Mayús: Añadir nodo como hermano\n"
+"Arrastrar y soltar + Alt: Cambiar tipo de nodo"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Crear polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar polígono (quitar punto)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Crea un nuevo polígono desde cero."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Crear Poly3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Establecer handle"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#, fuzzy
+msgid "Add/Remove Color Ramp Point"
+msgstr "Añadir/quitar punto de rampa de color"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Modificar rampa de color"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Crear biblioteca de modelos 3D"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Miniatura…"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "¿Quieres borrar el elemento %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Añadir elemento"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Borrar elemento seleccionado"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importar desde escena"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Actualizar desde escena"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Elemento %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Elementos"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Editor de lista de elementos"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Crear polígono oclusor"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Editar polígono existente:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "Clic izquierdo: Mover punto."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl + clic izquierdo: Partir segmento en dos."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "Clic derecho: Borrar punto."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "¡El modelo está vacío!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Crear colisión estática triangular"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Crear colisión estática convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "¡No puedes hacer esto en una escena raíz!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Crear forma triangular"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Crear forma convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Crear modelo de navegación 3D"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "¡A MeshInstance le falta un modelo 3D!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "¡El modelo 3D no tiene una superficie en la que crear contornos!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "¡No se pudo crear el contorno!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Crear contorno"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Crear colisión estática triangular"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Crear colisión estática convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Crear colisión hermanada triangular"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Crear colisión hermanada convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Crear modelo 3D de contorno…"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Crear modelo 3D de contorno"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Tamaño del contorno:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"No se especificó ningún modelo 3D de origen (y no se ha establecido ningún "
+"MultiMesh en el nodo)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+"No se especificó ningún modelo de origen (y MultiMesh no contiene ningún "
+"Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "El origen del modelo es incorrecto (ruta incorrecta)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "El modelo elegido no es correcto (al no ser un MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "El modelo elegido no es correcto (no contiene ningún recurso Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Ninguna superficie de origen especificada."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "La superficie de origen es incorrecta (ruta inválida)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "La superficie de origen es inválida (sin geometría)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "La superficie de origen es inválida (sin caras)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "La superficie padre no tiene caras solidas para poblar."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "No se pudo mapear el area."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Elige un modelo 3D:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Seleccioná una Superficie Objetivo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Llenar superficie"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Llenar MultiMesh"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Superficie objetivo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Modelo 3D elegido:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Eje X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Eje Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Eje Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Eje vertical del modelo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotación al azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinación al azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Escala al azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Rellenar"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Crear polígono de navegación"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Quitar polígono y punto"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Error al cargar la imagen:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+"No hay píxeles que tengan menos de un 128/255 de transparencia en la imagen…"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Establecer máscara de emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Borrar máscara de emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Cargar máscara de emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Conteo de puntos generados:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "El nodo no contiene geometría."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "El nodo no contiene geometría (caras)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "¡Las caras no contienen área!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "¡Sin caras!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Generar AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Crear emisor a partir de modelo"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Crear emisor a partir de nodo"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Borrar emisor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Crear emisor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Posiciones de emisión:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Relleno de emisión:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Superficie"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volumen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Borrar punto de curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+#, fuzzy
+msgid "Add Point to Curve"
+msgstr "Añadir punto a curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Mover Punto en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Mover In-Control en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Mover Out-Control en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Seleccionar puntos"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Mayús + arrastrar: Seleccionar puntos de control"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+#, fuzzy
+msgid "Click: Add Point"
+msgstr "Clic: Añadir punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Clic derecho: Eliminar punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Seleccionar puntos de control (Mayús + arrastrar)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Añadir punto (en espacio vacío)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Dividir segmento (en curva)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Eliminar punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Cerrar curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Nº de punto en curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Establecer pos. de punto de curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Establecer pos. de entrada de curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Establecer pos. de salida de curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Dividir ruta"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Quitar Punto de ruta"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Crear mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformar mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Editor UV de polígonos en 2D"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Mover punto"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Rotar"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Mayús: Mover todos"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Mayús + Ctrl: Escalar"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Mover polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Rotar polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Escalar polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polígono->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Limpiar UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Adherir a cuadrícula"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Adherir a cuadrícula"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Rejilla"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "¡ERROR: No se pudo cargar el recurso!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Añadir recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Renombrar recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Eliminar recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "¡El portapapeles de recursos está vacío!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Cargar recurso"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Leer BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Duración:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Abrir archivos de sonido"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "¡ERROR: No se pudo cargar el archivo de sonido!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Añadir archivo de sonido"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Renombrar archivo de sonido"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Eliminar archivo de sonido"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Estéreo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Formato"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Altura"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error al guardar el tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error al guardar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Error al importar el tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Error al importar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importar tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Guardar tema como…"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Script siguiente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script anterior"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Archivo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Nuevo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Guardar todo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Recargar parcialmente el script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Previo en historial"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Siguiente en el historial"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Recargar tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Guardar tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Guardar tema como"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Cerrar documentación"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Cerrar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Buscar…"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Buscar siguiente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Depurar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Step Over"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Step Into"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Break"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continuar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Mantener el depurador abierto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Ventana"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Mover a la izquierda"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Mover a la derecha"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Tutoriales"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Abre https://godotengine.org en la sección de tutoriales."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Clases"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Buscar en la jerarquía de clases."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Buscar en la documentación de referencia."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Ir a anterior documento editado."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Ir a siguiente documento editado."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Crear script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Los siguientes archivos son nuevos en disco.\n"
+"¿Qué es lo que quieres hacer?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Volver a cargar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Volver a guardar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Depurador"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Los scripts integrados sólo se pueden editar cuando la escena a la que "
+"pertenecen está cargada"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Pick Color"
+msgstr "Color"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Subir"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Bajar"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Indentar a la izquierda"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Indentar a la derecha"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Des/activar comentario"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Clonar hacia abajo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Completar símbolo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Borrar espacios sobrantes al final"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Autoindentar"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Desactivar todos los «breakpoints»"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Ir a siguiente «breakpoint»"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Ir al «breakpoint» anterior"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Buscar anterior"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Reemplazar…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Ir a función…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Ir a línea…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Ayuda contextual"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Cambiar Constante Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Cambiar Constante Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Cambiar Constante RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Cambiar Operador Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Cambiar Operador Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Cambiar Operador Vec. Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Cambiar Operador RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Act/Desact. Solo Rot."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Cambiar Función Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Cambiar Función Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Cambiar Uniforme Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Cambiar Uniforme Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Cambiar Uniforme RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Cambiar Valor por Defecto"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Cambiar Uniforme XForm"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Cambiar Uniforme Textura"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Cambiar Uniforme Cubemap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Cambiar Comentarío"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+#, fuzzy
+msgid "Add/Remove to Color Ramp"
+msgstr "Añadir/quitar a/de rampa de color"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Añadir/quitar a/de mapa de curvas"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Modificar Mapa de Curvas"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Cambiar Nombre de Entrada"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Conectar Nodos de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Desconectar Nodo de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Quitar Nodo de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Mover Nodo de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Duplicar Nodo(s) de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Quitar Nodo(s) de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Error: Link de Conección Cíclico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Error: Conecciones de Entrada Faltantes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+#, fuzzy
+msgid "Add Shader Graph Node"
+msgstr "Añadir nodo de gráficos de sombreador"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ortogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspectiva"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Se ha cancelado la transformación."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transformación en el eje X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transformación en el eje Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transformación en el eje Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Ver transformación en plano."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Escalando al %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Girando %s grados."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Vista inferior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Fondo"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Vista superior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Cima"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Vista anterior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Detrás"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Vista frontal."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Frente"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Vista izquierda."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Izquierda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Vista derecha."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Derecha"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Poner claves está desactivado (no se insertaron claves)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Clave de animación insertada."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Alinear con vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Entorno"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Oyente de Audio"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Ventana de transformación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "¡No se ha elegido ninguna escena a instanciar!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Instanciar en cursor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "¡No se pudo instanciar la escena!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Modo movimiento (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Modo rotación (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Modo escalado (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Vista inferior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Vista superior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Vista anterior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Vista frontal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Vista izquierda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Vista derecha"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Intercambiar entre vista de perspectiva y ortogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Insertar clave de animación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Focus Origin"
+msgstr "Ver origen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Seleccionar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Alinear selección con visor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Coordenadas locales"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Ventana de transformación…"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Usar iluminación predeterminada"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Usar sRGB predeterminado"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 visor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 visores"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 visores (altern.)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 visores"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 visores (altern.)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 visores"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Mostrar normales"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Mostrar polígonos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Mostrar superposiciones"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Mostrar sin sombras"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Ver origen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Ver rejilla"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Ajustes de fijado"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Fijar desplazamiento:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Fijar rotación (grados):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Fijar escala (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Ajustes del visor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Iluminación por normales predeterminada:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Color de iluminación ambiental:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "Anchura de perspectiva (en grados):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Profundidad mínima de vista:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Profundidad máxima de vista:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Transformar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Mover:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Girar (grados):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Escalar (porcentaje):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Tipo de transformación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Previa"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Posterior"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERROR: ¡No se pudo cargar el recurso de cuadros!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Añadir cuadro"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "¡El portapapeles de recursos esta vacío o no es una textura!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Pegar cuadro"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Añadir elemento vacío"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Cambiar repetición de animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Cambiar FPS de animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vacío)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animaciones"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Velocidad (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Cuadros de animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Insertar vacío (antes)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Insertar vacío (después)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Arriba"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Abajo"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "Vista previa de StyleBox:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Modo de fijado:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Ninguno>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Adherir a píxeles"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Adherir a cuadrícula"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Autotrocear"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Desplazamiento:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Paso:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Separación:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Región de textura"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Editor de regiones de texturas"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Añadir todos los elementos"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Añadir todos"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Remover Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
+msgid "Theme"
+msgstr "Guardar tema"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Añadir elementos de clase"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Quitar elementos de clases"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Crear plantilla vacía"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Crear plantilla de editor vacía"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Elemento"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Casilla de verificación"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Casilla de verificación activa"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Tiene"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Muchas"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Opciones"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "¡Tienes,Muchas,Y,Variadas,Opciones!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Tab 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Tab 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Tab 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Tipo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Tipo de datos:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Icono"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Estilo"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Color"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Pintar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Borrar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Eliminar selección"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Encontrar tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transponer"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Voltear horizontalmente"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Voltear verticalmente"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Cubo"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Elegir Tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Seleccionar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Rotar 0 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Rotar 90 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Rotar 180 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Rotar 270 grados"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "No se pudo cargar el tile:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nombre o ID de Item:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "¿Crear desde escena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "¿Mergear desde escena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Crear desde escena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Unir desde escena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Error"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Editar opciones de script"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "¡Prueba exportando fuera de la carpeta del proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "¡Error al exportar el proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "¡Error al escribir el PCK de proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "No hay exportador para la plataforma '%s' aun."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Crear recurso nuevo"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Nombre válido"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transición"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Estado:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Contraseña:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Letras válidas:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Nuevo nombre:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Incluir"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Cambiar grupo de imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "¡El nombre del grupo no puede estar vacío!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "¡El nombre del grupo contiene una letra no permitida!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "¡El nombre de grupo ya existe!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Añadir grupo de imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Eliminar grupo de imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Vista previa del atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Ajustes de exportación del proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Objetivo"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Exportar a plataforma"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Recursos"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Exportar los recursos seleccionado (incluyendo dependencias)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Exportar todos los recursos en el proyecto."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exportar todos los archivos en la carpeta del proyecto."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Modo de exportación:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Recursos a exportar:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Acción"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para exportar archivos que no son recursos (separados por comas, ej: "
+"*.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para excluir de la exportación (separados por comas, ej: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Convertir escenas de texto a binario al exportar."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Mantener el original"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Comprimir para disco (Con pérdidas, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Comprimir para RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Convertir imágenes (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Calidad de compresión para disco (con pérdidas):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Reducir todas las imágenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Formatos de compresión:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Grupos de imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Grupos:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Comprimir para disco"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Comprimir para RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Modo de compresión:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Calidad con pérdidas:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Reducir por:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Vista previa del atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Filtrado de imágenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Imágenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Deseleccionar todo"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Grupo"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Sonidos"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Modo de conversión de muestreo: (archivos .wav):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Conservar"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Comprimir (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Tasa de muestreo máxima (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Recortar"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Silencio sobrante al final:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de exportación de scipts:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Proveer la Clave Debajo)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clave de cifrado de scripts (256-bits en hexadecimal):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exportar PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exportar PCK del proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Exportar…"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Exportar proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Presets de Exportación:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "¡La ruta del proyecto no es correcta, tiene que existir!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "La ruta del proyecto no es correcta, godot.cfg no debe existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "¡La ruta del proyecto no es correcta, godot.cfg debe existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Proyecto importado"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "La ruta del proyecto no es correcta (¿has cambiado algo?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "No se pudo crear godot.cfg en la ruta de proyecto."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Los siguientes archivos no se pudieron extraer del paquete:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "¡El paquete se ha instalado correctamente!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importar proyecto existente"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Ruta del proyecto (debe existir):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nombre del proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Crear proyecto nuevo"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Ruta del proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Instalar proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Instalar"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Examinar"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Nuevo proyecto de juego"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "BINGO!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Proyecto sin nombre"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "¿Seguro que quieres abrir más de un proyecto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "¿Seguro que quieres ejecutar más de un proyecto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"¿Quieres quitar proyecto de la lista? (El contenido de la carpeta no se "
+"modificarán)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"Estás a punto de analizar %s carpetas en busca de proyectos de Godot. "
+"¿Quieres continuar?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Administrador de proyectos"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Lista de proyectos"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Ejecutar"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Analizar"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Selecciona la carpeta a analizar"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Proyecto nuevo"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Salir"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Tecla "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Botón del mando"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Eje del mando"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Botón del ratón"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "La acción no es correcta (no puedes utilizar «/» o «:»)."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "¡La acción «%s» ya existe!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Renombrar evento de acción de entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Añadir evento de acción de entrada"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Control+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Presiona una tecla…"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Índice de botón del ratón:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Botón izquierdo"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Botón derecho"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Botón del medio"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Botón rueda arriba"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Botón rueda abajo"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Botón 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Botón 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Botón 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Botón 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Índice de ejes del mando:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Índice de botones del mando:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Añadir acción de entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Borrar evento de acción de entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Error al guardar los ajustes."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Los ajustes se han guardado correctamente."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Añadir traducción"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Quitar traducción"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Añadir ruta remapeada"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Añadir remapeo de recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Cambiar idioma de remapeo de recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Quitar remapeo de recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Quitar opción de remapeo de recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Ajustes de proyecto (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "General"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Propiedad:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Eliminar"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Copiar a plataforma…"
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Mapa de entradas"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Acción:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Dispositivo:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Índice:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Traducciones"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Traducciones"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Traducciones:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Añadir…"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Remapeos"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Recursos:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remapeos por idioma:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Idioma"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Ajuste…"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Transición entrada"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Transición salida"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Cero"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Transición entrada-salida"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Transición salida-entrada"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Archivo…"
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Dir…"
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Cargar"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Asignar"
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Script siguiente"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Error al cargar el archivo: ¡No es un recurso!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "No se pudo cargar la imagen"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, valor %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "Activado"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Propiedades:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Selecciones:"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Seleccionar puntos"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Modo de selección"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "No se pudo ejecutar la herramienta PVRTC:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Reemparentar nodo"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Reemparentar ubicación (selecciona un nuevo padre):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Mantener transformación global"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Reemparentar"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Crear recurso nuevo"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Abrir recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Guardar recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Herramientas de recursos"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Crear local"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Modo de ejecución:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Escena actual"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Escena principal"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argumentos de escena principal:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Ajustes de ejecución de escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "No hay padre donde instanciar la escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Error al cargar escena desde %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Aceptar"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"No se puede instanciar la escena '%s' porque la escena actual existe dentro "
+"de uno de sus nodos."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instanciar escenas"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Esta operación no puede ser hecha en el árbol raíz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Mover Nodo Dentro del Padre"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Mover Nodos Dentro del Padre"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplicar nodos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "¿Quieres borrar los nodos?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Esta operación no puede realizarse sin una escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Esta operación no puede realizarse en escenas instanciadas."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Guardar nueva escena como…"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "¡Entendido!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "¡No se puede operar sobre los nodos de una escena externa!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "¡No se puede operar sobre los nodos heredados por la escena actual!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Borrar nodos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"No se pudo guardar la escena nueva. Es posible que no se hayan podido "
+"satisfacer las dependencias (instancias)."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Error al guardar escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Error al duplicar escena para guardarla."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Editar grupos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Editar conexiones"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Borrar nodos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Añadir nodo hijo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar escena hija"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Cambiar tipo"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Añadir script"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Crear script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Unir desde escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Guardar Rama como Escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Eliminar (sin confirmar)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Añadir/crear nodo nuevo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instanciar un archivo de escena como Nodo. Crear una escena heredada si no "
+"existe ningún nodo raíz."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach a new or existing script for the selected node."
+msgstr "Crear un nuevo script para el nodo seleccionado."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear a script for the selected node."
+msgstr "Crear un nuevo script para el nodo seleccionado."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Act/Desact. Espacial Visible"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Act/Desact. CanvasItem Visible"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instancia:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+"El nombre del nodo no es correcto, las siguientes letras no están permitidas:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Renombrar nodo"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Árbol de escenas (nodos):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Hijos editables"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Cargar como temporal"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Descartar instancia"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir en el editor"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Limpiar heredado"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "¿Quieres limpiar la herencia? (No se puede deshacer)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "¡Borrar!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Selecciona un nodo"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "El nombre de clase padre no es correcto"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Letras permitidas:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "El nombre de clase no es correcto"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Nombre válido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/D"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "¡El nombre de clase no es correcto!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "¡El nombre de clase padre no es correcto!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "¡Ruta incorrecta!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "No se puede crear el script en el sistema de archivos."
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Error al cargar escena desde %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "La ruta está vacia"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "La ruta no es local"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Ruta base incorrecta"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "La extensión no es correcta"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Crear script"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "Script siguiente"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nombre de clase:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Script integrado"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Crear script de nodo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Advertencia"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Error:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Fuente:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Función:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Errores"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Proceso Hijo Conectado"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Inspeccionar instancia anterior"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Inspeccionar instancia siguiente"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Frames del Stack"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Variable"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Errores:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Stack Trace (si aplica):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Inspector Remoto"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Árbol de Escenas en Vivo:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Propiedades de Objeto Remoto: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitores"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Lista de Uso de Memoria de Video por Recurso:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Total:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Memoria de vídeo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Ruta de recursos"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tipo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Uso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Otros"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Controles seleccionados:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tipo de controles seleccionados:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Raíz de Edición en Vivo:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Establecer desde árbol"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Atajos"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Cambiar Radio de Luces"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Cambiar FOV de Cámara"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Cambiar Tamaño de Cámara"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Cambiar Radio de Shape Esférico"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Cambiar Radio de Shape Caja"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Cambiar Radio de Shape Cápsula"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Cambiar Altura de Shape Cápsula"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Cambiar longitud de forma de rayo"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Cambiar Alcances de Notificadores"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Cambiar Alcances de Notificadores"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance no contiene un recurso BakedLight."
+
+#~ msgid "Vertex"
+#~ msgstr "Vértice"
+
+#~ msgid "Fragment"
+#~ msgstr "Fragmento"
+
+#~ msgid "Lighting"
+#~ msgstr "Iluminación"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Des/activar persistencia"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Este item no puede hacerse visible porque el padre esta oculto. Desocultá "
+#~ "el padre primero."
+
+#~ msgid "File exists"
+#~ msgstr "El archivo ya existe"
+
+#~ msgid "Valid path"
+#~ msgstr "Ruta válida"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "El nodo personalizado no tiene ningún _get_output_port_unsequenced(idx,"
+#~ "wmem), pero se especificaron puertos no secuenciados."
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "No se puede acceder al subdir:"
+
+#~ msgid "Help"
+#~ msgstr "Ayuda"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Importar Recursos"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Insertar Claves (Ins)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Cima (Num7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Fondo (Shift+Num7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Izquierda (Num3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Derecha (Shift+Num3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Frente (Num1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Detrás (Shift+Num1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Perspectiva (Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Ortogonal (Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Slección (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Alinear con vista (Ctrl+Shift+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Cambiar Interpolación de Loop de Anim"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Activar/Desactivar interpolación al loopear animación."
+
+#~ msgid "Load Layout"
+#~ msgstr "Cargar Layout"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Editor de Regiones de Escalado"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "Sin textura en este nodo.\n"
+#~ "Asigná una textura para poder editar la región."
+
+#~ msgid "New Scene Root"
+#~ msgstr "Nueva Raíz de Escena"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Heredar Escena"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Binds (Parametros Extra):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Método En el Nodo:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "Volver a Cargar Script de Herramientas (Soft)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Editar Conecciones.."
+
+#~ msgid "Set Params"
+#~ msgstr "Setear Params"
+
+#~ msgid "Live Editing"
+#~ msgstr "Edicion al Instante"
+
+#~ msgid "File Server"
+#~ msgstr "Servidor de Archivos"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Hacer Deploy de Clientes del Servidor de Archivos"
+
+#~ msgid "Group Editor"
+#~ msgstr "Editor de Grupos"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Grupo(s) de Nodos"
+
+#~ msgid "Set region_rect"
+#~ msgstr "Setear region_rect"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Lista de Plugins:"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
new file mode 100644
index 0000000000..d921254859
--- /dev/null
+++ b/editor/translations/es_AR.po
@@ -0,0 +1,7092 @@
+# Spanish (Argentina) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Lisandro Lorea <lisandrolorea@gmail.com>, 2016.
+# Roger BR <drai_kin@hotmail.com>, 2016.
+# Sebastian Silva <sebastian@sugarlabs.org>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-12-04 06:03+0000\n"
+"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n"
+"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
+"godot-engine/godot/es_AR/>\n"
+"Language: es_AR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Argumento de tipo inválido para convert(), usá constantes TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"No hay suficientes bytes para decodificar bytes, o el formato es inválido."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "el argumento step es cero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "No es un script con una instancia"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "No está basado en un script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "No está basado en un archivo de recursos"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Formato de diccionario de instancias inválido (@path faltante)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Formato de diccionario de instancias inválido (no se puede cargar el script "
+"en @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"Formato de diccionario de instancias inválido (script inválido en @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Diccionario de instancias inválido (subclases inválidas)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Un nodo rindió(yielded) sin memoria de trabajo, por favor lee los docs sobre "
+"como usar yield correctamente!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"El nodo rindió(yielded), pero no retornó un estado de función en la primera "
+"memoria de trabajo."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"El valor de retorno debe ser asignado al primer elemento de la memoria de "
+"trabajo nodos! Arreglá tu nodo, por favor."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "El nodo retornó una secuencia de salida inválida: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Se encontró un bit de secuencia pero no el nodo en el stack, reportá el bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Stack overflow con la profundidad del stack: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funciones:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variables:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Señales:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "El nombre no es un identificador válido:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "El nombre ya esta en uso por otra func/var/señal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Renombrar Función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Renombrar Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Renombrar Señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Agregar Función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Agregar Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Agregar Señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Quitar Función"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Quitar Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Editando Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Quitar Señal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Editando Señal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Cambiar Expresión"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Agregar Nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantené pulsado Meta para depositar un Getter. Mantené pulsado Shift para "
+"depositar una firma generica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantené pulsado Ctrl para depositar un Getter. Mantené pulsado Shift para "
+"depositar una firma genérica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Mantené pulsado Meta para depositar una referencia simple al nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Mantené pulsado Ctrl para depositar una referencia simple al nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Mantené pulsado Meta para depositar un Variable Setter."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Mantené pulsado Ctrl para depositar un Variable Setter."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Agregar Nodo Preload"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Agregar Nodo(s) Desde Arbol"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Agregar Propiedad Getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Agregar Propiedad Setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Condición"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Secuencia"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Switch"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Iterador"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Mientras"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Retornar"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Llamar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Obtener"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Setear"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Editar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipo Base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Miembros:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nodos Disponibles:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Seleccioná o creá una función para editar el grafo"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Cerrar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Editar Argumentos de Señal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Editar Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Cambiar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Eliminar Seleccionados"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Act/Desact. Breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Encontrar Tipo de Nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Copiar Nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Cortar Nodos"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Pegar Nodos"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Tipo de input no iterable: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "El iterador se volvió inválido"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "El iterador se volvió inválido: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Nombre de propiedad indíce inválido."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "El objeto base no es un Nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "La ruta no apunta a un Nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nombre de propiedad índice '%s' inválido en nodo %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argumento inválido de tipo: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumentos inválidos: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet no encontrado en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet no encontrado en el script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"El nodo personalizado no tiene ningún método _step(), no se puede procesar "
+"el grafo."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Valor de retorno inválido de _step(), debe ser un entero (seq out), o string "
+"(error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "recién presionado"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "recién soltado"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"No se pudo leer el archivo de certificado. Son tanto la ruta como el "
+"password correctos?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "Error al crear el objeto firma."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Error al crear la firma del paquete."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"No se encontraron export templates.\n"
+"Descargá o instalá export templates."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Paquete debug personalizado no encontrado."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Paquete release personalizado no encontrado."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Nombre único inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "GUID de producto inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "GUID de publisher inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Color de fondo inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+"Dimensiones de la imagen para el Store Logo inválidas (debería ser 50x50)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+"Dimensiones de la imagen para el logo cuadrado de 44x44 inválidas (debería "
+"ser 44x44)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+"Dimensiones de la imagen para el logo cuadrado de 71x71 inválidas (debería "
+"ser 71x71)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+"Dimensiones de la imagen para el logo cuadrado de 150x150 inválidas (debería "
+"ser 150x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+"Dimensiones de la imagen para el logo cuadrado de 310x310 inválidas (debería "
+"ser 310x310)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+"Dimensiones de la imagen para el logo ancho de 310x150 inválidas (debería "
+"ser 310x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "Dimensiones de la imagen del splash inválidas (debería ser 620x400)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Un recurso SpriteFrames debe ser creado o seteado en la propiedad 'Frames' "
+"para que AnimatedSprite pueda mostrar frames."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Solo se permite un CanvasModulate visible por escena (o set de escenas "
+"instanciadas). El primero creado va a funcionar, mientras que el resto van a "
+"ser ignorados."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolylgon2D solo sirve para proveer de un collision shape a un nodo "
+"derivado de CollisionObject2D. Favor de usarlo solo como un hijo de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para darles un shape."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Un CollisionPolygon2D vacío no tiene efecto en la colisión."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D solo sirve para proveer de un collision shape a un nodo "
+"derivado de CollisionObject2D. Favor de usarlo solo como un hijo de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para darles un shape."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
+"recurso shape!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Se debe proveer una textura con la forma de la luz a la propiedad 'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Se debe setear(o dibujar) un polígono oclusor para que este oclusor tenga "
+"efecto."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "El polígono de este oclusor esta vacío. Dibujá un polígono!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Se debe crear o setear un recurso NavigationPolygon para que este nodo "
+"funcione. Por favor creá una propiedad o dibujá un polígono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance debe ser un hijo o nieto de un nodo Navigation2D. "
+"Solo provee datos de navegación."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer node solo funciona cuando esta seteado como hijo de un nodo "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Particles2D valido para funcionar."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D solo funciona cuando está seteado como hijo de un nodo Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Un recurso SampleLibrary debe ser creado o seteado en la propiedad 'samples' "
+"de modo que SamplePlayer pueda reproducir sonido."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Viewport válido para funcionar. "
+"Dicho Viewport debe ser seteado a modo 'render target'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"El Viewport seteado en la propiedad path debe ser seteado como 'render "
+"target' para que este sprite funcione."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funciona mejor cuando se usa con la raíz de escena "
+"editada directamente como padre."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape solo sirve para proveer un collision shape a un nodo derivado "
+"de un CollisionObject. Favor de usarlo solo como hijo de Area, StaticBody, "
+"RigidBody, KinematicBody, etc. para darles un shape."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Se debe proveer un shape para que CollisionShape funcione. Creale un recurso "
+"shape!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon solo sirve para proveer un collision shape a un nodo "
+"derivado de un CollisionObject. Favor de usarlo solo como hijo de Area, "
+"StaticBody, RigidBody, KinematicBody, etc. para darles un shape."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Un CollisionPolygon vacio no tiene ningún efecto en la colisión."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Se debe crear o setear un recurso NavigationMesh para que este nodo funcione."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance debe ser un hijo o nieto de un nodo Navigation. Solo "
+"provee datos de navegación."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"La propiedad Path debe apuntar a un nodo Spatial valido para funcionar."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Solo se permite un WorldEnvironment por escena (o conjunto de escenas "
+"instanciadas)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Un recurso SampleLibrary debe ser creado o seteado en la propiedad 'samples' "
+"de modo que SpatialSamplePlayer puede reproducir sonido."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' "
+"para que AnimatedSprite3D pueda mostrar frames."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alerta!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Confirmá, por favor..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "El Archivo Existe, Sobreescribir?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Todas Reconocidas"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Todos los Archivos (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Abrir"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Abrir un Archivo"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Abrir Archivo(s)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Abrir un Directorio"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Abrir un Archivo o Directorio"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Guardar"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Guardar un Archivo"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Crear Carpeta"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Ruta:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Directorios y Archivos:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Archivo:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nombre:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "No se pudo crear la carpeta."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Debe ser una extensión válida."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Dispositivo"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Botón"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Botón Izquierdo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Botón Derecho."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Botón del Medio."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Rueda Arriba."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Rueda Abajo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Eje"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Cortar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copiar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Pegar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Seleccionar Todo"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Limpiar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Deshacer"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Los popups se esconderán por defecto a menos que llames a popup() o "
+"cualquiera de las funciones popup*(). Sin embargo, no hay problema con "
+"hacerlos visibles para editar, aunque se esconderán al ejecutar."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Este viewport no está seteado como render target. Si tenés intención de que "
+"muestre contenidos directo a la pantalla, hacelo un hijo de un Control para "
+"que pueda obtener un tamaño. Alternativamente, hacelo un RenderTarget y "
+"asigná su textura interna a algún otro nodo para mostrar."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Error inicializando FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Formato de tipografía desconocido."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Error cargando tipografía."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Tamaño de tipografía inválido."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Desactivado"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Toda la Selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Mover Agregar Clave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Cambiar Transición de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Cambiar Transform de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Cambiar Valor de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Cambiar Call de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Agregar Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplicar Claves de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Subir Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Bajar Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Quitar Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Setear Transiciones a:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Renombrar Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Cambiar Interpolación de Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Cambiar Modo de Valor de Track de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Editar Nodo Curva"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Editar Curva de Selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Borrar Claves de Anim"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplicar Selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplicar Transpuesto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Quitar Selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Contínuo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discreto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Trigger"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Agregar Clave de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Mover Claves de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Escalar Selección"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Escalar Desde Cursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Ir a Paso Próximo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Ir a Paso Previo"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineal"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transiciones"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimizar Animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Hacer Clean-Up de Animación"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Crear NUEVO track para %s e insertar clave?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Crear %d NUEVOS tracks e insertar claves?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Crear"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Crear e Insertar Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Insertar Track y Clave de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Insertar Clave de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Cambiar Largo de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Cambiar Loop de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Crear Clave de Valor Tipado para Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Insertar Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Escalar Keys de Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Agregar Call Track para Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom de animación."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Largo (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Largo de Animación (en segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Paso (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Snap de cursor por pasos (en segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Activar/Desactivar loopeo en la animación."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Agregar nuevos tracks."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Subir el track actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Bajar el track actual."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Quitar el track seleccionado."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Herramientas de tracks"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Activar la edición de claves individuales al cliquearlas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optimizador de Anim."
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Error Lineal Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Error Angular Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Angulo Optimizable Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimizar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Seleccioná un AnimationPlayer de el Arbol de Escenas para editar animaciones."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Clave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transición"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Ratio de Escala:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Llamar Funciones en Cual Nodo?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Quitar claves inválidas"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Quitar tracks vacios y sin resolver"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Hacer clean-up de todas las animaciones"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Hacer Clean-Up de Animación(es) (IMPOSIBLE DESHACER!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Clean-Up"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimencionar Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Cambiar Tipo de Valor del Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Cambiar Valor del Array"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Buscar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Ordenar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Invertir"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Categoría:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Todos"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Sitio:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Soporte.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficial"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunidad"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Testeo"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Archivo ZIP de Assets"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Lista de Métodos Para '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Lista de Métodos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumentos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Retornar:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Ir a Línea"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Numero de Línea:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Sin Coincidencias"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d Ocurrencia(s) Reemplazada(s)."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Reemplazar"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Reemplazar Todo"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Coincidir Mayúsculas/Minúsculas"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Palabras Completas"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Solo Selección"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Buscar"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Encontrar"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Siguiente"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d Ocurrencia(s) Reemplazadas."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "No se encontró!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Reemplazar Por"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Respetar Mayúsculas/Minúsculas"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Hacia Atrás"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Preguntar Antes de Reemplazar"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Saltear"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Zoom In"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Zoom Out"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Resetear el Zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Linea:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Col:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "El método en el Nodo objetivo debe ser especificado!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"El método objetivo no fue encontrado! Especificá un método válido o agregá "
+"un script al Nodo objetivo."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Conectar a Nodo:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Agregar"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Quitar"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Agregar Argumento de Llamada Extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argumentos de Llamada Extras:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Ruta al Nodo:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Crear Función"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Diferido"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Oneshot"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Conectar"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Conectar '%s' a '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Conectando Señal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Crear Subscripción"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Conectar.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Desconectar"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Señales"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Crear Nuevo"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoritos:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recientes:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Coincidencias:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Descripción:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Buscar Reemplazo Para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dependencias Para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"La Escena '%s' esta siendo editada actualmente.\n"
+"Los cambios no tendrán efecto hasta recargarlo."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr "El recurso '%s' está en uso. Los cambios tendrán efecto al recargarlo."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Recursos"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Ruta"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dependencias:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Arreglar Rota(s)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor de Dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Buscar Reemplazo de Recurso:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Dueños De:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Los archivos que se están removiendo son requeridos por otros recursos para "
+"funcionar.\n"
+"Quitarlos de todos modos? (imposible deshacer)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Quitar los archivos seleccionados del proyecto? (imposible deshacer)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Error cargando:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+"La escena falló al cargar debido a las siguientes dependencias faltantes:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Abrir de Todos Modos"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Que Acción Se Debería Tomar?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Arreglar Dependencias"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Errores al cargar!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Eliminar permanentemente %d item(s)? (Imposible deshacer!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Es Dueño De"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Recursos Sin Propietario Explícito:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Explorador de Recursos Huérfanos"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Eliminar archivos seleccionados?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Eliminar"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nombre inválido."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Nombre inválido. No debe colisionar con un nombre existente de clases del "
+"engine."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Nombre inválido. No debe colisionar con un nombre existente de un tipo built-"
+"in."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nombre inválido. No debe colisionar con un nombre de constante global "
+"existente."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Ruta inválida."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "El archivo existe."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "No está en la ruta de recursos."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Agregar AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autocargar '%s' ya existe!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Renombrar Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Act/Desact. AutoLoad Globals"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Mover Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Quitar Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Activar"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Reordenar Autoloads"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nombre de Nodo:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nombre"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Lista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Actualizando Escena"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Guardando cambios locales.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Actualizando escena.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Elegí un Directorio"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Elegir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Retroceder"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Avanzar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Subir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Refrescar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Act/Desact. Archivos Ocultos"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Act/Desact. Favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Act/Desact. Modo"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Foco en Ruta"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Subir Favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Bajar Favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Vista Previa:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "EscanearFuentes"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Buscar en la Ayuda"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Lista de Clases:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Buscar Clases"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Clase:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Hereda:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Heredada por:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Descripción Breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Métodos Públicos:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Items de Tema de la GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Constantes:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Descripción Breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Descripción de Métodos:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Texto de Búsqueda"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Agregado:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Removido:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Error al guardar atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "No se pudo guardar la subtextura de altas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Almacenando Archivo:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Empaquetando"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportando para %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Configurando.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Salida:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Reimportando"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importando:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Nodo desde Escena"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Error al guardar el recurso!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Guardar Recurso Como.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Ya Veo.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "No se puede abrir el archivo para escribir:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Formato requerido de archivo desconocido:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Error al grabar."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Guardar Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analizando"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Creando Miniatura"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"No se pudo guardar la escena. Probablemente no se hayan podido satisfacer "
+"dependencias (instancias)."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Fallo al cargar recurso."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "No se puede cargar MeshLibrary para hacer merge!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Error guardando MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "No se puede cargar TileSet para hacer merge!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Error guardando TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "No se puede abir el zip de templates de exportación."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Cargando Templates de Exportación"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Error al tratar de guardar el layout!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Layout por defecto del editor sobreescrito."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nombre de layout no encontrado!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Se restauró el layout por defecto a sus seteos base."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copiar Params"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Pegar Parametros"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Pegar Recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copiar Recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Crear Built-In"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Crear Sub-Recurso Unico"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Abrir en la Ayuda"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "No hay escena definida para ejecutar."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"No se ha definido ninguna escena principal, ¿elegir una?\n"
+"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria "
+"'aplicacion'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La escena '%s' seleccionada no existe, ¿seleccionar una válida?\n"
+"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria "
+"'aplicacion'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La escena '%s' seleccionada no es un archivo de escena, ¿seleccionar uno "
+"válido?\n"
+"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria "
+"'aplicacion'."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"La escena actual nunca se guardó. Favor de guardarla antes de ejecutar."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "No se pudo comenzar el subproceso!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Abrir Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Abrir Escena Base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Abrir Escena Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Abrir Script Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Si"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Cerrar escena? (Los cambios sin guardar se perderán)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Guardar Escena Como.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Esta escena nunca ha sido guardada. Guardar antes de ejecutar?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Por favor guardá la escena primero."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Guardar Strings Traducibles"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exportar Librería de Meshes"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exportar Tile Set"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Salir"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Salir del editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Escena actual sin guardar. Abrir de todos modos?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "No se puede volver a cargar una escena que nunca se guardó."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Revertir"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Esta acción no se puede deshacer. Revertir de todos modos?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Ejecutar Escena Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr "Abrir el Gestor de Proyectos? (Los cambios sin guardar se perderán)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Elegí una Escena Principal"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Ugh"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Error al cargar la escena, debe estar dentro de la ruta del proyecto. Usa "
+"'Importar' para abrir la escena, luego guardala dentro de la ruta del "
+"proyecto."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Error al cargar la escena."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "La escena '%s' tiene dependencias rotas:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Guardar Layout"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Eliminar Layout"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Por Defecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Cambiar Pestaña de Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d archivo(s) más"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d archivo(s) o carpeta(s) más"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Ir a la escena abierta previamente."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Pestaña siguiente"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Pestaña anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operaciones con archivos de escena."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nueva Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nueva Escena Heredada.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Abrir Escena.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Guardar Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Guardar todas las Escenas"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Cerrar Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Cerrar e Ir a Escena Prev."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Abrir Reciente"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtrado Rápido de Archivos.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Convertir A.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Strings Traducibles.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Rehacer"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Ejecutar Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Configuración de Proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Revertir Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Salir a Listado de Proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Modo Sin Distracciones"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importar assets al proyecto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importar"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Herramientas misceláneas a nivel proyecto o escena."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Herramientas"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exportar el proyecto a munchas plataformas."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exportar"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Reproducir el proyecto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Reproducir"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Pausar la escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausar la Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Parar la escena."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Detener"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Reproducir la escena editada."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Reproducir Escena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Reproducir escena personalizada"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Reproducir Escena Personalizada"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opciones de debugueo"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Hacer Deploy con Debug Remoto"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Al exportar o hacer deploy, el ejecutable resultante tratara de contectarse "
+"a la IP de esta computadora de manera de ser debugueado."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Deploy Pequeño con Network FS"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Cuando esta opción está activa, exportar o hacer deploy producirá un "
+"ejecutable mínimo.\n"
+"El sistema de archivos sera proveido desde el proyecto por el editor sobre "
+"la red.\n"
+"En Android, deploy usará el cable USB para mejor performance. Esta opción "
+"acelera el testeo para juegos con footprint grande."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Collision Shapes Visibles"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Los Collision shapes y nodos raycast (para 2D y 3D) seran visibiles durante "
+"la ejecución del juego cuando esta opción queda activada."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navegación Visible"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Los meshes de navegación y los polígonos seran visibles durante la ejecución "
+"del juego si esta opción queda activada."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sincronizar Cambios de Escena"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Cuando esta opción este encendida, cualquier cambio hecho a la escena en el "
+"editor sera replicado en el juego en ejecución.\n"
+"Cuando se usa remotamente en un dispositivo, esto es mas eficiente con un "
+"sistema de archivos remoto."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Actualizar Cambios en Scripts"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Cuando esta opción esta activa, cualquier script que se guarde sera vuelto a "
+"cargar en el juego en ejecución.\n"
+"Cuando se use remotamente en un dispositivo, esto es mas eficiente con un "
+"sistema de archivos de red."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Configuración"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configuración del Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Layout del Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Act./Desact. Pantalla Completa"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Instalar Templates de Exportación"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Acerca de"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Alerta cuando un recurso externo haya cambiado."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Gira cuando la ventana del editor repinta!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Siempre Actualizar"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Actualizar Cambios"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "Desactivar Update Spinner"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Crear un nuevo recurso en memoria y editarlo."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Cargar un recurso existente desde disco y editarlo."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Guardar el recurso editado actualmente."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Guardar Como.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Ir al anterior objeto editado en el historial."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Ir al siguiente objeto editado en el historial."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Historial de objetos recientemente editados."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Propiedades del objeto."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "FileSystem"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Nodo"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Salida"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Reimportar"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Actualizar"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Gracias de parte de la comunidad Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Gracias!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importar Templates Desde Archivo ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exportar Proyecto"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Exportar Libreria"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Mergear Con Existentes"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Abrir y Correr un Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Erroes de carga"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Plugins Instalados:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Version:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Estado:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Parar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Iniciar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Medida:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Duracion de Frame (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Tiempo Promedio (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Frame %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "Fixed Frame %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Tiempo:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusivo"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Propio"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Frame #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Por favor aguarda a que el scan termine."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "La escena actual debe ser guardada para reimportar."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Guardar y Reimportar"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Reimportar Recursos Cambiados"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Escribir tu lógica en el método _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Ya hay una escena editada."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "No se pudo instanciar el script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Te olvidaste de la palabra clave 'tool'?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "No se pudo ejecutar el script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Te olvidaste del método '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Por Defecto (Igual que el Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Seleccionar Nodo(s) para Importar"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Ruta a la Escena:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importar Desde Nodo:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"No se puede abrir file_type_cache.cch para escribir, no se guardará el cache "
+"de tipos de archivo!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Archivos de origen y destino iguales, no se realizará ninguna acción."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Ruta de origen y destino iguales, no se realizará ninguna acción."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "No se pueden mover directorios dentro de si mismos."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "No se puede operar en '..'"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Elejí un Nuevo Nombre y Ubicación Para:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Ningún Archivo seleccionado!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instancia"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Editar Dependencias.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Ver Dueños.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copiar Ruta"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Renombrar o Mover.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Mover A.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Info"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Mostrar en Gestor de Archivos"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Reimportando.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Directorio Previo"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Directorio Siguiente"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Reescanear Sistema de Archivos"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Act/Desact. estado de carpeta como Favorito"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+"Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Mover"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Agregar al Grupo"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Quitar del Grupo"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Sin máscaras de bits para importar!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "La ruta de destino está vacía."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "La ruta de destino debe ser una ruta de recursos completa."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "La ruta de destino debe existir."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "La ruta de guardado esta vacía!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importar BitMasks"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Textura(s) de Origen:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Ruta de Destino:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Aceptar"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Máscara de Bits"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Sin archivo de tipografías de origen!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Sin recurso de tipografías de destino!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Extension de archivo inválida.\n"
+"Usá .fnt, por favor."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "No se puede cargar/procesar la tipografía de origen."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "No se pudo guardar la tipografía."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Tipografía de Origen:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Tamaño de la Tipografía de Origen:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Recurso de Dest:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "El veloz murciélago hindú comía feliz cardillo y kiwi."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Prueba:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opciones:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importar Tipografías"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Este archivo ya es un archivo de tipografías de Godot, por favor suministrar "
+"un archivo tipo BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Error al abrir como archivo BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Origen personalizado de tipografía inválido."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Tipografía"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Sin meshes para importar!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importar Mesh Individual"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Importar Mesh(es) de Origen:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Superficie %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Sin muestras que importar!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importar Muestras de Audio"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Muestra(s) de Origen:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Muestra de Audio"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nuevo Clip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opciones de Animación"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Flags"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "Hacer Bake de FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optimizar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Error Lineal Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Error Angular Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Angulo Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Clips"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Comienzo(s)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Fin(es)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Loop"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtros"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "La ruta de origen esta vacía."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "No se pudo cargar el script post-importación."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Script post-importación inválido o roto."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Error al importar escena."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importar Escena 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Escena de Origen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Igual que Escena de Destino"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Compartido"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Carpeta de Textura de Destino:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script de Postprocesado:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Tipo de Nodo Raiz Customizado:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "Nombre del Nodo Raíz:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Los Siguientes Archivos estan Faltando:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importar de Todos Modos"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importar y Abrir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"La escena editada no ha sido guardada, abrir la escena importada de todos "
+"modos?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importar Escena"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importando Escena.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Ejecutando Script Personalizado.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "No se pudo cargar el script post importación:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Script para post importación inválido/roto (revisá la consola):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Error ejecutando el script de post-importacion:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importar Imagen:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "No se puede importar un archivo sobre si mismo:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "No se pudo localizar la ruta: %s (ya es local)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Guardando.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animacion de Escena 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Sin Comprimir"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Compresión Sin Pérdidas (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Compresión con Pérdidas (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Comprimir (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Formato de Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Calidad de Compresión de Textura (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opciones de Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Por favor especificá algunos archivos!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Se necesita al menos un archivo para el Atlas."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Error al importar:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Solo se requiere un archivo para textura grande."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Tamaño Max. de Textura:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importar Texturas para Atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Tamaño de Celda:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Textura Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importar Texturas Grandes (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Textura de Origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Textura Base de Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Textura(s) de Origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importar Texturas para 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importar Texturas para 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Importar Texturas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Textura 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Textura 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Textura de Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"AVISO: Importar texturas 2D no es obligatorio. Simplemente copiá los "
+"archivos png/jpg al proyecto."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Cropear espacio vacio."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importar Textura Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Cargar Imagen de Origen"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Rebanar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Insertando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Guardando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "No se pudo guardar la textura grande:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Construir Atlar Para:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Cargando Imagen:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "No se pudo cargar la imagen:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Convirtiendo Imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Cropeando Imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Haciendo Blitting de Imágenes"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "No se pudo guardar la imagen de atlas:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "No se pudo guardar la textura convertida:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Fuente inválida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Fuente de traducción inválida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Columna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Lenguaje"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Sin elementos para importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Sin ruta de destino!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importar Traducciones"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "No se pudo importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importar Traducción"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "CSV de Origen:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignorar Primera Columna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Comprimir"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Agregar al Proyecto (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Importar Lenguajes:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Traducción"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "Setear MultiNodo"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Grupos"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Seleccionar un Nodo para editar Señales y Grupos."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Activar/Desact. Autoplay"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Nombre de Animación Nueva:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nueva Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Cambiar Nombre de Animación:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Quitar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ERROR: Nombre de animación inválido!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ERROR: El nombre de animación ya existe!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Renombrar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Agregar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Blendear Próximo Cambiado"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Cambiar Tiempo de Blend"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Cargar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplicar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ERROR: No hay animaciones para copiar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ERROR: No hay recursos de animación en el portapapeles!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animación Pegada"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Pegar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ERROR: No hay aniación que editar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Reproducir hacia atras la animación seleccionada desde la posicion actual (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+"Reproducir hacia atrás la animación seleccionada desde el final. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Detener la reproducción de la animación. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Reproducir animación seleccinada desde el principio. (Shift + D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Reproducir animación seleccionada desde la posicion actual. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Posición de animación (en segundos)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Escalar la reproducción de la animación globalmente para el nodo."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Crear nueva animación en el reproductor."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Cargar una animación desde disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Cargar una animación desde disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Guardar la animación actual"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Diaplay list de animaciones en el reproductor."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Autoreproducir al Cargar"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Editar Blend Times Objetivo"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Herramientas de Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Copiar Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Crear Nueva Animación"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nombre de Animación:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Error!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Blend Times:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Siguiente (Auto Queue):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Cross-Animation Blend Times"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animación"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Nuevo nombre:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Escala:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Fade In (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Fade Out (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Blend"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mix"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Auto Reiniciar:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Reiniciar (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Reiniciar al Azar (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Iniciar!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Cantidad:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blend:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Blend 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Blend 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Tiempo de Crossfade (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Actual:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Agregar Entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Limpiar Auto Avanzar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Setear Auto Avanzar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Eliminar Entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Renombrar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "El árbol de animación es válido."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "El árbol de animación es inválido."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nodo de Animación"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nodo OneShot"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Nodo Mix"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nodo Blend2"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nodo Blend3"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nodo Blend4"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nodo TimeScale"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nodo TimeSeek"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nodo Transición"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Importar Animaciones.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Editar Filtros de Nodo"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtros.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Parseando %d Triángulos:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Triangulo #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Configuración de Baker de Luces:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Parseando Geometría"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Fijando/Corrigiendo Luces"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Creando BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Creando Octree de Luces"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Creando Octree de Texturas"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Transferencia a Lightmaps:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Asignando Textura #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Haciendo Bake de Triangulo #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Postprocesando Textura #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Hacer Bake!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+"Resetear el proceso de bake del octree de mapa de luces (empezar de nuevo)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Vista Previa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Configurar Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Offset de Grilla:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Step de Grilla:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Offset de Rotación:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Step de Rotación:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Mover Pivote"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Mover Acción"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Editar Cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Editar CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Cambiar Anchors"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Zoom (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Pegar Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Seleccionar Modo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Arrastrar: Rotar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Arrastrae: Mover"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Presioná 'v' para Cambiar el Pivote, 'Shift+v' para Arrastrar el Pivote (al "
+"mover)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+Click Der.: Selección en depth list"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Modo Mover"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Modo Rotar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Mostrar una lista de todos los objetos en la posicion cliqueada\n"
+"(igual que Alt+Click Der. en modo selección)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Click para cambiar el pivote de rotación de un objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Modo Paneo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Inmovilizar Objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Desinmovilizar Objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Asegurarse que los hijos de un objeto no sean seleccionables."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Restaurar la habilidad de seleccionar los hijos de un objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Usar Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Mostrar la Grilla"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Usar Snap de Rotación"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Usar Snap Relativo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Configurar Snap.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Usar Pixel Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Expandir al Padre"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Esqueleto.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Crear Huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Reestablecer Huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Mostrar Huesos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Crear Cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Reestrablecer Cadena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Ver"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Resetear Zoom"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Setear Zoom.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centrar Selección"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Encuadrar Selección"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Anchor"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Insertar Claves"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Insertar Clave"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Insetar Clave (Tracks Existentes)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copiar Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Reestablecer Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Setear un Valor"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Snap (Pixeles):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "Agregando %s..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Crear Nodo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Error al instanciar escena desde %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "No hay padre al que instanciarle un hijo."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Esta operación requiere un solo nodo seleccionado."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "Cambiar typo por defecto"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Drag & drop + Shift : Agregar nodo como hermano\n"
+"Drag & drop + Alt : Cambiar tipo de nodo"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Crear Polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Polígono (Remover Punto)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Crear un nuevo polígono de cero."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Crear Poly3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Setear Handle"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Agregar/Quitar Punto de Rampa de Color"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Modificar Rampa de Color"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Crear Librería de Meshes"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Miniatura.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Remover item %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Agregar Item"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Remover Item Seleccionado"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importar desde Escena"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Acutalizar desde Escena"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Item %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Items"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Editor de Lista de Items"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Crear Polígono Oclusor"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Editar polígono existente:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "Click. Izq: Mover Punto."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl+Click Izq.: Partir Segmento en Dos."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "Click Der.: Borrar Punto."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "El Mesh esta vacío!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Crear Trimesh Body Estático"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Crear Body Convexo Estático"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Esto no funciona en una escena raiz!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Crear Trimesh Shape"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Crear Shape Convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Crear Mesh de Navegación"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "A MeshInstance le falta un Mesh!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "El mesh no tiene una superficie de donde crear contornos(outlines)!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "No se pudo crear el outline!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Crear Outline"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Crear Body Estático Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Crear Body Estático Convexo"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Crear Trimesh Collision Sibling"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Crear Collision Sibling Convexo"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Crear Outline Mesh.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Crear Outline Mesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Tamaño de Outline:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"No se especificó mesh de origen (y no hay MultiMesh seteado en el nodo)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "No se especificó mesh de origen (y MultiMesh no contiene ningún Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Mesh de origen inválido (ruta inválida)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Mesh de origen inválido (no es un MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Mesh de origen inválido (no contiene ningun recurso Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Ninguna superficie de origen especificada."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "La superficie de origen es inválida (ruta inválida)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "La superficie de origen es inválida (sin geometría)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "La superficie de origen es inválida (sin caras)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "La superficie padre no tiene caras solidas para poblar."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "No se pudo mapear el area."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Seleccioná una Mesh de Origen:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Seleccioná una Superficie Objetivo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Poblar Superficie"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Poblar MultiMesh"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Superficie Objetivo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Mesh de Origen:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Eje-X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Eje-Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Eje-Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Eje Arriba del Mesh:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotación al Azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinación al Azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Escala al Azar:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Poblar"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Crear Polígono de Navegación"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Remover Polígono y Punto"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Error al cargar la imagen:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Sin pixeles con transparencia > 128 en imagen.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Setear Máscara de Emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Limpiar Máscara de Emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Cargar Máscara de Emisión"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Conteo de Puntos Generados:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "El nodo no contiene geometría."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "El nodo no contiene geometría (caras)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Las caras no contienen area!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Sin caras!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Generar AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Crear Emisor desde Mesh"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Crear Emisor desde Nodo"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Limpiar Emisor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Crear Emisor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Posiciones de Emisión:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Relleno de Emisión:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Superficie"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volumen"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Remover Punto de Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Agregar Punto a Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Mover Punto en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Mover In-Control en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Mover Out-Control en Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Seleccionar Puntos"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Arrastrar: Seleccionar Puntos de Control"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Click: Agregar Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Click Derecho: Eliminar Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Seleccionar Puntos de Control (Shift+Arrastrar)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Agregar Punto (en espacio vacío)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Partir Segmento (en curva)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Eliminar Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Cerrar Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Punto # de Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Setear Pos. de Punto de Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Setear Pos. In de Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Setear Pos. Out de Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Partir Path"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Quitar Punto del Path"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Crear Mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformar Mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Editor UV de Polígonos 2D"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Mover Punto"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Rotar"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Mover Todos"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Escalar"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Mover Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Rotar Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Escalar Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polígono->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Limpiar UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Esnapear"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Activar Snap"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Grilla"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ERROR: No se pudo cargar el recurso!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Agregar Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Renombrar Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Eliminar Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Clipboard de Recursos vacío!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Cargar Recurso"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Parsear BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Largo:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Abrir Archivo(s) de Muestra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "ERROR: No se pudo cargar la muestra!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Agregar Muestra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Renombrar Muestra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Eliminar Muestra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Estereo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Formato"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Altura"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error al guardar el tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error al guardar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Error al importar el tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Error al importar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Guardar Tema Como.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Script siguiente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script anterior"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Archivo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Nuevo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Guardar Todo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Recarga Soft de Script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Previo en Historial"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Siguiente en Historial"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Recargar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Guardar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Guardar Tema Como"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Cerrar Docs"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Cerrar Todos"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Encontrar.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Encontrar Siguiente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Debuguear"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Step Over"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Step Into"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Break"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continuar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Mantener el Debugger Abierto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Ventana"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Mover a la Izquierda"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Mover a la Derecha"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Tutoriales"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Abrir https://godotengine.org en la sección de tutoriales."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Clases"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Buscar en la jerarquía de clases."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Buscar en la documentación de referencia."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Ir a anterior documento editado."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Ir a siguiente documento editado."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Crear Script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Los siguientes archivos son nuevos en disco.\n"
+"¿Qué acción se debería tomar?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Volver a Cargar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Volver a Guardar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Debugger"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Los scripts built-in solo pueden ser editados cuando la escena a la que "
+"pertenecen esta cargada"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Elegir Color"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Subir"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Bajar"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Indentar a la Izq"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Indentar a la Der"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Act/Desact. Comentario"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Clonar hacia Abajo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Completar Símbolo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Eliminar Espacios Sobrantes al Final"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Auto Indentar"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Quitar Todos los Breakpoints"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Ir a Próximo Breakpoint"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Ir a Anterior Breakpoint"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Encontrar Anterior"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Reemplazar.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Ir a Función.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Ir a Línea.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Ayuda Contextual"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Cambiar Constante Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Cambiar Constante Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Cambiar Constante RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Cambiar Operador Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Cambiar Operador Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Cambiar Operador Vec. Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Cambiar Operador RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Act/Desact. Solo Rot."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Cambiar Función Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Cambiar Función Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Cambiar Uniforme Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Cambiar Uniforme Vec."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Cambiar Uniforme RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Cambiar Valor por Defecto"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Cambiar Uniforme XForm"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Cambiar Uniforme Textura"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Cambiar Uniforme Cubemap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Cambiar Comentarío"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Agregar/Quitar a Rampa de Color"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Agregar/quitar a Mapa de Curvas"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Modificar Mapa de Curvas"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Cambiar Nombre de Entrada"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Conectar Nodos de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Desconectar Nodo de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Quitar Nodo de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Mover Nodo de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Duplicar Nodo(s) de Gráfico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Quitar Nodo(s) de Gráfico de Shaders"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Error: Link de Conección Cíclico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Error: Conecciones de Entrada Faltantes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Agregar Nodo de Gráficos de Shader"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ortogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspectiva"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transformación Abortada."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transformación en Eje-X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transformación en Eje-Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transformación en Eje-Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Ver Transformación en Plano."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Escalando a %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Torando %s grados."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Vista Inferior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Fondo"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Vista Superior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Cima"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Vista Anterior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Detrás"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Vista Frontal."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Frente"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Vista Izquierda."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Izquierda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Vista Derecha."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Derecha"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Poner claves está desactivado (no se insertaron claves)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Clave de Animación Insertada."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Alinear con vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Entorno"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Oyente de Audio"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Dialogo XForm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Ninguna escena seleccionada a la instancia!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Instancia en Cursor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "No se pudo instanciar la escena!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Modo Mover (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Modo Rotar (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Modo de Escalado (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Vista Inferior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Vista Superior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Vista Anterior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Vista Frontal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Vista Izquierda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Vista Derecha"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Intercambiar entre vista Perspectiva/Orthogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Insertar Clave de Animación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Foco en Origen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Foco en Selección"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Alinear Selección Con Vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Coordenadas Locales"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Dialogo de Transformación.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Usar Luz por Defecto"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Usar sRGB por Defecto"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Viewports (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Viewports (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Mostrar Normales"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Mostrar Wireframe"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Mostrar Overdraw"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Mostrar sin Sombreado"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Ver Origen"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Ver Grilla"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Ajustes de Snap"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Snap de Traslación:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Snap de Rotación (grados):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Snap de Escala (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Ajustes de Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Normales de Luces por Defecto:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Color de Luz Ambiental:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "FOV de Perspectiva (grados.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z-Near de Vista:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z-Far de Vista:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Cambio de Transformación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Trasladar:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Rotar (grados.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Scalar (ratio):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Tipo de Transformación"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pre"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Post"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERROR: No se pudo cargar el recurso de frames!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Agregar Frame"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "El portapapeles de recursos esta vacío o no es una textura!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Pegar Frame"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Agregar Vacío"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Cambiar Loop de Animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Cambiar FPS de Animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vacío)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animaciones"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Velocidad (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Cuadros de Animación"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Insertar Vacío (Antes)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Insertar Vacío (Después)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Arriba"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Abajo"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "Vista Previa de StyleBox:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Modo Snap:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Ninguno>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Pixel Snap"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Snap de Grilla"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Auto Rebanar"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Offset:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Paso:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Separación:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Región de Textura"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Editor de Regiones de Texturas"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "No se pudo guardar el tema a un archivo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Agregar Todos los Items"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Agregar Todos"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Remover Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Tema"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Agregar Items de Clases"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Quitar Items de Clases"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Crear Template Vacío"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Crear Template de Editor Vacío"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Tildar Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Item Tildado"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Tiene"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Muchas"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Opciones"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Tenés,Muchas,Variadas,Opciones!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Tab 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Tab 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Tab 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Tipo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Tipo de Datos:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Icono"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Estilo"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Color"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Pintar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Borrar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Eliminar Selección"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Encontrar tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transponer"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Espejar X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Espejar Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Balde"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Elegir Tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Seleccionar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Rotar 0 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Rotar 90 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Rotar 180 grados"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Rotar 270 grados"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "No se pudo cargar el tile:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nombre o ID de Item:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "¿Crear desde escena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "¿Mergear desde escena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Crear desde Escena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Mergear desde Escena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Error"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Editar Opciones de Script"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Por favor exportá afuera de la carpeta de proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Error al exportar el proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Error al escribir el PCK de proyecto!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "No hay exportador para la plataforma '%s' aun."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Crear Nuevo Recurso"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Nombre válido"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transición"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Estado:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Contraseña:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Nuevo nombre:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Incluir"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Cambiar Grupo de Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "El nombre del grupo no puede estar vacío!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Caracter invalido en el nombre de grupo!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "El nombre de grupo ya existe!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Agregar Grupo de Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Eliminar Grupo de Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Vista Previa de Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Ajustes de Exportación del Proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Objetivo"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Exportar a Plataforma"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Recursos"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Exportar los recursos seleccionado (incluyendo dependencias)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Exportar todos los recursos en el proyecto."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exportar todos los archivos en el directorio del proyecto."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Modo de Exportación:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Recursos a Exportar:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Acción"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para exportar archivos que no son recursos (separados por comas, ej: "
+"*.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para excluir de la exportación (separados por comas, ej: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Convertir escenas de texto a binario al exportar."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Mantener el Original"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Comprimir para Disco (Con pérdidas, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Comprimir para RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Convertir Imágenes (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Calidad de Compresión para Disco (con perdidas):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Reducir Todas las Imagenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Formatos de Compresión:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Grupos de Imágenes"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Grupos:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Comprimir para Disco"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Comprimir para RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Modo de Compresión:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Calidad con Pérdidas:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Reducir Por:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Vista Previa de Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Filtro de Imágenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Imágenes:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "No Seleccionar Ninguno"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Grupo"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Muestras"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Modo de Conversión de Muestras: (archivos .wav):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Conservar"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Comprimir (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Limite de Tasa de Sampleo (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Recortar"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Silencio Sobrante al Final:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de Exportación de Scipts:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Proveer la Clave Debajo)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clave de Encriptación de Script (256-bits como hex):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exportar PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exportar PCK de Proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Exportar.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Exportar Proyecto"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Presets de Exportación:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Ruta de proyecto inválida, la ruta debe existir!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Ruta de proyecto inválida, godot.cfg no debe existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Ruta de proyecto inválida, godot.cfg debe existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Proyecto Importado"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Ruta de proyecto inválida (cambiaste algo?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "No se pudo crear godot.cfg en la ruta de proyecto."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Los siguientes archivos no se pudieron extraer del paquete:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "El Paquete se Instaló Exitosamente!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importar Proyecto Existente"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Ruta del Proyecto (Debe Existir):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nombre del Proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Crear Proyecto Nuevo"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Ruta del Proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Instalar Proyecto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Instalar"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Examinar"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Nuevo Proyecto de Juego"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "BINGO!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Proyecto Sin Nombre"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "¿Estás seguro/a que querés abrir mas de un proyecto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "¿Estás seguro/a que querés ejecutar mas de un proyecto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"¿Quitar proyecto de la lista? (Los contenidos de la carpeta no serán "
+"modificados)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"Estas a punto de examinar %s carpetas en busca de proyectos de Godot. "
+"Confirmar?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Gestor de Proyectos"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Listado de Proyectos"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Ejecutar"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Escanear"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Seleccionar una Carpeta para Examinar"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Proyecto Nuevo"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Salir"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Tecla "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Bottón de Joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Eje de Joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Botón de Mouse"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Acción Invalida (cualquier cosa va menos '/' o ':')."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "La acción '%s' ya existe!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Renombrar Evento de Acción de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Agregar Evento de Acción de Entrada"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Control+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Presionar una Tecla.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Indice de Botones de Mouse:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Botón Izquierdo"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Botón Derecho"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Botón del Medio"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Botón Rueda Arriba"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Botón Rueda Abajo"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Botón 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Botón 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Botón 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Botón 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Indice de Ejes de Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Indice de Botones de Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Agregar Acción de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Borrar Evento de Acción de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Error al guardar los ajustes."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Ajustes guardados satisfactoriamente."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Agregar Traducción"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Quitar Traducción"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Agregar Path Remapeado"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Remapear Recurso Agregar Remap"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Cambiar Lenguaje de Remapeo de Recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Remover Remapeo de Recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Remover Opción de Remapeo de Recursos"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Ajustes de Proyecto (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "General"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Propiedad:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Eliminar"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Copiar A Plataforma.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Mapa de Entradas"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Acción:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Dispositivo:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Indice:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Localización"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Traducciones"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Traducciones:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Agregar.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Remapeos"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Recursos:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remapeos por Locale:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Locale"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Preseteo.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Ease In"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ease Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zero"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Easing In-Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Easing Out-In"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Archivo.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Dir.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Cargar"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Asignar"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Nuevo Script"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Error al cargar el archivo: No es un recurso!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "No se pudo cargar la imagen"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, val %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "On"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Propiedades:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Selecciones:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Seleccionar Propiedad"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Seleccionar Método"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "No se pudo ejecutar la herramienta PVRTC:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Reemparentar Nodo"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Reemparentar Ubicación (Seleccionar nuevo Padre):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Mantener Transformación Global"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Reemparentar"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Crear Nuevo Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Abrir Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Guardar Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Herramientas de Recursos"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Crear Local"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Modo de Ejecución:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Escena Actual"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Escena Principal"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argumentos de Escena Principal:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Ajustes de Ejecución de Escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "No hay padre donde instanciar la escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Error al cargar escena desde %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"No se puede instanciar la escena '%s' porque la escena actual existe dentro "
+"de uno de sus nodos."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instanciar Escena(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Esta operación no puede ser hecha en el árbol raíz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Mover Nodo Dentro del Padre"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Mover Nodos Dentro del Padre"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplicar Nodo(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Eliminar Nodo(s)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Esta operación no puede hacerse sin una escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Esta operación no puede ser realizada en escenas instanciadas."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Guardar Nueva Escena Como.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Tiene Sentido!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "No se puede operar sobre los nodos de una escena externa!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+"No se puede operar sobre los nodos de los cual hereda la escena actual!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Quitar Nodo(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"No se pudo guardar la escena nueva. Probablemente no se hayan podido "
+"satisfacer las dependencias (instancias)."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Error al guardar escena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Error al duplicar escena para guardarla."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Editar Grupos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Editar Conexiones"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Eliminar Nodo(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Agregar Nodo Hijo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar Escena Hija"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Cambiar Tipo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Adjuntar Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "Reestablecer Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Mergear Desde Escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Guardar Rama como Escena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Eliminar (Sin Confirmación)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Agregar/Crear un Nuevo Nodo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instanciar un archivo de escena como Nodo. Crear una escena heredada si no "
+"existe ningún nodo raíz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "Adjuntar un script nuevo o existente para el nodo seleccionado."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "Reestablecer un script para el nodo seleccionado."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Act/Desact. Espacial Visible"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Act/Desact. CanvasItem Visible"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instancia:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nobre de nodo inválido, los siguientes caracteres no estan permitidos:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Renombrar Nodo"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Arbol de Escenas (Nodos):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Hijos Editables"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Cargar Como Placeholder"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Descartar Instanciado"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir en Editor"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Limpiar Herencia"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Limpiar Herencia? (Imposible Deshacer!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Limpiar!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Seleccionar un Nodo"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Nombre de clase padre inválido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Nombre de clase inválido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Nombre válido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "El nombre de clase es inválido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "El nombre de la clase padre es inválido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Ruta inválida!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "No se puede crear el script en el sistema de archivos."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Error al cargar el script desde %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "La ruta está vacia"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "La ruta no es local"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Ruta base inválida"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Extensión invalida"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "Crear script nuevo"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "Cargar script existente"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nombre de Clase:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Script Integrado (Built-In)"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Adjuntar Script de Nodo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Advertencia"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Error:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Fuente:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Funcion:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Errores"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Proceso Hijo Conectado"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Inspeccionar Instancia Previa"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Inspeccionar Instancia Siguiente"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Frames del Stack"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Variable"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Errores:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Stack Trace (si aplica):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Inspector Remoto"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Árbol de Escenas en Vivo:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Propiedades de Objeto Remoto: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitores"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Lista de Uso de Memoria de Video por Recurso:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Total:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Mem. de Video"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Ruta de Recursos"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tipo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Uso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Misc"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Controles Cliqueados:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tipo de Controles Cliqueados:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Raíz de Edición en Vivo:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Setear Desde Arbol"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Atajos"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Cambiar Radio de Luces"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Cambiar FOV de Cámara"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Cambiar Tamaño de Cámara"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Cambiar Radio de Shape Esférico"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Cambiar Radio de Shape Caja"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Cambiar Radio de Shape Cápsula"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Cambiar Altura de Shape Cápsula"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Cambiar Largo de Shape Rayo"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Cambiar Alcances de Notificadores"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Cambiar Alcances de Notificadores"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance no contiene un recurso BakedLight."
+
+#~ msgid "Vertex"
+#~ msgstr "Vértice"
+
+#~ msgid "Fragment"
+#~ msgstr "Fragmento"
+
+#~ msgid "Lighting"
+#~ msgstr "Iluminación"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Act/Desact. Persistente"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Este item no puede hacerse visible porque el padre esta oculto. Desocultá "
+#~ "el padre primero."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Las rutas no pueden comenzar con '/', las rutas absolutas deben comenzar "
+#~ "con 'res://', 'user://'. o 'local://'"
+
+#~ msgid "File exists"
+#~ msgstr "El archivo existe"
+
+#~ msgid "Valid path"
+#~ msgstr "Ruta inválida"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "El nodo personalizado no tiene ningún _get_output_port_unsequenced(idx,"
+#~ "wmem), pero se especificaron puertos no secuenciados."
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "No se puede acceder al subdir:"
+
+#~ msgid "Help"
+#~ msgstr "Ayuda"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Importar Recursos"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Insertar Claves (Ins)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Cima (Num7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Fondo (Shift+Num7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Izquierda (Num3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Derecha (Shift+Num3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Frente (Num1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Detrás (Shift+Num1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Perspectiva (Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Ortogonal (Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Slección (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Alinear con vista (Ctrl+Shift+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Cambiar Interpolación de Loop de Anim"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Activar/Desactivar interpolación al loopear animación."
+
+#~ msgid "Load Layout"
+#~ msgstr "Cargar Layout"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Editor de Regiones de Escalado"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "Sin textura en este nodo.\n"
+#~ "Asigná una textura para poder editar la región."
+
+#~ msgid "New Scene Root"
+#~ msgstr "Nueva Raíz de Escena"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Heredar Escena"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Binds (Parametros Extra):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Método En el Nodo:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "Volver a Cargar Script de Herramientas (Soft)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Editar Conecciones.."
+
+#~ msgid "Set Params"
+#~ msgstr "Setear Params"
+
+#~ msgid "Live Editing"
+#~ msgstr "Edicion al Instante"
+
+#~ msgid "File Server"
+#~ msgstr "Servidor de Archivos"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Hacer Deploy de Clientes del Servidor de Archivos"
+
+#~ msgid "Group Editor"
+#~ msgstr "Editor de Grupos"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Grupo(s) de Nodos"
+
+#~ msgid "Set region_rect"
+#~ msgstr "Setear region_rect"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Lista de Plugins:"
diff --git a/editor/translations/extract.py b/editor/translations/extract.py
new file mode 100755
index 0000000000..616fec17a0
--- /dev/null
+++ b/editor/translations/extract.py
@@ -0,0 +1,121 @@
+#!/bin/python
+
+import fnmatch
+import os
+import shutil
+import subprocess
+import sys
+
+
+line_nb = False
+
+for arg in sys.argv[1:]:
+ if (arg == "--with-line-nb"):
+ print("Enabling line numbers in the context locations.")
+ line_nb = True
+ else:
+ os.sys.exit("Non supported argument '" + arg + "'. Aborting.")
+
+
+if (not os.path.exists("editor")):
+ os.sys.exit("ERROR: This script should be started from the root of the git repo.")
+
+
+matches = []
+for root, dirnames, filenames in os.walk('.'):
+ for filename in fnmatch.filter(filenames, '*.cpp'):
+ if (filename.find("collada") != -1):
+ continue
+ matches.append(os.path.join(root, filename))
+ for filename in fnmatch.filter(filenames, '*.h'):
+ if (filename.find("collada") != -1):
+ continue
+ matches.append(os.path.join(root, filename))
+matches.sort()
+
+
+unique_str = []
+unique_loc = {}
+main_po = """
+# LANGUAGE translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8-bit\\n"
+"""
+
+print("Updating the editor.pot template...")
+
+for fname in matches:
+
+ f = open(fname, "rb")
+
+ l = f.readline()
+ lc = 1
+ while (l):
+
+ patterns = ['RTR(\"', 'TTR(\"']
+ idx = 0
+ pos = 0
+ while (pos >= 0):
+ pos = l.find(patterns[idx], pos)
+ if (pos == -1):
+ if (idx < len(patterns) - 1):
+ idx += 1
+ pos = 0
+ continue
+ pos += 5
+
+ msg = ""
+ while (pos < len(l) and (l[pos] != '"' or l[pos - 1] == '\\')):
+ msg += l[pos]
+ pos += 1
+
+ location = os.path.relpath(fname).replace('\\', '/')
+ if (line_nb):
+ location += ":" + str(lc)
+
+ if (not msg in unique_str):
+ main_po += "\n#: " + location + "\n"
+ main_po += 'msgid "' + msg + '"\n'
+ main_po += 'msgstr ""\n'
+ unique_str.append(msg)
+ unique_loc[msg] = [location]
+ elif (not location in unique_loc[msg]):
+ # Add additional location to previous occurence too
+ msg_pos = main_po.find('\nmsgid "' + msg + '"')
+ if (msg_pos == -1):
+ print("Someone apparently thought writing Python was as easy as GDScript. Ping Akien.")
+ main_po = main_po[:msg_pos] + ' ' + location + main_po[msg_pos:]
+ unique_loc[msg].append(location)
+
+ l = f.readline()
+ lc += 1
+
+ f.close()
+
+
+f = open("editor.pot", "wb")
+f.write(main_po)
+f.close()
+
+if (os.name == "posix"):
+ print("Wrapping template at 79 characters for compatibility with Weblate.")
+ os.system("msgmerge -w79 editor.pot editor.pot > editor.pot.wrap")
+ shutil.move("editor.pot.wrap", "editor.pot")
+
+shutil.move("editor.pot", "editor/translations/editor.pot")
+
+# TODO: Make that in a portable way, if we care; if not, kudos to Unix users
+if (os.name == "posix"):
+ added = subprocess.check_output("git diff editor/translations/editor.pot | grep \+msgid | wc -l", shell=True)
+ removed = subprocess.check_output("git diff editor/translations/editor.pot | grep \\\-msgid | wc -l", shell=True)
+ print("\n# Template changes compared to the staged status:")
+ print("# Additions: %s msgids.\n# Deletions: %s msgids." % (int(added), int(removed)))
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
new file mode 100644
index 0000000000..41a686ba52
--- /dev/null
+++ b/editor/translations/fa.po
@@ -0,0 +1,6880 @@
+# Persian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# alabd14313 <alabd14313@yahoo.com>, 2016.
+# hamed nasib <cghamed752@chmail.ir>, 2016.
+# rezapouya <r.pouya@chmail.ir>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-12 12:55+0000\n"
+"Last-Translator: alabd14313 <alabd14313@yahoo.com>\n"
+"Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/fa/>\n"
+"Language: fa\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"نوع آرگومان برای متد ()convert ‌ نامعتبر است ،‌ از ثابت های *_TYPE‌ استفاده "
+"کنید ."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"تعداد بایت های مورد نظر برای رمزگشایی بایت ها کافی نیست ،‌ و یا فرمت نامعتبر "
+"است ."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "آرگومان step صفر است!"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not a script with an instance"
+msgstr "اسکریپتی با یک نمونه نیست ."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "بر اساس یک اسکریپت نیست."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "بر اساس یک فایل منبع نیست."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "فرمت دیکشنری نمونه نامعتبر (pass@ مفقود)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"فرمت نمونه ی دیکشنری نامعتبر است . ( نمی توان اسکریپت را از مسیر path@ "
+"بارگذاری کرد.)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "فرمت دیکشنری نمونه نامعتبر (اسکریپت نامعتبر در path@)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "نمونه ی دیکشنری نامعتبر است . (زیرکلاس‌های نامعتبر)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"یک گره بدون قرارگیری در حافظه ،‌ متوقف شده است. لطفا اسناد رسمی Godot‌ را برای "
+"یادگیری درست متوقف کردن(yield‌ کردن بازی)، مطالعه کنید."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"گره متوقف شده است، ولی وضعیت تابع را به اولین حافظه‌ی فعال برنگردانده است."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"مقدار بازگشتی باید به اولین المان گره فعال در حافظه ،تخصیص یابد!‌ لطفا گره "
+"خود را اصلاح کنید."
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid "Node returned an invalid sequence output: "
+msgstr "گره ،‌ یک سلسله خروجی نامعتبر را برگردانده است: "
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "بیت دنباله پیدا شد ولی گره موجود در پشته نه، باگ را گزارش کن!"
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid "Stack overflow with stack depth: "
+msgstr "سرریزی پشته با عمق پشته: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "وظایف:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "متغیرها:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "سیگنال ها:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "نام یک شناسه‌ی معتبر نیست:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "نام هم‌اکنون توسط تابع/متغیر/سیگنال استفاده شده است:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "تغییر نام نقش"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "تغییر متغیر"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Signal را تغییر نام بده"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "افزودن وظیفه"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "افزودن متغیر"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Signal را اضافه کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "برداشتن نقش"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "برداشتن متغیر"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "ویرایش متغیر:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "برداشتن موج"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "ویرایش سیگنال:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "افزودن گره"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "افزودن گره"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "گره(ها) را از درخت اضافه کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "دارایی Getter را اضافه کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "دارایی Setter را اضافه کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "انتقال"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "بازگشت:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "فراخوانی"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "ویرایش کردن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "نوع پایه:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "عضوها:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "گره های موجود:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "یک تابع انتخاب یا ایجاد کنید تا گراف را ویرایش کنید"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "بستن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "آرگومان‌های سیگنال را ویرایش کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "متغیر را ویرایش کن:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "تغییر بده"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "انتخاب شده را حذف کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "یک Breakpoint درج کن"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "پیدا کردن نوع گره"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "مسیر به سمت گره:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "نوع ورودی قابل تکرار نیست: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+#, fuzzy
+msgid "Iterator became invalid"
+msgstr "تکرارگر نامعتبر شد"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+#, fuzzy
+msgid "Iterator became invalid: "
+msgstr "تکرارگر نامعتبر شد: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "نام دارایی ایندکس نامعتبر."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "شیء پایه یک گره نیست!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "مسیربه یک گره نمی رسد!‌"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "نام دارایی ایندکس نامعتبر 's%' در گره s%."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": آرگومان نوع نامعتبر "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": آرگومان‌های نامعتبر: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet در اسکریپت پیدا نشد: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet در اسکریپت پیدا نشد: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "گره سفارشی بدون متد ()step_ نمی‌تواند گراف را پردازش کند."
+
+#: modules/visual_script/visual_script_nodes.cpp
+#, fuzzy
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"مقدار بازگشتی نامعتبر از ()step_ ، باید integer (seq out) ، یا string "
+"(error) باشد."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "نام نامعتبر."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "اندازه‌ی قلم نامعتبر."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"یک منبع SpriteFrames باید در دارایی Frames ایجاد یا تنظیم شود تا "
+"AnimatedSprite فریم‌ها را نمایش دهد."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"تنها یک CanvasModulate نمایان به ازای هر صحنه (یا یک مجموعه از صحنه‌های "
+"نمونه‌گذاری شده) مجاز است. اولین مورد ایجاد شده کار خواهد کرد، در حالیکه از "
+"بقیه صرفنظر می‌شود."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D تنها برای فراهم کردن یک شکل برخورد برای یک گره مشتق‌شده‌ی "
+"CollisionObject2D بکار می‌رود. لطفا از آن تنها به عنوان یک فرزند Area2D و "
+"StaticBody2D و RigidBody2D و KinematicBody2D و غیره استفاده کنید تا به آن‌ها "
+"یک شکل بدهید."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "یک CollisionPolygon2D خالی اثری بر برخورد ندارد."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D تنها برای فراهم کردن یک شکل برخورد برای یک گره مشتق‌شده‌ی "
+"CollisionObject2D بکار می‌رود. لطفا از آن تنها به عنوان یک فرزند Area2D و "
+"StaticBody2D و RigidBody2D و KinematicBody2D و غیره استفاده کنید تا به آن‌ها "
+"یک شکل بدهید."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"یک شکل باید برای CollisionShape2D فراهم شده باشد تا عمل کند. لطفا یک شکل "
+"منبع برای آن ایجاد کنید!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "یک بافت با شکل نور باید برای دارایی texture فراهم شده باشد."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"یک چندضلعی مسدود باید برای این مسدودکننده (occluder) تنظیم (یا ترسیم) شود تا "
+"تأثیرگذار باشد."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "چندضلعی مسدود برای این مسدودکننده، خالی است. لطفا یک چندضلعی رسم کنید!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"یک منبع NavigationPolygon باید برای این گره تنظیم یا ایجاد شود تا کار کند. "
+"لطفا یک دارایی تعیین یا یک چندضلعی ترسیم کنید."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance باید یک فرزند یا نوه‌ی یک گره Navigation2D باشد. "
+"این تنها یک داده‌ی پیمایش را فراهم می‌کند."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"گره ParallaxLayer تنها در زمانی که به عنوان فرزند یک گره ParallaxBackground "
+"تنظیم شود کار می‌کند."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "دارایی Path باید به یک گره Particles2D معتبر اشاره کند تا کار کند."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D تنها در زمانی که به عنوان یک فرزند یک گره Path2D تنظیم شود کار "
+"می‌کند."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "دارایی Path باید به یک گره Node2D معتبر اشاره کند تا کار کند."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"یک منبع SampleLibrary باید در دارایی samples ایجاد یا تنظیم شود تا "
+"SamplePlayer آهنگ را پخش کند."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"دارایی Path باید به یک گره Viewport معتبر اشاره کند تا کار کند. این Viewport "
+"باید روی حالت render target تنظیم شود."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Viewport تنظیم شده در داریی path باید به صورت render target برای این اسپرایت "
+"تنظیم شود تا کار کند."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D زمانی بهتر کار می‌کند که در یک ریشه‌ی صحنه‌ی ویرایش شده به "
+"صورت پدر (parent) استفاده شود."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape تنها برای فراهم کردن یک شکل برخورد برای یک گره مشتق‌شده‌ی "
+"CollisionObject به کار می‌رود. لطفا از آن تنها به عنوان یک فرزند Area و "
+"StaticBody و RigidBody و KinematicBody و غیره استفاده کنید تا به آن‌ها یک شکل "
+"بدهید."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"باید یک شکل برای CollisionShape فراهم شده باشد تا عمل کند. لطفا یک منبع شکل "
+"برای آن ایجاد کنید!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon تنها برای فراهم کردن یک شکل برخورد برای یک گره مشتق‌شده‌ی "
+"CollisionObject به کار می‌رود. لطفا از آن تنها به عنوان یک فرزند Area و "
+"StaticBody و RigidBody و KinematicBody و غیره استفاده کنید تا به آن‌ها یک شکل "
+"بدهید."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "یک CollisionPolygon خالی تأثیری بر برخورد ندارد."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr "یک منبع NavigationMesh باید برای یک گره تنظیم یا ایجاد شود تا کار کند."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance باید یک فرزند یا نوه‌ی یک گره Navigation باشد. این "
+"تنها داده‌ی پیمایش را فراهم می‌کند."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "دارایی Path باید به یک گره Particles2D معتبر اشاره کند تا کار کند."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"فقط یک WorldEnvironment در هر صحنه (یا مجموعه ای از صحنه های نمونه‌گذاری شده) "
+"مجاز است."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"یک منبع SampleLibrary باید در دارایی samples ایجاد یا تنظیم شده باشد تا "
+"SpatialSamplePlayer آهنگ را پخش کند."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"یک منبع SpriteFrames باید در دارایی Frames ایجاد شده باشد تا "
+"AnimatedSprite3D فریم‌ها را نمایش دهد."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "لغو"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "موافقت"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "هشدار!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "لطفا تأیید کنید..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "فایل وجود دارد، آیا بازنویسی شود؟"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "همه ی موارد شناخته شده اند."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "تمام پرونده‌ها (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "باز کن"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "یک پرونده را باز کن"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "پرونده(ها) را باز کن"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "یک دیکشنری را باز کن"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "یک پرونده یا پوشه را باز کن"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "ذخیره کن"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "یک پرونده را ذخیره کن"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "پوشه ایجاد کن"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "مسیر:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "پوشه‌ها و پرونده‌ها:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "پرونده:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "صافی:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "نام:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "نمی‌تواند یک پوشه ایجاد شود."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "باید از یک پسوند معتبر استفاده شود."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "+Shift"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "+Alt"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "+Ctrl"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "+Meta"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "دستگاه"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "دکمه"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "دکمه‌ی چپ."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "دکمه‌ی راست."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "دکمه‌ی وسط."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "غلطاندن به بالا."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "غلطاندن به پایین."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "محور"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "بریدن"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "کپی کردن"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "چسباندن"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "انتخاب همه"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "پاک کردن"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "خنثی کردن (Undo)"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popup ها به صورت پیش‌فرض مخفی می‌شوند مگر اینکه ()popup یا یکی از توابع "
+"()*popup را فراخوانی کنید. در هر صورت نمایان کردن آن‌ها برای ویرایش خوب است، "
+"اما به محض اجرا مخفی می‌شوند."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"این viewport به صورت render target تنظیم نیست. اگر قصد دارید که محتویاتش را "
+"به صورت مستقیم در صفحه‌نمایش نمایش دهد، آن را یک فرزند یک Control قرار دهید "
+"تا بتواند یک اندازه بگیرد. در غیر اینصورت، آن را یک RenderTarget قرار دهید و "
+"بافت داخلی آن را برای نمایش به تعدادی گره تخصیص دهید."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "خطا در ارزش‌دهی آغارین به FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "فرمت قلم ناشناخته."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "خطای بارگذاری قلم."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "اندازه‌ی قلم نامعتبر."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "غیرفعال شده"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "همه‌ی انتخاب ها"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "کلید Add را جابجا کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "مقدار را در انیمیشن تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "فراخوانی را در انیمیشن تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "کلیدها را در انیمیشن حذف کن"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "انتخاب شده را به دو تا تکثیر کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "ترانهاده را به دو تا تکثیر کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "برداشتن انتخاب شده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "مستمر"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "گسسته"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "تریگر"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "یک کلید در انیمیشن اضافه کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "کلیدها را در انیمیشن جابجا کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "از مکان‌نما تغییر مقیاس بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "به گام بعدی برو"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "به گام قبلی برو"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "خطی"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "ثابت"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "داخل"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "خارج"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "داخل-خارج"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "خارج-داخل"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "انتقال‌ها"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "انیمیشن را بهینه‌سازی کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "انیمیشن را پاکسازی کن"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Create NEW track for %s and insert key?"
+msgstr "یک ترک جدید برای s% ایجاد کن و کلید را درج کن؟"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "تعداد d% ترک جدید ایجاد، و کلیدها را درج کن؟"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "ایجاد کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "ایجاد و درج در انیمیشن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "درج ترک و کلید در انیمیشن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "کلید را در انیمیشن درج کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "طول انیمیشن را تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "حلقه انیمیشن را تغییر بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "کلید مقدار دارای نوع را در انیمیشن ایجاد کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "در انیمیشن درج کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "کلیدها را در انیمیشن تغییر مقیاس بده"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "ترک فراخوانی را در انیمیشن اضافه کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "بزرگنمایی در انیمیشن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "طول(ها):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "طول انیمیشن (به ثانیه)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "گام(ها):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "گام چسبنده‌ی مکان‌نما (به ثانیه)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "ایجاد حلقه را در انیمیشن فعال/غیر فعال کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "ترک‌های جدید اضافه کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "ترک جاری را به بالا جابجا کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "ترک جاری را به پایین جابجا کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "ترک انتخاب شده را حذف کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "ابزارهای ترک"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "ویرایش کلیدهای انفرادی با کلیک بر روی آن‌ها را فعال کن."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "بهینه‌ساز انیمیشن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "خطای Max. Linear:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "خطای Max. Angular:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "زاویه‌ی قابل بهینه‌سازی بیشینه:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "بهینه‌سازی کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"یک AnimationPlayer از درخت صحنه انتخاب کنید تا انیمیشن‌ها را ویرایش کنید."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "کلید"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "انتقال"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "نسبت تغییر مقیاس:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "توابع را در کدام گره فراخوانی کند؟"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "کلیدهای نامعتبر را حذف کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "ترک‌های حل نشده و خالی را حذف کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "تمام انیمیشن‌ها را پاکسازی کن"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "انیمیشن(ها) را پاکسازی کن (نه UNDO !)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "پاکسازی"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "آرایه را تغییر اندازه بده"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "نوع مقدار آرایه را تغییر بده"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "مقدار آرایه را تغییر بده"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "جستجو:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "مرتب‌سازی:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "معکوس"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "طبقه‌بندی:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "همه"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "تارنما:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "پشتیبانی.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "دفتری"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "انجمن"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "آزمودن"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "فایل های ZIP‌ منابع بازی"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "لیست متد برای 's%' :"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "فهرست متدها:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "نشانوندها:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "بازگشت:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "برو به خط"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "شماره خط:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "تطبیقی ندارد"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "تعداد d% رخداد جایگزین شد."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "جایگزینی"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "جایگزینی همه"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "بین حروف کوچک و بزرگ لاتین تمایز قائل شو"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "عین کلمات (بدون هیچ کم و کاستی)"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "تنها در قسمت انتخاب شده"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "جستجو"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "یافتن"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "بعدی"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "تعداد d% رخداد جایگزین شد."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "چیزی یافت نشد!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "جایگزین کردن با"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "حساس به حالت (حروف لاتین)"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "به سمت عقب"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "موقع جایگزینی از کاربر بپرس"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "رد کردن"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "بزرگنمایی بیشتر"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "بزرگنمایی کمتر"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "بازنشانی بزرگنمایی"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "خط:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "ستون:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "متد در گره مقصد باید مشخص شده باشد!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "اتصال به گره:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "افزودن"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "برداشتن"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "آرگومان اضافی فراخوانی را اضافه کن:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "آرگومان‌های اضافی فراخوانی:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "مسیر به سمت گره:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "تابع را بساز"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "معوق"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Oneshot"
+msgstr "تک شات"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "اتصال"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "'s%' را به 's%' متصل کن"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "اتصال سیگنال:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "در حال اتصال..."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "عدم اتصال"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "سیگنال‌ها"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "جدید ایجاد کن"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "تطبیق‌ها:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "توضیح:"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Search Replacement For:"
+msgstr "جستجو کن جایگزینی را برای:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "بستگی‌ها برای:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"صحنه‌ی 's%' در حال حاضر ویرایش شده است.\n"
+"تغییرات مؤثر نخواهد بود مگر با بارگذاری مجدد."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"منابع 's%' در حال استفاده است.\n"
+"تغییرات با بارگذاری مجدد مؤثر خواهد بود."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "بستگی‌ها"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "منبع"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "مسیر"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "بستگی‌ها:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "(بستگی) معیوب را تعمیر کن"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "ویرایشگر بستگی"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "منبع جایگزینی را جستجو کن:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "مالکانِ:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"پرونده‌هایی که می‌خواهید حذف شوند برای منابع دیگر مورد نیاز هستند تا کار "
+"کنند.\n"
+"آیا در هر صورت حذف شوند (بدون undo)؟"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "آیا پرونده‌های انتخاب شده از پروژه حذف شوند؟ (بدون undo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "خطا در بارگذاری:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "خطا در بارگذاری صحنه به دلیل بستگی‌های مفقود:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "در هر صورت باز کن"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "کدام عمل باید اجرا شود؟"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "بستگی‌ها را تعمیر کن"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "خطا در بارگذاری!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "به طور دائمی تعداد 'd%' آیتم را حذف کند؟ (بدون undo !)"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Owns"
+msgstr "مال خود"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "منابع بدون مالکیت صریح:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "پوینده‌ی منبع جدا افتاده"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "آیا پرونده‌های انتخاب شده حذف شود؟"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "حذف کن"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "نام نامعتبر."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "کاراکترهای معتبر:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "نام نامعتبر. نباید با یک نام کلاس موجود در موتور برخوردی داشته باشد."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "نام نامعتبر. نباید یا یک نام نوع توکار برخوردی داشته باشد."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr "نام نامعتبر. نباید با نام یک ثابت سراسری موجود برخوردی داشته باشد."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "مسیر نامعتبر."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "پرونده موجود نیست."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "در مسیرِ منبع نیست."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "بارگذاری خودکار (AutoLoad) را اضافه کن"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "بارگذاری خودکار را تغییر نام بده"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "فهرست کلاس:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "جستجوی کلاسها"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "کلاس:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "میراث:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "به ارث رسیده به وسیله:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "خلاصه توضیحات:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "خلاصه توضیحات:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "جستجوی متن"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "افزوده شده:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "برداشته شده:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " خروجی:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "در حال وارد کردن دوباره..."
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "ذخیره منبع از ..."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "من میبینم ..."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "ذخیره سازی صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "در حال پردازش"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "باز کردن راهنما"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "باز کردن صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "تایید"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "ذخیره صحنه در ..."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "خروج"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "از ویرایشگر خارج می شوید؟"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "پیشفرض"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "زبانه بعدی"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "زبانه قبلی"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "صحنه جدید"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "ابزارها"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "پخش"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "پخش صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "پخش سفارشی صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "پخش سفارشی صحنه"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "ترجیحات"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "ویرایشگر ترجیحات"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "حالت تمام صفحه"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "معرفی"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "به روز رسانی دامی"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "ذخیره در..."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "خروجی"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "بروز رسانی"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "تشکرات!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "واردکردن قالب ها از درون یک فایل ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "صادر کردن پروژه"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "صادکردن فایل کتابخانه ای"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "ترکیب کردن با نمونه ی موجود"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "گذرواژه:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "باز کردن و اجرای یک اسکریپت"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "خطاهای بارگذاری"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "افزونه های نصب شده:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "نسخه:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "خالق:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "وضعیت:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "زمان:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"کلاغ فرز و چابک، ظهر هر روز با صدای ضخیم و عذاب‌آورش بـه جستجوی یک مثقال گنج "
+"پنهان در حیاط رژه می رفت."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "انتخاب حالت"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "نوع مقدار آرایه را تغییر بده"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "بستن"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "پوشه ایجاد کن"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "انتقال"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "وضعیت:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "گذرواژه:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "کاراکترهای معتبر:"
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "نمونه ها"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"شما درخواست بررسی پوشه های ٪‌ را برای پیدا کردن پروژه های Godot‌ را داده اید. "
+"آیا انجام این عمل را تایید می کنید!؟‌"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "صحنه جدید"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "دارایی Setter را اضافه کن"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "انتخاب حالت"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "صحنه جدید"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "صحنه جدید"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "خذف(تایید نشده)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "خطای بارگذاری قلم."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "جدید ایجاد کن"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "صحنه جدید"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance محتوی یک منبع BakedLight نیست."
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "گره سفارشی دارای get_output_port_unsequenced(idx,wmem)_ نیست، اما پورت‌های "
+#~ "نامتوالی مشخص شده است."
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
new file mode 100644
index 0000000000..2c4f7144fe
--- /dev/null
+++ b/editor/translations/fr.po
@@ -0,0 +1,7163 @@
+# French translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Brice <bbric@free.fr>, 2016.
+# Chenebel Dorian <LoubiTek54@gmail.com>, 2016.
+# derderder77 <derderder77380@gmail.com>, 2016.
+# finkiki <specialpopol@gmx.fr>, 2016.
+# Hugo Locurcio <hugo.l@openmailbox.org>, 2016.
+# Marc <marc.gilleron@gmail.com>, 2016.
+# Nicolas Lehuen <nicolas@lehuen.com>, 2016.
+# Omicron <tritonic.dev@gmail.com>, 2016.
+# Onyx Steinheim <thevoxelmanonyx@gmail.com>, 2016.
+# rafeu <duchainer@gmail.com>, 2016.
+# Rémi Verschelde <rverschelde@gmail.com>, 2016.
+# Roger BR <drai_kin@hotmail.com>, 2016.
+# Thomas Baijot <thomasbaijot@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-12-15 22:36+0000\n"
+"Last-Translator: Nicolas Lehuen <nicolas@lehuen.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
+"godot/fr/>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.10\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Argument invalide de type convertir(), utiliser le TYPE * constantes."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Pas assez d'octets pour les octets de décodage, ou format non valide."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "L'argument du pas est zéro!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "N'est pas un script avec une instance"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "N'est pas basé sur un script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "N'est pas basé sur un fichier de ressource"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Instance invalide pour le format de dictionnaire (@path manquant)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Instance invalide pour le format de dictionnaire (impossible de charger le "
+"script depuis @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"Instance invalide pour le format de dictionnaire (script invalide dans @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+"Instance invalide pour le format de dictionnaire (sous-classes invalides)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Le nœud a été produit mais il n'a pas retourné un état de fonction dans la "
+"première mémoire de travail."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Une valeur de retour doit être assignée au premier élément de la mémoire de "
+"travail du nœud! Veuillez corriger votre nœud."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Le nœud a retourné une séquence de sortie invalide: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Une séquence d'octets a été trouvée mais pas le nœud dans la pile, signalez "
+"le bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Débordement de pile avec profondeur de pile: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Fonctions :"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variables :"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signaux :"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Le nom n'est pas un identifiant valide:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Le nom est déjà utilisé dans une autre func/var/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Renommer la fonction"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Renommer la variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Renommer le signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Ajouter une fonction"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Ajouter une variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Ajouter un signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Supprimer la fonction"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Supprimer la variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Éditer la variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Supprimer le signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Éditer le signal :"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Changer l'expression"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Ajouter un nœud"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Maintenir Meta pour déposer un accesseur. Maintenir Maj pour déposer une "
+"signature générique."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Maintenir Ctrl pour déposer un accesseur. Maintenir Maj pour déposer une "
+"signature générique."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Maintenir Meta pour déposer une référence simple au nœud."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Maintenir Ctrl pour déposer une référence simple au nœud."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Maintenir Meta pour déposer un mutateur de variable."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Maintenir Ctrl pour déposer un mutateur de variable."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Ajouter un nœud 'preload'"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Ajouter un nœud à partir de l'arbre"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Ajouter une propriété accesseur"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Ajouter une propriété mutateur"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Condition"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Séquence"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Switch"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Itérateur"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Tant que"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Retour"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Appel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Récupérer"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Définir"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Modifier"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Type de base"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Membres :"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nœuds disponibles:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Sélectionner ou créer une fonction pour éditer le graph"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Fermer"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Éditer les arguments du signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Éditer la variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Changer"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Supprimer la selection"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Placer un point d'arrêt"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Trouver le type du nœud"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Copier les nœuds"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Couper les nœuds"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Coller les nœuds"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Type d'entrée non itérable: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "L'itérateur est devenu invalide"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "L'itérateur est devenu invalide "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Indice de nom de propriété invalide."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "L'objet de base n'est pas un nœud !"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Le chemin ne mène pas au nœud !"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nom de propriété invalide '%s' dans le nœud %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argument invalide de type: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Arguments invalides: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet introuvable dans le script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet introuvable dans le script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Le nœud personnalisé n'a pas de méthode _step(), le graph ne peut pas être "
+"traité."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"La valeur retournée par _step() est invalide, elle doit être un entier (seq "
+"out), ou une chaîne (erreur)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "seulement pressé"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "seulement relâché"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"Le fichier certificat ne pourrait pas être lu. Les chemin et mot de passe "
+"sont t-ils tous deux corrects ?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "Erreur en créant la signature de l'objet."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Erreur en créant la signature du paquet."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"Aucun modèle d'export n'a été trouvé.\n"
+"Téléchargez et installez des modèles d'export."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Le paquet personnalisé de débogage n'a pas été trouvé."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Le paquet personnalisé de parution n'a pas été trouvé."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Nom unique invalide."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "GUID de produit invalide."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "GUID d'éditeur invalide."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Couleur d'arrière-plan invalide."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Dimensions d'image de logo magasin invalides (devraient être 50x50)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+"Dimensions d'image de logo carré 44x44 invalides (devraient être 44x44)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+"Dimensions d'image de logo carré 71x71 invalides (devraient être 71x71)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+"Dimensions d'image de logo carré 150x150 invalides (devraient être 150x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+"Dimensions d'image de logo carré 310x310 invalides (devraient être 310x310)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+"Dimensions d'image de logo large 310x150 invalides (devraient être 310x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+"Dimensions d'image d'écran de démarrage invalides (devraient être 620x300)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Une ressource SpriteFrames doit être créée ou assignée à la propriété « "
+"Frames » afin qu'AnimatedSprite affiche les images."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Seul un nœud de type CanvasModulate est autorisé par scène (ou ensemble de "
+"scènes instanciées). Le premier créé fonctionnera, les autres seront ignorés."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"Un CollisionPolygon2D n'est utile que lorsqu'il est enfant d'un nœud dérivé "
+"de CollisionObject2D, comme Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Un CollisionPolygon2D vide n'a pas d'effet sur les collisions."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"Un CollisionShape2D n'est utile que lorsqu'il est enfant d'un nœud dérivé de "
+"CollisionObject2D, comme Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, "
+"etc."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Une forme doit être créée afin qu'une CollisionShape2D fonctionne. Veuillez "
+"créer une ressource de forme !"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Une texture avec la forme de la lumière doit être fournie dans la propriété "
+"« texture »."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Un polygone d'occultation doit être défini (ou dessiné) afin que cet "
+"occulteur ait un effet."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Le polygone d'occultation pour cet occulteur est vide. Veuillez dessiner un "
+"polygone !"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Vous devez créer ou sélectionner une ressource de type NavigationPolygon "
+"pour que ce nœud fonctionne. Sélectionnez une ressource ou dessinez un "
+"polygone."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"Un NavigationPolygonInstance doit être un enfant ou petit-enfant d'un nœud "
+"Navigation2D. Il fournit seulement des données de navigation."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Le nœud ParallaxLayer ne fonctionne que lorsqu'il s'agit d'un enfant d'un "
+"nœud de type ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"La propriété Path doit pointer à un nœud de type Particles2D valide pour "
+"fonctionner."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"Un PathFollow2D fonctionne seulement quand défini comme un enfant d'un nœud "
+"Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"La propriété Path doit pointer vers un nœud de type Node2D valide pour "
+"fonctionner."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Une ressource SampleLibrary doit être créée ou définie dans la propriété "
+"\"échantillon\" pour que le SamplePlayer puisse jouer un son."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"La propriété Path doit pointer vers un nœud de type Viewport valide pour "
+"fonctionner. Ce Viewport doit utiliser le mode « render target »."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Le Viewport défini dans la propriété Path doit utiliser le mode « render "
+"target » pour que cette sprite fonctionne."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"Un VisibilityEnable2D fonctionne mieux lorsqu'il est directement enfant du "
+"nœud racine de la scène."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"Un CollisionShape n'est utile que lorsqu'il est enfant d'un nœud dérivé de "
+"CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Afin qu'une CollisionShape fonctionne, il lui faut une forme. Créez une "
+"ressource de forme pour cette CollisionShape !"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"Un CollisionPolygon n'est utile que lorsqu'il est enfant d'un nœud dérivé de "
+"CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Un CollisionPolygon vide n'a pas d'effet sur les collisions."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Une ressource de type NavigationMesh doit être définie ou créée pour que ce "
+"nœud fonctionne."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"Un NavigationMeshInstance doit être enfant ou sous-enfant d'un nœud de type "
+"Navigation. Il fournit uniquement des données de navigation."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"La propriété Path doit pointer vers un nœud Spatial valide pour fonctionner."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Seul un WorldEnvironnement ne peut être utilisé par scène (ou ensemble de "
+"scènes instanciées)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Une ressource de type SampleLibrary doit être créée ou définie dans la "
+"propriété « samples » afin que le SpatialSamplePlayer joue des sons."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Une ressource de type SampleFrames doit être créée ou définie dans la "
+"propriété « Frames » afin qu'une AnimatedSprite3D fonctionne."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Annuler"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alerte !"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Veuillez confirmer…"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Le fichier existe, l'écraser ?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Tous les types de fichiers reconnus"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Tous les fichiers (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Ouvrir"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Ouvrir un fichier"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Ouvrir un ou plusieurs fichiers"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Ouvrir un répertoire"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Ouvrir un fichier ou un répertoire"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Enregistrer"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Enregistrer un fichier"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Créer un dossier"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Chemin :"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Répertoires et fichiers :"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Fichier :"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtre :"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nom :"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Impossible de créer le dossier."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Utilisez une extension valide."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Maj+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Méta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Périphérique"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Bouton"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Bouton gauche."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Bouton droite."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Bouton du milieu."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Molette vers le haut."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Molette vers le bas."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Axe"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Couper"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copier"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Coller"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Tout sélectionner"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Effacer"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Annuler"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Les pop-ups seront cachés par défaut jusqu'à ce que vous appelez une "
+"fonction popup() ou une des fonctions popup*(). Les rendre visibles pour "
+"l'édition ne pose pas de problème, mais elles seront cachées lors de "
+"l'exécution."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Ce Viewport n'est pas sélectionné comme cible du rendu. Si vous avez "
+"l'intention d'afficher son contenu directement à l'écran, rattachez-le à un "
+"nœud de type Control afin qu'il en obtienne une taille. Sinon, faites-en un "
+"RenderTarget et assignez sa texture à un nœud quelquonque pour son affichage."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Erreur d'initialisation de Freetype."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Format de police inconnu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Erreur lors du chargement de la police."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Taille de police invalide."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Désactivé"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Toute la sélection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Mouvement Ajouter une clé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Animation Changer la transition"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Animation Changer la transformation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Animation Changer la valeur"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Animation Changer l'appel"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Animation Ajouter une piste"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Animation Dupliquer les clés"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Monter la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Descendre la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Supprimer la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Définir les transitions à :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Renommer la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Modifier l'interpolation de la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Modifier le mode de valeur de la piste d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Modifier Courbe du Noeud"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Modifier la courbe de sélection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Animation Supprimer les clés"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Dupliquer la sélection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Double transposé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Supprimer la sélection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Continu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discret"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Déclencheur"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Animation Ajouter une clé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Animation Déplacer les clés"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Mettre à l'échelle la sélection"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Echelle Du Curseur"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Aller à l'étape suivante"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Revenir à l'étape précédente"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linéaire"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-in"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transitions"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimiser l'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Nettoyer l'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Créer une NOUVELLE piste pour %s et insérer une clé ?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Créer %d NOUVELLES pistes et insérer des clés ?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Créer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Animation Créer et insérer"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Animation Insérer une piste et une clé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Animation Inserer une clé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Modifier la longueur de l'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Changer l'animation de la boucle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Animation Créer une clé pour une valeur typée"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Insérer une animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Images-clés d'échelle de l'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Animation ajouter une piste d'appel"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom de l'animation."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Longueur (s) :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Longueur de l'animation (en secondes)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Pas (s) :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Pas du curseur (en secondes)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Activer/Désactiver le bouclage de l'animation."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Ajouter de nouvelles pistes."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Déplacer la piste actuelle vers le haut."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Déplacer la piste actuelle vers le bas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Supprimer la piste sélectionnée."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Outils de piste"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Activer la modification de pistes individuelles en cliquant dessus."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optimiseur d'animation"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Erreur linéaire max. :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Erreur angulaire max. :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Angle optimisable max. :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimiser"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Sélectionnez un AnimationPlayer de l'arbre de scène pour éditer les "
+"animations."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Clé"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transition"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Ratio d'échelle :"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Appeler des fonctions dans quel nœud ?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Supprimer les clés invalides"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Supprimer les pistes vides et non résulues"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Nettoyer toutes les animations"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Nettoyer les animations (PAS DE RETOUR EN ARRIÈRE !)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Nettoyer"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimensionner le tableau"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Changer les types des valeurs du tableau"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Changer les valeurs du tableau"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Rechercher :"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Trier :"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Inverser"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Catégorie :"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Tout"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Site :"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Support…"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Officiel"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Communauté"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "En test"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Fichier ZIP de données"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Liste des méthodes pour « %s » :"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Liste des méthodes :"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Paramètres :"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Retourne :"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Aller à la ligne"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Numéro de ligne :"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Pas de correspondances"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d occurrence(s) remplacée(s)."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Remplacer"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Remplacer tout"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Sensible à la casse"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Mots entiers"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Sélection uniquement"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Rechercher"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Trouver"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Suivant"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d occurrence(s) remplacée(s)."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Non trouvé !"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Remplacer par"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Sensible à la casse"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "À l'envers"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Avertir lors du remplacement"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Passer"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Zoomer"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Dézoomer"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Réinitialiser le zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Ligne :"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Colonne :"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "La méthode du nœud cible doit être spécifiée !"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"La méthode cible n'a pas été trouvée! Spécifiez une méthode valide ou "
+"attachez un script au nœud cible."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Connecter au nœud :"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Ajouter"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Supprimer"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Ajouter des arguments supplémentaires :"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Arguments supplémentaires :"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Chemin vers le nœud :"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Créer une fonction"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Différé"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "One-shot"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Connecter"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Connecter « %s » à « %s »"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Connecter un signal :"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Créer une souscription"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Connecter…"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Déconnecter"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Signaux"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Créer un nouveau"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoris :"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Récents :"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Correspondances :"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Description :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Rechercher un remplacement pour :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dépendances pour :"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"La scène « %s » est actuellement en cours de modification.\n"
+"Les changements n'auront pas d'effet avant un rechargement."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Le ressource « %s » est utilisée.\n"
+"Les changements n'auront pas d'effet avant un rechargement."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dépendances"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Ressource"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Chemin"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dépendances :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Corriger les dép. cassées"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Éditeur de dépendances"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Recherche une ressource de remplacement :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Propriétaires de :"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Les fichiers supprimés sont requis par d'autres ressources pour leur "
+"fonctionnement.\n"
+"Les supprimer quand même ? (aucune annulation possible)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+"Supprimer les fichiers sélectionnés du projet ? (aucune annulation possible)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Erreur de chargement :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "La scène n'a pas pu être chargée à cause de dépendances manquantes :"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Ouvrir quand même"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Quelle action doit être prise ?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Corriger les dépendances"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Erreurs de chargement !"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+"Supprimer de manière permanente %d objet(s) ? (Impossible de revenir en "
+"arrière !)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Possède"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Ressources sans propriété explicite :"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Explorateur de ressources orphelines"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Supprimer les fichiers sélectionnés ?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Supprimer"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nom invalide."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caractères valides :"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'une classe "
+"moteur existante."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'un type "
+"intégré au moteur."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'une "
+"constante globale."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Chemin invalide."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Le fichier n'existe pas."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Pas dans le chemin de la ressource."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Ajouter l'AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "L'autoload « %s » existe déjà !"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Renommer l'AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Activer les variables globales AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Déplacer l'AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Supprimer l'AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Activer"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Ré-organiser les AutoLoads"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nom de nœud :"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nom"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Liste :"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Mise à jour de la scène"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Stockage des modifications locales…"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Mise à jour de la scène…"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Choisir un répertoire"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Choisir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Retour"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Avancer"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Monter"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Basculer les fichiers cachés"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Basculer le favori"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Basculer le mode"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Focaliser le chemin"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Déplacer le favori vers le haut"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Déplacer le favori vers le bas"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Aperçu :"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Scanner les sources"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Chercher dans l'aide"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Liste des classes :"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Chercher dans les classes"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Classe :"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Hérite de :"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Héritée par :"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Brève description :"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Méthodes publiques :"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Items de thème GUI :"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Constantes :"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Brève description :"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Description de la méthode :"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Chercher du texte"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Ajouté :"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Supprimé :"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Erreur de sauvegarde de l'atlas :"
+
+#: tools/editor/editor_import_export.cpp
+#, fuzzy
+msgid "Could not save atlas subtexture:"
+msgstr "Impossible d'enregistrer la sous-texture atlas :"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Stockage du fichier :"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Empaquetage"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportation pour %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Configuration…"
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Sortie :"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Ré-importation"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importation :"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Nœud à partir d'une scène"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Erreur d'enregistrement de la ressource !"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Enregistrer la ressource sous…"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Je vois…"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Impossible d'ouvrir le fichier pour écriture :"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Format de fichier demandé inconnu :"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Erreur lors de l'enregistrement."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Enregistrement de la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analyse"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Création de l'aperçu"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Impossible d'enregistrer la scène. Les dépendances (instances) n'ont sans "
+"doute pas pu être satisfaites."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Impossible de charger la ressource."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Impossible de charger la MeshLibrary pour fusion !"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Erreur d'enregistrement de la MeshLibrary !"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Impossible de charger la TileSet pour fusion !"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Erreur d'enregistrement de la TileSet !"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Impossible d'ouvrir le ZIP de modèles d'exportation."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Chargement des modèles d'exportation"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Erreur d'enregistrement de la disposition !"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Disposition de l'éditeur par défaut remplacée."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nom de la disposition non trouvé !"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Disposition par défaut remise à zéro."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copier paramètres"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Coller les paramètres"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Coller la ressource"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copier la ressource"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Rendre intégré"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Rendre les sous-ressources uniques"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Ouvrir dans l'aide"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Il n'y a pas de scène définie pour être lancée."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Aucune scène principale n'a jamais été définie, en sélectionner une ?\n"
+"Vous pouvez la modifier ultérieurement dans les « Paramètres du projet » "
+"dans la catégorie « application »."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La scène sélectionnée « %s » n'existe pas, en sélectionner une valide ?\n"
+"Vous pouvez la modifier ultérieurement dans les « Paramètres du projet » "
+"dans la catégorie « application »."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La scène sélectionnée « %s » n'est pas un fichier de scène, en sélectionner "
+"une valide ?\n"
+"Vous pouvez la modifier ultérieurement dans les « Paramètres du projet » "
+"dans la catégorie « application »."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"La scène actuelle n'a jamais été sauvegardée, veuillez la sauvegarder avant "
+"de la lancer."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Impossible de démarrer le sous-processus !"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Ouvrir une scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Ouvrir scène de base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Ouvrir une scène rapidement…"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Ouvrir un script rapidement…"
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Oui"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Fermer la scène ? (les modifications non sauvegardées seront perdues)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Enregistrer la scène sous…"
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+"Cette scène n'a jamais été enregistrée. L'enregistrer avant de la lancer ?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Veuillez enregistrer la scène d'abord."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Enregistrer les chaînes traduisibles"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exporter une bibliothèque de maillages"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exporter un ensemble de tuiles"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Quitter"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Quitter l'éditeur ?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "La scène actuelle n'est pas enregistrée. Ouvrir quand même ?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Impossible de recharger une scène qui n'a jamais été sauvegardée."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Réinitialiser"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Cette action ne peut être annulée. Réinitialiser quand même ?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Lancer une scène rapidement…"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Ouvrir le gestionnaire de projets ?\n"
+"(les modifications non sauvegardées seront perdues)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Choisir une scène principale"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Oups"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Erreur lors du chargement de la scène, elle doit être dans le chemin du "
+"projet. Utilisez « Importer » pour ouvrir la scène, puis enregistrez-la dans "
+"le répertoire du projet."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Erreur lors du chargement de la scène."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "La scène « %s » a des dépendences cassées :"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Enregistrer la disposition"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Supprimer la disposition"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Par défaut"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Basculer entre les onglets de scène"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d fichier(s) supplémentaire(s)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%s fichier(s) ou dossier(s) supplémentaire(s)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Aller à la scène ouverte précédemment."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Onglet suivant"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Onglet precedent"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Opérations avec les fichiers de scène."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nouvelle scène"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nouvelle scène héritée…"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Ouvrir une scène…"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Enregistrer la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Enregistrer toutes les scènes"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fermer la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Fermer, aller à la scène précédente"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Fichiers récents"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtre rapide d'un fichier…"
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Convertir vers…"
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Chaînes traduisibles…"
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary…"
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet…"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Refaire"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Lancer le script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Paramètres du projet"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Réinitialiser la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Quitter vers la liste des projets"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Mode sans distraction"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importer des ressources dans le projet."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importer"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Outils divers liés au projet ou à la scène."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Outils"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exporter le projet vers diverses plate-formes."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exporter"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Lancer le projet."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Jouer"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Mettre en pause la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Mettre en pause la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Arrêter la scène."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Arrêter"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Lancer la scène actuellement en cours d'édition."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Lancer la scène"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Jouer une scène personnalisée"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Play Custom Scene"
+msgstr "Jouer une scène personnalisée"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Options de débogage"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Déployer avec le débogage distant"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Lors de l'exportation ou du déploiement, l'exécutable produit tentera de se "
+"connecter à l'adresse IP de cet ordinateur afin de procéder au débogage."
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Small Deploy with Network FS"
+msgstr "Petit déploiement avec le réseau FS"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Lorsque cette option est activée, l'exportation ou le déploiement produira "
+"un exécutable minimal.\n"
+"Le système de fichiers sera fourni à partir du projet par l'éditeur sur le "
+"réseau.\n"
+"Sur Androïd, le déploiement va utiliser le câble USB pour une meilleure "
+"performance. Cette option accélère les tests pour les jeux avec une grande "
+"empreinte."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Formes de collision visibles"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Les formes de collision et les nœuds de raycast (pour 2D et 3D) seront "
+"visibles en jeu si cette option est activée."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navigation visible"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Les maillages et polygones de navigation seront visibles en jeu si cette "
+"option est activée."
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Sync Scene Changes"
+msgstr "Changement de synchronisation de scène"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Lorsque cette option est activée, toutes les modifications apportées à la "
+"scène dans l'éditeur seront reproduites en jeu.\n"
+"Lorsqu'elle est utilisée à distance sur un périphérique, l'efficacité est "
+"meilleure avec le système de fichiers réseau."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Synchroniser les modifications de script"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Lorsque cette option est activée, chaque script enregistré sera rechargé en "
+"jeu.\n"
+"Lorsque c'est utilisé à distance sur un périphérique, c'est plus efficace "
+"avec le système de fichiers réseau."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Paramètres"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Paramètres de l'éditeur"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Disposition de l'éditeur"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Basculer le mode plein écran"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Installer les modèles d'exportation"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "À propos"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Alerte lorsqu'une ressource externe a été modifiée."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Tourne lorsque la fenêtre de l'éditeur est repainte !"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Toujours repeindre"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Repeindre quand modifié"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspecteur"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Créer une nouvelle ressource dans la mémoire et la modifier."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Charger une ressource existante depuis la disque et la modifier."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Enregistrer la ressource actuellement modifiée."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Enregistrer sous…"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Aller à l'objet modifié précédent dans l'historique."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Aller à l'objet modifié suivant dans l'historique."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Historique des objets récemment édités."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Propriétés de l'objet."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "Système de fichiers"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Nœud"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Sortie"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Ré-importer"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Mettre à jour"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "La communauté Godot vous dit merci !"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Merci !"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importer des modèles depuis un fichier ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exporter le projet"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Bibliothèque d'exportation"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Fusionner avec l'existant"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Ouvrir et exécuter un script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Erreurs de chargement"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Extensions Installées :"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Version :"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Auteur :"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "État :"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Arrêter le profilage"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Démarrer le profilage"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Mesure:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Temps image (en seconde)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Temps moyen (seconde)"
+
+#: tools/editor/editor_profiler.cpp
+#, fuzzy
+msgid "Frame %"
+msgstr "Image %"
+
+#: tools/editor/editor_profiler.cpp
+#, fuzzy
+msgid "Fixed Frame %"
+msgstr "Cadre prédéfini %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Temps :"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusif"
+
+#: tools/editor/editor_profiler.cpp
+#, fuzzy
+msgid "Self"
+msgstr "Soi-même"
+
+#: tools/editor/editor_profiler.cpp
+#, fuzzy
+msgid "Frame #:"
+msgstr "Image #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Veuillez attendre la fin du scan."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "La scène actuelle doit être enregistrée afin de pouvoir ré-importer."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Enregistrer et ré-importer"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Ré-importer les ressources modifiées"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Écrivez votre code dans la méthode _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Il y a déjà une scène éditée."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Impossible d'instancier le script :"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Avez-vous oublié le mot-clé « tool » ?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Impossible d'exécuter le script :"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Avez-vous oublié la méthode « _run » ?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Par défaut (même que l'éditeur)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Sélectionner les nœuds à importer"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Chemin de la scène :"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importer à partir d'un nœud :"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Impossible d'ouvrir file_type_cache.cch en écriture, le fichier de cache ne "
+"sera pas sauvé !"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Fichiers source et destination identiques, rien à faire."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Chemins source et destination identiques, rien à faire."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Impossible de déplacer des répertoires vers eux-mêmes."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "Impossible d'opérer sur « .. »"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Entrez un nouveau nom et chemin pour :"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Pas de fichiers sélectionnés !"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instance"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Modifier les dépendances…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Voir les propriétaires…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copier le chemin"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Renommer ou déplacer…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Déplacer vers…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Information"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Montrer dans le gestionnaire de fichiers"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Ré-importer…"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Répertoire précédent"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Répertoire suivant"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Re-scanner le système de fichiers"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Basculer l'état favori du dossier"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Instancie la/les scènes sélectionnées en tant qu'enfant du nœud."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Déplacer"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Ajouter au groupe"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Supprimer du groupe"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Pas de masques de bits à importer !"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Le chemin de destination est vide."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+"Le chemin de destination doit être un chemin complet vers une ressource."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Le chemin de destination doit exister."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Le chemin de sauvegarde est vide !"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importer des BitMasks"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Texture(s) source :"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Chemin de destination :"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Accepter"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#, fuzzy
+msgid "Bit Mask"
+msgstr "Masque de bits"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Pas de fichier de police source !"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Pas de ressource de police de destination !"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Extension de fichier non valide.\n"
+"Veuillez utiliser .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Impossible de charger ou traiter la police source."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Impossible d'enregistrer la police."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Police source :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Taille de la police source :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Ressource de destination :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "Voix ambiguë d'un cœur qui, au zéphyr, préfère les jattes de kiwis."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Test :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Options :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importation d'une police"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Ce fichier est déjà un fichier de police Godot, veuillez fournir un fichier "
+"de type BMFont à la place."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Impossible d'ouvrir le fichier en tant que fichier BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Source personnalisée de police invalide."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Police"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Pas de maillages à importer !"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importer un maillage"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Maillage(s) source :"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Maillage"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Surface %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Pas d'échantillons à importer !"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importer des échantillons audio"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Échantillon(s) source :"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Échantillon audio"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nouvelle séquence"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Options d'animation"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Drapeaux"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "FPS de calcul :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optimiseur"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Erreur linéaire maximale"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Erreur angulaire maximale"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Angle maximal"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Séquences"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Départ(s)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Fin(s)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Boucle"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtres"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Le chemin source est vide."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Impossible de charger le script de post-importation."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Script invalide ou cassé de post-importation."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Erreur d'importation de la scène."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importer une scène 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Scène source :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Le même que la scène de destination"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Partagé"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Dossier de destination des textures :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script de post-traitement :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Custom Root Node Type:"
+msgstr "Type de racine de nœud personnalisé:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nom de nœud :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Les fichiers suivants sont manquants :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importer quand même"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importer et ouvrir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"La scène modifiée actuellement n'a pas été enregistrée, ouvrir la scène "
+"importée quand même ?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importer une scène"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importation de la scène…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Lancement du script personnalisé…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Impossible de charger le script de post-importation :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Script de post-importation invalide ou cassé (vérifiez la console):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Erreur d'exécution du script de post-importation :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importer une image :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Impossible d'importer un fichier par-dessus lui-même :"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Impossible de rendre le chemin local : %s (déjà local)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Enregistrement…"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animation de scène 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Non compressé"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Compression sans perte (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Compression avec perte (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Compression GPU (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Format de texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Qualité de compression de la texture (WebP) :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Options de texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Veuillez spécifier des fichiers !"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Il faut au moins un fichier pour créer un atlas."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Erreur d'importation :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Un seul fichier est nécessaire pour créer une grande texture."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Taille de texture maximale :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importer des textures pour un atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Taille des cellules :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Grande texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importer des grandes textures (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Texture source"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Texture d'atlas de base"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Texture(s) source"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importer des textures pour la 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importer des textures pour la 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Importer des textures"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Texture 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Texture 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Texture atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"REMARQUE : Il n'est pas obligatoire d'importer les textures en 2D. Copiez "
+"directement les fichiers PNG ou JPEG dans le projet."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Rogner l'espace vide."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importer une grande texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Charger une image source"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Découpage"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Insertion"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Enregistrement"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Impossible d'enregistrer la grande texture :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Construire l'atlas pour :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Chargement de l'image :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Impossible de charger l'image :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Conversion des images"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Rognage des images"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Découpage des images"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Impossible d'enregistrer l'image d'atlas :"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Impossible d'enregistrer la texture convertie :"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Source invalide !"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Source de traduction invalide !"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Colonne"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Langage"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Pas d'objets à importer !"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Pas de chemin de destination !"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importer des traductions"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Impossible d'importer !"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importer une traduction"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "CSV source :"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignorer la première ligne"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Compresser"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Ajouter au projet (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Importer les langues :"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Traduction"
+
+#: tools/editor/multi_node_edit.cpp
+#, fuzzy
+msgid "MultiNode Set"
+msgstr "Réglage multi-nœuds"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Groupes"
+
+#: tools/editor/node_dock.cpp
+#, fuzzy
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Sélectionnez un nœud pour modifier des signaux et des groupes."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Activer/désactiver la lecture automatique"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Nom de la nouvelle animation :"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nouvelle animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Modifier le nom de l'animation :"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Supprimer l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ERREUR : Nom de l'animation invalide !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ERREUR : Le nom de l'animation existe déjà !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Renommer l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Ajouter une animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Blend Next Changed"
+msgstr "Mélange Suivant Changé"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Change Blend Time"
+msgstr "Changer le temps de mélange"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Charger l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Dupliquer l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ERREUR : Aucune animation à copier !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ERREUR : Pas de ressource de type animation dans le presse-papiers !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animation collée"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Coller l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ERREUR : Pas d'animation à modifier !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Jouer l'animation sélectionnée à l'envers depuis la position actuelle. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Lire l'animation sélectionnée à rebours de la fin. (Maj + A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Arrêter la lecture de l'animation. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Lire l'animation sélectionnée depuis le début. (Maj + D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Lire l'animation sélectionnée depuis la position actuelle. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Position de l'animation (en secondes)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Scale animation playback globally for the node."
+msgstr "Echelle de lecture de l'animation dans sa globalité pour le noeud."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Créer une nouvelle animation dans le lecteur."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Charger une animation depuis le disque."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Charger une animation depuis le disque."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Enregistrer l'animation actuelle"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Enregistrer sous"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Afficher la liste des animations dans le lecteur."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Lecture automatique au chargement"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Target Blend Times"
+msgstr "Modifier les temps de mélange des cibles"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Outils d'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Copier l'animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Créer une nouvelle animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nom de l'animation :"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Erreur !"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Blend Times:"
+msgstr "Temps de mélange"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Suivant (file d'attente automatique) :"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Cross-Animation Blend Times"
+msgstr "Temps de mélange des Cross-animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animation"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Nouveau nom :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Échelle :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Fondu entrant (s) :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Fondu sortant (s) :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Mélanger"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mixer"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Redémarrage automatique :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Redémarrer (s) :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Redémarrage aléatoire (s) :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Démarrer !"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Quantité :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mélange :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Mélange 0 :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Mélange 1 :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Actuel :"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Ajouter une entrée"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Réinitialiser la progression automatique"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Définir la progression automatique"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Supprimer l'entrée"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Renommer"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "L'arbre d'animations est valide."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "L'arbre d'animations est invalide."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nœud d'animation"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nœud one-shot"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Mélanger le nœud"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nœud Blend2"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nœud Blend3"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nœud Blend4"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nœud TimeScale"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nœud TimeSeek"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nœud Transition"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Importer des animations…"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Modifier les filtres de nœud"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtres…"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Analyse de %d triangles :"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Triangle #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Paramètres du calculateur d'éclairage :"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Analyse de la géométrie"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Correction des lumières"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Création du BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Création de l'octree de lumière"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Création de la texture d'octree"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Transfert vers des lightmaps :"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Allocation de la texture #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Calcul de la texture #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Post-traitement de la texture #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Calculer !"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Remettre le processus de calcul de l'éclairage à zéro (recommencer)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Aperçu"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Configurer la grille"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Décalage de la grille :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Pas de la grille :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Décalage de la rotation :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Pas de la rotation :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Déplacer le pivot"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Déplacer l'action"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Modifier la chaîne IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Modifier le CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Modifier les ancres"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Zoom (%) :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Coller la pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Sélectionner le mode"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Glisser : tourner"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt + Glisser : déplacer"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Appuyez sur « v » pour changer le pivot, « Maj+V » pour glisser le pivot "
+"(lors du déplacement)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt + Bouton droit : sélection détaillée par liste"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Mode déplacement"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate Mode"
+msgstr "Mode rotation (E)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Afficher une liste de tous les objets à la position cliquée\n"
+"(identique à Alt+Clic droit en mode sélection)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Cliquer pour changer le pivot de rotation de l'objet."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Mode navigation"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Verrouiller l'objet sélectionné (il ne pourra plus être déplacé)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Déverouiller l'objet sélectionné (il pourra être déplacé de nouveau)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Rendre la sélection des enfants de l'objet impossible."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Rendre la sélection des enfants de l'objet de nouveau possible."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Aligner sur la grille"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Afficher la grille"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Rotation alignée"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Alignement relatif"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Configurer la grille…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Aligner au pixel près"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Étendre au parent"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Squelette…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Créer les os"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Effacer les os"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Afficher les os"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Créer une chaîne IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Effacer la chaîne IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Affichage"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Réinitialiser le zoom"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Définir le zoom…"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centrer sur la sélection"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Cadrer la sélection"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Ancre"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Insérer des clefs"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Insérer une clé"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Insérer une clé (pistes existantes)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copier la pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Vider la pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Définir une valeur"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Aligner (pixels) :"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Add %s"
+msgstr "Tout ajouter"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Créer un nœud"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Erreur d'instanciation de la scène depuis %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Pas de parent dans lequel instancier l'enfant."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+"Cette opération ne peut être réalisée uniquement avec un seul nœud "
+"sélectionné."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Changer la valeur par défaut"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Créer un polygone"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Modifier le polygone"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Modifier le polygone (supprimer un point)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Créer un nouveau polygone à partir de rien."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Créer un Poly3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Définir la poignée"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Ajouter/supprimer un point de rampe de couleur"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Modifier une rampe de couleurs"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Création de la bibliothèque de maillages"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Aperçu…"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Supprimer l'objet %d ?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Ajouter un item"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Supprimer l'élément sélectionné"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importer depuis la scène"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Mettre à jour depuis la scène"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Objet %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Objets"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Éditeur de listes d'objets"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Créer un polygone occulteur"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Modifier un polygone existant :"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "Bouton gauche : déplacer un point."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Contrôle + Bouton gauche : séparer le segment."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "Bouton droit : effacer un point."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Le maillage est vide !"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Créer un corps statique de type Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Créer un corps statique de type convexe"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Cela ne fonctionne pas sur la racine de la scène !"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Créer une forme Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Créer une forme convexe"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Créer un maillage de navigation"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "Le MeshInstance n'a pas de maillage !"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+"Le maillage n'a pas de surfaces où des contours pourraient être créées !"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Impossible de créer le contour !"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Créer le contour"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Créer un corps statique Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Créer un corps statique convexe"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Créer un maillage de contour…"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Créer un maillage de contour"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Taille du contour :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"Pas de maillage source spécifié (et aucun MultiMesh n'a été défini dans le "
+"nœud)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+"Pas de maillage source spécifié (et le MultiMesh ne contient pas de "
+"maillage)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "La source du maillage est invalide (chemin non valide)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Le maillage source est invalide (ce n'est pas une MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+"Le maillage source est invalide (ne contient pas de ressource de type Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Pas de surface source spécifiée."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "La surface source est invalide (chemin non valide)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "La surface source est invalide (pas de géométrie)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "La surface source est invalide (pas de faces)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Le parent n'a pas de faces solides à peupler."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Impossible de cartographier la zone."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Sélectionner un maillage source :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Sélectionner une surface cible :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Peupler la surface"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Peupler la MultiMesh"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Surface cible :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Maillage source :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Axe X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Axe Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Axe Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Axe vers le haut du maillage :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotation aléatoire :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinaison aléatoire :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Échelle aléatoire :"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Peupler"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Créer un polygone de navigation"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Supprimer le polygone et le point"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Erreur de chargement de l'image :"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Pas de pixels avec une transparence > 128 dans l'image…"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Définir le masque d'émission"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Effacer le masque d'émission"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Charger le masque d'émission"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Compte de points générés:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "Le nœud ne contient pas de géométrie."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Le nœud ne contient pas de géométrie (faces)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Les faces n'ont pas de surface !"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Pas de faces !"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Générer un AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Créer un émetteur à partir d'un maillage"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Créer un émetteur à partir d'un nœud"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Effacer l'émetteur"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Créer un émetteur"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Positions d'émission :"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Remplissage d'émission :"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Surface"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volume"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Supprimer le point d'une courbe"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Ajouter un point à la courbe"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Déplacer le point dans la courbe"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Sélectionner des points"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Maj. + Glisser : sélectionner des points de contrôle"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Clic : ajouter un point"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Clic droit : supprimer un point"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Sélectionner les points de contrôle (Maj. + glisser)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Ajouter un point (dans un espace vide)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Diviser le segment (en courbe)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Supprimer le point"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Fermer la courbe"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Point de courbe #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Définir la position du point de la courbe"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Diviser le chemin"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Supprimer le chemin du point"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Créer une carte UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformer la carte UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Éditeur UV de polygones 2D"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Déplacer le point"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Contrôle: Tourner"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Maj. : Tout déplacer"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Maj.+Contrôle : Mettre à l'échelle"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Déplacer le polygone"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Tourner le polygone"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Mettre à l'échelle le polygone"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polygone -> UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV -> Polygone"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Effacer l'UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Aligner"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Activer l'alignement"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Grille"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ERREUR : Impossible de charger la ressource !"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Ajouter une ressource"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Renommer une ressource"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Supprimer une ressource"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Le presse-papiers des ressources est vide !"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Charger une ressource"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Analyser le BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Longueur :"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Ouvrir un ou des fichiers d'échantillons"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "ERREUR : Impossible de charger l'échantillon !"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Ajouter un échantillon"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Renommer l'échantillon"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Supprimer l'échantillon"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Stéréo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Format"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Hauteur"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erreur d'enregistrement du thème"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erreur d'enregistrement"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Erreur d'importation du thème"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Erreur d'importation"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importer un thème"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Enregistrer le thème sous…"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Script suivant"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script précédent"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Fichier"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Nouveau"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Tout enregistrer"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Soft Reload Script"
+msgstr "Recharger le script (mode doux)"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Précédent dans l'historique"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Suivant dans l'historique"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Recharger le thème"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Enregistrer le thème"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Enregistrer le thème sous"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fermer les documentations"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Fermer tout"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Trouver…"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Trouver le suivant"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Débogage"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Sortir"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Rentrer"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Mettre en pause"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continuer"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Garder le débogueur ouvert"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Fenêtre"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Aller à gauche"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Aller à droite"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Tutoriels"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Ouvre https://godotengine.org dans la section des tutoriels."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Classes"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Cherche dans la hiérarchie des classes."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Cherche dans la documentation de référence."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Aller au document modifié précédent."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Aller au document modifié suivant."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Créer un script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Les fichiers suivants sont plus récents sur le disque.\n"
+"Quelle action doit être prise ? :"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Recharger"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Ré-enregistrer"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Débogueur"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Les scripts intégrés ne peuvent être modifiés uniquement lorsque la scène à "
+"qui ils appartiennent est ouverte"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Prélever une couleur"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Déplacer vers le haut"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Déplacer vers le bas"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Indenter vers la gauche"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Indenter vers la droite"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Commenter/décommenter"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Cloner en dessous"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Compléter le symbole"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Supprimer les espaces de fin de ligne"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Indentation automatique"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Supprimer tous les points d'arrêt"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Aller au point d'arrêt suivant"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Aller au point d'arrêt précédent"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "trouver précédente"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Remplacer…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Aller à la fonction…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Aller à la ligne…"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Aide contextuelle"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Modifier une constante scalaire"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Modifier une constance vectorielle"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Modifier une constante RVB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Modifier un opérateur scalaire"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Modifier un opérateur vectoriel"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Modifier un opérateur vectoriel scalaire"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Modifier un opérateur RVB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Basculer seulement la rotation"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Modifier une fonction scalaire"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Modifier une fonction vecteur"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Changer la valeur par défaut"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Modifier un commentaire"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Ajouter/supprimer de la rampe de couleurs"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Ajouter/supprimer de la carte de courbes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Modifier la carte de courbes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Changer le nom de l'entrée"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Connecter les nœuds de graphe"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Déconnecter les nœuds de graphe"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Supprimer le nœud de graphe Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Déplacer le nœud de graphe Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Dupliquer le(s) nœud(s) de graphe"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Effacer le(s) nœud(s) de graphe Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Erreur: lien de connexion cyclique"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Erreur : connexions d'entrée manquantes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Ajouter un nœud de graphe Shader"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Orthogonale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspective"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transformation annulée."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transformation sur l'axe X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transformation sur l'axe Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transformation sur l'axe Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Transformation du plan de vue."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Mise à l'échelle %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Rotation de %s degrés."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Vue de dessous."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Dessous"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Vue de dessus."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Dessus"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Vue arrière."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Arrière"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Vue avant."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Avant"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Vue de gauche."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Gauche"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Vue de droite."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Droite"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "L'insertion de clé est désactivée (pas de clé insérée)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Clé d'animation insérée."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Aligner avec la vue"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Environnement"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Écouteur audio"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Dialogue XForm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Pas de scène sélectionnée à instancier !"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Instancier sur le cursuer"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Impossible d'instancier la scène !"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Move déplacement (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Mode rotation (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Mode de mise à l'échelle (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Vue de dessous"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Vue de dessus"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Vue arrière"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Vue avant"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Vue de gauche"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Vue de droite"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Basculer entre la vue perspective et orthogonale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Insérer une clef d'animation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Focaliser l'origine"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Focaliser la sélection"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Aligner la sélection avec la vue"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Coordonnées locales"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Dialogue de transformation…"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Utiliser la lumière par défaut"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Utiliser sRGB par défaut"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 vue"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 vues"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 vues (alt.)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 vues"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 vues (alt.)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 vues"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Affichage normal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Affichage en fil de fer"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Affichage des surimpressions"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Affichage sans ombrage"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Afficher l'origine"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Afficher la grille"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Paramètres d'alignement"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Alignement des translations :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Alignement des rotations (degrés) :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Alignement des mises à l'échelle (%) :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Paramètres de la vue"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Normale de l'éclairage par défaut :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Couleur de l'éclairage ambient :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "Champ de vision de perspective (degrés) :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z-Near de la vue :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z-Far de la vue :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Modification de la transformation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Translater :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Tourner (degrés) :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Échelle (ratio) :"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Type de transformation"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pré"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Post"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERREUR : Impossible de charger la resource de type trame !"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Ajouter une image"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Le presse-papiers des ressources est vide ou n'est pas une texture !"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Coller une image"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Ajouter vide"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Modifier la boucle d'animation"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Modifier le taux d'IPS de l'animation"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vide)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animations"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Vitesse (FPS) :"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Trames d'animation"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Insérer vide (avant)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Insérer vide (après)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Haut"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Bas"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "Aperçu de la StyleBox :"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Mode d'aimantation :"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Aucun>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Aimanter au pixel"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Aimanter à la grille"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Coupe automatique"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Décalage:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Step:"
+msgstr "Pas (s) :"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Séparation:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Région de texture"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Éditeur de région de texture"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Impossible d'enregistrer le thème dans le fichier :"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Ajouter tous les items"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Tout ajouter"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Supprimer l'item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Thème"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Ajouter des items de classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Supprimer des items de classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Créer un nouveau modèle"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Créer un nouveau modèle d'éditeur"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "Case à cocher Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "Case à cocher Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Item à cocher"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Item coché"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Possède"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Plusieurs"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Options"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Ont,Plusieurs,Possibilités,D'options !"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Onglet 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Onglet 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Onglet 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Type :"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Type de données :"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Icône"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Style"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Couleur"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Peindre sur la TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Dupliquer"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Supprimer la TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Supprimer la sélection"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Chercher une case"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transposer"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Miroir X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Miroir Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Seau"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Sélectionner une case"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Sélectionner"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Tourner de 0 degrés"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Tourner de 90 degrés"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Tourner de 180 degrés"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Tourner de 270 degrés"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Impossible de trouver la tuile :"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nom d'item ou ID :"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Créer depuis la scène ?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Fusionner depuis la scène ?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Créer depuis la scène"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Fusionner depuis la scène"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Erreur"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Modifier les options du script"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Veuillez exporter en dehors du dossier du projet !"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Erreur d'exportation du projet !"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Erreur d'écriture du PCK du projet !"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Pas d'exportateur pour la plate-forme « %s » actuellement."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Créer une nouvelle ressource"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Nom valide"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transition"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "État :"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Mot de passe :"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Caractères valides :"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Nouveau nom :"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Inclure"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Changer le groupe d'images"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Le nom du groupe ne peut pas être vide !"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Caractère invalide dans le nom du groupe !"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Le nom du groupe existe déjà !"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Ajouter un groupe d'images"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Supprimer le groupe d'images"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Aperçu de l'atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Paramètres d'exportation du projet"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Cible"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Exporter vers la plate-forme"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Ressources"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Exporter les ressources sélectionnées (y compris les dépendences)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Exporter toutes les ressources dans le projet."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exporter tous les fichiers dans le répertoire du projet."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Mode d'exportation :"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Ressources à exporter :"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Action"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtres à utiliser pour l'exportation des fichiers (séparés par des "
+"virgules, par exemple : *.json, *.txt) :"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtres à utiliser pour exclure des fichiers (séparés par des virgules, par "
+"exemple: *.json, *.txt) :"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+"Convertir les scènes en format texte au format binaire à l'exportation."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Images"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Garder les originaux"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Compression pour le disque (avec perte, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Compression pour la RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Convertir les images (*.png) :"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Qualité de la compression pour le disque (avec perte) :"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Réduire toutes les images :"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Compresser les formats :"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Groupes d'images"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Groupes :"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Compression pour le disque"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Compression pour la RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Mode de compression :"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Qualité de compression avec perte :"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas :"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Réduire de :"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Aperçu de l'atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Filtre d'image :"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Images :"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Ne rien sélectionner"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Groupe"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Échantillons"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Mode de conversion des échantillons (fichiers .wav) :"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Conserver"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Compresser (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Limite de taux d'échantillonage (Hz) :"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Rogner"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Silence de fin :"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Mode d'exportation des scripts :"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Texte"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilé"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Chiffré (insérez une clé ci-dessous)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clé de chiffrement des scripts (256 bits en hexadécimal) :"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exporter le PCK/ZIP"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exporter le PCK du projet"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Exporter…"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Exportation de projet"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Pré-réglage d'exportation :"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Chemin de projet invalide, le chemin doit exister !"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Chemin de projet invalide, godot.cfg ne doit pas exister."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Chemin de projet invalide, godot.cfg doit exister."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Projet importé"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Chemin de projet non valide (avez-vous changé quelque chose ?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+"Impossible de créer le fichier godot.cfg dans le répertoire du projet."
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "The following files failed extraction from package:"
+msgstr ""
+"Les fichiers suivants sont plus récents sur le disque.\n"
+"Quelle action doit être prise ? :"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Paquetage installé avec succès !"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importer un projet existant"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Chemin du projet (doit exister) :"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nom du projet :"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Créer un nouveau projet"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Chemin du projet :"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Install Project:"
+msgstr "Projets récents :"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Installer"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Parcourir"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Nouveau projet de jeu"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "C'est un BINGO !"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Projet sans titre"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Are you sure to open more than one project?"
+msgstr "Voulez-vous vraiment ouvrir plus d'un projet à la fois ?"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Are you sure to run more than one project?"
+msgstr "Voulez-vous vraiment lancer plus d'un projet à la fois ?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"Vous êtes sur le point de scanner les %s de dossiers pour les projets Godot "
+"existants. Est-ce que vous confirmez ?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Gestionnaire de projets"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Liste des projets"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Lancer"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Scanner"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Sélectionnez un dossier à scanner"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Nouveau projet"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Quitter"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Touche "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Bouton de joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Axe de joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Bouton de souris"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Action invalide (tout passe, sauf « / » ou « : »)."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "L'action « %s » existe déjà !"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Renommer l'événement d'action d'entrée"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Ajouter un événement d'action d'entrée"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Contrôle+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Appuyez sur une touche…"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Index du bouton de la souris :"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Bouton gauche"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Bouton droite"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Bouton du milieu"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Molette vers le haut"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Molette vers le bas"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Bouton 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Bouton 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Bouton 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Bouton 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Index de l'axe du joystick :"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Index du bouton du joystick :"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Ajouter une action d'entrée"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Effacer l'événement d'action d'entrée"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Erreur d'enregistrement des paramètres."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Paramètres enregistrés avec succès."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Ajouter une traduction"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Supprimer la traduction"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Ajouter un chemin remappé"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Paramètres du projet (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Général"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Propriété :"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Supprimer"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Copier vers la plate-forme…"
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Contrôles"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Action :"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Périphérique :"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Index :"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Localisation"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Traductions"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Traductions :"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Ajouter…"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Remaps"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Ressources :"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remaps par langue :"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Langue"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Extensions"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Pré-réglage…"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Ease in"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ease out"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zéro"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Ease in-out"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Ease out-in"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Fichier…"
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Répertoire…"
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Charger"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Assigner"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Nouveau script"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Erreur de chargement du fichier : ce n'est pas une ressource !"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Impossible de charger l'image"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, valeur %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "Activé"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Propriétés :"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Sections :"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Sélectionnez une propriété"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Sélectionner une méthode"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "Impossible d'exécuter l'outil PVRTC :"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+"L'image convertie n'a pas pu être rechargée en utilisant l'outil PVRTC:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Re-parenter le nœud"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Localisation pour le re-parentage (sélectionnez le nouveau parent) :"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Conserver la transformation globale"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Re-parenter"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Créer une nouvelle ressource"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Ouvrir la ressource"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Enregistrer la ressource"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Outils des ressources"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Rendre local"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Mode d'exécution :"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Scène actuelle"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Scène principale"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Arguments de la scène principale :"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Paramètres d'exécution de la scène"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "Aucun parent dans lequel instancier les scènes."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Erreur de chargement de la scène depuis %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "OK"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Impossible d'instancier la scène « %s » car la scène actuelle existe dans "
+"l'un de ses nœuds."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instancier scène(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Cette opération ne peut être réalisée sur la racine de l'arbre."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Déplacer le nœud dans le parent"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Déplacer des nœuds dans le parent"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Dupliquer le(s) nœud(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Supprimer le(s) nœud(s) ?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Cette opération ne peut être réalisée sans une scène."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Cette opération ne peut être réalisée sur des scènes instanciées."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Enregistrer la nouvelle scène sous…"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "C'est sensé !"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Impossible d'opérer sur des nœuds d'une scène étrangère !"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Impossible d'opérer sur des nœuds dont la scène actuelle hérite !"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Supprimer le(s) nœud(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Impossible d'enregistrer la nouvelle scène. Il est probable que des "
+"dépendances (comme des instances) n'ont pas pu être satisfaites."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Erreur d'enregistrement de la scène."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Erreur de duplication de la scène afin de l'enregistrer."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Modifier les groupes"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Modifier les connexions"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Supprimer nœud(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Ajouter un nœud enfant"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instancier une scène enfant"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Changer le type"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Ajouter un script"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Créer un script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Fusionner depuis la scène"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Sauvegarder la branche comme scène"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Effacer (pas de confirmation)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Ajouter un nouveau nœud"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instancie un fichier de scène comme nœud. Crée une scène héritée si aucun "
+"nœud racine n'existe."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach a new or existing script for the selected node."
+msgstr "Créer un nouveau script pour le nœud sélectionné."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear a script for the selected node."
+msgstr "Créer un nouveau script pour le nœud sélectionné."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Afficher/cacher le Spatial"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Afficher/cacher le CanvasItem"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instance :"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nom de nœud invalide, les caractères suivants ne sont pas autorisés :"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Renommer le nœud"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Arbre de scène (nœuds) :"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Enfants modifiables"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Charger en tant que fictif"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Abandonner l'instanciation"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Ouvrir dans l'éditeur"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Effacer l'héritage"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Effacer l'héritage ? (Pas de retour en arrière !)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Effacer !"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Sélectionner un nœud"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Nom de classe parent invalide"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Caractères valides :"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Nom de classe invalide"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Nom valide"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Le nom de classe est invalide !"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Le nom de classe parent est invalide !"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Chemin invalide !"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Impossible de créer le script dans le système de fichiers."
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Erreur de chargement de la scène depuis %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Le chemin est vide"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Le chemin n'est pas local"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Chemin de base invalide"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Extension invalide"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Créer un script"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "Script suivant"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nom de classe :"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Script intégré"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Créer le script de nœud"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Octets :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Avertissement"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Erreur :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Source :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Fonction :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Erreurs"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Processus enfant connecté"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Inspecter l'instance précédente"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Inspecter l'instance suivante"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Pile des appels"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Variable"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Erreurs :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Trace de pile (si applicable) :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Inspecteur distant"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Arbre des scènes en direct :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Propriétés de l'objet distant : "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profileur"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Moniteur"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valeur"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Moniteurs"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Liste de l'utilisation de la mémoire vidéo par ressource :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Total :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Mémoire vidéo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Chemin de la ressource"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Type"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Utilisation"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Divers"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Control cliqué :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Type de Control cliqué :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Racine pour l'édition en direct :"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Définir depuis l'arbre"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Raccourcis"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Changer le rayon d'une lumière"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Changer le champ de vision d'une caméra"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Changer la taille d'une caméra"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Changer le rayon d'une forme en sphère"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Changer les extents d'une forme en boîte"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Changer le rayon d'une forme en capsule"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Changer la hauteur d'une forme en capsule"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Changer la longueur d'une forme en rayon"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Changer les extents d'un notificateur"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Changer les extents d'un notificateur"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "La BakedLightInstance ne contient pas de ressource BakedLight."
+
+#~ msgid "Vertex"
+#~ msgstr "Vertex"
+
+#~ msgid "Fragment"
+#~ msgstr "Fragment"
+
+#~ msgid "Lighting"
+#~ msgstr "Éclairage"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Mode persistant"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Cet objet ne peut être rendu visible car son parent est caché. Affichez "
+#~ "le parent d'abord."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Les chemins ne peuvent pas commencer par '/', les chemins absolus doivent "
+#~ "commencer par 'res://', 'user://' ou 'local://'"
+
+#~ msgid "File exists"
+#~ msgstr "Le fichier existe"
+
+#~ msgid "Valid path"
+#~ msgstr "Chemin valide"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Impossible d'aller dans le sous-répertoire :"
+
+#~ msgid "Help"
+#~ msgstr "Aide"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Ressources importées"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Dessus (Pavé num. 7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Dessous (Maj+Pavé num. 7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Gauche (Pavé num. 3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Droite (Maj+Pavé num. 3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Devant (Pavé num. 1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Arrière (Maj+Pavé num. 1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Perspective (Pavé num. 5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Orthogonale (Pavé num. 5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Sélection (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Aligner avec la vue (Ctrl+Maj+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Changer l'interpolation de la boucle d'animation"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Activer/Désactiver l'interpolation lors de la boucle d'animation."
+
+#~ msgid "Load Layout"
+#~ msgstr "Charger la disposition"
+
+#~ msgid "New Scene Root"
+#~ msgstr "Nouvelle racine de la scène"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Hériter la scène"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Méthode dans le nœud :"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Modifier les connexions..."
+
+#~ msgid "Set Params"
+#~ msgstr "Définir paramètres"
+
+#~ msgid "Live Editing"
+#~ msgstr "Édition en direct"
+
+#~ msgid "File Server"
+#~ msgstr "Serveur de fichiers"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Déployer des clients de serveur de fichiers"
+
+#~ msgid "Group Editor"
+#~ msgstr "Éditeur de groupes"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Groupes de nœuds"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Liste d'extensions :"
+
+#~ msgid "Overwrite Existing Scene"
+#~ msgstr "Écraser la scène existante"
+
+#~ msgid "Overwrite Existing, Keep Materials"
+#~ msgstr "Écraser l'existant, conserver les matériaux"
+
+#~ msgid "Keep Existing, Merge with New"
+#~ msgstr "Conserver l'existant, fusionner avec les nouveautés"
+
+#~ msgid "Keep Existing, Ignore New"
+#~ msgstr "Conserver l'existant, ignorer les nouveautés"
+
+#~ msgid "This Time:"
+#~ msgstr "Cette fois :"
+
+#~ msgid "Next Time:"
+#~ msgstr "Les prochaines fois :"
+
+#~ msgid "%d frames"
+#~ msgstr "%d images"
+
+#~ msgid ""
+#~ "NOTICE: You are not forced to import textures for 2D projects. Just copy "
+#~ "your .jpg or .png files to your project, and change export options later. "
+#~ "Atlases can be generated on export too."
+#~ msgstr ""
+#~ "NOTICE : Vous n'êtes pas obligé d'importer des textures pour des projets "
+#~ "en 2D. Copiez simplement vos fichiers .jpg ou .png dans le projet, et "
+#~ "modifiez les options d'exportation par la suite. Vous pouvez également "
+#~ "générer des atlas à l'exportation."
+
+#~ msgid "Merging.."
+#~ msgstr "Fusion..."
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
new file mode 100644
index 0000000000..335ab25c6a
--- /dev/null
+++ b/editor/translations/hu.po
@@ -0,0 +1,6748 @@
+# Hungarian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Varga Dániel <danikah.danikah@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-11-11 18:19+0000\n"
+"Last-Translator: Varga Dániel <danikah.danikah@gmail.com>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/hu/>\n"
+"Language: hu\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/id.po b/editor/translations/id.po
new file mode 100644
index 0000000000..30bd357a21
--- /dev/null
+++ b/editor/translations/id.po
@@ -0,0 +1,6947 @@
+# Indonesian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016.
+# Andevid Dynmyn <doyan4forum@gmail.com>, 2016.
+# Andinawan Asa <asaandinawan@gmail.com>, 2016.
+# Khairul Hidayat <khairulcyber4rt@gmail.com>, 2016.
+# yursan9 <rizal.sagi@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-10-15 04:17+0000\n"
+"Last-Translator: Andevid Dynmyn <doyan4forum@gmail.com>\n"
+"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/id/>\n"
+"Language: id\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"Tipe argument salah dalam menggunakan convert(), gunakan konstanta TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Tidak cukup bytes untuk menerjemahkan, atau format tidak sah."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "Langkah argumen adalah nol!"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not a script with an instance"
+msgstr "Skrip tidak mempunyai turunannya"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Tidak berbasis skrip"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Tidak berbasis resource file"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Format kamus acuan tidak sah (@path hilang)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "Format kamus acuan tidak sah (tidak dapat memuat script pada @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Format kamus acuan tidak sah (skrip tidak sah pada @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Kamus acuan tidak sah (sub kelas tidak sah)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Sebuah node dihasilkan tanpa kerja memori, silahkan baca dokumentasi tentang "
+"bagaimana menggunakannya dengan benar!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Node dihasilkan, tetapi keadaan sebuah fungsi tidak kembali saat kerja "
+"memori pertama."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Nilai pengembalian harus ditetapkan pada elemen pertama dari node kerja "
+"memori! Silahkan perbaiki node anda."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Node mengembalikan sebuah keluaran urutan yang tidak sah: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Telah ditemukan urutan dalam jumlah sedikit tetapi bukan node dalam jumlah "
+"besar, laporkan bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Tumpukan melimpah dengan kedalaman tumpukan: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Fungsi-fungsi:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variabel-variabel:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Sinyal-sinyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Nama bukan sebuah pengidentifikasi yang sah:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Nama telah digunakan oleh fungsi/variabel/sinyal yang lain:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Namai kembali Fungsi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Namai kembali Variabel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Namai kembali Sinyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Tambahkan Fungsi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Tambahkan Variabel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Tambahkan Sinyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Hapus Fungsi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Hapus Variabel"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Mengedit Variabel:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Hapus Sinyal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Mengedit Sinyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Ubah Transisi Anim"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Tambahkan Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Tambahkan Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Tambahkan Node (Node-node) dari Tree"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Tambahkan Properti Getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Tambahkan Properti Setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Transisi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Kembali:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Panggil"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Edit"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipe Dasar:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Member-member:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Node-node yang Tersedia:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Pilih atau ciptakan sebuah fungsi untuk mengedit grafik"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Tutup"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Edit Argumen-argumen Sinyal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Edit Variabel:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Ubah"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Hapus yang Dipilih"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Beralih Breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Cari Tipe Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Copy Nodes"
+msgstr "Salin Resource"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Path ke Node:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Tipe masukan tidak iterable: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Iterator menjadi tidak sah"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Iterator menjadi tidak sah: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Nama properti index tidak sah."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Objek dasar bukan sebuah Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Path tidak menunjukkan Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nama properti index '%s' tidak sah dalam node %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argumen tidak sah dari tipe: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumen-argumen tidak sah: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet tidak ditemukan dalam script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet tidak ditemukan dalam script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Node modifikasi tidak memiliki method _step(), tidak bisa memproses grafik."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Nilai kembali dari _step() tidak sah, seharusnya integer (seq out), atau "
+"string (error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Nama tidak sah."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Ukuran font tidak sah."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Sebuah resource SpriteFrames seharusnya diciptakan atau diatur dalam "
+"properti 'Frames' agar AnimatedSprite menampilkan frame-frame."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Hanya satu visible CanvasModulate yang diizinkan per scene (atau atur pada "
+"scene-scene yang diacu). Yang diciptakan pertama akan bekerja, sedangkan "
+"sisanya akan diabaikan."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D hanya berfungsi untuk menyediakan sebuah bentuk collision "
+"pada sebuah CollisionObject2D node asal. Mohon hanya gunakan itu sebagai "
+"sebuah child dari Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, dll. "
+"untuk memberikan mereka sebuah bentuk."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+"Sebuah CollisionPolygon2D yang kosong tidak memiliki efek pada collision."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D hanya berfungsi untuk menyediakan sebuah bentuk collision "
+"pada sebuah CollisionObject2D node asal. Mohon hanya gunakan itu sebagai "
+"sebuah child dari Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, dll. "
+"untuk memberikan mereka sebuah bentuk."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Sebuah bentuk harus disediakan untuk CollisionShape2D untuk fungsi. Mohon "
+"ciptakan resource bentuk untuk itu!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Sebuah tekstur dengan bentuk cahaya harus disuplai ke properti 'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Sebuah polygon occluder harus diatur (atau digambar) untuk occluder ini "
+"berpengaruh."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Polygon occluder untuk occluder ini kosong. Mohon gambar dulu sebuah polygon!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Sebuah resource NavigationPolygon harus diatur atau diciptakan untuk node "
+"ini bekerja. Mohon atur sebuah properti atau gambar sebuah polygon."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance harus menjadi sebuah child atau grandchild ke "
+"sebuah node Navigation2D. Ini hanya menyediakan data navigasi."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Node ParallaxLayer hanya bekerja ketika diatur sebagai child dari sebuah "
+"node ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Properti path harus menunjuk ke sebuah node Particles2D yang sah agar "
+"bekerja."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D hanya bekerja ketika diatur sebagai sebuah child dari sebuah "
+"node Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Properti path harus menunjuk pada sebuah node Node2D yang sah untuk bekerja."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Sebuah resource SampleLibrary harus diciptakan atau diatur didalam properti "
+"'samples' agar SamplePlayer memainkan suara."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Properti path harus menunjuk pada node Viewport yang sah untuk bekerja. "
+"Viewport tersebut harus diatur ke mode 'render target'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Pengaturan Vieport dalam properti path harus diatur sebagai 'render target' "
+"agar sprite bekerja."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D bekerja dengan sangat baik ketika digunakan dengan "
+"mengedit root scene secara langsung sebagai parent."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape hanya berfungsi untuk memberikan sebuah bentuk collision ke "
+"node CollisionObject asal. Mohon hanya gunakan ini sebagai child dari Area, "
+"StaticBody, RigidBody, KinematicBody, dll. untuk memberi mereka sebuah "
+"bentuk."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Sebuah bentuk harus disediakan untuk CollisionShape untuk fungsi. Mohon "
+"ciptakan sebuah resource bentuk untuk itu!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon hanya berfungsi untuk menyediakan sebuah bentuk collision "
+"ke node CollisionObject asal. Mohon hanya gunakan ini sebagai child dari "
+"Area, StaticBody, RigidBody, KinematicBody, dll. untuk memberi mereka bentuk."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+"Sebuah CollisionPolygon yang kosong tidak memiliki efek pada collision."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Sebuah resource NavigationMesh harus diatur atau diciptakan untuk node ini "
+"bekerja."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance harus menjadi child atau grandchild untuk sebuah node "
+"Navigation. Ini hanya menyediakan data navigasi."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Properti path harus menunjuk ke sebuah node Particles2D yang sah agar "
+"bekerja."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Hanya satu WorldEnvironment yang diizinkan per scene (atau atur scene-scene "
+"yang diacu)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Sebuah resource SampleLibrary harus dibuat atau diatur didalam properti "
+"'samples' agar SpatialSamplePlayer memainkan suara."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Sebuah resource SpriteFrames harus diciptakan atau diatur didalam properti "
+"'Frames' agar AnimatedSprite3D menampilkan frame-frame."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Batal"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Oke"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Peringatan!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Mohon konfirmasi..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "File telah ada, Overwrite?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Semua diakui"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Semua File-file (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Buka"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Buka sebuah File"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Buka File (File-file)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Buka sebuah Direktori"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Buka sebuah File atau Direktori"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Simpan"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Simpan sebuah File"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Buat Folder"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Path:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Direktori-direktori & File-file:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "File:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filter:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nama:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Tidak dapat membuat folder."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Harus menggunakan ekstensi yang sah."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Perangkat"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Tombol"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Tombol Kiri."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Tombol Kanan."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Tombol Tengah."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#, fuzzy
+msgid "Wheel Up."
+msgstr "Scroll keatas."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#, fuzzy
+msgid "Wheel Down."
+msgstr "Scroll kebawah."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Axis"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Potong"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopy"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Tempel"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Pilih Semua"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Bersihkan"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Batal"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popup-popup akan sembunyi secara default kecuali panggil popup() atau apapun "
+"dari fungsi-fungsi popup*(). Meskipun membuat mereka terlihat untuk mengedit "
+"itu baik, tetapi mereka akan sembunyi saat berjalan."
+
+#: scene/main/viewport.cpp
+#, fuzzy
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Viewport ini tidak diatur sebagai target render. Jika anda berniat untuk "
+"menampilkan konten-kontennya secara langsung ke layar, buatlah sebuah child "
+"dari kontrol jadi hal tersebut bisa memperoleh ukuran. Jika tidak, buatlah "
+"sebuah RenderTarget dan tetapkannya tekstur internal untuk beberapa node "
+"untuk ditampilkan."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Error menginisialisasi FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Format font tidak diketahui."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Error memuat font."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Ukuran font tidak sah."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Dinonaktifkan"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Semua pilihan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Pindahkan Kunci Tambah"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Transition"
+msgstr "Ubah Transisi Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Transform"
+msgstr "Ubah Transformasi Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Value"
+msgstr "Ubah Nilai Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Call"
+msgstr "Ubah Panggilan Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Add Track"
+msgstr "Tambah Track Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Duplicate Keys"
+msgstr "Duplikat Tombol Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Move Anim Track Up"
+msgstr "Pindahkan Track Anim ke Atas"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Move Anim Track Down"
+msgstr "Pindahkan Track Anim ke Bawah"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Remove Anim Track"
+msgstr "Hapus Track Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Atur transisi ke:"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Track Rename"
+msgstr "Namai Kembali Track Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Ganti Mode Nilai Track Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Edit Kurva Node"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Edit Kurva Pilihan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Hapus Kunci Anim"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplikat Pilihan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplikat Dialihkan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Hapus Pilihan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Lanjut"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Berlainan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Pemicu"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Tambah Kunci Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Pindahkan Kunci Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Scale Selection"
+msgstr "Beri Skala Seleksi"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Scale From Cursor"
+msgstr "Beri Skala dari Kursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Lanjut ke Langkah Berikutnya"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Lanjut ke Langkah Sebelumnya"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linier"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Konstan"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "In"
+msgstr "Kedalam"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Out"
+msgstr "Keluar"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Masuk-Keluar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Keluar-Masuk"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transisi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optimalkan Animasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Bersihkan Animasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Buat track BARU untuk %s dan masukkan tombol?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Buat track BARU %d dan masukkan tombol-tombol?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Buat"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Create & Insert"
+msgstr "Anim Buat & Masukan"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Insert Track & Key"
+msgstr "Masukkan Track & Tombol Anim"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Insert Key"
+msgstr "Anim Masukkan Tombol"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Ubah Panjang Animasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Ubah Perulangan Animasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Buat Nilai Kunci Animasi Tertulis"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Insert"
+msgstr "Anim Masukkan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Skala Kunci Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Tambah Pemanggilan Track Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom animasi."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Panjang:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Panjang animasi (dalam detik)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Langkah:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Langkah kursor sekejap (dalam detik)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Aktifkan/Nonaktifkan pengulangan dalam animasi."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Tambah tracks baru."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Pindahkan track sekarang ke atas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Pindahkan track sekarang ke bawah."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Hapus track yang dipilih."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Alat track"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Aktifkan penyuntingan tombol-tombol individual dengan mengkliknya."
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim. Optimizer"
+msgstr "Anim. Optimisasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Maks. Linier Error:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Maks. Angular Error:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Maksimal Angle yang dapat Dioptimalkan:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Optimasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "Pilih sebuah AnimationPlayer dari Scene Tree untuk menyunting animasi."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Tombol"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transisi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Skala Rasio:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Memanggil Fungsi-Fungsi dalam Node yang Mana?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Hapus Tombol-tombol yang tidak sah"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Hapus tracks yang kosong dan belum diselesaikan"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Bersihkan semua animasi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Bersihkan Animasi (Tidak Dapat Dikembalikan!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Bersihkan"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Ubah ukuran Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Ubah Tipe Nilai Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Ubah Nilai Array"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Cari:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Sortir:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Terbalik"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Kategori:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Semua"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Situs:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Dukungan.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Resmi"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Komunitas"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Menguji"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Aset-aset File ZIP"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Daftar Fungsi Untuk '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Daftar Fungsi:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumen:"
+
+#: tools/editor/call_dialog.cpp
+#, fuzzy
+msgid "Return:"
+msgstr "Kembali:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Pergi ke Barisan"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Nomor Barisan:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Tidak ada yang cocok"
+
+#: tools/editor/code_editor.cpp
+#, fuzzy
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Diganti Kejadian (Kejadian-kejadian) %d."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Tukar"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Tukar Semua"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Kasus Kecocokan"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Semua Kata"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Hanya yang Dipilih"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Cari"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Cari"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Berikutnya"
+
+#: tools/editor/code_editor.cpp
+#, fuzzy
+msgid "Replaced %d ocurrence(s)."
+msgstr "Diganti kejadian (kejadian-kejadian) %d."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Tidak ditemukan!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Ganti dengan"
+
+#: tools/editor/code_editor.cpp
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "Case Sensitive"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Ke belakang"
+
+#: tools/editor/code_editor.cpp
+#, fuzzy
+msgid "Prompt On Replace"
+msgstr "Cepat Pada Penggantian"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Lalui"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Perbesar Pandangan"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Perkecil Pandangan"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Kebalikan Semula Pandangan"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Baris:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Kolom:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Method dalam Node target harus spesifik!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Sambungkan Ke Node:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Tambah"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Hapus"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Tambah Argumen Panggilan Ekstra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argumen-argumen Panggilan Ekstra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Path ke Node:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Buat Fungsi"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Ditunda"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Satu Waktu"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Menghubungkan"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Sambungkan '%s' ke '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Menyambungkan Sinyal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Buat Subskribsi"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Menyambungkan.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Tidak tersambung"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Sinyal-sinyal"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Buat Baru"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favorit:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Saat ini:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#, fuzzy
+msgid "Matches:"
+msgstr "Kecocokan:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Deskripsi:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Cari Ganti Untuk:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Ketergantungan Untuk:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Scene '%s' sedang disunting saat ini.\n"
+"Perubahan-perubahan tidak akan berefek kecuali dimuat ulang."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Resource '%s' sedang digunakan.\n"
+"Perubahan-perubahan akan terjadi ketika dimuat ulang."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Ketergantungan"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Resource"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Path"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Ketergantungan:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Perbaiki yang Rusak"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Dependency Editor"
+msgstr "Editor Ketergantungan"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Cari Resource Pengganti:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Pemilik Dari:"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"File-file yang telah dihapus diperlukan oleh resource-resource lainnya agar "
+"mereka bekerja.\n"
+"Hapus saja mereka? (tanpa membatalkan/undo)"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Hapus file-file yang dipilih dari proyek? (tanpa membatalkan/undo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Error memuat:"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Scene gagal memuat disebabkan oleh ketergantungan yang hilang:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Buka Saja"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Tindakan mana yang seharusnya diambil?"
+
+#: tools/editor/dependency_editor.cpp
+#, fuzzy
+msgid "Fix Dependencies"
+msgstr "Perbaiki Ketergantungan"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Gagal memuat!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Hapus secara permanen %d item? (Tidak dapat dikembalikan!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Memiliki"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Resource-resource tanpa kepemilikan yang jelas:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Orphan Resource Explorer"
+msgstr "Penjelajah Resource Orphan"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Hapus file yang dipilih?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Hapus"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nama tidak sah."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Karakter sah:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "Nama tidak sah. Harus tidak serupa dengan class name engine yang ada."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "Nama tidak sah. Tidak boleh serupa dengan nama bawaan."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nama tidak sah. Tidak boleh serupa dengan nama konstanta global yang ada."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Path Tidak Sah."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "File tidak ada."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Tidak didalam path resource."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Tambahkan AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload '%s' telah ada!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Namai kembali Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Beralih AutoLoad Globals"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Pindahkan Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Hapus Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Enable"
+msgstr "Aktifkan"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Mengatur kembali Autoload-autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nama Node:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nama"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Daftar:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Memperbaharui Scene"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Menyimpan perubahan-perubahan lokal.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Memperbaharui scene.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Pilih sebuah Direktori"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Pilih"
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Go Back"
+msgstr "Mundur"
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Go Forward"
+msgstr "Maju"
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Go Up"
+msgstr "Naik"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Segarkan"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Beralih File Tersembunyi"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Beralih Favorit"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Beralih Mode"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Garis Fokus"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Pindahkan Favorit Keatas"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Pindahkan Favorit Kebawah"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Pratinjau:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Sumber Pemindaian"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Mencari Bantuan"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Daftar Class:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Cari Kelas"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Kelas:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Turunan:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Diturunkan oleh:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Deskripsi Singkat:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Metode Publik:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Item-item Tema GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Konstanta:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Deskripsi Singkat:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Deskripsi Metode:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Mencari Teks"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Ditambahkan:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Dihapus:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Gagal menyimpan atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Tidak dapat menyimpan sub tekstur atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Menyimpan File:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Mengemas"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Mengekspor untuk %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Mengatur.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Keluaran:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Mengimpor ulang"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Mengimpor:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Node Dari Scene"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Error menyimpan resource!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Simpan Resource Sebagai.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "I see.."
+msgstr "Aku tahu.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Tidak dapat membuka file untuk menulis:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Format file yang diminta tidak diketahui:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Error saat menyimpan."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Menyimpan Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Menganalisis"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Membuat Thumbnail"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Tidak dapat menyimpan scene. Dependensi (instance) mungkin tidak terpenuhi."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Gagal memuat resource."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Tidak dapat memuat MeshLibrary untuk menggabungkan!"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Error saving MeshLibrary!"
+msgstr "Error menyimpan MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Tidak dapat memuat TileSet untuk menggabungkan!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Error menyimpan TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Tidak dapat membuka ekspor template-template zip."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Memuat Ekspor Template-template."
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Error mencoba untuk menyimpan layout!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Layout editor default ditimpa."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nama layout tidak ditemukan!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Mengembalikan semula layout default ke pengaturan-pengaturan awal."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Salin Parameter"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Tempel Parameter"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Tempel Resource"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Salin Resource"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Buat Menjadi Bawaan"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Membuat sub-Resource Unik"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Buka di Bantuan"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Tidak ada definisi scene untuk dijalankan."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Tidak ada scene utama yang pernah didefinisikan, pilih satu?\n"
+"Anda dapat mengubahnya nanti di akhir dalam \"Project Settings\" dibawah "
+"kategori 'application'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Scene '%s' tidak tersedia, pilih yang sah?\n"
+"Anda dapat menggantinya kemudian di \"Pengaturan Proyek\" di bawah kategori "
+"'aplikasi'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Scene '%s' bukanlah sebuah file scene, pilih yang sah?\n"
+"Anda dapat menggantinya kemudian di \"Pengaturan Proyek\" di bawah kategori "
+"'aplikasi'."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"Scene saat ini belum pernah disimpan, mohon simpat dahulu untuk "
+"menjalankannya."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Tidak dapat memulai subprocess!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Buka Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Buka Scene Dasar"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Buka Cepat Scene.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Buka Cepat Script.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Ya"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Tutup scene? (Perubahan-perubahan yang belum disimpan akan hilang)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Simpan Scene Sebagai.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Scene ini belum pernah disimpan. Simpan sebelum menjalankan?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Mohon simpan scene terlebih dahulu."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Simpan Kalimat yang Dapat Diterjemahkan"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Ekspor Mesh Library"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Ekspor Tile Set"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Keluar"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Keluar editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Scene saat ini tidak disimpan. Buka saja?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Tidak bisa memuat ulang scene yang tidak pernah disimpan."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Pulihkan"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Tindakan ini tidak dapat dibatalkan. Pulihkan saja?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Jalankan Cepat Scene.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Buka Manajer Proyek?\n"
+"(Perubahan yang tidak disimpan akan hilang)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Pilih sebuah Scene Utama"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Ugh"
+msgstr "Wadoo"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Gagal memuat scene, harus dalam alamat proyek. Gunakan 'Impor\" untuk "
+"membuka scene tersebut, kemudian simpan di dalam alamat proyek."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Gagal memuat scene."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Scene '%s' memiliki dependensi yang rusak:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Simpan Penampilan"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Hapus Penampilan"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Bawaan"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Pilih Tab Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d file lagi"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d file atau folder lagi"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Suasana"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Pergi ke scene yang dibuka sebelumnya."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Tab selanjutnya"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Tab sebelumnya"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operasi dengan file scene."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Scene Baru"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Scene Turunan Baru.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Buka Scene.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Simpan Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Mode Tanpa Gangguan"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "Mode Layar Penuh"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nama Node:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Ubah Tipe Nilai Array"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Tutup"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Buat Folder"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transisi"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Karakter sah:"
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Scene Baru"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Tambahkan Properti Setter"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Metode Publik:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Scene Baru"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Scene Baru"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Error memuat font."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Buat Subskribsi"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Scene Baru"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Set From Tree"
+msgstr "Menyetel Dari Keturunan"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Ganti Radius Lampu"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Camera FOV"
+msgstr "Ganti FOV Kamera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Camera Size"
+msgstr "Ganti Ukuran Kamera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Ganti Radius Bentuk Bola"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance tidak berisi resource BakedLight."
+
+#, fuzzy
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Path tidak bisa diawali dengan '/', tetapi absolut path harus diawali "
+#~ "dengan 'res://', 'user://', atau 'local://'"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Node modifikasi tidak memiliki _get_output_port_unsequenced(idx,wmem), "
+#~ "tetapi port-port unsequenced dispesifikasikan."
diff --git a/editor/translations/it.po b/editor/translations/it.po
new file mode 100644
index 0000000000..8fefe67677
--- /dev/null
+++ b/editor/translations/it.po
@@ -0,0 +1,7134 @@
+# Italian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Dario Bonfanti <bonfi.96@hotmail.it>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-11-22 20:27+0000\n"
+"Last-Translator: Dario Bonfanti <bonfi.96@hotmail.it>\n"
+"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/it/>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Argomento tipo invalido per convert(), usare le costanti TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Non vi sono abbastanza bytes per i bytes di decodifica, oppure formato "
+"invalido."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "step argument è zero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Non è uno script con un istanza"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Non si basa su uno script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Non si basa su un file risorsa"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Istanza invalida formato dizionario (manca @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Istanza invalida formato dizionario (impossibile caricare script in @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Istanza invalida formato dizionario (script invalido in @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Istanza invalida formato dizionario (sottoclassi invalide)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Un nodo ha ceduto senza memoria di lavoro, si prega di leggere la "
+"documentazione riguardo a come cedere in maniera corretta!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Il nodo ha ceduto, ma non ha ritornato uno stato di funzione nella prima "
+"memoria di lavoro."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Il valore di return deve essere assegnato al primo elemento della memoria di "
+"lavoro del nodo! Si prega di aggiustare il nodo."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Il nodo ha ritornato una sequenza di output invalida: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "Trovato bit di sequenza ma non il nodo nello stack, segnalare il bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Overflow dello stack con profondità dello stack: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funzioni:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Valiabili:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Segnali:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Il nome non è un identificatore valido:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Nome già in uso da un altro funz/var/segnale:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Rinomina Funzione"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Rinomina Variabile"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Rinomina Segnale"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Aggiungi Funzione"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Aggiungi Variabile"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Aggiungi Segnale"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Rimuovi Funzione"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Rimuovi Variabile"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Modifica Variabile:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Rimuovi Segnale"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Modifica Segnale:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Cambia Espressione"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Aggiungi Nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantieni premuto Meta per rilasciare un Getter. Mantieni premuto Shift per "
+"rilasciare una firma generica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Mantieni premuto Control per rilasciare un Getter. Mantieni premuto Shift "
+"per rilasciare una firma generica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Mantieni premuto Meta per rilasciare un riferimento semplice al nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Mantieni premuto Ctrl per rilasciare un riferimento semplice al nodo."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Mantieni premuto Meta per rilasciare un Setter Variabile."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Mantieni premuto Ctrl per rilasciare un Setter Variabile."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Aggiungi Nodo Preload"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Aggiungi Nodo(i) Da Albero"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Aggiungi Proprietà Getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Aggiungi Proprietà Setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Condizione"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Sequenza"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Interruttore"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Iteratore"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Mentre"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Ritorna"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Chiama"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Get"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Set"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Modifica"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipo Base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Membri:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nodi Disponibili:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Seleziona o crea una funzione per modificare il grafico"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Chiudi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Modifica Argomenti Segnali:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Modifica Variabile:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Cambia"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Elimina selezionati"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Abilita Breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Trova Tipo Nodo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Copia Nodi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Taglia Nodi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Incolla Nodi"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Il tipo di input non è iterabile: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "L'iteratore è diventato invalido"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "L'iteratore è diventato invalido: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Nome proprietà indice invalido."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "L'oggetto base non è un Nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Il percorso non conduce ad un Nodo!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nome proprietà indice invalido '%s' nel nodo %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argomento invalido di tipo: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argomenti invalidi: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet non trovato nello script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet non trovato nello script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Il nodo personalizato non ha un metodo _step(), impossibile processare il "
+"grafico."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Valore di return invalido da _step(), deve esere intero (seq out), oppure "
+"stringa (errore)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "appena premuto"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "appena rilasciato"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"Impossibile leggere il file del certificatio. Il percorso e la pasword sono "
+"entrambi corretti?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "Errore in creazione del signature object."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Errore di creazione della firma del pacchetto."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"Nessun template di esportazione trovato.\n"
+"Scarica ed installa i template di esportazione."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Pacchetto di debug personalizzato non trovato."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Pacchetto di release personalizzato non trovato."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Nome unico invalido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "GUID prodotto invalido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "GUID publisher invalido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Colore di background invalido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+"Dimensioni dell'immagine dello Store Logo invalide (dovrebbero essere 50x50)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+"Dimensioni non valide dell'immagine del logo quadrato 44x44 (dovrebbero "
+"essere 44x44)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+"Dimensioni non valide dell'immagine del logo quadrato 71x71 (dovrebbero "
+"essere 71x71)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+"Dimensioni non valide dell'immagine del logo quadrato 150x150 (dovrebbero "
+"essere 150x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+"Dimensioni non valide dell'immagine del logo quadrato 310x310 (dovrebbero "
+"essere 310x310)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+"Dimensioni non valide dell'immagine del logo quadrato 310x150 (dovrebbero "
+"essere 310x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+"Dimensioni non valide dell'immagine dello splash screen (dovrebbero essere "
+"620x300)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Una risorsa SpriteFrames deve essere creata o impostata nella proprietà "
+"'Frames' affinché AnimatedSprite mostri i frame."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Solamente un CanvasModulate visibile è consentito per scena (o insieme di "
+"scene istanziate). Il primo creato funzionerà, mentre i restanti saranno "
+"ignorati."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D serve a fornire una forma di collisione ad un nodo "
+"derivato di CollisionObject2D. Si prega di utilizzarlo solamente come figlio "
+"di Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da "
+"dargli una forma."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Un CollisionPolygon2D vuoto non ha effetti sulla collisione."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D serve a fornire una forma di collisione ad un nodo derivato "
+"di CollisionObject2D. Si prega di utilizzarlo solamente come figlio di "
+"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da dargli "
+"una forma."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Perché CollisionShape2D funzioni deve essere fornita una forma. Si prega di "
+"creare una risorsa forma (shape)!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Una texture con la forma della luce deve essere fornita nella proprietà "
+"'texture'."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Un poligono di occlusione deve essere impostato (o disegnato) affinché "
+"l'occlusore abbia effetto."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Il poligono di occlusione per questo occlusore è vuoto. Per favore disegna "
+"un poligono!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Una risorsa NavigationPolygon deve essere impostata o creata affinché questo "
+"nodo funzioni. Si prega di impostare una proprietà o di disegnare un "
+"poligono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance deve essere figlio o nipote di un nodo "
+"Navigation2D. Fornisce solamente dati di navigazione."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Il nodo ParallaxLayer funziona solamente quando impostato come figlio di un "
+"nodo ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"La proprietà path deve puntare a un nodo Particles2D valido per poter "
+"funzionare."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D funziona solamente quando impostato come figlio di un nodo "
+"Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"La proprietà path deve puntare ad un nodo Node2D valido per funzionare."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Una risorsa SampleLibrary deve essere creata o impostata nella proprietà "
+"'samples' affinché SamplePlayer riproduca un suono."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"La proprietà path deve puntare a un nodo Viewport valido per poter "
+"funzionare. Tale Viewport deve essere impostata in modalità 'render target'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Il Viewport impostato nella proprietà path deve essere impostato come "
+"'render target' affinché questa sprite funzioni."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funziona al meglio quando usato direttamente come "
+"genitore con il root della scena modificata."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape serve a fornire una forma di collisione ad un nodo derivato "
+"di CollisionObject. Si prega di utilizzarlo solamente come figlio di Area, "
+"StaticBody, RigidBody, KinematicBody, etc. in modo da dargli una forma."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Perché CollisionShape funzioni deve essere fornita una forma. Si prega di "
+"creare una risorsa forma (shape)!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon serve solamente a fornire una forma di collisione ad un "
+"nodo derivato di CollisionObject. Si prega di usarlo solamente come figlio "
+"di Area, StaticBody, RigidBody, KinematicBody, etc. in modo da dargli una "
+"forma."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Un CollisionPolygon vuoto non ha effetti in collisione."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Una risorsa NavigationMesh deve essere creata o impostata affinché questo "
+"nodo funzioni."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance deve essere un figlio o nipote di un nodo Navigation. "
+"Fornisce solamente dati per la navigazione."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"La proprietà path deve puntare ad un nodo Spaziale (Spatial) valido per "
+"poter funzionare."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Solamente un WorldEnvironment è consentito per scena (o insieme di scene "
+"istanziate)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Una risorsa SampleLibrary deve essere creata o impostata nella proprietà "
+"'samples' affinché SpatialSamplePlayer riproduca un suono."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Una risorsa SpriteFrames deve essere creata o impostata nella proprietà "
+"'Frames' affinché AnimatedSprite3D mostri i frame."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Annulla"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Attenzione!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Si Prega Di Confermare..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "File Esistente, Sovrascrivere?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Tutti i Riconosciuti"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Tutti i File (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Apri"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Apri un File"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Apri File(s)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Apri una Directory"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Apri un File o una Directory"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Salva"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Salva un File"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Crea Cartella"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Percorso:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Directory e File:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "File:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nome:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Impossibile creare cartella."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Necessaria un'estensione valida."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Dispositivo"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Pulsante"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Pulsante Sinistro."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Pulsante DEstro."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Pulsante centrale."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Rotellina su."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Rotellina Giù."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Asse"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Taglia"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copia"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Incolla"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Seleziona tutti"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Rimuovi"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Annulla"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"I popup saranno nascosti di default a meno che vengano chiamate la funzione "
+"popup() o qualsiasi altra funzione popup*(). Renderli visibili per la "
+"modifica nell'editor è okay, ma verranno nascosti una volta in esecuzione."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Questo viewport non è impostato come target di render. Se si vuole che il "
+"suo contenuto venga direttamente mostrato a schermo, renderlo figlio di un "
+"Control, in modo che possa ottenere una dimensione. Altrimenti, renderlo un "
+"RenderTarget e assegnare alla sua texture interna qualche nodo da mostrare."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Errore inizializzazione FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Formato font sconosciuto."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Errore caricamento font."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Dimensione font Invalida."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Disabilitato"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Seleziona Tutto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Sposta Aggiunta Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Anim Cambia Transizione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Anim Cambia Transform"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Anim Cambia Valore"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Anim Cambia Chiamata"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Anim Aggiungi Traccia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplica Key Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Muovi Traccia Animazione Su"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Muovi Traccia Animazione Giù"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Rimuovi Traccia Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Imposta Transizione a:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Traccia Anim Rinomina"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Traccia Anim Cambia Interpolazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Traccia Anim Cambia Modalità Valore"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Modifica Curva del Nodo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Modifica Selezione Curva"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim Elimina Key"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplica Selezione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplica Transposto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Rimuovi Selezione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Continuo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discreto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Attivazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Anim Aggiungi Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Anim Sposta Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Scala Selezione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Scala da Cursore"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Vai a Step Successivo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Vai a Step Precedente"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Lineare"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Costante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transizioni"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Ottimizza Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Pulisci Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Crea NUOVA traccia per %s e inserire key?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Creare %d NUOVE tracce e inserire key?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Crea"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Anim Crea e Inserisci"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim Inserisci Traccia e Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim Inserisci Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Cambia Lunghezza Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Cambia Loop Animazione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Anim Crea Typed Value Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim Inserisci"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Anim Scala Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Anim Aggiungi Chiamata Traccia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom Animazione."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Lunghezza (e):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Lunghezza animazone (in secondi)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Step (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Step Snap Cursore (in secondi)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Attiva/Disattiva loop animazione."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Aggiungi nuova traccia."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Muovi la traccia corrente su."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Muovi la traccia corrente giù."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Rimuovi traccia selezionata."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Strumenti traccia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Attiva modifica di key individuali cliccandovi."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Ottimizzatore Anim."
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Max. Errore Lineare:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Max. Errore Angolare:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Max. Angolo Ottimizzabile:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Ottimizza"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Seleziona un AnimationPlayer dallo Scene Tree per modificare le animazioni."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Key"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transizione"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Ratio di scalatura:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Chiama Funzioni in Quale Nodo?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Rimuovi key invalidi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Rimuovi tracce Irrisolte e vuote"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Pulisci tutte le animazioni"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Pulisci Animazione(i) (NO UNDO!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Pulisci"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Ridimensiona Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Cambia Tipo del Valore Array"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Cambia Valore Array"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Cerca:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Ordina:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Inverti"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Categoria:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Tutti"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Sito:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Supporta.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Ufficiale"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunità"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Testing"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "ZIP File degli Asset"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Lista Metodi Per '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Lista Metodi:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argomenti:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Ritorna:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Vai alla Linea"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Numero Linea:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Nessuna Corrispondenza"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Rimpiazzate %d Occorrenze."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Rimpiazza"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Rimpiazza Tutti"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Controlla Maiuscole"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Parole Intere"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Solo Selezione"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Cerca"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Trova"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Successivo"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Rimpiazzate %d occorrenze."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Non trovato!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Rimpiazza con"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Case Sensitive"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "All'indietro"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Richiedi Per Sostituire"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Salta"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Zoom In"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Zoom Out"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Resetta Zoom"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Riga:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Col:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Il Metodo nel nodo di target deve essere specificato!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"Metodo di destinazione non trovato! Specifica un metodo valido o annetti uno "
+"script al nodo di destinazione."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Connetti A Nodo:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Aggiungi"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Aggiungi Argomento Extra di Chiamata:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argomenti Chiamata Extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Percorso a Nodo:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Rendi Funzione"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Differita"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Oneshot"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Connetti"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Connetti '%s' a '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Connessione Segnali:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Crea Sottoscrizione"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Connetti.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Disconnetti"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Segnali"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Crea Nuovo"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Preferiti:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recenti:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Corrispondenze:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Cerca Rimpiazzo Per:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dipendenze Per:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"La scena '%s' è al momento in modifica.\n"
+"I cambiamenti non avranno effetto a meno che venga ricaricata."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"La risorsa '%s' è in uso.\n"
+"I cambiamenti avranno effetto quando sarà ricaricata."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dipendenze"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Risorsa"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Percorso"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dipendenze:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Riparare Rotti"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor Dipendenze"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Cerca Risorsa di Rimpiazzo:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Proprietari Di:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"I file che stanno per essere rimossi sono richiesti da altre risorse perchè "
+"esse funzionino.\n"
+"Rimuoverli comunque? (no undo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Rimuovi i file selezionati dal progetto? (no undo)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Errore in caricamento:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Caricamento scena fallito per mancanza di dipendenze:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Apri Comunque"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Quale Azione deve essere intrapresa?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Ripara Dipendenze"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Errori in caricamento!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Elimina permanentemente %d elementi? (No undo!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Possiede"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Risorse Senza Proprietà Esplicita:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Esplora Risorse Orfane"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Eliminare i file selezionati?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Elimina"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nome Invalido."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caratteri validi:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Nome invalido. Non deve essere in conflitto con un nome di classe di engine "
+"esistente."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Nome invalido. Non deve essere in conflitto con un nome di tipo built-in "
+"esistente."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nome invalido. Non deve essere in conflitto con un nome di una costante "
+"globale esistente."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Percorso Invalido."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "File non esistente."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Non è nel percorso risorse."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Aggiungi AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload '%s' esiste già!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Rinomina Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Abilita AutoLoad Globals"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Sposta Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Rimuovi Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Abilita"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Riordina gli Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nome Nodo:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nome"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Lista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Aggiornamento Scena"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Memorizzando i cambiamenti locali.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Aggiornando la scena.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Scegli una Directory"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Scegli"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Torna Indietro"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Vai Avanti"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Vai Su"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Abilita File Nascosti"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Attiva Preferito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Modalità Attivazione"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Percorso Di Fuoco"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Sposta Preferito Su"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Sposta Preferito Giù"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Anteprima:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "ScansionaSorgenti"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Cerca Aiuto"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Lista Classi:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Cerca Classi"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Classe:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Eredita:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Ereditato da:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Breve Descrizione:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Metodi Pubblici:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Elementi Tema GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Costanti:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Breve Descrizione:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Descrizione Metodo:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Cerca Testo"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Agginto:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Rimosso:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Errore di salvataggio dell'atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Impossibile salvare la substruttura dell'atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Memorizzazione File:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Impacchettando"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Esportando per %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Impostando.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Output:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Re-Importando"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importo:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Nodo Da Scena"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Errore salvando la Risorsa!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Salva Risorsa Come.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Capisco.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Impossibile aprire il file per la scrittura:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Formato file richiesto sconosciuto:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Errore durante il salvataggio."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Salvataggio Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analizzo"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Creazione Miniature"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Impossibile salvare la scena. Probabili dipendenze (instanze) non sono state "
+"soddisfatte."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Caricamento della risorsa fallito."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Impossibile caricare MeshLibrary per l'unione!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Errore salvataggio MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Impossibile caricare TileSet per unione!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Errore di salvataggio TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Impossibile aprire zip dei template d'esportazionie."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Caricamento Template d'Esportazione"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Errore tentando di salvare il layout!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Layout dell'editor di default ignorato."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nome layout non trovato!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Ripristinato il layout di default ai settaggi di base."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copia parametri"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Incolla Parametri"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Incolla Risorsa"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copia Risorsa"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Rendi Built-In"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Rendi Sotto-risorse Uniche"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Apri in Aiuto"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Non c'è nessuna scena definita da eseguire."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Nessuna scena principale è mai stata definita, selezionarne una?\n"
+"Puoi cambiarla successivamente da \"Impostazioni Progetto\" sotto la "
+"categoria 'applicazioni'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"La scena selezionata '%s' non esiste, sceglierne una valida?\n"
+"Puoi cambiarla successivamente da \"Impostazioni Progetto\" sotto la "
+"categoria 'applicazioni'."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Las cena selezionata '%s non è un file scena, sceglierne una valida?\n"
+"Puoi cambiarla successivamente da \"Impostazioni Progetto\" sotto la "
+"categoria 'applicazioni'."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"La scena corrente non è mai stata salvata, per favore salvarla prima di "
+"eseguire."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Impossibile avviare subprocesso!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Apri Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Apri Scena Base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Apri scena rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Apri Script Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Si"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Chiudi scena? (I cambiamenti non salvati saranno persi)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Salva Scena Come.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Questa scena non è mai stata salvata. Salvare prima di eseguire?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Si prega di salvare prima la scena."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Salva Stringhe Traducibili"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Esporta Libreria Mesh"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Esporta Tile Set"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Esci"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Uscire dall'editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Scena corrente non salvata. Aprire comunque?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Impossibile ricaricare una scena che non è mai stata salvata."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Ripristina"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Questa azione non può essere annullata. Ripristinare comunque?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Esegui Scena Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Aprire la Gestione Progetti?\n"
+"(I cambiamenti non salvati saranno persi)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Scegli una Scena Principale"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Ugh"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Errore di caricamento scena, deve essere all'interno del percorso del "
+"progetto. Usare 'Importa' per aprire la scena, salvarla poi nel percorso del "
+"progetto."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Errore di caricamento della scena."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "La scena '%s' ha rotto le dipendenze:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Salva layout"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Elimina Layout"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Default"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Cambia Tab di Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d altri file"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "% altri file o cartelle"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Vai alla scena precedentemente aperta."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Scheda successiva"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Scheda precedente"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operazioni con i file delle scene."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nuova scena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nuova Scena Ereditata.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Apri Scena.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Salva Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Salva tutte le Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Chiudi Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Vai a Scena Preced."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Apri Recente"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtro Files Rapido.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Converti In.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Stringhe Traducibili.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Redo"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Esegui Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Impostazioni Progetto"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Ripristina Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Esci alla Lista Progetti"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Modalità Senza Distrazioni"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importa asset nel progetto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importa"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Strumenti di progetto o scena vari."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Strumenti"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Esporta il progetto a diverse piattaforme."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Esporta"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Esegui il progetto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Play"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Metti in pausa la scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausa Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Ferma la scena."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Stop"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Esegui la scena in modifica."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Esegui Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Esegui scena personalizzata"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Esegui Scena Personalizzata"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opzioni di Debug"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Distribuisci con Debug Remoto"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"All'esportazione o distribuzione, l'eseguibile risultante tenterà di "
+"connettersi all'IP di questo computer per poter effettuare il debug."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Distribuzione Piccola con Network FS"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Quando questa opzione è abilitata, esportare o distribuire produrrà un "
+"eseguibile minimo.\n"
+"Il filesystem verrà fornito dal progetto dall'editor mediante rete.\n"
+"Su Android, la distribuzione userà il cavo USB per una performance migliore. "
+"Questa opzione accellera il testing di giochi di grande entità."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Forme di Collisione Visibili"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Le forme di collisione e i nodi di raycast (per il 2D e 3D) Saranno visibili "
+"nel gioco in esecuzione se l'opzione è attiva."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navigazione Visibile"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Le mesh e i poligoni di navigazione saranno visibili nel gioco in esecuzione "
+"se l'opzione è attiva."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sincronizza Cambiamenti Scena"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Quando questa opzione è attiva, qualsiasi cambiamento fatto alla scena "
+"nell'editor sarà replicato nel gioco in esecuzione.\n"
+"Quando usata remotamente su un dispositivo, essa è più efficiente con il "
+"filesystem in rete."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Sincronizza Cambiamenti Script"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Quando questa opzione è attiva, qualsiasi script salvato verrà ricaricato "
+"nel gioco in esecuzione.\n"
+"Quando usata remotamente su un dispositivo, essa è più efficiente con il "
+"filesystem in rete."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Impostazioni Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Layout dell'Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Abilita/Disabilita Fullscreen"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Installa Template di Esportazione"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Riguardo a"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Avverti quando una risorsa esterna è stata modificata."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Gira quando la finestra dell'editor viene ridisegnata!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Aggiorna Sempre"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Aggiorna Cambiamenti"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "Disabilita lo Spinner di Update"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Crea una nuova risorsa in memoria e modificala."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Carica una risorsa esistente dal disco e modificala."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Salva la risorsa in modifica."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Salva Come.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Vai all'ultimo oggetto modificato nella cronologia."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Vai al prossimo oggetto modificato nella cronologia."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Cronologia di oggetti recentemente modificati."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Proprietà oggetto."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "FileSystem"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Nodo"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Output"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Re-Importa"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Aggiorna"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Grazie dalla comunità di Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Grazie!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importa templates Da File ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Esporta Progetto"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Esporta Libreria"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Unisci Con Esistente"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Password:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Apri e Esegui uno Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Carica Errori"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Plugins Installati:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Versione:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autore:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Stato:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Interrrompi Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Inizia Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Misura:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Tempo Frame (sec)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Tempo Medio (sec)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Frame %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "Frame Fisso %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Tempo:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusivo"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Se stesso"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Frame #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Si prega di attendere che lo scan venga completato."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "La scena corrente deve essere salvata per re-importare."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Salva e Re-Importa"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Re-Importando Risorse Cambiate"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Scrivi la logica nel metodo _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Vi è già una scena correntemente modificata."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Impossibile istanziare script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Hai dimenticato la keyword 'tool'?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Impossibile eseguire lo script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Hai dimenticato il metodo '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Default (Stesso che Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Scegli Nodo(i) da Importare"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Percorso Scena:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importa Da Nodo:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Impossibile aprire file_type_cache.cch per scrittura, non salvo la cache dei "
+"tipi di file!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Stessi file di origine e e destinazione, non faccio nulla."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+"Stessi percorsi \n"
+"di origine e e destinazione, non faccio nulla."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Impossibile muovere le directory dentro se stesse."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "Non posso operare su '..'"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Scegli un Nuovo Nome e Posizione Per:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Nessun File selezionato!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Istanza"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Modifica Dipendenze.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Vedi Proprietari.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copia Percorso"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Rinomina o Sposta.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Sposta in.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Info"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Mostra nel File Manager"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Re-Importa.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Directory Precedente"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Directory Successiva"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Re-Scan Filesystem"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Abilita lo stato della cartella come Preferito"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Istanzia le scene selezionate come figlie del nodo selezionato."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Sposta"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Aggiungi a Gruppo"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Rimuovi da Gruppo"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Nessuna bit mask da importare!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Il percorso di destinazione vuoto."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+"Il percorso di destinazione deve essere un percorso completo di risorsa."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Il percorso di destinazione deve esistere."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Il percorso di salvataggio è vuoto!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importa BitMasks"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Texture Sorgenti:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Percorso di destinazione:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Accetta"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Bit Mask"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Nessun file font sorgente!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Nessuna risorsa font di destinazione!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Estensione file invalida.\n"
+"Si prega di usare .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Impossibile caricare/processare il font sorgente."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Impossibile salvare font."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Font Sorgente:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Dimensione Font sorgente:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Risorsa di destin. :"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "La rapida volpe bianca scavalca il cane pigro."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Test:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opzioni:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importazione font"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Questo file è già un file font di Godot, si prega di fornire invece un file "
+"di tipo BMfont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Apertura come BMFont file fallita."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Sorgente font personalizzato invalido."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Font"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Nessuna mesh da importare!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importa Mesh Singola"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Mesh Sorgente(i):"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Superficie %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Nessun sample da importare!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importa Sample Audio"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Sample Sorgente(i):"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Sample Audio"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nuova Clip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opzioni Animazione"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Flags"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "Bake FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Ottimizzatore"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Errore Lineare Max"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Errore Angolare Max"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Angolo Max"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Clips"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Inizio(i)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Fine(i)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Loop"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtri"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Il percorso sorgente è vuoto."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Impossibile caricare script di post-importazione."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Script di post-importazione invalido/non funzionante."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Errore di importazione scena."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importa Scena 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Scena Sorgente:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Stesso che Scena di Destinazione"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Condiviso"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Cartella Texture di Destinazione:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script di Post-Process:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Tipo di Nodo Root Personalizzato:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "Nome Nodo di Root:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "I File Seguenti sono Mancanti:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importa ComunqueImporta Comunque"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importa e Apri"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"La scena modificata non è stata salvata, aprire la scena importata comunque?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importa Scena"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importando Scena.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Eseguendo Script Personalizzato.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Impossibile caricare lo script di post-import:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Script di post-import invalido/non funzionante (controllare console):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Errore di esecuzione dello script di post-import:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importa Immagine:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Impossibile importare un file su se stesso:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Impossibile localizzare il percorso: %s (già locale)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Salvataggio.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animazione Scena 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Decompressi"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Comprimi Lossless (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Comprimi Lossy (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Comprimi (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Formato Texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Qualità Compressione Texture (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opzioni Texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Si prega di specificare qualche file!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Almeno un file è richiesto per l'Atlas."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Errore di importazione:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Solo un file è richiesto per una texture grande."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Dimensione Texture Massima:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importa Textures per Atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Dimensione Cella:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Texture Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importa Texture Grandi (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Texture Sorgente"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Texture Base Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Texture Sorgente(i)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importa Textures per 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importa Textures per 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Importa Textures"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Texture 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Texture 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Texture dell'Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"NOTA: Importare texture 2D non è obbligatorio. Basta copiare i file png/jpg "
+"nel progetto."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Ritaglia spazio vuoto."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Texture"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importa Texture Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Carica Immagine Sorgente"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Taglio"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Inserimento"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Salvataggio"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Impossibile salvare texture grande:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Costruisci Atlas Per:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Immagine Caricamento:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Impossibile caricare immagine:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Convertendo Immagini"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Tagliando Immagini"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Bliting Immagini"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Impossibile salvare l'immagine di atlas:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Impossibile salvare la texture convertita:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Sorgente invalida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Sorgente traduzione invalida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Colonna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Linguaggio"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Nessun elemento da importare!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Nessun percorso di destinazione!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importa Traduzioni"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Impossibile Importare!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importa Traduzione"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "CSV Sorgente:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignora Prima Riga"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Comprimi"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Aggiungi a Progetto (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Importa Lingue:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Traduzione"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "MultiNode Set"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Gruppi"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Seleziona un Nodo per modificare Segnali e Gruppi."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Abilità Autoplay"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Nuovo Nome Animazione:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nuova Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Cambia Nome Animazione:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Rimuovi Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ERRORE: Nome animazione invalido!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ERRORE: Il nome dell'animazione esiste già!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Rinomina Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Aggiungi Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Fondi il Successivo Cambiato"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Cambia tempo di Blend"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Carica Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplica Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ERRORE: Nessuna animazione da copiare!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ERRORE; Nessuna risorsa animazione nella clipboard!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animazione Incollata"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Incolla Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ERRORE: Nessuna animazione da modificare!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Esegui la seguente animazione al contrario dalla posizione corrente (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Esegui la seguente animazione al contrario dalla fine. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Ferma il playback dell'animazione. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Esegui l'animazione seguente dall'inizio (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Esegui la seguente animazione dalla posizione corrente (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Posizione animazione (in secondi)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Scala playback dell'animazione globalmente per il nodo."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Crea nuova animazione nel player."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Carica animazione da disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Carica un'animazione da disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Salva l'animazione corrente"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Salva Come"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Mostra una lista di animazioni nel player."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Autoplay al Caricamento"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Modifica i tempi di Blend della destinazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Strumenti di Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Copia Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Crea Nuova Animazione"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nome Animazione:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Errore!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Tempi di Blend:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Successivo (Coda Automatica):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Tempi di Blend Cross-Animation"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animazione"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Nuovo nome:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Scala:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Fade In (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Fade Out (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Fondi"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mischia"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Restart Automatico:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Restart (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Restart Casuale(i):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Inizia!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Quantità:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blend:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Blend 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Blend 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Tempo(i) di Crossfade:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Corrente:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Aggiungi Input"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Pulisci Auto-Avanzamento"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Imposta Auto-Avanzamento"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Elimina Input"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Rinomina"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Animation tree valido."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Animation tree invalido."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nodo Animazione"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nodo OneShot"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Node Mix"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nodo Blend2"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nodo Blend3"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nodo Blend4"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nodo TimeScale"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nodo TimeScale"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nodo Transizione"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Importa animazioni.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Modifica Filtri Nodi"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtri.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Elaborazione %d Triangoli:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Triangolo #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Impostazioni Baker Luci:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Elaborazione Geometria"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Aggiustando le Luci"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Creazione BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Creazione Octree Luci"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Creazione Octree Texture"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Trasferisci a Lightmap:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Allocazione Texture #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Backing Triangoli #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Texture Post-Processing #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Bake!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Resetta il processo di baking dell'octree (ricomincia da capo)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Anteprima"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Configura Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Offset Griglia:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Step Griglia:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Offset Rotazione:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Step Rotazione:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Perno di Movimento"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Azione di spostamento"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Modifica Catena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Modifica CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Cambia Ancore"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Zoom(%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Incolla Posa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Modalità di Selezione"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Trascina: Ruota"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Drag: Muovi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Premi 'v' per Cambiare Perno, 'Shift+v' per Trascinare il Pernno (durante lo "
+"spostamento)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+RMB: Selezione Lista Profondità"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Modalità Movimento"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Modalità Rotazione"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Mostra una lista di tutti gli oggetti alla posizione cliccata\n"
+"(identico a Alt+RMB in modalità selezione)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Clicca per cambiare il perno di rotazione dell'oggetto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Modalità di Pan"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Blocca l'oggetto selezionato sul posto (non può essere mosso)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Sblocca l'oggetto selezionato (può essere mosso)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Accerta che I figli dell'oggetto non siano selezionabili."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Ripristina l'abilità dei figli dell'oggetto di essere selezionati."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Usa lo Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Mostra Griglia"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Usa lo Snap di Rotazione"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Snap Relativo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Configura Snap..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Usa Snap a Pixel"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Espandi a Genitore"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Scheletro.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Crea Ossa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Elimina Ossa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Mostra Ossa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Crea Catena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Elimina Catena IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Vista"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Zoom Reset"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Imposta Zoom.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centra Selezione"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Selezione Frame"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Ancora"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Inserisci Keys"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Inserisci Key"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Inserisci Key (Tracce Esistenti)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copia Posa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Pulisci Posa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Imposta un Valore"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Snap (Pixels):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "Aggiungi %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "Aggiungendo %s..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Crea Nodo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Errore istanziamento scena da %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Nessun genitore del quale istanziare un figlio."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Questa operazione richiede un solo nodo selezionato."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "Cambia tipo di default"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Premi & Trascina + Shift : Aggiungi nodo come fratello\n"
+"Premi & Trascina + Alt : Cambia tipo del nodo"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Crea Poly"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Modifica Poly"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Modifica Poly (Rimuovi Punto)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Crea un nuovo poligono dal nulla."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Crea Poly3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Imposta Maniglia"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Aggiungi/Rimuovi Punto Rampa Colori"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Modifica Rampa Colori"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Creazione Libreria Mesh"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Miniatura.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Rimuovi elemento %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Aggiungi Elemento"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Rimuovi Elementi Selezionati"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importa da Scena"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Aggiorna da Scena"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Elemento %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Elementi"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Editor Lista Elementi"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Crea Poligono di occlusione"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Modifica poligono esistente:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "LMB: Sposta punto."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl+LMB: dividi Segmento."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "RMB: Elimina Punto."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "La mesh è vuota!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Crea Corpo Trimesh Statico"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Crea Corpo Convesso Statico"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Questo non funziona sulla root della scena!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Crea Forma Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Crea Forma Convessa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Crea Mesh di Navigazione"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "MeshInstance manca di una Mesh!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "La mesh non ha superficie dalla quale creare un'outline!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Impossiblile creare outline!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Crea Outline"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Crea Corpo Statico Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Crea Corpo Statico Convesso"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Crea Fratello di Collisione Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Crea Fratello di Collisione Convessa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Crea Mesh di Outline.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Crea Mesh di Outline"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Dimensione Outline:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"Nessuna sorgente mesh specificata (e nessun MultiMesh impostata nel nodo)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+"Nessuna sorgente mesh specificata (e la MultiMesh non contiene alcuna Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Sorgente Mesh invalida (percorso invalido)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Sorgente Mesh invalida (non è una MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Sorgente Mesh invalida (non contiene alcun a risorsa Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Nessuna sorgente di superficie specificata."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Sorgente superficie invalida (percorso invalido)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Sorgente superficie invalida (nessuna geometria)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "Sorgente superficie invalida (nessuna faccia)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Il genitore non ha facce solde da popolare."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Impossibile mappare l'area."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Seleziona una Mesh Sorgente:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Seleziona una Superficie di Target:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Popola la Superficie"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Popola MultiMesh"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Superficie Target:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Mesh Sorgente:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Asse-X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Asse-Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Asse-Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Asse Mesh Su:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotazione Casuale:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinazione Casuale:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Scala Casuale:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Popola"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Crea Poligono di Navigazione"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Rimuovi Poligono e Punto"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Errore di caricamento immagine:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Nessun pixel con trasparenza >128 nell'immagine.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Imposta Maschera Emissione"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Cancella Maschera Emissione"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Carica Maschera Emissione"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Conteggio Punti Generati:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "Il nodo non contiene geometria."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Il nodo non contiene geometria (facce)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Le facce non contengono area!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Nessuna faccia!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Genera AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Crea Emitter Da Mesh"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Crea Emitter Da Nodo"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Cancella Emitter"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Crea Emitter"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Posizioni di Emissione:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Riempimento Emissione:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Superficie"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volume"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Rimuovi Punto da Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Aggiungi Punto a Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Sposta Punto in curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Sposta In-Control sulla Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Sposta Out-Control sulla Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Selezione Punti"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Trascina: Seleziona Punti di Controllo"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Click: Aggiungi Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Click Destro: Elimina Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Seleziona Punti di Controllo (Shift+Trascina)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Aggiungi Punto (in sapzio vuoto)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Spezza Segmento (in curva)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Elimina Punto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Chiudi curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Punto Curva #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Imposta Posizione Punti curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Imposta Posizione Curve In"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Imposta Posizione Curve Out"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Dividi Percorso"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Rimuovi Punto Percorso"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Crea UV Map"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Trasla UV Map"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Polygon 2D UV Editor"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Sposta Punto"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Ruota"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Muovi Tutti"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Scala"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Sposta Poligono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Ruota Poligono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Scala Poligono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Poligono->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Poligono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Cancella UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Abilita Snap"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Griglia"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ERROERE: Impossibile caricare la risorsa!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Aggiungi Risorsa"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Rinomina Risorsa"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Elimina Risorsa"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Clipboard risorse vuota!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Carica Risorsa"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Decodifica BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Lunghezza:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Apri File(s) Sample"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "ERRORE: Impossibile caricare sample!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Aggiungi Sample"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Rinomina Sample"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Elimina Sample"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Stereo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Formato"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Pitch"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Errore durante il salvataggio del tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Errore di salvataggio"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Errore di importazione tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Errore di importazione"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importa Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Salva Tema Come.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Script successivo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script Precedente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "File"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Nuovo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Salva Tutto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Ricarica Script Soft"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Cronologia Succ."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Cronologia Prec."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Ricarica Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Salva Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Salva Tema Come"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Chiudi Documentazione"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Chiudi Tutto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Trova.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Trova Successivo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Debug"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Step Over"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Step Into"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Break"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continua"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Mantieni Debugger Aperto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Finestra"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Sposta a Sinistra"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Sposta a Destra"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Tutorials"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Apri https://godotengine.org alla sezione tutorial."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Classi"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Cerca nella gerarchia delle classi."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Cerca Riferimenti nella documentazione."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Vai al documento precedentemente modificato."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Vai al documento successivo."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Crea Script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"I file seguenti sono più recenti su disco.\n"
+"Che azione deve essere intrapresa?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Ricarica"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Risalva"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Debugger"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Gli script built-in possono essere modificati solamente quando la scena a "
+"cui appartengono è caricata"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Scegli Colore"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Sposta Su"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Sposta giù"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Indenta Sinistra"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Indenta Destra"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Cambia a Commento"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Clona Sotto"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Completa Simbolo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Taglia Spazi in Coda"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Auto Indenta"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Rimuovi Tutti i Breakpoints"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Vai a Breakpoint Successivo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Vai a Breakpoint Precedente"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Trova Precedente"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Rimpiazza.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Vai a Funzione.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Vai a Linea.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Aiuto Contestuale"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Cambia Costante Scalare"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Cambia Costante Vett."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Cambia Costante RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Cambia Operatore Scalare"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Cambia Operatore Vett."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Cambia Operatore Scalare Vett."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Cambia Operatore RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Abilita Solo Rot"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Cambia Funzione Scalare"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Cambia Funzione Vett."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Cambia Uniforme Scalare"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Cambia Uniforme Vett."
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Cambia Uniforme RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Cambia Valore di Default"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Cambia Uniforme XForm"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Cambia Uniforme Texture"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Cambia Uniforme Cubemap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Cambia Commento"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Aggiungi/Rimuovi alla Rampa Colori"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Aggiung/Rimuovi alla Mappa Curve"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Modifica la Mappa Curve"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Cambia Nome Input"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Connetti Nodi Grafico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Disconnetti Nodi Grafico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Rimuovi Nodo Grafico di Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Sposta Nodo Grafico di Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Duplica Nodo(i) Grafico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Elimina Nodo(i) Grafico di Shader"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Errore: Giunzione ciclica"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Errore: Connessioni Input MAncanti"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Aggiungi Nodo Grafico Shader"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ortogonale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Prospettiva"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transform Abortito."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transform Asse-X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transform Asse-Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transform Asse-Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Visualizza Tranform del Piano."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Scalando a %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Ruotando di %s gradi."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Vista dal Basso."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Basso"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Vista dall'Alto."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Alto"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Vista dal Retro."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Retro"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Vista Frontale."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Fronte"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Vista Sinistra."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Sinistra"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Vista Destra."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Destra"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Keying disabilitato (nessun key inserito)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Key d'Animazione Inserito."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Allinea a vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Ambientazione"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Audio Listener"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Finestra di XForm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Nessuna scena da istanziare selezionata!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Istanzia a Cursore"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Impossibile istanziare la scena!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Modalità Movimento (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Modalità Rotazione (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Modalità Scala (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Vista dal Basso"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Vista dall'Alto"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Vista dal Retro"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Vista Frontale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Vista Sinistra"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Vista Destra"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Cambia Vista Prospettiva/Ortogonale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Inserisci Key Animazione"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Focalizza su Origine"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Centra a Selezione"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Allinea Selezione Con Vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transform"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Coordinate locali"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Finestra di Transform.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Usa Luce Default"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Usa sRGB Default"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Vista"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Viste"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Viste (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Viste"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Viste (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Viste"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Mostra Normale"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Mostra Wireframe"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Mostra Overdraw"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Mostra senza Shader"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Visualizza Origine"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Visualizza Griglia"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Impostazioni Snap"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Trasla Snap:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Ruota Snap (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Scala Snap (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Impostazioni Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Normale Luce di Default:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Colore Luce Ambiente:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "FOV Prospettiva (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Visualizza Z-Near:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Visualizza Z-Far:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Cambiamento Transform"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Transla:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Ruota (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Scala (rateo):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Tipo Transform"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pre"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Post"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERRORE; Impossibile caricare la risorsa frame!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Aggiungi frame"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Clipboard risorse vuota o non è una texture!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Incolla Frame"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Aggiungi vuoto"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Cambia Loop Animazione"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Cambia FPS ANimazione"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vuoto)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animazioni"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Velocità (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Frames Animazione"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Inserisci Vuoto (Prima)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Inserisci Vuoto (Dopo)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Su"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Giù"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "Anteprima StyleBox:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Modalità Snap:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Nessuno>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Snap a Pixel"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Snap Griglia"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Auto Divisione"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Offset:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Step:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Separazione:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Regione Texture"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Editor Regioni Texture"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Impossibile salvare il tema su file:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Aggiungi Tutti gli Elementi"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Aggiungi Tutti"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Rimuovi Elemento"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Tema"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Aggiungi Elementi di Classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Rimuovi Elementi di Classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Crea Template Vuota"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Crea Template Editor Vuota"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Elemento"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Check Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Checked Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Ha"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Molte"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Opzioni"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Ha, Molte, Diverse, Opzioni!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Tab 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Tab 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Tab 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Tipo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Tipo Dato:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Icona"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Stile"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Colore"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Disegna TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "duplica"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Cancella TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Cancella selezione"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Trova tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Trasponi"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Specchia X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Specchia Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Secchiello"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Preleva Tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Seleziona"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Ruota a 0 gradi"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Ruota a 90 gradi"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Ruota a 180 gradi"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Ruota a 270 gradi"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Impossibile trovare tile:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nome elemento o ID:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Crea da scena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Unisci da scena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Crea da Scena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Unisci da Scena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Errore"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Modifica le opzioni di script"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Si prega di esportare al di fuori della cartella del progetto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Errore di esportazione del progetto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Errore di scrittura del PCK del progetto!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Per ora non vi è esportatore per la piattaforma '%s'."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Crea Nuova Risorsa"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Nome valido"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transizione"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Stato:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Password:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Caratteri validi:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Nuovo nome:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Includi"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Cambia Gruppo Immagine"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Il nome del gruppo non può essere vuoto!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Carattere invalido nel nome del gruppo!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Il nome del gruppo è già esistente!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Aggiungi Gruppo Immagini"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Elimina Gruppo Immagini"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Anteprima Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Impostazioni Esportazione Progetto"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Target"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Esporta a Piattaforma"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Risorse"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Esporta le risorse selezionate (incluse le dipendenze)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Esporta tutte le risorse nel progetto."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Esporta tutti i file nella directory del progetto."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Modalità d'Esportazione:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Risorse da Esportare:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Azione"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtri per esportare file che non son risorse (separati con virgola, es.: *."
+"json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtri per escludere dall'esportazione (separati con virgola, es.: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Converti le scene in formato testuale in binario all'esportazione."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Immagini"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Mantieni l'originale"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Comprimi per Disco (Lossy, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Comprimi per RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Converti Immagini (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Qualità compressione per disco (Lossy):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Riduci Tutte le Immagini:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Formati di Compressione:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Gruppi Immagini"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Gruppi:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Comprimi Disco"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Comprimi RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Modalità di Compressione:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Qualità Lossy:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Riduci di:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Anteprima Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Filtro Immagine:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Immagini:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Seleziona Nulla"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Gruppo"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Samples"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Modalità Conversione Sample (file .wav):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Mantieni"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Comprimi (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Limite Sampling Rate (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Ritaglia"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Silenzio di coda:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modalità Esportazione Script:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Testo"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilato"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Criptato (Fornisci la Chiave Sotto)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chiave di Crittografia Script (256-bits come esadecimali):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Esporta PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Esporta Progetto PCK"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Esporta.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Esportazione Progetto"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Preset Esportazione:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Percorso di progetto invalido, il percorso deve esistere!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Percorso di progetto invalido, godot.cfg non deve esistere."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Percorso di progetto invalido, godot.cfg deve esistere."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Progetto Importato"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Percorso di progetto invalido (cambiato qualcosa?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Impossibile creare godot.cfg nel percorso di progetto."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Impossibile estrarre i file seguenti dal pacchetto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Pacchetto Installato Con Successo!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importa Progetto Esistente"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Percorso Progetto (Deve Esistere):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nome Progetto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Crea Nuovo Progetto"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Percorso Progetto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Installa Progetto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Installa"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Sfoglia"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Nuovo Progetto di Gioco"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "Questo è un BINGO!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Progetto Senza Nome"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Sei sicuro di voler aprire più di un progetto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "Sei sicuro di voler eseguire più di un progetto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"Rimuovere progetto dalla lista? (I contenuti della cartella non saranno "
+"modificati)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr "Stai per esaminare %s cartelle per progetti Godot esistenti. Confermi?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Gestione Progetti"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Lista Progetti"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Esegui"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Esamina"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Scegli una Cartella da Scansionare"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Nuovo Progetto"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Esci"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Tasto "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Pulsante Joy"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Asse Joy"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Pulsante Mouse"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Azione invalida (va bene tutto a parte '/' o ':')."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "L'Azione '%s' esiste già!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Rinomina Evento di Azione Input"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Aggiungi Evento di Azione Input"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Control+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Premi un tasto.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Indice Pulsante Mouse:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Pulsante Sinistro"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Pulsante Destro"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Pulsante Centrale"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Pulsante Rotellina Su"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Pulsante Rotellina Giù"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Pulsante 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Pulsante 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Pulsante 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Pulsante 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Indice Asse Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Indice Pulsante Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Aggiungi azione di input"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Elimina Evento di Azione Input"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Errore nel salvare le impostazioni."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Impostazioni salvate OK."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Aggiungi Traduzione"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Rimuovi Traduzione"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Aggiungi percorso rimappato"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Remap Risorse Aggiungi Remap"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Cambia Lingua Remap Risorse"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Rimuovi Remap Risorse"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Rimuovi Opzione di Remap Rimorse"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Impostazioni Progetto (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Generali"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Proprietà:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Elim."
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Copia A Piattaforma.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Mappa Input"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Azione:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Dispositivo:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Indice:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Localizzazione"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Traduzioni"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Traduzioni:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Aggiungi..."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Remaps"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Risorse:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remaps per Locale:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Locale"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Preset.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Ease In"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ease Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zero"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Easing In-Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Easing Out-In"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "File.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Dir.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Carica"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Assegna"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Nuovo Script"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Errore caricamento file: Non è una risorsa!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Impossibile caricare l'immagine"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, val %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "On"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Proprietà:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Sezioni:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Seleziona Proprietà"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Seleziona Metodo"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "Impossibile eseguire lo strumento di PVRTC:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "Impossibile ricaricare l'immagine convertita usando il tool PVRTC:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Reparent Nodo"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Posizione Reparent (Seleziona nuovo genitore):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Mantieni Transform Globale"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Cambia Genitore"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Crea Nuova Risorsa"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Apri Risorsa"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Salva Risorsa"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Strumenti Risorsa"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Rendi Locale"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Modalità esecuzione:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Scena Corrente"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Scena Principale"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argomenti Scena Principale:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Impostazioni Esecuzione Scena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "Nessun genitore nel quale istanziare una scena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Errore caricamento scena da %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Impossibile istanziale la scena '%s' perché la scena corrente esiste in uno "
+"dei suoi nodi."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Istanzia Scena(e)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Questa operazione non può essere eseguita alla radice dell'albero."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Sposta Nodo In Genitore"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Sposta Nodi In Genitore"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplica Nodo(i)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Elimina Nodo(i)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Questa operazione non può essere eseguita senza una scena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Questa operazione no può essere eseguita su scene istanziate."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Salva Nuova Scena Come.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Ha Senso!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Impossibile operare su nodi da scena esterna!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Impossibile operare su nodi da cuoi la scena corrente eredita!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Rimuovi nodo(i)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Impossibile salvare la scena. Probabili dipendenze (istanze) non hanno "
+"potuto essere soddisfatte."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Errore salvando la scena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Errore duplicando la scena per salvarla."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Modifica Gruppi"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Modifica Connessioni"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Elimina Nodo(i)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Aggiungi Nodo Figlio"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Istanzia Scena Figlia"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Cambia Tipo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Allega Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "Svuota Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Unisci Da Scena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Salva Ramo come Scena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Elimina (Senza Conferma)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Aggiungi/Crea un Nuovo Nodo"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Istanzia un file scena come Nodo. Crea una scena ereditata se nessun nodo di "
+"root esiste."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "Allega un nuovo script o uno esistente al nodo selezionato."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "Svuota uno script per il nodo selezionato."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Abilita Spatial Visibile"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Abilita CanvasItem Visibile"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Istanza:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nome nodo invalido, i caratteri seguenti non sono consentiti:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Rinomina Nodo"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Scene Tree (Nodi):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Figlio Modificabile"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Carica come placeholder"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Scarta Istanziamento"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Apri nell Editor"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Liberare ereditarietà"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Liberare ereditarietà? (No Undo!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Libera!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Scegli un Nodo"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Nome classe genitore invalido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Caratteri Validi:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Nome classe invalido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Nome valido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Nome classe invalido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Nome classe genitore invalido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Percorso Invalido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Impossibile creare script in filesystem."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Errore caricamento script da %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Percorso vuoto"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Percorso non locale"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Percorso di base invalido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Estensione Invalida"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "Crea nuovo script"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "Carica script esistente"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nome Classe:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Built-In Script"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Allega Script Nodo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Avvertimento"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Errore:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Sorgente:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Funzione:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Errori"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Processo Figlio Connesso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Ispeziona Istanza Precedente"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Ispeziona Istanza Successiva"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Impila Frame"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Valiabile"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Errori:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Stack Trace (se applicabile):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Inspector Remoto"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Scene Tree Live:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Proprietà Oggetto Remoto: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valore"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Lista di Utilizzo Memoria Video per Risorsa:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Totale:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Mem Video"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Percorso Risosa"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tipo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Utilizzo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Vari"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Clicked Control:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tipo Clicked Control:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Modifica Root Live:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Imposta da Tree"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Scorciatoie"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Cambia Raggio Luce"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Cambia FOV Telecamera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Cambia dimensione Telecamera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Cambia Raggio di Sphere Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Cambia Ampiezza Box Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Cambia Raggio Capsule Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Cambia Altezza Capsule Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Cambia lunghezza Ray Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Cambia Estensione di Notifier"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Cambia Estensione di Notifier"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance non contiene una risorsa BakedLight."
+
+#~ msgid "Vertex"
+#~ msgstr "Vertice"
+
+#~ msgid "Fragment"
+#~ msgstr "Frammento"
+
+#~ msgid "Lighting"
+#~ msgstr "Illuminazione"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Attiva Persistenza"
+
+#~ msgid "Global"
+#~ msgstr "Globale"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Questo elemento non può essere reso visibile perchè il genitore è "
+#~ "nascosto. Rivela prima il genitore."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "I percorsi non possono iniziare per '/', i percorsi assoluti devono "
+#~ "iniziare per 'res://', 'user://', oppure 'local://'"
+
+#~ msgid "File exists"
+#~ msgstr "File esistente"
+
+#~ msgid "Valid path"
+#~ msgstr "Percorso valido"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Il nodo personalizzato non ha _get_output_port_unsequenced(idx,wmem), ma "
+#~ "le porte unsequenced sono state specificate."
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Impossibile accedere alla subdirectory:"
+
+#~ msgid "Help"
+#~ msgstr "Aiuto"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Risorse Importate"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Inserisci Keys (Ins)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Alto (Num7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Basso (Shift+Num7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Sinistra (Num3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Destra (Shift+Num3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Fronte (Num1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Retro (Shift+Num1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Prospettiva (Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Ortogonale (Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Selezione (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Allinea con vista (Ctrl+Shift+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Cambia Interpolazione Loop Animazione"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Attiva/Disattiva interpolazione durante loop animazione."
+
+#~ msgid "Load Layout"
+#~ msgstr "Carica Layout"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Scala Editor Regioni"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "Nessuna texture in questo nodo.\n"
+#~ "Imposta una texture per poter modificare la regione."
+
+#~ msgid "New Scene Root"
+#~ msgstr "Nuova Scena di Root"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Eredita Scena"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Lega (Parametri Extra):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Metodo Nel Nodo:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "Ricarica Tool Script (Soft)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Modifica Connessioni.."
+
+#~ msgid "Set Params"
+#~ msgstr "Imposta parametri"
+
+#~ msgid "Live Editing"
+#~ msgstr "Editing Live"
+
+#~ msgid "File Server"
+#~ msgstr "File Server"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Distribuisci i Client del File Server"
+
+#~ msgid "Group Editor"
+#~ msgstr "Editor Gruppo"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Gruppo(i) Nodi"
+
+#~ msgid "Set region_rect"
+#~ msgstr "Imposta region_rect"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Lista Plugin:"
+
+#~ msgid "%d frames"
+#~ msgstr "%d frames"
+
+#~ msgid ""
+#~ "NOTICE: You are not forced to import textures for 2D projects. Just copy "
+#~ "your .jpg or .png files to your project, and change export options later. "
+#~ "Atlases can be generated on export too."
+#~ msgstr ""
+#~ "NOTA: Non sei obbligato ad importare le texture per i progetti 2D. È "
+#~ "sufficiente copiare i tuoi file .jpg o .png nel tuo progetto, e cambiare "
+#~ "le opzioni di esportazione successivamente. Gli atlas possono essere "
+#~ "anche generati in esportazione."
+
+#~ msgid "Overwrite Existing Scene"
+#~ msgstr "Sovrascrivi Scena esistente"
+
+#~ msgid "Overwrite Existing, Keep Materials"
+#~ msgstr "Sovrascrivi Esistente, Mantieni Materiali"
+
+#~ msgid "Keep Existing, Merge with New"
+#~ msgstr "Mantieni Esistente, Unisci a Nuova"
+
+#~ msgid "Keep Existing, Ignore New"
+#~ msgstr "Mantieni Esistente, Ignora Nuova"
+
+#~ msgid "This Time:"
+#~ msgstr "Questa Volta:"
+
+#~ msgid "Next Time:"
+#~ msgstr "Prossima Volta:"
+
+#~ msgid "Merging.."
+#~ msgstr "Unione.."
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
new file mode 100644
index 0000000000..ea314db101
--- /dev/null
+++ b/editor/translations/ja.po
@@ -0,0 +1,6870 @@
+# Japanese translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# akirakido <achts.y@gmail.com>, 2016.
+# hopping tappy (たっぴさん) <hopping.tappy@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-11-12 15:11+0000\n"
+"Last-Translator: akirakido <achts.y@gmail.com>\n"
+"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ja/>\n"
+"Language: ja\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.9\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+#, fuzzy
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Convert()に対して無効な型の引数です。TYPE_* 定数を使ってください。"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+#, fuzzy
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "デコードバイトのバイトは十分ではありません。または無効な形式です。"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "ステップ引数はゼロです!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "インスタンスを使用していないスクリプトです"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "スクリプトに基づいていません"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "リソースファイルに基づいていません"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "無効なインスタンス辞書形式です ( @path が見つかりません)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "無効なインスタンス辞書形式です (@path でスクリプトを読み込めません)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "無効なインスタンス辞書形式です (@path で無効なスクリプト)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "無効なインスタンス辞書です (無効なサブクラス)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Functions:"
+msgstr "関数を作成"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Rename Function"
+msgstr "関数を作成"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Function"
+msgstr "関数を作成"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Function"
+msgstr "選択しているものを削除"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Variable"
+msgstr "無効なキーを削除"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Signal"
+msgstr "選択しているものを削除"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Editing Signal:"
+msgstr "信号を接続:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Node(s) From Tree"
+msgstr "シーンからのノード"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "遷移"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "戻り値:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "呼び出し"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "閉じる"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Edit Signal Arguments:"
+msgstr "余分に呼び出し引数を追加します。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Delete Selected"
+msgstr "選択範囲を複製"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "ノードへのパス:"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "無効なフォント サイズです。"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "無効なフォント サイズです。"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"SpriteFrames リソースを作成または AnimatedSprite フレームを表示するためには "
+"'Frames' プロパティに設定する必要があります。"
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"1 つだけ表示されている CanvasModulate は、シーン (またはインスタンス化された"
+"シーンのセット) ごとに許可されます。最初に作成された 1 つが動作する一方、残り"
+"の部分は無視されます。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D は、CollisionObject2D 派生ノードに衝突シェイプを提供するた"
+"めにのみ機能します。のみとしてご利用ください Area2D、StaticBody2D、"
+"RigidBody2D、KinematicBody2D などの子図形をすることです。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "空の CollisionPolygon2D は、衝突判定を持ちません。"
+
+#: scene/2d/collision_shape_2d.cpp
+#, fuzzy
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D は、CollisionObject2D 派生ノードにコリジョンシェイプを提供す"
+"るためにのみ機能します。Area2D、StaticBody2D、RigidBody2D、KinematicBody2D な"
+"どの子としてのみご利用ください。"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"関数の CollisionShape2D の形状を指定する必要があります。そのためのシェイプリ"
+"ソースを作成してください!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "光の形状とテクスチャは、'texture'プロパティに指定します。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"この遮蔽を有効にして、オクルーダ ポリゴンを設定 (または描画) する必要がありま"
+"す。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "この遮蔽のオクルーダ ポリゴンが空です。多角形を描画してください!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"NavigationPolygon リソースを設定または動作するようにこのノード用に作成する必"
+"要があります。プロパティを設定するか、ポリゴンを描画してください。"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance は、子または孫 Navigation2D ノードにある必要があり"
+"ます。ナビゲーション データのみ提供します。"
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer ノードは、ParallaxBackground ノードの子として設定されている場合"
+"のみ動作します。"
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Path プロパティは、動作するように有効な Particles2D ノードを示す必要がありま"
+"す。"
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D は、Path2D ノードの子として設定されている場合のみ動作します。"
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Path プロパティは、動作するように有効な Node2D ノードを示す必要があります。"
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"SampleLibrary リソースは SamplePlayer がサウンドを再生するために作成または "
+"'samples' プロパティで設定する必要があります。"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Path プロパティは、動作するように有効なビューポート ノードをポイントする必要"
+"があります。このようなビューポートは、'render target' モードに設定する必要が"
+"あります。"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Path プロパティに設定したビューポートは、このスプライトの動作する順序で "
+"'render target' として設定する必要があります。"
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D は、親として直接編集されたシーンのルートを使用する場合に最"
+"適です。"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape は衝突物由来のノードに衝突形状を提供するのに役立ちます。唯一の"
+"彼らに形状を与えることなどエリア、静ボディ、RigidBody、キネマティックボディの"
+"子としてそれを使用してください。"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"関数の CollisionShape の形状を指定する必要があります。それのためのシェイプリ"
+"ソースを作成してください!"
+
+#: scene/3d/collision_polygon.cpp
+#, fuzzy
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon は、CollisionObject 派生ノードにコリジョンシェイプを提供する"
+"ためにのみ機能します。Area、StaticBody、RigidBody、KinematicBody の子としての"
+"み利用してください。"
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "空の CollisionPolygon は、衝突判定を持ちません。"
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"このノードを動かすために NavigationMesh リソースを設定または作成する必要があ"
+"ります。"
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance は、ナビゲーションノードの子や孫である必要があります。"
+"これはナビゲーションデータのみ提供します。"
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Path プロパティは、動作するように有効な Particles2D ノードを示す必要がありま"
+"す。"
+
+#: scene/3d/scenario_fx.cpp
+#, fuzzy
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"1 つだけの WorldEnvironment は、シーン (またはインスタンス化されたシーンの"
+"セット) ごとに許可されます。"
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"SpatialSamplePlayer でサウンドを再生するためには SampleLibrary リソースを作成"
+"または 'samples' プロパティで設定する必要があります。"
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"SpriteFrames リソースを作成または AnimatedSprite3D フレームを表示するために"
+"は 'Frames' プロパティに設定する必要があります。"
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "決定"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "警告!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "確認してください。"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "ファイルが既に存在します。上書きしますか?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "すべての認識"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "すべてのファイル(*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "開く"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "ファイルを開く"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "ファイルを開く"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "ディレクトリを開く"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "ファイルまたはディレクトリを開く"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "保存"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "ファイルを保存"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "フォルダを作成"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Path:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "ディレクトリまたはファイル:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "ファイル:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "フィルター:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "名前:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "フォルダを作成できませんでした。"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "有効な拡張子を使用する必要があります。"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "デバイス"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "ボタン"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "左クリック"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "右クリック"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "中クリック"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "ホイール上"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "ホイール下"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "アナログ"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "切り取り"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "コピー"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "貼り付け"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "すべて選択"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "削除"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "元に戻す"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"ポップアップは、popup() または popup*() 関数のいずれかを呼び出す場合を除き、"
+"既定では非表示になります。編集のためにそれらを可視化することは可能ですが、彼"
+"らは実行時に非表示になります。"
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"このビューポートは、レンダー ターゲットとして設定されていません。その内容を画"
+"面に直接表示する場合は、サイズを得ることができるように、コントロールの子をつ"
+"くります。それ以外の場合、レンダー ターゲットし、その内部のテクスチャ表示のい"
+"くつかのノードに割り当てます。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "FreeType の初期化エラー。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "不明なフォント形式です。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "フォント読み込みエラー。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "無効なフォント サイズです。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "無効"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "すべて選択"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "追加したキーを移動"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Anim トラックを上に移動"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Anim トラックを下に移動"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Anim トラックを削除"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "これにトランジションを設定:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Anim トラック名の変更"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Anim トラック補間の変更"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Anim トラック値モード変更"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "ノード カーブを編集"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "選択曲線を編集"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim キー削除"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "選択範囲を複製"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "複製を転置"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "選択しているものを削除"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "継続的"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "離散"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "トリガー"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Anim キーを追加"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Anim キーの移動"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "スケールの選択"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "次のステップへ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "前のステップへ"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linear"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constant"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "アニメーションの最適化"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "アニメーションをクリーンアップ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "%s の新しいトラックを作成し、キーを挿入しますか?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "新しい %d トラックを作成し、キーを挿入しますか?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "作成"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Anim の作成・挿入"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim トラック ・ キーを挿入"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim キーを挿入"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Anim Len を変更"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Anim Loop を変更"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Anim は、型指定された値のキーを作成"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim 挿入"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Anim スケールキー"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Anim コールトラックを追加"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "アニメーション 拡大。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "長さ:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "アニメーションの長さ (単位は秒)。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "ステップ:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "カーソル ステップ スナップ (単位は秒)。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "アニメーションのループを有効/無効。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "新しいトラックを追加。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "現在のトラックに移動します。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "現在のトラックを下へ移動します。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "選択したトラックを削除します。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "トラック ツール"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "それらをクリックすることで、個々のキーの編集を有効にします。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "アニメーションのオプティマイザー"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "最大。線形エラー:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "最大。角度エラー:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "最大最適化角度:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "最適化"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "キー"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "遷移"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "スケールの比率:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "ノード内の関数を呼び出しますか?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "無効なキーを削除"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "未解決や空のトラックを削除"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "すべてのアニメーションをクリーンアップ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "クリーン アップ アニメーション(元に戻せません!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "クリーンアップ"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "配列のサイズを変更"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "配列の値の種類の変更"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "配列の値を変更"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "検索:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "並べ替え:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "逆"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "カテゴリー:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "すべて"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "サイト:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "サポート."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "公式"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "コミュニティ"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "テスト中"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "'%s' のメソッド一覧:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "メソッド一覧:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "引数:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "戻り値:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "行に移動"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "行番号:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "一致なし"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d 箇所を置換しました。"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "置換"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "すべて置換"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "大文字と小文字"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "単語全体"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "選択範囲のみ"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "検索"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "検索"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "次"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d 箇所を置換しました。"
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "見つかりません!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "置換"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "大文字小文字を区別"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "後方"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "スキップ"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "ライン:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "対象となるノードのメソッドを指定する必要があります!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "ノードに接続します。"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "追加"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "削除"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Add Extra Call Argument:"
+msgstr "余分に呼び出し引数を追加します。"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "ノードへのパス:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "関数を作成"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "接続"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "'%s' を '%s' に接続"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "信号を接続:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"シーン '%s' は現在編集中です。\n"
+"再読み込みしない限り、変更は反映されません。"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "依存関係が不足しているのためシーンを読み込めませんでした。"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "シーンを更新"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "シーンを更新しています.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Node From Scene"
+msgstr "シーンからのノード"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "シーンを保存"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"シーンを保存できませんでした。おそらく依存関係 (インスタンス) を満たせていま"
+"せん。"
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "There is no defined scene to run."
+msgstr "実行する定義済みのシーンはありません。"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"選択したシーン '%s' は、シーン ファイルではありません、有効なものを選択してい"
+"ますか?\n"
+"'アプリケーション' カテゴリの下の'プロジェクトの設定'で変更できます。"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"現在のシーンが保存されていませんでした、それ以前の実行中に保存してください。"
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "シーンを開く"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "終了"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "エディターを終了しますか?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Save all Scenes"
+msgstr "ファイルを保存"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "終了してプロジェクトリストを開く"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Select Mode"
+msgstr "すべて選択"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Move Mode"
+msgstr "追加したキーを移動"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "配列の値の種類の変更"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close Docs"
+msgstr "閉じる"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "閉じる"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "フォルダを作成"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "遷移"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "終了"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "すべて選択"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "すべて選択"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete (No Confirm)"
+msgstr "確認してください。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "フォント読み込みエラー。"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "フォルダを作成"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#, fuzzy
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "パスは「/」で始めることができません。絶対パスは必ず「res://」「user://」"
+#~ "「local://」 で始まる必要があります。"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
new file mode 100644
index 0000000000..a0ecb70bf5
--- /dev/null
+++ b/editor/translations/ko.po
@@ -0,0 +1,7011 @@
+# Korean translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# 박한얼 (volzhs) <volzhs@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-11-23 14:38+0000\n"
+"Last-Translator: 박한얼 <volzhs@gmail.com>\n"
+"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ko/>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"convert()하기 위한 인자 타입이 유효하지 않습니다, TYPE_* 상수를 사용하세요."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "디코딩할 바이트가 모자라거나, 유효하지 않은 형식입니다."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "스텝 인자가 제로입니다!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "스크립트의 인스턴스가 아님"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "스크립트에 기반하지 않음"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "리소스 파일에 기반하지 않음"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "유효하지 않은 인스턴스 Dictionary 형식 (@path 없음)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"유효하지 않은 인스턴스 Dictionary 형식 (@path 에서 스크립트를 로드할 수 없음)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"유효하지 않은 인스턴스 Dictionary 형식 (@path의 스크립트가 유효하지 않음)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "유효하지 않은 인스턴스 Dictionary (서브클래스가 유효하지 않음)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "함수:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "변수:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "시그널:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "함수명 변경"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "변수명 변경"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "시그널명 변경"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "함수 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "변수 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "시그널 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "함수 제거"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "변수 제거"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "변수 편집:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "시그널 제거"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "시그널 편집:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "표현식 변경"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "노드 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Preload 노드 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "트리에서 노드 추가"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "조건"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "스위치"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "리턴"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "호출"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "얻기"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "설정"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "편집"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "기본 타입:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "멤버:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "가능한 노드:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "닫기"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "시그널 인자 편집:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "변수 편집:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "변경"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "선택 항목 삭제"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "중단점 토글"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "노드 타입 찾기"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "노드 복사"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "노드 잘라내기"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "노드 붙여넣기"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "유요하지 않은 인덱스 속성명."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "노드를 지칭하는 경로가 아닙니다!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": 유효하지 않은 인자 타입: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": 유효하지 인자: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr "인증서 파일을 읽을 수 없습니다. 경로와 비밀번호가 정확합니까?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "서명 오브젝트 생성중 에러."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "패키지 서명을 생성하는 중 에러가 발생했습니다."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"내보내기 템플릿을 찾을 수 없습니다.\n"
+"내보내기 템플릿을 다운로드하여 설치하십시요."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "커스텀 디버그 패키지를 찾을 수 없습니다."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "커스텀 릴리즈 패키지를 찾을 수 없습니다."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "유효하지 않은 고유 이름."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "유요하지 않은 프로덕트 GUID."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "유요하지 않은 퍼블리셔 GUID."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "유요하지 않은 배경 색상."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (50x50 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (44x44 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (71x71 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (150x150 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (310x310 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "유효하지 않은 로고 이미지 크기입니다 (310x150 이어야 합니다)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+"유효하지 않은 스플래쉬 스크린 이미지 크기입니다 (620x300 이어야 합니다)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"AnimatedSprite이 프레임을 보여주기 위해서는 'Frames' 속성에 SpriteFrames 리소"
+"스 만들거나 지정해야 합니다."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"씬마다 보이는 CanvasModulate가 단 하나만 허용됩니다. 첫번째로 생성된 것만 동"
+"작하고, 나머지는 무시됩니다."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D는 CollisionObject2D에 충돌 모양을 지정하기 위해서만 사용됩"
+"니다. Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등에 자식 노드로 추"
+"가하여 사용합니다."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "빈 CollisionPolygon2D는 충돌에 영향을 주지 않습니다."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D는 CollisionObject2D에 충돌 모양을 지정하기 위해서만 사용됩니"
+"다. Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등에 자식 노드로 추가"
+"하여 사용합니다."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"CollisionShape2D가 기능을 하기 위해서는 반드시 모양이 제공되어야 합니다. 모"
+"양 리소스를 만드세요!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "라이트의 모양을 나타내는 텍스쳐를 'texture' 속성에 지정해야합니다."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Occluder가 동작하기 위해서는 Occluder 폴리곤을 지정하거나 그려야 합니다."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "Occluder 폴리곤이 비어있습니다. 폴리곤을 그리세요!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"이 노드가 동작하기 위해서는 NavigationPolygon 리소스를 지정 또는 생성해야 합"
+"니다. 속성을 지정하거나, 폴리곤을 그리세요."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance은 Navigation2D 노드의 하위에 있어야 합니다. 이것은 "
+"네비게이션 데이타만을 제공합니다."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer는 ParallaxBackground 노드의 자식노드로 있을 때만 동작합니다."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "Path 속성은 유효한 Particles2D 노드를 가리켜야 합니다."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D는 Path2D 노드의 자식노드로 있을 때만 동작합니다."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "Path 속성은 유효한 Node2D 노드를 가리켜야 합니다."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"SamplePlayer가 사운드를 재생하기 위해서는 'Samples' 속성에서 새로운 "
+"SampleLibrary 리소스를 생성하거나, 지정해야합니다."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Path 속성은 유효한 Viewport 노드를 가리켜야 합니다. 가리킨 Viewport는 또한 "
+"'render target' 모드로 설정되어야 합니다."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"이 Sprite가 동작하기 위해서는 Path 속성에 지정된 Viewport가 'render target'으"
+"로 설정되어야 합니다."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D는 편집 씬의 루트의 하위 노드로 추가할 때 가장 잘 동작합니"
+"다."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape은 CollisionObject에 충돌 모양을 지정하기 위해서만 사용됩니다. "
+"Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가하여 사용합니"
+"다."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"CollisionShape이 기능을 하기 위해서는 모양이 제공되어야 합니다. 모양 리소스"
+"를 만드세요!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon은 CollisionObject에 충돌 모양을 지정하기 위해서만 사용됩니"
+"다. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가하여 사용"
+"합니다."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "빈 CollisionPolygon는 충돌에 영향을 주지 않습니다."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"이 노드가 동작하기 위해서는 NavigationMesh 리소스를 지정하거나 생성해야 합니"
+"다."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance은 Navigation 노드의 하위에 있어야 합니다. 이것은 네비"
+"게이션 데이타만을 제공합니다."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Path 속성은 유효한 Spatial 노드를 가리켜야 합니다."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr "씬마다 WorldEnvironment가 단 하나만 허용됩니다."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"SpatialSamplePlayer가 사운드를 재생하기 위해서는 'Samples' 속성에서 새로운 "
+"SampleLibrary 리소스를 생성하거나, 지정해야합니다."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"AnimatedSprite3D가 프레임을 보여주기 위해서는 'Frames' 속성에 SpriteFrames 리"
+"소스 만들거나 지정해야 합니다."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "취소"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "확인"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "경고!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "확인해주세요..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "파일이 존재합니다. 덮어쓰시겠습니까?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "인식 가능한 모든 파일"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "모든 파일 (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "열기"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "파일 열기"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "파일 열기"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "디렉토리 열기"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "디렉토리 또는 파일 열기"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "저장하기"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "파일로 저장하기"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "폴더 생성"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "경로:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "디렉토리와 파일:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "파일:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "필터:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "이름:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "폴더를 만들 수 없습니다."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "유효한 확장자를 사용해야 합니다."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "쉬프트+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "알트+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "컨트롤+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "메타+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "기기"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "버튼"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "왼쪽 버튼."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "오른쪽 버튼."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "가운데 버튼."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "휠 위로."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "휠 아래로."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "축"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "잘라내기"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "복사하기"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "붙여넣기"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "전체선택"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "지우기"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "되돌리기"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popup은 popup() 또는 기타 popup*() 함수를 호출하기 전까지는 기본적으로 숨겨집"
+"니다. 화면을 편집하는 동안 보여지도록 할 수는 있으나, 실행시에는 숨겨집니다."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Viewport가 Render Target으로 설정되지 않았습니다. Viewport의 내용을 화면상에 "
+"직접 표시하고자 할 경우, 사이즈를 얻기 위해서 Control의 자식 노드로 만들어야"
+"합니다. 그렇지 않을 경우, 화면에 표시하기 위해서는 Render target으로 설정하"
+"고 내부적인 텍스쳐를 다른 노드에 할당해야 합니다."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "FreeType 초기화 에러."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "알 수 없는 폰트 포멧."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "폰트 로딩 에러."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "유요하지 않은 폰트 사이즈."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "사용 안함"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "모든 선택"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "키 이동"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "전환 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "속성 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "값 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "호출 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "트랙 추가"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "키 복제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "트랙 위로 이동"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "트랙 아래로 이동"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "트랙 삭제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "전환 설정:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "트랙 이름 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "트랙 보간 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "트랙 값 모드 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "노드 커브 수정"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "선택 커브 수정"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "키 삭제"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "선택키 복제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "선택된 트랙에 복제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "선택 삭제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "연속적인"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "비연속적인"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "트리거"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "키 추가"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "키 이동"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "선택키 스케일 조절"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "커서 위치에서 스케일 조절"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "다음 스텝으로 이동"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "이전 스텝으로 이동"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "직선형"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "비선형"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "전환"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "애니메이션 최적화"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "애니메이션 정리"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "%s (을)를 위해 새 트랙을 만들고 키를 추가하시겠습니까?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "%d개의 새 트랙을 생성하고 키를 추가하시겠습니까?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "생성"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "애니메이션 생성과 삽입"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "애니메이션 트랙과 키 삽입"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "애니메이션 키 삽입"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "애니메이션 길이 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "애니메이션 루프 변경"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "애니메이션 타입지정 값 키 만들기"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "애니메이션 삽입"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "애니메이션 키 크기 조절"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "애니메이션 함수 트랙 추가"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "애니메이션 확대."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "길이 (초):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "애니메이션 길이 (초)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "단계 (초):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "커서 단계 스냅 (초)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "애니메이션 루프 활성화/비활성화."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "새 트랙 추가."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "현재 트랙을 위로 이동."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "현재 트랙을 아래로 이동."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "선택된 트랙 삭제."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "트랙 도구"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "개별 키를 클릭함으로써 편집 활성화."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "애니메이션 최적화"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "최대 선형 오류:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "최대 각도 오류:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "최적화 가능한 최대 각도:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "최적화"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "애니메이션 편집을 위해서는 씬에서 AnimationPlayer를 선택해야 합니다."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "키"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "전환"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "스케일 비율:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "어떤 노드에서 함수를 호출할까요?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "유효하지 않은 키 삭제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "미결 트랙과 빈 트랙 삭제"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "모든 애니메이션 없애기"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "애니메이션 없애기 (되돌리기 불가!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "없애기"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "배열 크기 변경"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "배열 값 타입 변경"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "배열 값 변경"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "검색:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "정렬:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "뒤집기"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "카테고리:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "모두"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "사이트:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "지원.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "공식"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "커뮤니티"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "테스팅"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "에셋 ZIP 파일"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "'%s' 함수 목록:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "함수 목록:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "인수:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "리턴:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "라인으로 이동"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "라인 번호:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "일치 결과 없음"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d 회 변경됨."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "바꾸기"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "전체 바꾸기"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "대소문자 구분"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "전체 단어"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "선택영역만"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "검색"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "찾기"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "다음"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d 회 변경됨."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "찾을 수 없습니다!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "으로 바꿈"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "대소문자 구분"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "뒤로"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "변경 시 알림"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "건너뛰기"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "확대"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "축소"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "줌 리셋"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "라인:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "칼럼:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "대상 노드의 함수를 명시해야합니다!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"타겟 메소드를 찾을 수 없습니다! 유효한 메소드를 지정하거나, 타겟 노드에 스크"
+"립트를 추가하세요."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "연결할 노드:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "추가"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "삭제"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "별도의 호출 인자 추가:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "별도의 호출 인자:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "노드 경로:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "함수 만들기"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "지연"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "1회"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "연결"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "'%s'를 '%s'에 연결"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "시그널 연결:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "연결 해제"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "연결하기.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "연결해제"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "시그널"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "새로 만들기"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "즐겨찾기:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "최근:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "일치:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "설명:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "대체할 대상 찾기:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "종속 관계:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"씬 '%s'이(가) 현재 편집 중입니다.\n"
+"다시 로드 할 때 변경 사항이 적용됩니다."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"리소스 '%s'이(가) 사용 중입니다.\n"
+"다시 로드 할 때 변경 사항이 적용됩니다."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "종속 관계"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "리소스"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "경로"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "종속된 항목:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "깨진 종속성 수정"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "종속 관계 편집기"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "대체 리소스 검색:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "소유자:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"삭제하려고 하는 파일들은 다른 리소스들이 정상동작하기 위해 필요합니다.\n"
+"정말로 삭제하시겠습니까? (되돌리기 불가)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "프로젝트에서 선택된 파일들을 삭제하시겠습니까? (되돌리기 불가)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "로드 중 에러:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "없어진 종속 관계 때문에 씬을 로드할 수 없습니다:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "무시하고 열기"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "어떤 것을 수행하시겠습니까?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "종속 관계 수정"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "로드 중 에러 발생!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "%d개 항목을 영구적으로 삭제하시겠습니까? (되돌리기 불가)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "소유"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "명확하게 사용되지 않은 리소스:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "미사용 리소스 탐색기"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "선택된 파일들을 삭제하시겠습니까?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "삭제"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "유효하지 않은 이름."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "유효한 문자:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"유효하지 않은 이름입니다. 엔진에 존재하는 클래스 이름과 충돌하지 않아야 합니"
+"다."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "유효하지 않은 이름입니다. 내장 타입 이름과 충돌하지 않아야 합니다."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr "유효하지 않은 이름입니다. 전역 상수 이름과 충돌하지 않아야 합니다."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "유효하지 않은 경로."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "파일이 존재하지 않습니다."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "리소스 경로가 아닙니다."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "자동 로드 추가"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "자동로드에 '%s'이(가) 이미 존재합니다!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "자동 로드 이름 변경"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "자동로드 글로벌 토글"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "자동 로드 이동"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "자동 로드 삭제"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "활성화"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "자동 로드 위치 변경"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "노드 이름:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "이름"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "싱글톤"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "목록:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "씬 업데이트 중"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "로컬 변경사항을 저장 중.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "씬 업데이트 중.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "디렉토리 선택"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "선택"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "뒤로 가기"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "앞으로 가기"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "위로 가기"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "새로고침"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "숨김 파일 토글"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "즐겨찾기 토글"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "모드 토글"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "경로 포커스"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "즐겨찾기 위로 이동"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "즐겨찾기 아래로 이동"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "미리보기:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "소스 조사"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "도움말 검색"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "클래스 목록:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "클래스 검색"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "클래스:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "상속:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "상속한 클래스:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "간단한 설명:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "공개 함수:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "GUI 테마 항목:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "상수:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "간단한 설명:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "함수 설명:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "문자 검색"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "추가됨:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "제거됨:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "아틀라스 저장 중 에러:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "아틀라스 서브 텍스쳐를 저장할 수 없습니다:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "파일 저장 중:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "패킹중"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "%s 내보내기"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "설정 중.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " 출력:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "다시 가져오기"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "가져오는 중:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "씬으로부터 노드 가져오기"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "리소스 저장 중 에러!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "리소스를 다른 이름으로 저장.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "알겠습니다.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "쓰기 위한 파일을 열 수 없음:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "요청한 파일 형식을 알 수 없음:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "저장 중 에러."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "씬 저장"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "분석중"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "썸네일 생성 중"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"씬을 저장할 수 없습니다. 아마도 종속 관계가 만족스럽지 않을 수 있습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "리소스 로드 실패."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "병합할 메쉬 라이브러리를 로드할 수 없습니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "메쉬 라이브러리 저장 중 에러!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "병합할 타일셋을 로드할 수 없습니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "타일셋 저장 중 에러!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "내보내기 템플릿 zip 파일을 열 수 없습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "내보내기 템플릿 로딩 중"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "레이아웃 저장 시도 중 에러!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "에디터 기본 레이아웃이 변경되었습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "레이아웃 이름을 찾을 수 없습니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "기본 레이아웃이 초기 설정으로 복원되었습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "속성 복사"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "속성 붙여넣기"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "리소스 붙여넣기"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "리소스 복사하기"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "내장으로 만들기"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "하위 리소스를 유일하게 만들기"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "도움말에서 열기"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "실행하기 위해 정의된 씬이 없습니다."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"메인 씬이 지정되지 않았습니다. 선택하시겠습니까?\n"
+"나중에 \"프로젝트 설정\"의 'Application' 항목에서 변경할 수 있습니다."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"선택한 '%s' 씬이 존재하지 않습니다. 다시 선택하시겠습니까?\n"
+"나중에 \"프로젝트 설정\"의 'Application' 항목에서 변경할 수 있습니다."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"선택한 '%s' 씬이 씬 파일이 아닙니다. 다시 선택하시겠습니까?\n"
+"나중에 \"프로젝트 설정\"의 'Application' 항목에서 변경할 수 있습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr "현재 씬이 저장되지 않았습니다. 실행전에 저장해주세요."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "서브 프로세스를 시작할 수 없습니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "씬 열기"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "기본 씬 열기"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "빠른 씬 열기.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "빠른 스크립트 열기.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "네"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "씬을 닫으시겠습니까? (저장하지 않은 변경사항은 사라집니다.)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "씬을 다른 이름으로 저장.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "이 씬은 저장되지 않았습니다. 실행전에 저장하시겠습니까?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "먼저 씬을 저장해주세요."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "번역가능한 문자열 저장"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "메쉬 라이브러리 내보내기"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "타일 셋 내보내기"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "종료"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "에디터를 종료하시겠습니까?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "현재 씬이 저장되지 않았습니다. 무시하고 여시겠습니까?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "저장되지 않은 씬은 다시 로드할 수 없습니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "되돌리기"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "이 행동은 취소가 불가능합니다. 무시하고 되돌리시겠습니까?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "빠른 씬 실행.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"프로젝트 매니저를 실행하시겠습니까?\n"
+"(저장하지 않은 변경사항은 사라집니다.)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "메인 씬 선택"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "오우"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"씬 로딩 중 에러가 발생했습니다. 프로젝트 경로 안에 존재해야 합니다. '가져오"
+"기'로 씬을 연 후에, 프로젝트 경로 안에 저장하세요."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "씬 로딩 중 에러."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "'%s' 씬의 종속 항목이 깨져있습니다.:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "레이아웃 저장"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "레이아웃 삭제"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Default"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "씬 탭 전환"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d개 추가파일"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d개 추가 파일 또는 폴더"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "씬"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "이전에 열었던 씬으로 가기."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "다음 탭"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "이전 탭"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "씬 파일 동작."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "새 씬"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "새 상속 씬.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "씬 열기.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "씬 저장"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "모든 씬 저장"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "씬 닫기"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "닫고 이전 씬으로 이동"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "최근 열었던 항목"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "빠른 파일 필터링.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "변환.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "번역 가능한 문자열.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "메쉬 라이브러리.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "타일 셋.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "다시 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "스크립트 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "프로젝트 설정"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "씬 되돌리기"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "종료하고 프로젝트 목록으로 돌아가기"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "초집중 모드"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "프로젝트로 에셋 가져오기."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "가져오기"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "프로젝트 또는 씬 관련 여러가지 도구들."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "도구"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "프로젝트를 많은 플랫폼으로 내보내기."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "내보내기"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "프로젝트 실행."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "재성"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "씬 일시 정지"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "씬 일시 정지"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "씬 정지."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "정지"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "편집 중인 씬 실행."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "씬 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "다른 씬 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "커스텀 씬 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "디버그 옵션"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "원격 디버그 배포"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"내보내기나 배포를 할 때, 실행 파일이 디버깅을 위해서 이 컴퓨터의 IP로 연결을 "
+"시도합니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "네트워크 파일 시스템을 갖는 작은 배포"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"이 옵션이 활성화 되어 있을 경우, 내보내기나 배포는 최소한의 실행파일을 생성합"
+"니다.\n"
+"파일 시스템은 네트워크를 통해서 에디터 상의 프로젝트가 제공합니다.\n"
+"안드로이드의 경우, USB 케이블을 사용하여 배포할 경우 더 빠른 퍼포먼스를 제공"
+"합니다. 이 옵션은 큰 설치 용량을 요구하는 게임의 테스트를 빠르게 할 수 있습니"
+"다."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Collision Shape 보이기"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"이 옵션이 활성화 되어 있을 경우, 게임이 실행되는 동안 (2D와 3D의) 충돌 모양"
+"과 Raycast 노드가 표시됩니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navigation 보이기"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"이 옵션이 활성화 되어 있을 경우, 게임이 실행되는 동안 네비게이션 메쉬가 표시"
+"됩니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "씬 변경사항 동기화"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"이 옵션이 활성화 되어 있을 경우, 에디터상의 씬의 변경사항이 실행중인 게임에 "
+"반영됩니다.\n"
+"기기에 원격으로 사용되는 경우, 네트워크 파일 시스템과 함께하면 더욱 효과적입"
+"니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "스크립트 변경사항 동기화"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"이 옵션이 활성화 되어 있을 경우, 스크립트를 수정하고 저장하면 실행중인 게임에"
+"서 다시 읽어 들입니다.\n"
+"기기에 원격으로 사용되는 경우, 네트워크 파일 시스템과 함께하면 더욱 효과적입"
+"니다."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "설정"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "편집기 설정"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "에디터 레이아웃"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "전체화면 토글"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "내보내기 템플릿 설치"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "정보"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "외부 리소스가 변경되었을 때 알림."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "에디터 윈도우가 다시 그려질 때 회전!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "항상 갱신"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "변경사항만 갱신"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "업데이트 스피너 비활성화"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "인스펙터"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "새로운 리소스를 메모리에 만들고 편집합니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "디스크에서 기존 리소스를 로드하여 편집합니다."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "현재 편집된 리소스 저장."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "다른 이름으로 저장.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "히스토리상 이전에 편집한 오브젝트로 가기."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "히스토리상 다음에 편집한 오브젝트로 가기."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "최근 편집 오브젝트 히스토리."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "오브젝트 속성."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "파일 시스템"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "노드"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "출력"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "다시 가져오기"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "갱신"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Godot 커뮤니티에 감사드립니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "감사합니다!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "ZIP 파일로부터 템플릿을 가져오기"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "프로젝트 내보내기"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "라이브러리 내보내기"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "기존과 병합"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "암호:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "스크립트를 열고 실행"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "로드 에러"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "설치된 플러그인:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "버전:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "저자:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "상태:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "프로파일링 중지"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "프로파일링 시작"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "측정:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "프레임 시간 (초)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "평균 시간 (초)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "프레임 %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "고정 프레임 %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "시간:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "포함"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "자신"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "프레임 #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "스캔이 완료될 때까지 기다려주세요."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "다시 가져오기 위해서는 현재 씬을 저장해야 합니다."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "저장 및 다시 가져오기"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "변경된 리소스 다시 가져오기"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "로직을 _run() 함수안에 작성하세요."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "이미 편집된 씬이 있습니다."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "스크립트를 인스턴스 할 수 없습니다:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "'tool' 키워드를 잊으셨습니까?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "스크립트를 실행할 수 없습니다:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "'_run' 함수를 잊으셨습니까?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "기본 (에디터와 동일)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "가져올 노드들 선택"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "씬 경로:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "노드에서 가져오기:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr "file_type_cache.cch를 열수 없어서, 파일 타입 캐쉬를 저장하지 않습니다!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "소스와 대상 파일이 동일하여, 무시됩니다."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "소스와 대상 경로가 동일하여, 무시됩니다."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "디렉토리를 자신으로 이동할 수 없습니다."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "'..'에 수행할 수 없음"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "새로운 이름과 위치를 고르세요:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "파일이 선택되지 않았습니다!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "인스턴스"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "종속 관계 편집.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "소유자 보기.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "경로 복사"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "이름 변경 또는 이동.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "이동.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "정보"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "파일 매니저에서 보기"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "다시 가져오기.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "이전 디렉토리"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "다음 디렉토리"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "파일 시스템 재검사"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "즐겨찾기로 설정 토글"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "선택된 씬을 선택된 노드의 자식으로 인스턴스 합니다."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "이동"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "그룹에 추가"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "그룹에서 제거"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "가져올 비트 마스크가 없습니다!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "대상 경로가 없습니다."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "대상 경로는 완전한 리소스 경로여야 합니다."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "대상 경로가 존재해야 합니다."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "저장 경로가 없습니다!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "비트마스크 가져오기"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "소스 텍스쳐:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "대상 경로:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "수락"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "비트 마스크"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "소스 폰트 파일이 없습니다!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "폰트 리소스 경로가 없습니다!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"유효하지 않은 파일 확장자.\n"
+".fnt 를 사용하세요."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "소스 폰트를 로드/처리할 수 없습니다."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "폰트를 저장할 수 없습니다."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "소스 폰트:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "소스 폰트 크기:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "리소스 경로:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"The quick brown fox jumps over the lazy dog.\n"
+"다람쥐 헌 쳇바퀴에 타고파."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "테스트:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "옵션:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "폰트 가져오기"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr "이 파일은 이미 Godot 폰트 파일입니다. BMFont 파일을 선택하세요."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "BMFont 파일을 여는데 실패했습니다."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "사용자 지정 폰트 소스가 유효하지 않습니다."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "폰트"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "가져올 메쉬가 없습니다!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "단일 메쉬 가져오기"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "소스 메쉬:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "메쉬"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "서페이스 %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "가져올 샘플이 없습니다!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "오디오 샘플 가져오기"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "소스 샘플:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "오디오 샘플"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "새 클립"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "애니메이션 옵션"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "플래그"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "FPS 설정:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "최적화"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "최대 선형 오류"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "최대 각도 오류"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "최대 각도"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "클립"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "시작(초)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "끝(초)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "루프"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "필터"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "소스 경로가 비어있습니다."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "가져오기 후 실행할 스크립트를 로드할 수 없습니다."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "가져오기 후 실행할 스크립트가 유효하지 않거나 깨져있습니다."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "씬 가져오기 에러."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "3D 씬 가져오기"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "소스 씬:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "대상 씬과 같음"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "공유됨"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "대상 텍스쳐 폴더:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "가져오기 후 수행할 스크립트:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "사용자 정의 루트 노드 타입:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "자동"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "루트 노드 이름:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "다음의 파일들이 빠져있습니다:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "무시하고 가져오기"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "가져오기 후 열기"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr "편집된 씬이 저장되지 않았습니다. 무시하고 가져온 씬을 여시겠습니까?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "씬 가져오기"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "씬 가져오는 중.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "사용자 정의 스크립트 실행중.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "가져오기 후 실행할 스크립트를 로드할 수 없습니다:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+"가져오기 후 실행할 스크립트가 유효하지 않거나 깨져있습니다 (콘솔 확인):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "가져오기 후 실행할 스크립트 실행 중 에러:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "이미지 가져오기:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "자신을 가져올 수 없습니다:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "경로를 로컬 경로로 바꿀 수 없습니다: %s (이미 로컬 경로)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "저장 중.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "3D 씬 애니메이션"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "무압축"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "무손실 압축 (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "손실 압축 (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "압축 (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "텍스쳐 포멧"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "텍스쳐 압축 품질 (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "텍스쳐 옵션"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "파일을 지정하세요!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "아틀라스 생성을 위해서는 최소 1개 이상의 파일이 필요합니다."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "가져오기 에러:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "큰 텍스쳐를 위해서는 단 하나의 파일만 요구됩니다."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "최대 텍스쳐 사이즈:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "아틀라스를 위한 텍스쳐 가져오기 (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "쎌 사이즈:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "큰 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "큰 텍스쳐 가져오기 (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "소스 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "기본 아틀라스 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "소트 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "2D 텍스쳐 가져오기"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "3D 텍스쳐 가져오기"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "텍스쳐 가져오기"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3D 텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "텍스쳐 아틀라스"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"알림: 2D 텍스쳐 가져오기가 필수는 아닙니다. png/jpg 파일들을 프로젝트에 복사"
+"해서 사용해도 됩니다."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "빈 영역 잘라내기."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "텍스쳐"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "큰 텍스쳐 가져오기"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "소스 이미지 로드"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "자르는 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "삽입 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "저장 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "큰 텍스쳐를 저장할 수 없음:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "아틀라스 생성:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "이미지 로딩:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "이미지를 로드할 수 없음:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "이미지 변환 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "이미지 자르는 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "이미지 병합 중"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "아틀라스 이미지를 저장할 수 없음:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "변환된 텍스쳐를 저장할 수 없음:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "유효하지 않은 소스!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "유효하지 않은 번역 소스!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "열"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "언어"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "가져올 항목이 없습니다!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "대상 경로가 없습니다!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "번역 가져오기"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "가져올 수 없습니다!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "번역 가져오기"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "소스 CSV:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "첫째줄 무시"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "압축"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "프로젝트에 추가 (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "언어 가져오기:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "번역"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "다중 노드 설정"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "그룹"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "시그널과 그룹을 편집할 노드를 선택하세요."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "자동 재생 전환"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "새 애니메이션 이름:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "New Anim"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "애니메이션 이름 변경:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "애니메이션 제거"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "에러: 유요하지 않은 애니메이션 이름!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "에러: 애니메이션 이름이 이미 존재합니다!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "애니메이션 이름 변경"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "애니메이션 추가하기"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "다음 연결 변경"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "연결 시간 변경"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "애니메이션 로드하기"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "애니메이션 복제하기"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "에러: 복사할 애니메이션이 없습니다!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "에러: 클립보드에 애니메이션 리소스가 없습니다!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "붙여진 애니메이션"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "애니메이션 붙여넣기"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "에러: 편집할 애니메이션이 없습니다!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "선택된 애니메이션을 현재 위치에서 거꾸로 재생. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "선택된 애니메이션을 끝에서 거꾸로 재생. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "애니메이션 재생 정지. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "선택된 애니메이션을 처음부터 재생. (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "선택된 애니메이션을 현재 위치에서 재생. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "애니메이션 위치 (초)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "애니메이션 재생 속도를 전체적으로 조절."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "새로운 애니메이션 만들기."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "디스크에서 애니메이션 로드."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "디스크에서 애니메이션 로드."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "현재 애니메이션 저장"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "다른 이름으로 저장"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "애니메이션 목록 표시."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "로드 시 자동 시작"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "대상 블렌드 시간 편집"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "애니메이션 도구"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "애니메이션 복사"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "새 애니메이션 만들기"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "애니메이션 이름:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "에러!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "블렌드 시간:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "다음 (자동 큐):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "교차-애니메이션 블렌드 시간"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "애니메이션"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "새 이름:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "크기:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "페이드 인 (초):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "페이드 아웃 (초):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "블렌드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "믹스"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "자동 재시작:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "재시작 (초):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "랜덤 재시작 (초):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "시작!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "양:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "블렌드:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "블렌드 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "블렌드 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "크로스 페이드 시간 (초):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "현재:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "입력 추가"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "자동 진행 제거"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "자동 진행 설정"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "입력 삭제"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "이름 변경"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "애니메이션 트리가 유효합니다."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "애니메이션 트리가 유효하지 않습니다."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "애니메이션 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "원샷 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "믹스 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "블렌드2 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "블렌드3 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "블렌드4 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "시간 크기 조절 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "시간 탐색 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "전환 노드"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "애니메이션 가져오기.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "노드 필터 편집"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "필터.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "%d개 삼각형 분석 중:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "삼각형 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "라이트 베이커 설정:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "지오미트리 분석 중"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "라이트 수정 중"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "BVH 만드는 중"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "라이트 오크트리 생성 중"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "오크트리 텍스쳐 생성 중"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "라이트맵으로 전송:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "텍스쳐 할당 중 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "삼각형 굽는 중 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "텍스쳐 후처리 중 #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "굽기!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "라이트맵 오크트리 굽기 프로세스 재설정 (처음부터 다시)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "미리보기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "스냅 설정"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "그리드 오프셋:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "그리드 스텝:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "회전 오프셋:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "회전 스텝:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "피벗 이동"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "이동 액션"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "IK 체인 편집"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "CanvasItem 편집"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "앵커 변경"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "확대 (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "포즈 붙여넣기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "선택 모드"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "드래그: 회전"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "알트+드래그: 이동"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr "'v'키는 피벗 이동, '쉬프트+v'키는 피벗 드래그 (이동하는 동안)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "알트+우클릭: 겹친 오브젝트 선택"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "이동 모드"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "회전 모드"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"클릭한 위치에 있는 모든 오브젝트들의 목록을 보여줍니다.\n"
+"(선택모드에서 알트+우클릭과 같습니다.)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "오브젝트의 회전 피벗 변경."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "팬 모드"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "선택된 오브젝트를 잠급니다 (이동불가)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "선택된 오브젝트를 잠금 해제합니다 (이동가능)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "오브젝트의 자식노드가 선택될 수 없도록 설정합니다."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "오브젝트의 자식노드가 선택될 수 있도록 복원합니다."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "스냅 사용"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "그리드 보이기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "회전 스냅 사용"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "상대적인 스냅"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "스냅 설정.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "픽셀 스냅 사용"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "부모로 확장"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "스켈레톤.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Bones 만들기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Bones 없애기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "뼈대 보기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "IK 체인 만들기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "IK 체인 없애기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "보기"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "확대 초기화"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "확대 설정.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "선택항목 화면 중앙에 표시"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "선택항목 화면 꽉차게 표시"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "앵커"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "키 삽입"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "키 삽입"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "키 삽입 (존재하는 트랙)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "포즈 복사"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "포즈 정리"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "값 설정"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "스냅 (픽셀):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "%s 추가"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "%s 추가중..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "노드 생성"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "'%s' 로부터 씬 인스턴스 중 에러"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "넹 :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "선택된 부모 노드가 없어서 자식노드를 인스턴스할 수 없습니다."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "이 작업은 하나의 선택된 노드를 필요로 합니다."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "기본 타입 변경"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"드래그 & 드랍 + 쉬프트 : 형제 노드로 추가\n"
+"드래그 & 드랍 + 알트 : 노드 타입 변경"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "폴리곤 생성"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "폴리곤 편집"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "폴리곤 편집 (점 삭제)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "처음부터 새로운 폴리곤 만들기."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "폴리곤3D 만들기"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "핸들 설정"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "칼라 램프 포인트 추가/삭제"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "칼라 램프 수정"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "메쉬 라이브러리 생성 중"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "썸네일.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "%d 항목을 삭제하시겠습니까?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "항목 추가"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "선택된 항목 삭제"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "씬으로부터 가져오기"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "씬으로부터 갱신하기"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "항목 %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "항목"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "항목 목록 편집기"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Occluder 폴리곤 만들기"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "기존 폴리곤 편집:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "좌클릭: 포인트 이동."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "컨트롤+좌클릭: 세그먼트 분할."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "우클릭: 포인트 삭제."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "메쉬가 비었습니다!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Static Trimesh Body 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Static Convex Body 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "씬 루트에서는 할 수 없습니다!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Trimesh Shape 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Convex Shape 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "네비게이션 메쉬 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "MeshInstance에 메쉬가 없습니다!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "메쉬에 아웃라인을 만들기 위한 서피스가 없습니다!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "외곽선을 만들수 없습니다!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "외곽선 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Trimesh Static Body 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Convex Static Body 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Trimesh Collision Sibling 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Convex Collision Sibling 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "외곽선 메쉬 만들기.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "외곽선 메쉬 만들기"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "외곽선 크기:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr "소스 메쉬가 지정되지 않았습니다 (그리고 노드에 MultiMesh가 없습니다)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "소스 메쉬가 지정되지 않았습니다 (그리고 MultiMesh에 메쉬가 없습니다)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "소스 메쉬가 유효하지 않습니다 (유효하지 않은 경로)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "소스 메쉬가 유효하지 않습니다 (MeshInstance가 아닙니다)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "소스 메쉬가 유효하지 않습니다 (메쉬 리소스가 없습니다)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "서피스 소스가 지정되지 않았습니다."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "서피스 소스가 유효하지 않습니다 (유효하지 않은 경로)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "서피스 소스가 유효하지 않습니다 (지오미트리 없음)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "서피스 소스가 유효하지 않습니다 (페이스 없음)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "부모노드가 솔리드 페이스를 가지고 있지 않아 생성할 수 없습니다."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "영역을 매핑 할 수 없습니다."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "소스 메쉬 선택:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "대상 서피스 선택:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "서피스 생성"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "MultiMesh 생성"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "대상 서피스:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "소스 메쉬:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "X축"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Y축"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Z축"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "메쉬의 위쪽 축:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "임의 회전:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "임의 기울기:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "임의 크기:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "생성"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "네비게이션 폴리곤 만들기"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "폴리곤과 포인트 삭제"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "이미지 로드 에러:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "이미지에 투명도가 128보다 큰 픽셀이 없습니다.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "에미션 마스크 설정"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "에미션 마스크 정리"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "에미션 마스크 로드"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "생성된 포인트 개수:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "노드가 지오미트리를 포함하고 있지 않습니다."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "노드가 지오미트리를 포함하고 있지 않습니다 (페이스)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "페이스가 영역을 가지고 있지 않습니다!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "페이스가 없습니다!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "AABB 생성"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "메쉬로부터 에미터 만들기"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "노드로부터 에미터 만들기"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "에미터 정리"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "에미터 만들기"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "에미션 위치:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "에미션 채움:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "출사면"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "배출량"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "커브에서 포인트 삭제"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "커브에 포인트 추가"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "커브의 포인트 이동"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "커브의 인-컨트롤 이동"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "커브의 아웃-컨트롤 이동"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "포인트 선택"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "쉬푸트+드래그: 컨트롤 포인트 선택"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "클릭: 포인트 추가"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "우클릭: 포인트 삭제"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "컨트롤 포인트 선택 (쉬프트+드래그)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "포인트 추가 (빈 공간)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "세그먼트 분할 (커브)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "포인트 삭제"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "커브 닫기"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "커브 포인트 #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "커브 포인트 위치 설정"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "커브 포인트 In 설정"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "커브 포인트 Out 설정"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "경로 나누기"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "경로 포인트 삭제"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "UV 맵 만들기"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "UV 맵 변형"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "폴리곤 2D UV 편집기"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "포인트 이동"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "컨트롤: 회전"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "쉬프트: 전체 이동"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "쉬프트+컨트롤: 크기 조절"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "폴리곤 이동"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "폴리곤 회전"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "폴리곤 크기 조절"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "폴리곤->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->폴리곤"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "UV 정리"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "스냅"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "스냅 활성화"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "그리드"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "에러: 리소스를 로드할 수 없습니다!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "리소스 추가"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "리소스 이름 변경"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "리소스 삭제"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "리소스 클립보드가 비었습니다!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "리소스 로드"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "BBCode 읽기"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "길이:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "샘플 파일 열기"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "에러: 샘플을 로드할 수 없습니다!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "샘플 추가"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "샘플 이름 변경"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "샘플 삭제"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 비트"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 비트"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "스테레오"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "모노"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "포멧"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "피치"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "테마 저장 중 에러"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "저장 중 에러"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "테마 가져오는 중 에러"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "가져오는 중 에러"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "테마 가져오기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "테마 다른 이름으로 저장.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "다음 스크립트"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "이전 스크립트"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "파일"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "새로운"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "모두 저장"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "스크립트 다시 로드"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "이전 히스토리"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "다음 히스토리"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "테마 재로드"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "테마 저장"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "테마 다른 이름으로 저장"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "문서 닫기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "모두 닫기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "찾기.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "다음 찾기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "디버그"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "한 단계식 코드 실행"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "프로시저 단위 실행"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "정지"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "계속"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "디버거 항상 열어놓기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "윈도우"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "왼쪽으로 이동"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "오른쪽으로 이동"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "튜토리얼"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "https://godotengine.org의 튜토리얼 부분을 엽니다."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "클래스"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "클래스 계층 검색."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "레퍼런스 문서 검색."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "이전 편집 문서로 이동."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "다음 편집 문서로 이동."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "스크립트 만들기"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"다음의 파일들이 디스크상 더 최신입니다.\n"
+"어떤 작업을 수행하시겠습니까?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "다시 로드"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "다시 저장"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "디버거"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr "내장 스크립트는 종속된 씬이 열린 상태에서만 편집이 가능합니다"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "색상 선택"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "위로 이동"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "아래로 이동"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "내어쓰기"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "들여쓰기"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "주석 토글"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "아래로 복제"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "자동 완성"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "후행 공백 문자 제거"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "자동 들여쓰기"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "중단점 모두 삭제"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "다음 중단점으로 이동"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "이전 중단점으로 이동"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "이전 찾기"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "변경.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "함수로 이동.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "라인으로 이동.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "도움말 보기"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Scalar 상수 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Vec 상수 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "RGB 상수 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Scalar 연산자 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Vec 연산자 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Vec Scalar 연산자 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "RGB 연산자 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "회전만 토글"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Scalar 함수 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Vec 함수 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Scalar uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Vec uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "RGB uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "기본값 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "변환 uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "텍스쳐 uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "큐브맵 uniform 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "주석 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "색상 램프 추가/삭제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "커브 맵 추가/삭제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "커브맵 수정"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "입력 이름 변경"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "그래프 노드 연결"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "그래프 노드 연결 해제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "셰이더 그래프 노드 삭제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "셰이더 그래프 노드 이동"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "그래프 노드 복제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "셰이더 그래프 노드 삭제"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "에러: 순환 연결 링크"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "에러: 입력 연결 누락"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "셰이더 그래프 노드 추가"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "직교보기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "원근보기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "변형 중단."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "X축 변형."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Y축 변형."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Z축 변형."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "뷰 평면 변형."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "%s%%로 크기 변경."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "%s도로 회전."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "아랫면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "아랫면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "윗면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "윗면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "뒷면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "뒷면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "정면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "정면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "왼쪽면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "왼쪽면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "오른쪽면 보기."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "오른쪽면"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "키가 비활성화 되어 있습니다 (키가 삽입되지 않았습니다)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "애니메이션 키가 삽입되었습니다."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "뷰에 정렬"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "환경"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "오디오 리스너"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "기즈모"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "변환 다이얼로그"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "인스턴스할 씬이 선택되지 않았습니다!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "커서에 인스턴스 만들기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "씬을 인스턴스 할 수 없습니다!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "이동 모드 (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "회전 모드 (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "크기조절 모드 (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "하단 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "상단 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "후면 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "정면 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "좌측 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "우측 뷰"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "원근/직교 뷰 전환"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "애니메이션 키 삽입"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "원점 보기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "선택 포커스"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "선택 항목을 뷰에 정렬"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "변환"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "로컬 좌표"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "변환 다이얼로그.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "기본 Light 사용"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "기본 sRGB 사용"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1개 뷰포트"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2개 뷰포트"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2개 뷰포트 (다른 방식)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3개 뷰포트"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3개 뷰포트 (다른 방식)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4개 뷰포트"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Normal 표시"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Wireframe 표시"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Overdraw 표시"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Shadeless 표시"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "원점 보기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "그리드 보기"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "스냅 설정"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "이동 스냅:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "회전 스냅 (도):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "크기 스냅 (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "뷰포트 설정"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "기본 라이트 노말:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "환경 광 색상:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "원근 시야 (도):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z축 가까이 보기:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z축 멀리 보기:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "변환 변경"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "이동:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "회전 (도):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "크기 (비율):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "변환 타입"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pre"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Post"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "에러: 프레임 리소스를 로드할 수 없습니다!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "프레임 추가"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "리소스 클립보드가 비었거나 텍스쳐가 아닙니다!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "프레임 붙여넣기"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "빈 프레임 추가"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "애니메이션 루프 변경"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "애니메이션 FPS 변경"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(비었음)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "애니메이션"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "속도 (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "애니메이션 프레임"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "빈 프레임 삽입 (이전)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "빈 프레임 삽입 (이후)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "위"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "아래"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox 미리보기:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "스냅 모드:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<없음>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "픽셀 스냅"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "그리드 스냅"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "자동 자르기"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "오프셋:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "단계:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "간격:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "텍스쳐 영역"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "텍스쳐 구역 편집기"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "테마를 파일로 저장할 수 없습니다:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "모든 아이템 추가"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "모두 추가"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "아이템 삭제"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "테마"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "클래스 아이템 추가"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "클래스 아이템 삭제"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "빈 템플릿 만들기"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "빈 에디터 템플릿 만들기"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Check Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Checked Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Has"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Many"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "옵션"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Have,Many,Several,Options!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Tab 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Tab 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Tab 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "타입:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "데이타 타입:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "아이콘"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "스타일"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "색깔"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "타일맵 칠하기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "복제"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "타일맵 지우기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "선택부분 지우기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "타일 찾기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "바꾸기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "X축 뒤집기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Y축 뒤집기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "채우기"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "타일 선택"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "선택"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "0도 회전"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "90도 회전"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "180도 회전"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "270도 회전"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "타일을 찾을 수 없음:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "아이템 이름 또는 아이디:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "씬으로부터 만드시겠습니까?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "씬으로부터 병합하시겠습니까?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "씬으로부터 만들기"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "씬으로부터 병합하기"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "에러"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "스크립트 옵션 편집"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "프로젝트 폴더 바깥에 내보내기를 하세요!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "프로젝트 내보내기 중 에러!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "프로젝트 PCK 작성중 에러!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "'%s' 플랫폼으로 내보내기 위한 템플릿 파일이 없습니다."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "새 리소스 만들기"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "유요한 이름"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "전환"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "상태:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "암호:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "유효한 문자:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "새 이름:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "포함"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "이미지 그룹 변경"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "그룹 이름을 지정해야 합니다!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "그룹 이름에 유효하지 않은 문자가 사용되었습니다!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "그룹 이름이 이미 사용중입니다!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "이미지 그룹 추가"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "이미지 그룹 삭제"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "아틀라스 미리보기"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "프로젝트 내보내기 설정"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "대상"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "플랫폼으로 내보내기"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "리소스"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "선택된 리소스 내보내기 (종속된 리소스 포함)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "프로젝트의 모든 리소스 내보내기."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "프로젝트 디렉토리 안의 모든 파일 내보내기."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "내보내기 모드:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "내보낼 리소스:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "액션"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr "내보내기 시, 포함시킬 파일 (콤마로 구분, 예: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr "내보내기 시, 제외시킬 파일 (콤마로 구분, 예: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "내보내기 시, 텍스트 기반 씬 파일을 바이너리 형식으로 변환."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "이미지"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "원본 유지"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "디스크 압축 (Lossy, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "메모리 압축 (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "이미지 변환 (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "디스크를 위한 압축 (손실) 품질:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "모든 이미지 줄이기:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "압축 포멧:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "이미지 그룹"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "그룹:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "디스크 압축"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "메모리 압축"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "압축 모드:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "손실 품질:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "아틀라스:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "이미지 줄이기:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "아틀라스 미리보기"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "이미지 필터:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "이미지:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "모든 선택 해제"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "그룹"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "샘플"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "샘플 변환 모드: (.wav 파일):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "유지"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "압축 (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "샘플링 레이트 제한 (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "잘라내기"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "끝의 무음:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "스크립트"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "스크립트 내보내기 모드:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "텍스트"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "컴파일"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "암호화 (아래에 키값 필요)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "스크립트 암호 키 (256-비트를 hex 포멧으로):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "PCK/Zip 내보내기"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "프로젝트 PCK 내보내기"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "내보내기.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "프로젝트 내보내기"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "프리셋 내보내기:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "프로젝트 경로가 유효하지 않습니다. 경로가 반드시 존재해야 합니다!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "프로젝트 경로가 유효하지 않습니다. godot.cfg가 있으면 안됩니다."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "프로젝트 경로가 유효하지 않습니다. godot.cfg가 존재해야합니다."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "가져온 프로젝트"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "유효하지 않은 프로젝트 경로 (뭔가 변경하신 거라도?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "프로젝트 경로에 godot.cfg를 생성할 수 없습니다."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "다음의 파일들을 패키지로부터 추출하는데 실패했습니다:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "패키지가 성공적으로 설치되었습니다!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "기존 프로젝트 가져오기"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "프로젝트 경로 (반드시 필요):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "프로젝트 명:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "새 프로젝트 만들기"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "프로젝트 경로:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "프로젝트 설치:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "설치"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "찾아보기"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "새 게임 프로젝트"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "빙고!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "이름없는 프로젝트"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "두개 이상의 프로젝트를 열려는 것이 확실합니까?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "두개 이상의 프로젝트를 실행하려는 것이 확실합니까?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"목록에서 프로젝트를 제거하시겠습니까? (폴더와 파일들은 남아있게 됩니다.)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr "%s 에서 기존 Godot 프로젝트들을 스캔하려고 합니다. 진행하시겠습니까?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "프로젝트 매니저"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "프로젝트 목록"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "실행"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "스캔"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "스캔할 폴더를 선택하세요"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "새 프로젝트"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "종료"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "키 "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "조이스틱 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "조이스틱 축"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "마우스 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "유효하지 않은 액션 ('/' 또는 ':' 문자 사용 불가)."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "'%s' 액션이 이미 존재합니다!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "입력 앱션 이벤트 이름 변경"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "입력 액션 이벤트 추가"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "컨트롤+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "키를 눌러주세요.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "마우스 버튼 인덱스:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "왼쪽 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "오른쪽 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "가운데 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "휠 위로 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "휠 아래로 버튼"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "버튼 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "버튼 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "버튼 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "버튼 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "조이스틱 축 인덱스:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "조이스틱 버튼 인덱스:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "입력 액션 추가"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "입력 액션 이벤트 삭제"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "설정 저장 중 에러."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "설정 저장 완료."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "번역 추가"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "번역 삭제"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "리맵핑 경로 추가"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "리소스 리맵핑 추가"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "언어 리소스 리맵핑 변경"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "리소스 리맵핑 제거"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "리소스 리맵핑 옵션 제거"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "프로젝트 설정 (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "일반"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "속성:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "삭제"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "플랫폼으로 복사.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "입력 설정"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "액션:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "기기:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "인덱스:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "현지화"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "번역"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "번역:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "추가.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "리맵핑"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "리소스:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "지역에 따른 리맵핑:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "지역"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "자동 로드"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "플러그인"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "프리셋.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "감속"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "가속"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "등속"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "감속-가속"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "가속-감속"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "파일.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "디렉토리.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "로드"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "할당"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "새 스크립트"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "파일 로드 에러: 리소스가 아닙니다!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "이미지를 로드할 수 없음"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "비트 %d, 값 %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "사용"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "속성:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "부문:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "속성 선택"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "메소드 선택"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "PVRTC 도구를 실행할 수 없습니다:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "PVRTC 도구를 사용하여 변환된 이미지를 다시 로드 할 수 없습니다:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "부모노드 재지정"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "부모노드 재지정 위치 (새 부모 노드를 선택):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "현재 모양새 유지"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "부모노드 재지정"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "새 리소스 만들기"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "리소스 열기"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "리로스 저장"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "리소스 도구"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "로컬로 만들기"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "실행 모드:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "현재 씬"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "메인 씬"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "메인 씬 인수:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "씬 실행 설정"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "씬을 인스턴스할 수 있는 부모가 없습니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "'%s' 로부터 씬 로딩 중 에러"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "확인"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr "노드중에 현재 씬이 존재하기 때문에, '%s' 씬을 인스턴스 할 수 없습니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "씬 인스턴스"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "이 작업은 트리 루트에서는 불가합니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "노드를 부모 노드로 이동"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "노드들을 부모 노드로 이동"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "노드 복제"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "노드를 삭제하시겠습니까?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "이 작업은 씬 없이는 불가합니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "이 작업은 인스턴스된 씬에서는 불가합니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "새 씬을 다른 이름으로 저장.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "오케바리!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "다른 씬에서 수행할 수 없는 작업입니다!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "상속 씬 내에서 수행할 수 없는 작업입니다!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "노드 삭제"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"씬을 저장할 수 없습니다. 아마도 종속 관계가 만족스럽지 않을 수 있습니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "씬 저장 중 에러."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "저장하기 위해 씬을 복제하는 중에 에러가 발생했습니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "그룹 편집"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "연결 편집"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "노드 삭제"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "자식 노드 추가"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "자식 씬 추가"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "타입 변경"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "스크립트 붙이기"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "스크립트 제거"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "다른 씬과 병합"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "선택 노드를 다른 씬으로 저장"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "삭제 (확인 없음)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "새 노드 추가/생성"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"씬 파일을 노드로 추가합니다. 루트 노드가 없을 경우, 상속씬으로 만들어집니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "선택된 노드에 새로운 스크립트를 생성하거나 기존 스크립트를 로드합니다."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "선택된 노드의 스크립트를 제거합니다."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Spatial 보이기 토글"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "CanvasItem 보이기 토글"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "인스턴스:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "유효하지 않은 노드 이름입니다. 다음의 문자는 허용되지 않습니다:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "노드 이름 변경"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "씬 트리 (노드):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "자식노드 편집 가능"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Placeholder로써 로드"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "인스턴스 폐기"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "에디터에서 열기"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "상속 없애기"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "상속을 없애시겠습니까? (되돌리기 불가!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "없앴습니다!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "노드 선택"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "유요하지 않은 부모 클래스명"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "유요한 문자:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "유요하지 않은 클래스명"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "유요한 이름"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "해당 없음"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "클래스명이 유효하지 않습니다!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "부모 클래스명이 유효하지 않습니다!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "경로가 유효하지 않습니다!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "파일 시스템에 스크립트를 생성할 수 없습니다."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "'%s' 스크립트 로딩 중 에러"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "경로가 비어 있음"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "경로가 로컬이 아님"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "기본 경로가 유요하지 않음"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "확장자가 유요하지 않음"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "새 스크립트 만들기"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "기존 스크립트 로드하기"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "클래스명:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "내장 스크립트"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "노드 스크립트 붙이기"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "바이트:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "경고"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "에러:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "소스:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "함수:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "에러"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "자식 프로세스 연결됨"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "이전 인스턴스 검사"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "다음 인스턴스 검사"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "스택 프레임"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "변수"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "에러:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "스택 추적 (해당되는 경우):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "원격 인스펙터"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "실시간 씬 트리:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "원격 오브젝트 속성: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "프로파일러"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "모니터"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "값"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "모니터"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "리소스별 비디오 메모리 사용량 목록:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "전체:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "비디오 메모리"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "리소스 경로"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "타입"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "사용"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "기타"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "클릭된 Control:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "클릭된 Control 타입:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "실시간 편집 루트:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "트리로부터 설정"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "단축키"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Light 반경 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Camera 시야 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Camera 크기 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Sphere Shape 반경 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Box Shape 범위 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Capsule Shape 반경 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Capsule Shape 높이 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Ray Shape 길이 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Notifier 범위 변경"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Notifier 범위 변경"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance가 BakedLight 리소스를 가지고 있지 않습니다."
+
+#~ msgid "Vertex"
+#~ msgstr "버텍스"
+
+#~ msgid "Fragment"
+#~ msgstr "프래그먼트"
+
+#~ msgid "Lighting"
+#~ msgstr "라이팅"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "지속 전환"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "부모 노드가 숨겨져 있기 때문에 이 항목을 보이도록 만들 수 없습니다. 부모 "
+#~ "노드를 먼저 보이도록 하세요."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "경로는 '/'로 시작할 수 없습니다. 'res://', 'user://', 또는 'local://'로 시"
+#~ "작하는 절대 경로를 사용해야 합니다"
+
+#~ msgid "File exists"
+#~ msgstr "파일이 존재함"
+
+#~ msgid "Valid path"
+#~ msgstr "유요한 경로"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "하위 디렉토리로 이동할 수 없습니다:"
+
+#~ msgid "Help"
+#~ msgstr "도움말"
+
+#~ msgid "Imported Resources"
+#~ msgstr "가져온 리소스"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "키 삽입 (Ins 키)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "윗면 (넘버패드7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "아랫면 (쉬프트+넘버패드7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "왼쪽면 (넘버패드3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "오른쪽면 (쉬프트+넘버패드3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "정면 (넘버패드1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "뒷면 (쉬프트+넘버패드1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "원근보기 (넘버패드5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "직교보기 (넘버패드5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "선택 (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "뷰에 정렬 (컨트롤+쉬프트+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "애니메이션 루프 보간 변경"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "애니메이션 루프 시 보간 활성화/비활성화."
+
+#~ msgid "Load Layout"
+#~ msgstr "레이아웃 로드"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "스케일 구역 편집기"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "이 노드에 텍스쳐가 없습니다.\n"
+#~ "구역을 편집하기 위해서는 텍스쳐를 지정해야합니다."
+
+#~ msgid "New Scene Root"
+#~ msgstr "새로운 씬 루트"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "상속 씬"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "바인드 (추가 파라미터):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "노드의 함수:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "툴 스크립트 다시 로드 (소프트)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "연결 편집.."
+
+#~ msgid "Set Params"
+#~ msgstr "속성 적용"
+
+#~ msgid "Live Editing"
+#~ msgstr "실시간 편집"
+
+#~ msgid "File Server"
+#~ msgstr "파일 서버"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "파일 서버 클라이언트 배포"
+
+#~ msgid "Group Editor"
+#~ msgstr "그룹 편집기"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "노트 그룹"
+
+#~ msgid "Set region_rect"
+#~ msgstr "구역 설정"
+
+#~ msgid "Plugin List:"
+#~ msgstr "플러그인 목록:"
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
new file mode 100644
index 0000000000..cbd2a09951
--- /dev/null
+++ b/editor/translations/nb.po
@@ -0,0 +1,6748 @@
+# Norwegian Bokmål translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Jørgen Aarmo Lund <jorgen.aarmo@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-29 19:46+0000\n"
+"Last-Translator: Jørgen Aarmo Lund <jorgen.aarmo@gmail.com>\n"
+"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-"
+"engine/godot/nb/>\n"
+"Language: nb\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Ugyldig argument til convert(), bruk TYPE_*-konstantene."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
new file mode 100644
index 0000000000..50afecad1b
--- /dev/null
+++ b/editor/translations/pl.po
@@ -0,0 +1,6956 @@
+# Polish translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# 8-bit Pixel <dawdejw@gmail.com>, 2016.
+# Adrian Węcławski <weclawskiadrian@gmail.com>, 2016.
+# Daniel Lewan <vision360.daniel@gmail.com>, 2016.
+# Kajetan Kuszczyński <kajetanek99@gmail.com>, 2016.
+# Kamil Lewan <lewan.kamil@gmail.com>, 2016.
+# Karol Walasek <coreconviction@gmail.com>, 2016.
+# Mietek Szcześniak <ravaging@go2.pl>, 2016.
+# Rafal Brozio <rafal.brozio@gmail.com>, 2016.
+# siatek papieros <sbigneu@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-12-29 16:37+0000\n"
+"Last-Translator: 8-bit Pixel <dawdejw@gmail.com>\n"
+"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
+"godot/pl/>\n"
+"Language: pl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Niepoprawny typ argumentu funkcji convert(), użyj stałych TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Niewystarczająca ilość bajtów dla bajtów dekodujących, albo zły format."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "argument kroku wynosi zero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "To nie jest skrypt z instancją"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Nie bazuje na skrypcie"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Nie bazuje na pliku zasobów"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Niepoprawna instancja formatu słownika (brak @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Niepoprawna instancja formatu słownika (nie można wczytać skryptu w @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Niepoprawna instancja formatu słownika (niepoprawny skrypt w @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Niepoprawna instancja słownika (niepoprawne podklasy)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Zwrócona wartość musi być przypisana do pierwszego elementu węzła pamięci "
+"roboczej! Proszę naprawić swój węzeł."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Węzeł zwrócił niewłaściwą sekwencję wyjściową: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Przepełnienie stosu z głębokością stosu: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funkcje:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Zmienne:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Sygnały:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Nazwa nie jest prawidłowym identyfikatorem:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Nazwa jest już użyta przez inną funkcję/zmienną/sygnał:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Zmień nazwę funkcji"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Zmień nawę zmiennej"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Zmień nazwę sygnału"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Dodaj funkcję"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Dodaj zmienną"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Dodaj sygnał"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Usuń funkcję"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Usuń zmienną"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Edytuj zmienną:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Usuń sygnał"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Edytuj sygnał:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Zmień typ"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Dodaj węzeł"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Dodaj dziecko węzła"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Dodaj węzeł(y) z drzewa"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Skopiuj animacje"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Switch"
+msgstr "Wysokość"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Zwraca:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Wywołanie"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Get"
+msgstr "Ustaw"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Ustaw"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Edycja"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Typ bazowy:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Członkowie:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Dostępne węzły:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Wybierz lub utwórz funkcję, aby edytować wykres"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Zamknij"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Edytuj argumenty sygnału:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Edytuj zmienną:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Zmień"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Usuń zaznaczone"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Przełącz pułapkę"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Znajdź typ węzła"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Copy Nodes"
+msgstr "Skopiuj Pozę"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Cut Nodes"
+msgstr "Utwórz węzeł"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Wklej Pozę"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+#, fuzzy
+msgid "Invalid index property name."
+msgstr "Nieprawidłowa nazwa klasy bazowej"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Obiekt bazowy nie jest węzłem!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Ścieżka nie prowadzi do węzła!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nieprawidłowy indeks we właściwości '%s' węzła %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ":nieprawidłowy argument typu: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ":nieprawidłowe argumenty: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "Nie znaleziono VariableGet w skrypcie: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "Nie znaleziono VariableSet w skrypcie: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the signature object."
+msgstr "Błąd przy eksporcie projektu!"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Niewłaściwa nazwa."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Niepoprawny rozmiar fonta."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid publisher GUID."
+msgstr "Niepoprawna ścieżka bazowa"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid background color."
+msgstr "Nie rozpoznano typu czcionki."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Aby AnimatedSprite pokazywał poszczególne klatki, pole Frames musi zawierać "
+"odpowiedni zasób SpriteFrames."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Tylko jeden CanvasModulate jest dozwolony na scenie (lub zestawie "
+"zinstancjonowanych scen) Tylko pierwszy CanvasModulate zadziała, przy czym "
+"pozostałe będą zignorowane."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D służy jedynie do określenia kształtu kolizji dla jednego "
+"z obiektów dziedziczących z CollisionObject2D. Używaj go tylko jako dziecko "
+"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itd."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Pusty CollisionPolygon2D nie ma wpływu na kolizje."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D służy jedynie do określenia kształtu kolizji dla jednego z "
+"obiektów dziedziczących z CollisionObject2D. Używaj go tylko jako dziecko "
+"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itd."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Zasób shape jest niezbędny do działania CollisionPolygon2D. Proszę utworzyć "
+"zasób shape!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Tekstura z kształtem promieni światła musi być dodana do pola Tekstura."
+
+#: scene/2d/light_occluder_2d.cpp
+#, fuzzy
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Poligon zasłaniający musi być ustawiony (lub narysowany) aby Occluder "
+"zadziałał."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "Poligon zasłaniający jest pusty. Proszę narysować poligon!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Zasób typu NavigationPolygon musi być ustawiony lub utworzony, aby ten węzeł "
+"zadziałał."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance musi być dzieckiem lub wnukiem węzła Navigation2D. "
+"Udostępnia on potrzebne dane nawigacyjne."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Węzeł typu ParallaxLayer zadziała, jeśli będzie dzieckiem węzła "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Żeby zadziałało, pole Path musi wskazywać na istniejący węzeł Particles2D."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D zadziała tylko wtedy, gdy będzie dzieckiem węzeł Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "Żeby zadziałało, pole Path musi wskazywać na istniejący węzeł Node2D."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Zasób typu SampleLibrary musi być dodany jako pole Samples, aby SamplePlayer "
+"mógł odtwarzać dźwięk."
+
+#: scene/2d/sprite.cpp
+#, fuzzy
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Aby zadziałało, pole Path musi wskazywać na obiekt Viewport, który ma "
+"zaznaczoną opcję trybu Render Target."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Pole trybu Render Target musi być ustawione w Viewport wskazywanym przez "
+"pole Path, aby ten Sprite mógł zadziałać."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D działa najlepiej, gdy jest bezpośrednio pod korzeniem "
+"aktualnie edytowanej sceny."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape służy jedynie do określenia kształtu kolizji dla jednego z "
+"węzłów dziedziczących z CollisionObject. Używaj go tylko jako dziecko węzłów "
+"typu Area, StaticBody, RigidBody, KinematicBody itd."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Kształt musi być określony dla CollisionShape, aby spełniał swoje zadanie. "
+"Utwórz zasób typu CollisionShape w odpowiednim polu obiektu!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon służy jedynie do określenia kształtu kolizji dla jednego z "
+"obiektów dziedziczących z CollisionObject. Używaj go tylko jako dziecko "
+"obiektów typu Area, StaticBody, RigidBody, KinematicBody itd."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Pusty CollisionPolygon nie wpływa na efekty kolizji."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Zasób typu NavigationMesh musi być ustawiony w odpowiednim polu, aby ten "
+"węzeł zadziałał."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance musi być dzieckiem lub wnukiem węzła typu Navigation. "
+"Udostępnia on tylko dane nawigacyjne."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Żeby zadziałało, pole Path musi wskazywać na istniejący węzeł Particles2D."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Tylko jeden WorldEnvironment jest dozwolony na scenę (lub zestaw "
+"zinstancjonowanych scen)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Zasób SampleLibrary musi być ustawiony jako wartość właściwości 'samples' "
+"żeby SpatialSamplePlayer odtwarzał dźwięk."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Zasób SpriteFrames musi być ustawiony jako wartość właściwości 'Frames' żeby "
+"AnimatedSprite3D wyświetlał klatki."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alarm!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Proszę potwierdzić..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Plik istnieje, nadpisać?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Wszystkie rozpoznane"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Wszystkie pliki (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Otwórz"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Otwórz plik"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Otwórz plik(i)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Otwórz katalog"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Otwórz plik lub katalog"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Zapisz"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Zapisz plik"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Utwórz katalog"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Ścieżka:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Katalogi i pliki:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Plik:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtr:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Nie można utworzyć katalogu."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Rozszerzenie musi być poprawne."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Urządzenie"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Przycisk"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Lewy przycisk."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Prawy przycisk."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Środkowy przycisk."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Kółko myszy w górę."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Kółko myszy w dół."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Oś"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Wytnij"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopiuj"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Wklej"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Zaznacz wszystko"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Wyczyść"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Cofnij"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popup będzie domyślnie ukryty dopóki nie wywołasz popup() lub dowolnej "
+"funkcji popup*(). Ustawienie go jako widoczny jest przydatne do edycji, ale "
+"zostanie ukryty po uruchomieniu."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Ten Viewport nie jest ustawiony jako Render Target. Jeśli chcesz wyświetlić "
+"jego zawartość na ekranie dodaj go jako dziecko węzła typu Control, aby "
+"otrzymał jakiś rozmiar. W przeciwnym wypadku ustawi opcję RenderTarget i "
+"przyporządkuj jego teksturę dla któregoś węzła."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Błąd przy inicjalizacji FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Nieznany format fontu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Błąd ładowania fonta."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Niepoprawny rozmiar fonta."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Wyłączone"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Wszystkie zaznaczenia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Anim Change Transition"
+msgstr "Animacja przejścia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Animacja transformacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Animacja wartości"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Animacja - wywołanie funkcji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Dodaj ścieżkę animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplikuj klucze"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Usuń animację"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Ustaw przejścia na:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Zmień nazwę animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Zmień funkcję interpolacji animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Zmień tryb wartości animacji"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Edit Node Curve"
+msgstr "Edytuj krzywe"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Usuń klucze animacji"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplikuj zaznaczone"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplikuj transponowane"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Usuń zaznaczone"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Ciągłe"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Dyskretne"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Wyzwalacz"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Dodaj klucz animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Skaluj zaznaczone"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Przejdź do następnego kroku"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Przejdź do poprzedniego kroku"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Liniowe"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Stałe"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "We."
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Wy."
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "We-Wy"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Wy-We"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Przejścia"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Optymalizuj animację"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Wyczyść animację"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Stworzyć NOWĄ ścieżkę dla %s i wstawić klatkę kluczową?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Utworzyć NOWĄ ścieżkę i dodać klatkę kluczową?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Utwórz"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Zmień długość animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Zmień pętlę animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Wstaw animację"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Dodaj ścieżkę wywołania funkcji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Powiększenie animacji."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Długość:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Długość animacji (w sekundach)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Krok:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Krok kursora (sekundy)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Włącz/Wyłącz zapętlenie animacji."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Dodaj nowe ścieżki."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Przesuń wybraną ścieżkę do góry."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Przesuń wybraną ścieżkę w dół."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Usuń wybraną ścieżkę."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Narzędzia ścieżki"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Włączenie edycji pojedynczych kluczy poprzez kliknięcie na nie."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Optymalizator animacji"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Maks. błąd liniowy:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Maks. błąd kątowy:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Zoptymalizuj"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Klucz"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Przejście"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Z którego węzła wywołać funkcję?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Usuń wadliwe klucze"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Wyczyść wszystkie animacje"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Oczyść animacje (NIE MOŻNA COFNĄĆ!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Oczyść"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Zmień rozmiar Tablicy"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Zmień Typ Tablicy"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Zmień Wartość Tablicy"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Szukaj:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Sortuj:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Odwróć"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Kategoria:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Wszystko"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Źródło:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Wsparcie.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficjalny"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Społeczność"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Testowanie"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Lista metod '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Lista metod:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumenty:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Zwraca:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Idź do lini"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Numer linii:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Nie znaleziono"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Zastąpiono %d wystąpień."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Zastąp"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Zastąp wszystkie"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Uwzględnij wielkość liter"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Całe słowa"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Tylko zaznaczenie"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Szukaj"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Szukaj"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Następny"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Zastąpiono %d wystąpień."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Nie znaleziono!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Zastąp przez"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Z uwzględnieniem wielkości liter"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Wstecz"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Zaptytaj przy zastąpieniu"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Pomiń"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Przybliż"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Oddal"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Wyzeruj przybliżenie"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Linia:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Kolumna:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Wybierz metodę w wybranym węźle!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Podłączanie Do Węzła:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Dodaj"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Usuń"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Dodaj dodatkowy argument wywołania funkcji:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Dodatkowe argumenty wywołania:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Ścieżka do węzła:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Utwórz funkcję"
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Deferred"
+msgstr "Odroczone"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Wywołaj raz"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Połącz"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Połącz '%s' z '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Połączony sygnał:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Utwórz subskrypcje"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Połącz.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Rozłącz"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Sygnały"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Utwórz nowy"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Ulubione:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Ostatnie:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Pasujące:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Opis:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Znajdź i zamień:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Zależności:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Zależności"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Zasoby"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Ścieżka"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Zależności:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Napraw uszkodzone"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Edytor zależnośći"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Szukaj zastępczego zasobu:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Właściciele:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Usuwany plik jest wymagany przez inne zasoby do działania.\n"
+"Usunąć mimo to? (Nie można tego cofnąć)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Usunąć wybrane pliki z projektu? (Nie można tego cofnąć)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Błąd ładowania:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Scena nie została wczytana z powodu brakujących zależności:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Otwórz Pomimo"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Jaka działanie powinno zostać podjęte?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Napraw zależności"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Błędy ładowania!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Permanentnie usuń %d obiekt(ów) (Nie można tego cofnąć)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Posiada"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Zasoby bez jawnych właścicieli:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Eksplorator osieroconych zasobów"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Usunąć zaznaczone pliki?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Usuń"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Niewłaściwa nazwa."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Dopuszczalne znaki:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Niepoprawna nazwa. Nie może być taka sama jak istniejąca klasa silnika."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "Niepoprawna nazwa. Nie może być taka sama jak wbudowany typ."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr "Niepoprawna nazwa. Nie może być taka sama jak nazwa globalnej stałej."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Niewłaściwa ścieżka."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Plik nie istnieje."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Dodaj AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload '%s' już istnieje!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Zmień nazwę Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Usuń Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Włącz"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nazwa węzła:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nazwa"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Lista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Aktualizowanie Sceny"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Zachowywanie lokalnych zmian.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Aktualizacja sceny .."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Wybierz Katalog"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Wybierz"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Wróć"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Dalej"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "W górę"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Odśwież"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Przełącz ukryte pliki"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Ustaw jako ulubione"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Przełącz tryby"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Przesuń Ulubiony w górę"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Przesuń Ulubiony w dół"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Podgląd:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Przeszukaj źródła"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Wyszukaj w Pomocy"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "List Klas:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Przeszukaj klasy"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Klasa:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Dziedziczy:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Dziedziczone przez:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Krótki opis:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Metody Publiczne:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Elementy motywu GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Stałe:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Krótki opis:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Opis Metody:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Wyszukaj w tekście"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Dodane:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Usunięte:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Błąd podczas zapisywania atlasu:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Nie udało się zapisać tekstury atlasu:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Zapisywanie Pliku:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Pakowanie"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportowanie do %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Konfigurowanie .."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Konsola:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Prze-Importowanie"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importowanie:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Węzeł ze Sceny"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Błąd podczas zapisu zasobu!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Zapisz zasób jako..."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Widzę.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Nie można otworzyć pliku do zapisu:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Nieznany format pliku:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Błąd podczas zapisywania."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Zapisywanie Sceny"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analizowanie"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Tworzenie Miniatury"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Nie udało się zapisać sceny. Najprawdopodobniej pewne zależności nie są "
+"spełnione."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Nie udało się wczytać zasobu."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Nie udało się wczytać MeshLibrary do połączenia!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Błąd podczas zapisywania MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Nie udało się wczytać TileSet do połączenia!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Błąd podczas zapisywania TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Nie można otworzyć pliku zip szablonów eksportu."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Ładowanie szablonów eksportu"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Błąd podczas zapisu layoutu!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Domyślny layout edytora został nadpisany."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nie znaleziono nazwy layoutu!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Przywrócono domyślny layout do ustawień bazowych."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Kopiuj parametry"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Wklej parametry"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Wklej zasób"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Kopiuj zasób"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Make Built-In"
+msgstr "Skrypt wbudowany"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Otwórz w Pomocy"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Nie ma zdefiniowanej sceny do uruchomienia."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Nie zdefiniowano głównej sceny, chcesz jakąś wybrać?\n"
+"Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Wybrana scena '%s' nie istnieje, wybrać poprawną? \n"
+"Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Wybrany plik '%s' nie jest sceną, wybrać poprawny?\n"
+"Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+"Aktualna scena nie została zapisana, proszę zapisać scenę przed "
+"uruchomieniem."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Nie można było uruchomić podprocesu!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Otwórz scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Otwórz scenę bazową"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Szybkie otwieranie sceny.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Szybkie otwieranie skryptu.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Tak"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Zamknąć scenę? (Niezapisane zmiany zostaną utracone)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Zapisz scenę jako.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Ta scena nie została zapisana. Zapisać przed uruchomieniem?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Proszę najpierw zapisać scenę."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Eksportuj bibliotekę Meshów"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Eksportuj TileSet"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Wyjdź"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Zamknąć edytor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Aktualna scena nie została zapisana. Otworzyć mimo to?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Nie można przeładować sceny która nie została zapisana."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Przywróć"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Tego nie można cofnąć. Przywrócić mimo to?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Szybkie uruchomienie sceny.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Otworzyć Menedżer Projektów?\n"
+"(Niezapisane zmiany zostaną utracone)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Wybierz główną scenę"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Ugh"
+msgstr "Błąd"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Błąd podczas ładowania sceny. Musi ona znajdować się wewnątrz folderu "
+"projektu. Użyj narzędzia \"Importuj\" aby zapisać scenę wewnątrz tego "
+"projektu."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Błąd ładowania sceny."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Scena '%s' ma niespełnione zależności:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Zapisz layout"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Usuń layout"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Domyślny"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Przełącz Zakładkę Sceny"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "Pozostało %d plików"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "Pozostało %d plików lub folderów"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Scena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Idź do poprzednio otwartej sceny."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Następna zakładka"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Poprzednia zakładka"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operacja na plikach sceny."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nowa scena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nowa odziedziczona scena.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Otwórz scenę.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Zapisz scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Zapisz wszystkie sceny"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Zamknij scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Zamknij i przejdź do poprzedniej sceny"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Ostatnio otwierane"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Szybkie filtry plików.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Konwertuje na.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary..."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet..."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Ponów"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Uruchom skrypt"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Ustawienia projektu"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Resetuj scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Wyjdź do Listy Projektów"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Tryb bez rozproszeń"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importuj zasoby do projektu."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importuj"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Narzędzia"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Eksportuj projekt na inne platformy."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Eksport"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Uruchom projekt."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Uruchom"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Zapauzuj scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Zapauzuj scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Zatrzymaj scene."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Stop"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Uruchom aktualnie edytowaną scenę."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Odtwórz Scene"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Uruchom niestandardową scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Uruchom niestandardową scenę"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opcje debugowania"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Uruchom z użyciem zdalnego debugowania"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Podczas eksportu lub uruchomienia aplikacja wynikowa spróbuje połączyć się z "
+"adresem IP tego komputera w celu debugowania."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Gdy ta opcja jest zaznaczona, eksportowanie utworzy jak najmniejszy plik "
+"wykonywalny.\n"
+"System plików będzie udostępniony przez ten edytor poprzez sieć.\n"
+"Na Androidzie eksport użyje kabla USB dla lepszej wydajności. Opcja ta "
+"znacznie przyspiesza testowanie dużych gier."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Widoczne kształty kolizji"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Kształty kolizji i promienie raycast (2D i 3D) będą widoczne, jeśli ta opcja "
+"będzie zaznaczona."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Widoczna nawigacja"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Kształty i poligony nawigacyjne będą widoczne, jeśli ta opcja będzie "
+"zaznaczona."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Synchronizuj zmiany w scenie"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Wszelkie zmiany sceny w edytorze będą odtworzone w uruchomionej grze na "
+"urządzeniu zdalnym. Opcja ta działa szybciej na sieciowych systemach plików."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Synchronizuj zmiany skryptów"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Wszelkie zmiany skryptów będą synchronizowane z urządzeniem zdalnym "
+"(działające instancje będą zrestartowane). Opcja ta działa szybciej z "
+"użyciem sieciowych systemów plików."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Ustawienia edytora"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Layout edytora"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "Pełny ekran"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Zainstaluj Szablony Eksportu"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "O programie"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Powiadomienie o zmianie stanu zasobu zewnętrznego."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Ikona obraca się, gdy okno edytora jest odrysowywane!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Zawsze Odświeżaj"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Odśwież Zmiany"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspektor"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Utwórz nowy zasób wewnątrz pamięci i edytuj go."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Wczytaj istniejący zasób i edytuj go."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Zapisz aktualnie edytowany zasób."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Zapisz jako..."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Idź do poprzedniego edytowanego obiektu w historii."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Idź do następnego edytowanego obiektu w historii."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Historia ostatnio edytowanych obiektów."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Właściwości obiektu."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "System plików"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Węzeł"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Konsola"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Prze-Importuj"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Odśwież"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Podziękowania od społeczności Godot'a!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Dzięki!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Zaimportuj Szablony z pliku ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Wyeksportuj projekt"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Wyeksportuj biblioteke"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Połącz z Istniejącym"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Hasło:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Otwórz i Uruchom Skrypt"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Wczytaj błędy"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Zainstalowane wtyczki:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Wersja:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Status:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Zatrzymaj profilowanie"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Rozpocznij profilowanie"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Zmierzono:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Czas ramki (sek)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Średni Czas (sek)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "% Ramek"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "% Ramek Fixed"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Czas:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Włącznie"
+
+#: tools/editor/editor_profiler.cpp
+#, fuzzy
+msgid "Self"
+msgstr "Ten obiekt"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Klatka #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Proszę poczekać na zakończenie skanowania."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "Bieżąca scena musi być zapisana aby ponownie zaimportować."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Zapisz i Prze-Importuj"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Zaimportuj ponownie zmienione zasoby"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Wpisz swoją logikę w metodzie _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Edytowana scena już istnieje."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Nie udało się utworzyć instancji skryptu:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Zapomniałeś nazwy 'narzędzia' ?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Nie można uruchomić skryptu:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Zapomniałeś metody '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Damyślny(Same as Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Wybierz węzły do importu"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Ścieżka sceny:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Zaimportuj z węzła:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Nie udało się otworzyć pliku file_type_cache.cch do zapisu, pamięć podręczna "
+"typu plików nie będzie zapisana!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+"Ścieżki źródłowa i docelowa są takie same, żadna akcja nie została wykonana."
+
+#: tools/editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Can't move directories to within themselves."
+msgstr "Nie możesz przenieść danego katalogu do jego wnętrza."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Wybierz nową nazwę i lokację dla:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Nie wybrano pliku!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instancja"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Edytuj Zależności..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Pokaż właścicieli.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Skopiuj Ścieżkę"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Zmień nazwę lub Przenieś..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Przenieś Do..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Informacje"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Pokaż w menadżerze plików"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Importuj ponownie.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Poprzedni katalog"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Następny folder"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Przeskanuj system plików ponownie"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Ustaw folder jako ulubiony"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Utwórz instancje wybranej sceny/scen jako dziecko wybranego węzła."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Przenieś"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Dodaj do Grupy"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Usuń z Grupy"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Docelowa ścieżka jest pusta."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "Ścieżka docelowa musi być bezwzględna."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Docelowa ścieżka musi istnieć."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Ścieżka zapisu jest pusta!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importuj BitMasks"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Źródło tekstury:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Ścieżka docelowa:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Akceptuj"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "BitMask"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Brak pliku źródłowego czcionki!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Brak docelowego zasobu czcionki!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Błędne rozszerzenie pliku.\n"
+"Proszę użyć .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Nie udało się zapisać czcionki."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Źródło czcionki:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Wielkość oryginalna czcionki:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Wielkość docelowa czcionki:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "ŻżŹźĆćŃńĄąŁłĘęÓó."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Test:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opcje:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Import czcionki"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Nie rozpoznano typu czcionki."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Czcionka"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Brak siatek do zaimportowania!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importuj Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Źródło Mesh:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Siatka"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Powierzchnia %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Brak sampli do importu!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importuj pliki dźwiękowe"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Źródło dźwięku:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Dźwięk"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Nowy klip"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opcje animacji"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Flagi"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Optymalizator"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Maksymalny błąd liniowy"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Maksymalny błąd kątowy"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Maksymalny Kąt"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Klipy"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Start"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Koniec"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Pętla"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtry"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Ścieżka źródłowa jest pusta."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Nie udało się wczytać skryptu po imporcie."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Niepoprawny/uszkodzony skrypt post-importu."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Błąd podczas wczytywania sceny."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Zaimportuj Scene 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Scena źródłowa:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Taki sam jak scena docelowa"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Współdzielone"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Docelowy folder tekstur:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Skrypt do wywołania po imporcie:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Niestandardowy typ węzła głównego:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Automatyczny"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nazwa węzła:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Brakuje następujących plików:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Zaimportuj Pomimo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importuj i Otwórz"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"Edytowana sceny nie została zapisana. Otworzyć importowaną scenę mimo tego?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importuj Scene"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importowanie Sceny.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Uruchamiam skrypt..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Nie udało się wczytać skryptu po imporcie:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+"Pojawiły się błędy podczas uruchamiania skryptu po imporcie (sprawdź "
+"konsolę):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Błąd podczas uruchamiania skryptu po imporcie:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Zaimportuj Obraz:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Nie można zaimportować pliku wewnątrz siebie samego:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Zapisywanie.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Scena animacji 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Nieskompresowany"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Bezstratna Kompresja (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Kompresja Stratna (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Skompresuj (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Format Tekstury"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Jakość Kompresji Textury (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opcje Tekstury"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Proszę podać kilka plików !"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Co najmniej jeden plik potrzebny do \"Atlas'u\"."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Błąd importowania:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Tylko jeden plik jest wymagany dla dużych tekstur."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Maksymalny rozmiar tekstury:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Zaimportuj Tekstury z \"Atlas'u\" (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Rozmiar komórki:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Duża Tekstura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Zaimportuj Duże Tekstury (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Źródłowa Tekstura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Bazowa tekstura \"Atlas'u\""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Tekstura(y) źródłowe"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importuj tekstury dla 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importuj tekstury dla 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Zaimportuj Textury"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Tekstura 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Tekstura 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Tekstura \"Atlas'u\""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"UWAGA: Importowanie tekstur 2D nie jest wymagane. Po prostu skopiuj pliki "
+"png/jpg do folderu projektu."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Przytnij pusty obszar."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Tekstura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importuj dużą teksturę"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Wczytaj obrazek źródłowy"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Przycinanie"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Wstawianie"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Zapisywanie"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Nie udało się zapisać dużej tekstury:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Ładowanie obrazu:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Nie można załadować obrazu:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Konwersja obrazków"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Przycinanie obrazków"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Wadliwe źródło!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Nieprawidłowe źródło tłumaczenia!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Kolumna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Język"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Brak elementów do importu!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Brak ścieżki docelowej!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importuj tłumaczenia"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Nie można zaimportować!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importuj tłumaczenie"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "Źródłowy CSV:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignoruj pierwszy wiersz"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Skompresuj"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Dodaj do projektu (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Zaimportuj Język:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Tłumaczenie"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Grupy"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Wybierz węzeł do edycji sygnałów i grup."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Ustaw automatycznie"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Nowa nazwa animacji:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nowa animacja"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Zmień nazwę animacji:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Usuń animację"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "BŁĄD: błędna nazwa animacji!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "BŁĄD: animacja o takiej nazwie już istnieje!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Zmień nazwę animacji"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Dodaj animację"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Wczytaj animację"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplikuj animacje"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "BŁĄD: Brak animacji do skopiowania!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Wklejona animacja"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Wklej animację"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "BŁĄD: Brak animacji do edycji!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "Odtwórz zaznaczoną animację od tyłu z aktualnej poz. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Zatrzymaj animację (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Uruchom animację od początku (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Uruchom animację od aktualnej pozycji (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Pozycja animacji (sekundy)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Stwórz nową animację."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Załaduj animację z dysku."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Załaduj animacje z dysku."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Zapisz wybraną animacje"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Zapisz jako"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Wyświetl listę animacji w odtwarzaczu."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Auto odtwarzanie po załadowaniu"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Narzędzia do animacji"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Skopiuj animacje"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Utwórz nową animację"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nazwa animacji:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Błąd!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animacja"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Nowa nazwa:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Skala:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Mix"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Automatyczny Restart:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Restart(y):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Start!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Czas X-Fade (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Bieżący:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Dodaj Wejście"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Zmień nazwę"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Zaimportuj animacje.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtry.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Parsowanie Geometrii"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Tworzenie BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Podgląd"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Konfiguruj krokowanie"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Offset siatki:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Krok siatki:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Offset obrotu:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Krok obrotu:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Przesuń pivot"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Edytuj łańcuch IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Edytuj CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Zmień zakotwiczenie"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Powiększenie (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Wklej Pozę"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Tryb zaznaczenia"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Przeciągnij: Obróć"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Przeciągnij: Przesuń"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Wciśnij 'v' by Zmienić Pivot, 'Shift+v' by Przesunąć Pivot (podczas "
+"poruszania)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Tryb przesuwania"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Tryb Rotacji"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Kliknij by zmienić środek obrotu obiektu."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Tryb przesuwania"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Zablokuj wybrany obiekt w miejscu (nie można go przesuwać)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Odblokuj wybrany obiekt (można go przesuwać)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Zablokuj selekcję węzłów podrzędnych."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Odblokuj selekcję węzłów podrzędnych."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Użyj przyciągania"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Pokaż kratownicę"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Użyj kroków obrotu"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Konfiguruj krokowanie.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Użyj krokowania na poziomie pikseli"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Szkielet.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Utwórz Kości"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Wyczyść Kości"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Show Bones"
+msgstr "Utwórz Kości"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Utwórz Łańcuch IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Wyczyść Łańcuch IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Widok"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Wyzeruj przybliżenie"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Ustaw przybliżenie..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Wyśrodkowywanie na zaznaczeniu"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Powiększ do zaznaczenia"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Wstaw Klucze"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Wstaw Klucz"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Skopiuj Pozę"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Wyczyść Pozę"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Ustaw Wartość"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Add %s"
+msgstr "Dodaj wszystko"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Utwórz węzeł"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Zmień Wartość Domyślną"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Utwórz Polygon"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Miniatura.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Usuń element %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Dodaj element"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Usuń zaznaczony element"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Import ze sceny"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Aktualizuj ze sceny"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Element %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Elementy"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Edytor listy elementów"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Stwórz Occluder Polygon"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Edytuj istniejący polygon:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "LMB: Przesuń Punkt."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "RMB: Wymaż Punkt."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Oś-X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Oś-Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Oś-Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Błąd wczytywania obrazu:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Generuj AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Wyczyść Emiter"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Utwórz Emiter"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Powierzchnia"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Głośność"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Zaznacz Punkty"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Drag: Zaznacz Punkty Kontrolne"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Klik: Dodaj Punkt"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Prawy Klik: Usuń Punkt"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Zaznacz Punkty Kontrolne (Shift+Drag)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Dodaj Punkt (w pustym miejscu)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Podziel Segment (na krzywej)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Usuń Punkt"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Zamknij krzywą"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Punkt Krzywej #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Podziel Ścieżkę"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Usuń punkt ścieżki"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Utwórz Mapę UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Przekształć Mapę UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Wielokąt 2D UV Edytor"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Przesuń Punkt"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Obróć"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Przesuń wszystko"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Skaluj"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Przesuń Wielokąt"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Obróć Wielokąt"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Skaluj Wielokąt"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Wielokąt->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Wielokąt"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Wyczyść UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Kratownica"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "BŁĄD: Nie można wczytać zasobu!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Dodaj Zasób"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Zmień nazwę Zasobu"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Usuń zasób"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Wczytaj Zasób"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Długość:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Stereo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Format"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Wysokość"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Błąd podczas zapisywania motywu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Błąd zapisywania"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Błąd importowania motywu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Błąd importowania"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Zaimportuj motyw"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Zapisz motyw jako.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Następny skrypt"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Poprzedni skrypt"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Plik"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Nowy"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Zapisz wszystko"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Przeładuj motyw"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Zapisz motyw"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Zapisz motyw jako"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Zamknij pliki pomocy"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Zamknij"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Znajdź.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Znajdź następny"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Debug"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Kontynuuj"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Pozostaw Debugger otwarty"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Okno"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Przesuń w lewo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Przesuń w prawo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Poradniki"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Otwórz https://godotengine.org na sekcji poradników."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Klasy"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Szukaj w hierarchii klas."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Przejdź do poprzednio edytowanego dokumentu."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Przejdź do następnego edytowanego dokumentu."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Utwórz Skrypt"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Przeładuj"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Zapisz ponownie"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Debugger"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Pick Color"
+msgstr "Kolor"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Przesuń w górę"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Przesuń w dół"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Wcięcie w lewo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Wcięcie w prawo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Ustaw komentarz"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Usuń wszystkie pułapki"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Przejdź do następnej pułapki"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Przejdź do poprzedniej pułapki"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Znajdź poprzedni"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Zamień.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Przejdź do funkcji.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Przejdź do linii.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Pomoc kontekstowa"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Zmień Wartość Domyślną"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Zmień komentarz"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Usuń węzeł Shader Graph"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Usuń węzeł(y) Shader Graph"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Tył"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Przód"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Tryb Przesuwania (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Tryb Rotacji (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Wstaw klucz animacji"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Użyj domyślnie sRGB"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Obrót (stopnie):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Dodaj pusty"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Zmień FPS animacji"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(pusty)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animacje"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Prędkość (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Dodaj pusty (wcześniej)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Dodaj pusty (później)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<żaden>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Krok:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Nie mogę zapisać motywu do pliku:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Dodaj wszystkie elementy"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Dodaj wszystko"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Usuń element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
+msgid "Theme"
+msgstr "Zapisz motyw"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Utwórz pusty szablon"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "CheckBox Radio1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "CheckBox Radio2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Element"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Ma"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Wiele"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Opcje"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Typ:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Ikona"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Styl"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Kolor"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplikuj"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Zaznacz"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Obróć o 0 stopni"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Obróć o 90 stopni"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Obróć o 180 stopni"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Obróć o 270 stopni"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nazwa elementu lub ID:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Utwórz ze sceny?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Połącz ze sceny?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Utwórz ze sceny"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Połącz ze sceny"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Błąd"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Eksportuj poza folderem projektu!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Błąd przy eksporcie projektu!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Brak jeszcze eksportu dla platformy '%s'."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Utwórz nowy zasób"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Poprawna nazwa"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Przejście"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Status:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Hasło:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Dopuszczalne znaki:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Nowa nazwa:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Zawiera"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Zmień grupę obrazków"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Nazwa grupy nie może być pusta!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Nieprawidłowy znak w nazwie grupy!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Nazwa grupy już istnieje!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Dodaj grupę obrazków"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Usuń grupę obrazków"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Opcje eksportu projektu"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Cel"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Eksportuj na platformę"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Zasoby"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Eksportuj wszystkie zasoby w projekcie."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Eksportuj wszystkie pliki w katalogu projektu."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Tryb eksportu:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Zasoby do eksportu:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Akcja"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Obrazki"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Konwertuj obrazki (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Zmniejsz wszystkie obrazki:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Format kompresji:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Grupy obrazków"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Grupy:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Kompresja RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Tryb kompresji:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Zmniejsz o:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Obrazki:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Grupa"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Sample"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Bez zmian"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Kompresja (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Przytnij"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Skrypt"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Tryb eksportu skryptów:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Tekst"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Skompilowany"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Zaszyfrowany (podaj klucz poniżej)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Klucz szyfrujący skryptu (256-bit jako hex):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Eksport PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Eksport projektu PCK"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Eksport.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Eksport projektu"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Szablon eksportu:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Niepoprawna ścieżka projektu, ścieżka musi istnieć!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Niepoprawna ścieżka projektu, godot.cfg nie może istnieć."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Niepoprawna ścieżka projektu, godot.cfg musi istnieć."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Zaimportowano projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Niepoprawna ścieżka projektu (zmienić cokolwiek?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Nie można było utworzyć godot.cfg w ścieżce projektu."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Pakiet zastał zainstalowany poprawnie!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importuj istniejący projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Ścieżka projektu (musi istnieć):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nazwa projektu:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Utwórz nowy projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Ścieżka do projektu:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Zainstaluj projekt:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Instaluj"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Szukaj"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Nowy projekt gry"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Projekt bez nazwy"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Czy jesteś pewny że chcesz otworzyć więcej niż jeden projekt?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "Czy jesteś pewny że chcesz uruchomić więcej niż jeden projekt?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Menedżer projektów"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Lista projektów"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Uruchom"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Skanuj"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Wybierz folder do skanowania"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Nowy projekt"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Wyjdź"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Klawisz "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Przycisk joysticka"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Oś joysticka"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Przycisk myszy"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "Akcja %s już istnieje!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Naciśnij klawisz.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Lewy guzik"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Prawy guzik"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Środkowy guzik"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Przycisk 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Przycisk 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Przycisk 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Przycisk 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Błąd zapisu ustawień."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Ustawienia zapisane pomyślnie."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Ustawienia projektu (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Ogólny"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Właściwość:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Usuń"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Kopiuj na platformę..."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Akcja:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Urządzenie:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Indeks:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Lokalizacja"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Tłumaczenia"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Tłumaczenia:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Dodaj.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Zasoby:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Wtyczki"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zero"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Plik.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Katalog.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Wczytaj"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Następny skrypt"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Błąd wczytania pliku: Brak zasobu!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Nie można wczytać obrazu"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Właściwości:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Zaznacz Punkty"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Tryb zaznaczenia"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Zmień nadrzędny"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Utwórz nowy zasób"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Otwórz zasób"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Zapisz zasób"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Narzędzia zasobów"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Aktualna scena"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Główna scena"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argumenty głównej sceny:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Ustawienia uruchomienia sceny"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Błąd przy ładowaniu sceny z %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Nie można wykonać tej operacji na głównym węźle drzewa."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Move Nodes In Parent"
+msgstr "Przenieść węzły do węzła nadrzędnego."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplikuj węzeł(y)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Usuń węzeł(y)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Ta operacja nie może zostać wykonana bez sceny."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Tej operacji nie można wykonać na dziedziczącej scenie."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Zapisz nową scenę jako ..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "To ma sens!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Usuń węzeł(y)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Nie udało się zapisać sceny. Najprawdopodobniej pewne zależności nie są "
+"spełnione."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Błąd podczas zapisywania sceny."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Error duplicating scene to save it."
+msgstr "Błąd duplikowania sceny przy zapisywaniu."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Edytuj grupy"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Edytuj Połączenia"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Usuń węzeł (węzły)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Dodaj dziecko węzła"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instancjonuj dziecko sceny"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Zmień typ"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Dodaj skrypt"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Utwórz Skrypt"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Dołącz ze sceny"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Zapisz gałąź jako scenę"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Usuń (bez potwierdzenie)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Dodaj/Utwórz nowy węzeł"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach a new or existing script for the selected node."
+msgstr "Utwórz nowy skrypt dla zaznaczonego węzła."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear a script for the selected node."
+msgstr "Utwórz nowy skrypt dla zaznaczonego węzła."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Przełącz widoczność Spatial"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Przełącz widoczność CanvasItem"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instancja:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nieprawidłowa nazwa węzła, następujące znaki są niedozwolone:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Zmień nazwę węzła"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Drzewo sceny (węzły):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Edytowalne dzieci"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Załaduj jako zastępczy"
+
+#: tools/editor/scene_tree_editor.cpp
+#, fuzzy
+msgid "Discard Instancing"
+msgstr "Odrzuć instancjonowanie"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Otwórz w edytorze"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Wyczyść dziedziczenie"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Wyczyścić dziedziczenie? (Nie można cofnąć!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Czysto!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Wybierz węzeł"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Nieprawidłowa nazwa klasy bazowej"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Poprawne znaki:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Niepoprawna nazwa klasy"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Poprawna nazwa"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Nazwa klasy jest niepoprawna!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Nazwa klasy nadrzędnej jest niepoprawna!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Niepoprawna ścieżka!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Nie można było utworzyć skryptu w systemie plików."
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Błąd przy ładowaniu sceny z %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Ścieżka jest pusta"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Ścieżka nie jest lokalna"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Niepoprawna ścieżka bazowa"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Niepoprawne rozszerzenie"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Utwórz Skrypt"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "Następny skrypt"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nazwa klasy:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Wbudowany skrypt"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Utwórz skrypt dla węzła"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bajty:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Błąd:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Źródło:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Funkcja:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Błędy"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Połączono z procesem potomnym"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Sprawdź poprzednią instancję"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Sprawdź następną instancję"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Ramki stosu"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Zmienna"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Błędy:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Śledzenie stosu (jeśli dotyczy):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Zdalny inspektor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Właściwości zdalnego obiektu: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Wartość"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitory"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Zużycie pamięci wideo według zasobów:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Całkowity:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Pamięć wideo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Ścieżka zasobu"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Typ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Użycie"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Różne"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Kliknięta kontrolka:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Typ klikniętej kontrolki:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Ustaw z drzewa"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Skróty"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Zmień promień światła"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Zmień Pole Widzenia Kamery"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Zmień rozmiar kamery"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Zmień promień Sphere Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Zmień rozmiar Box Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Zmień średnicę Capsule Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Zmień wysokośc Capsule Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Zmień długość Ray Shape"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Zmień rozmiar Box Shape"
+
+#~ msgid "Vertex"
+#~ msgstr "Wierzchołek"
+
+#~ msgid "Global"
+#~ msgstr "Globalne"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Ten obiekt nie może być widoczny ponieważ jego rodzic jest ukryty. Odkryj "
+#~ "najpierw rodzica."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Ścieżki nie mogą zaczynać się od '/', ścieżki absolutne muszą zaczynać "
+#~ "się od 'res://', 'user://', lub 'local://'"
+
+#~ msgid "File exists"
+#~ msgstr "Plik Istnieje"
+
+#~ msgid "Valid path"
+#~ msgstr "Poprawna ścieżka"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Nie można iść do podkatalogu:"
+
+#~ msgid "Help"
+#~ msgstr "Pomoc"
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
new file mode 100644
index 0000000000..8ea2967a22
--- /dev/null
+++ b/editor/translations/pr.po
@@ -0,0 +1,6773 @@
+# Pirate translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Zion Nimchuk <zionnimchuk@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-11-14 19:48+0000\n"
+"Last-Translator: Zion Nimchuk <zionnimchuk@gmail.com>\n"
+"Language-Team: Pirate <https://hosted.weblate.org/projects/godot-engine/"
+"godot/pr/>\n"
+"Language: pr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"Shiver me timbers! ye type argument t' convert() be wrong! use yer TYPE_* "
+"constants!"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Nah enough bytes fer decodin' bytes, or ye got th' wrong ship."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "Blimey! Ye step argument be marooned!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Arr! Yer script is marooned!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Ye be loaded to the gunwalls? It's anchorage be not on a script!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Yer anchorage not be on a resource file, ye bilge rat!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Ye got th' wrong dictionary getup! (ye be missin' yer @path!)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "Ye got th' wrong dictionary getup! (yer script aint' at ye @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+"Ye got th' wrong dictionary getup! (ye be drinkin'? Ye got yerself a bad "
+"script at @path!)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+"Ye got th' wrong dictionary getup! (yer subclasses be walkin' the plank!)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Yer scurvy node yielded but she got n' workin' memry'! Ye should keep a "
+"lookout for em' docs, she knows how t' yield like yer captain!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Yer scurvy node yielded but er' booty didn't have no function state in er' "
+"maiden workin' memry'!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Yer value best be comin' back posted to ye first element of yer node's "
+"workin' memry'! Swab the decks!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Blow the man down! Yer node's booty got ye n' a evil sequence output: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Arrr! I found yer sequence bit but there be no node in yer stack. Tell th' "
+"Captain!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Avast! Yer stack has burst! Her depth be: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Yer functions:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Yer variables:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Yer signals:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Yer name's got no valid identifier: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+"Yer name be backstabin'! She be used by another dastardly func/var/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Rename Function"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Rename Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Rename Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Add Function"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Add Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Add Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Discharge ye' Function"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Discharge ye' Variable"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Ye be fixin' Variable:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Discharge ye' Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Ye be fixin' Signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Swap yer Expression"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Add Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Smash yer Meta t' sink yer Getter. Smash yer Shift t' sink a generic "
+"signature."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Smash yer Ctrl t' sink yer Getter. Smash yer Shift t' sink a generic "
+"signature."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Avast! Ye cannot steer yer ship with a '/'! Yer need t' start wit' "
+#~ "'res://', 'user://', or 'local://' ye knave!"
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
new file mode 100644
index 0000000000..9ab81786b1
--- /dev/null
+++ b/editor/translations/pt_BR.po
@@ -0,0 +1,7116 @@
+# Portuguese (Brazil) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
+# George Marques <george@gmarqu.es>, 2016.
+# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016.
+# Mailson Silva Marins <mailsons335@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: 2016-05-30\n"
+"PO-Revision-Date: 2016-09-02 21:07+0000\n"
+"Last-Translator: Mailson Silva Marins <mailsons335@gmail.com>\n"
+"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
+"godot-engine/godot/pt_BR/>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.8\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Argumento de tipo inválido para converter(), use constantes TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Não há bytes suficientes para decodificar, ou o formato é inválido."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "o argumento step é zero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Não é um script com uma instância"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Não é baseado num script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Não é baseado num arquivo de recurso"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Formato de dicionário de instância inválido (faltando @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Formato de dicionário de instância inválido (não se pôde carregar o script "
+"em @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Formato de dicionário de instância inválido (script inválido em @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Dicionário de instância inválido (subclasses inválidas)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funções:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variáveis:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Sinais:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Renomear Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "renomeie variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Renomear Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Adicionar Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Adicionar Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Adicionar Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Remover Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Remover Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Editando Variável:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Remover Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Editando Sinal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change Expression"
+msgstr "Alterar Tipo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Adicionar Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Adicionar Nó Filho"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Node(s) From Tree"
+msgstr "Nó a Partir de Cena"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Condition"
+msgstr "Copiar Animação"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Switch"
+msgstr "Pitch"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Return"
+msgstr "Retornar:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Chamar"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Get"
+msgstr "Definir"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Definir"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Editar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipo de Base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Membros:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nós Disponíveis:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Fechar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Editar Argumentos do Sinal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Editar Variável:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Alterar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Excluir Selecionados"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Alternar Ponto de interrupção"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Localizar Tipo de Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Copy Nodes"
+msgstr "Copiar Pose"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Cut Nodes"
+msgstr "Criar Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Colar Pose"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+#, fuzzy
+msgid "Invalid index property name."
+msgstr "Nome de classe pai inválido"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+#, fuzzy
+msgid "Path does not lead Node!"
+msgstr "O caminho não é local"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+#, fuzzy
+msgid ": Invalid argument of type: "
+msgstr "Nome de classe pai inválido"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumentos inválidos: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Error creating the signature object."
+msgstr "Erro ao escrever o PCK do projeto!"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Nome Inválido."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "Tamanho de fonte inválido."
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid publisher GUID."
+msgstr "Caminho base inválido"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid background color."
+msgstr "Origem personalizada da fonte inválida."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade "
+"\"Frames\" para que o nó AnimatedSprite mostre quadros."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"É permitido apenas um CanvasModulate visível por cena (ou conjunto de cenas "
+"instanciadas). O primeiro criado irá funcionar, enquanto os outros serão "
+"ignorados."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D apenas serve para fornecer a forma de colisão para um nó "
+"derivado de CollisionObject2D. Por favor use-o apenas como filho de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para dá-los forma."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Um nó CollisionPolygon2D vazio não é efetivo para colisão."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D apenas serve para fornecer a forma de colisão para um nó "
+"derivado de CollisionObject2D. Por favor use-o apenas como filho de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para dá-los forma."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Uma forma deve ser fornecida para que o nó CollisionShape2D funcione. Por "
+"favor, crie um recurso de forma para ele!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Uma textura com a forma da luz deve ser fornecida na propriedade \"textura\"."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Um polígono de oclusão deve ser definido (ou desenhado) para que este "
+"oclusor tenha efeito."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"O polígono para este oclusor está vazio. Por favor desenhe um polígono!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Um recurso do tipo NavigationPolygon deve ser definido ou criado para que "
+"este nó funcione. Por favor defina a propriedade ou desenhe um polígono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance deve ser filho ou neto de um nó Navigation2D. Ele "
+"apenas fornece dados de navegação."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"O nó ParallaxLayer apenas funciona quando definido como filho de um nó "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "A propriedade Caminho deve apontar a um nó Particles2D para funcionar."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D apenas funciona quando definido como filho de um nó Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"A propriedade \"Caminho\" deve apontar para um nó Node2D válido para "
+"funcionar."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Um recurso do tipo SampleLibrary deve ser criado ou definido na propriedade "
+"'amostras' para que o SamplePlayer possa tocar algum som."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"A propriedade \"Caminho\" deve apontar a um nó Viewport para funcionar. Tal "
+"Viewport deve estar no modo \"Destino de Render\"."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"O nó Viewport definido na propriedade \"Caminho\" deve ser marcado como "
+"\"destino de render\" para que este sprite funcione."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D funciona melhor quando usado como filho direto da raiz da "
+"cena atualmente editada."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape apenas serve para fornecer formas de colisão a um nó derivado "
+"de CollisionObject. Por favor, use-o apenas como filho de Area, StaticBody, "
+"RigidBody, KinematicBody, etc. para dá-los forma."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Uma forma deve ser fornecida para que o nó CollisionShape fucione. Por "
+"favor, crie um recurso de forma a ele!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon apenas serve para fornecer formas de colisão a um nó "
+"derivado de CollisionObject. Por favor, use-o apenas como filho de Area, "
+"StaticBody, RigidBody, KinematicBody, etc. para dá-los forma."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Um nó CollisionPolygon vazio não é efetivo na colisão."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Um recurso do tipo NavigationMesh deve ser definido ou criado para que este "
+"nó funcione."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance deve ser filho ou neto de um nó Navigation. Ele "
+"apenas fornece dados de navegação."
+
+#: scene/3d/remote_transform.cpp
+#, fuzzy
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "A propriedade Caminho deve apontar a um nó Particles2D para funcionar."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"É permitido apenas um nó WorldEnvironment por cena (ou conjunto de cenas "
+"instanciadas)."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Um recurso do tipo SampleLibrary deve ser criado ou definido na propriedade "
+"'amostras' para que o SpatialSamplePlayer possa tocar algum som."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade "
+"\"Frames\" para que o nó AnimatedSprite mostre quadros."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alerta!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Confirme Por Favor..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "O arquivo existe. Sobrescrever?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Todas Reconhecidas"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Todos os Arquivos (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Abrir"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Abrir um Arquivo"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Abrir Arquivo(s)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Abrir um Diretório"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Abrir Arquivo ou Diretório"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Salvar"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Salvar um Arquivo"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Criar Pasta"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Caminho:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Diretórios & Arquivos:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Arquivo:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Nome:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Não foi possível criar a pasta."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Deve usar uma extensão válida."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Dispositivo"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Botão"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Botão Esquerdo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Botão Direito."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Botão do Meio."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Roda para Cima."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Roda para Baixo."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Eixo"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Recortar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Copiar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Colar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Selecionar Tudo"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Limpar"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Desfazer"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popups são ocultos por padrão a menos que você chame alguma das funções "
+"popup*(). Torná-los visíveis para editar não causa problema, mas eles "
+"ocultarão ao rodar a cena."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Este viewport não está definido como destino de render. Se você pretende que "
+"ele mostre seu conteúdo diretamente na tela, faça-o filho de um nó Control "
+"para que ele possa ter um tamanho. Caso contrário, defina-o como destino de "
+"render e atribua sua textura interna a algum nó para exibir."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Erro ao inicializar FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Formato de fonte desconhecido."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Erro ao carregar fonte."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Tamanho de fonte inválido."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Desabilitado"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Toda a Seleção"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Mover Adicionar Chave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Mudar Transição da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Mudar Transformação da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Mudar Valor da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Mudar Chamada da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Adicionar Trilha na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Duplicar Chave na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Mover Trilha para cima"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Mover Trilha para Baixo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Remover Trilha da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Definir Transições para:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Renomear Trilha na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Alterar Interpolação da Trilha"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Mudar Modo de Valor da Trilha"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Editar Curva do Nó"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Editar Curva da Seleção"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Excluir Chaves da Anim"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplicar Seleção"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplicar Transposto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Remover Seleção"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Contínuo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Discreto"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Gatilho"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Adicionar Chave na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Mover Chaves da Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Mudar Escala da Seleção"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Mudar Escala a partir do Cursor"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Ir ao Próximo Passo"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Ir ao Passo Anterior"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linear"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constante"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "In-Out"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Out-In"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Transições"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Otimizar Animação"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Limpar Animação"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Criar NOVA trilha para %s e inserir chave?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Criar %d NOVAS trilhas e inserir chaves?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Criar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Criar e Inserir Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Inserir Trilha e Chave na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Inserir Chave na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Mudar Comprimento da Animação"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Mudar Loop da Animação"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Criar Chave com Valor Definido"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Inserir Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Alterar Escala das Chaves na Anim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Adicionar Trilha de Chamada"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Zoom da animação."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Duração (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Duração da animação (em segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Passo (s):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Passo de snap do cursor (em segundos)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Habilitar/Desabilitar loop de animação."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Adicionar novas trilhas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Mover a trilha atual para cima."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Mover a trilha atual para baixo."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Remover trilha selecionada."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Ferramentas de trilha"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Habilitar edição de chaves individuais clicando nelas."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Otimizador de Animação"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Erro Linear Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Erro Angular Max.:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Angulo Máximo otimizável:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Otimizar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Chave"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Transição"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Proporção de Escala:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Chamar Funções em Qual Nó?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Remover Chaves Invalidas"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Remover trilhas vazias e não resolvidas"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Limpar todas as animações"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Limpar Animação(ões) (IRREVERSÍVEL!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Limpar"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimensionar Vetor"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Alterar Tipo de Valor do Vetor"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Alterar Valor do Vetor"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Pesquisar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Ordenar:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Reverso"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Categoria:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Todos"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Site:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Suportado..."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficial"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunidade"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Em teste"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Arquivo ZIP de Assets"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Lista de Métodos para \"%s\":"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Lista de Métodos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Argumentos:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Retornar:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Ir para Linha"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Número da Linha:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Sem Correspondências"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Substituída(s) %d Ocorrência(s)."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Substituir"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Substituir Tudo"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Corresponder Caixa"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Palavras Inteiras"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Apenas na Seleção"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Pesquisar"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Localizar"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Próximo"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d ocorrência(s) substituída(s)."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Não encontrado!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Substituir Por"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Diferenciar Caixa"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Para trás"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Perguntar ao Substituir"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Pular"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Ampliar Mais"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Ampliar Menos"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Linha:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Coluna:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "O método no Nó destino precisa ser especificado!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Conectar ao Nó:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Adicionar"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Remover"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Adicionar Argumento de Chamada Extra:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argumentos de Chamada Extras:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Caminho para o Nó:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Criar Função"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Postergado"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Uma vez"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Conectar"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Conectar \"%s\" a \"%s\""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Conectando Sinal:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Criar Conexão"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Conectar..."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Disconectar"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Sinais"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Criar Novo"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoritos:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recente:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Combinações:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Descrição:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Buscar Substituição Para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dependências Para:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"A cena \"%s\" está sendo editada atualmente.\n"
+"As mudanças não terão efeito a menos que seja recarregada."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"O recurso \"%s\" está em uso.\n"
+"As mudanças não terão efeito a menos que seja recarregado."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Dependências"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Recurso"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Caminho"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dependências:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Consertar Quebradas"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor de Dependências"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Buscar Recurso para Substituição:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Donos De:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Os arquivos a serem removidos são requeridos por outros recursos para que "
+"funcionem.\n"
+"Removê-los mesmo assim? (irreversível)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Remover os arquivos selecionados do projeto? (impossível desfazer)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Erro ao carregar:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "A cena não pôde ser carregada por causa de dependências ausentes:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Abrir Assim Mesmo"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Que ação deve ser tomada?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Consertar Dependências"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Erros ao carregar!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Excluir permanentemente %d item(s)? (Impossível desfazer!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Possui"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Recursos Sem Posse Explícita:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Explorador de Recursos Órfãos"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Excluir os arquivos selecionados?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Excluir"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nome Inválido."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "Nome inválido. Não é permitido utilizar nomes de classes da engine."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Nome inválido. Não é permitido utilizar nomes de tipos internos da engine."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Nome inválido. Não é permitido utilizar nomes de constantes globais da "
+"engine."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Caminho inválido."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "O arquivo não existe."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Não está no caminho de recursos."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Adicionar Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload \"%s\" já existe!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Renomear Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Alternar Auto Carregamentos de Globais"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Mover Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Remover Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Habilitar"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Reordenar Autoloads"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nome do Nó:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Nome"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Lista:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Atualizando Cena"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Armazenando mudanças locais..."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Atualizando Cena..."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Escolha um Diretório"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Escolher"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Voltar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Avançar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Acima"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Alternar Arquivos Ocultos"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Alternar Favorito"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Alternar Modo"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Focar no Caminho"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Mover Favorito Acima"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Mover Favorito Abaixo"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Previsualização:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "BuscarFontes"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Pesquisar Ajuda"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Lista de Classes:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Pesquisar Classes"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Classe:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Herda de:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Herdado por:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Descrição breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Métodos Públicos:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Itens do Tema de GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Constantes:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Descrição breve:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Descrição do Método:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Pesquisar Texto"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Adicionado:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Removido:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Erro ao salvar atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Não foi possível salvar Subtextura do Atlas:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Armazenando Arquivo:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Empacotando"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Exportando para %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Ajustando..."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Saída:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Re-Importando"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Importando:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Nó a Partir de Cena"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Erro ao salvar Recurso!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Salvar Recuso como..."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Entendo..."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Não é possível abrir arquivo para escrita:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Formato de arquivo requisitado desconhecido:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Erro ao salvar."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Salvando Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Analisando"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Criando Miniatura"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Não se pôde salvar a cena. É provável que dependências (instâncias) não "
+"foram satisfeitas."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Falha ao carregar recurso."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Não se pôde carregar MeshLibrary para fusão!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Erro ao salvar MeshLibrary!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Não se pôde carregar TileSet para fusão!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Erro ao salvar TileSet!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Não se pôde abrir zip dos modelos de exportação."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Carregando Modelos de Exportação"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Erro ao salvar o layout!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Layout padrão do editor sobrescrito."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nome do layout não encontrado!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Layout padrão restaurado às configurações base."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Copiar Parâmetros"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Colar Params"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Colar Recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Copiar Recurso"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Tornar Embutido"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Tornar Únicos os Sub-recursos"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Abrir na Ajuda"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Não há cena definida para rodar."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"A cena principal não foi definida, selecionar uma?\n"
+"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria "
+"\"application\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"A cena selecionada \"%s\" não existe, selecionar uma válida?\n"
+"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria "
+"\"application\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"A cena selecionada \"%s\" não é um arquivo de cena, selecionar uma válida?\n"
+"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria "
+"\"application\"."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr "A cena atual nunca foi salva. Por favor salve antes de rodá-la."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Não se pôde iniciar sub-processo!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Abrir Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Abrir Cena Base"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Abri Cena Ágil..."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Abrir Script Ágil..."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Sim"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Fechar cena? (Mudanças não salvas serão perdidas)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Salvar Cena Como..."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Esta cena nunca foi salva. Salvar antes de rodar?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Por favor salve a cena primeiro."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Salvar Strings Traduzíveis"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exportar MeshLibrary"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exportar Tile Set"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Sair"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Sair do editor?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Cena atual não salva. Abrir mesmo assim?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Não foi possível recarregar a cena pois nunca foi salva."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Reverter"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Esta ação não pode ser desfeita. Reverter mesmo assim?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Rodar Cena Ágil..."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Abrir Gerenciador de Projetos?\n"
+"(Mudanças não salvas serão perdidas)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Escolha uma Cena Principal"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Ugh"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Erro ao carregar cena, ela deve estar dentro do caminho do projeto. Use "
+"\"Importar\" para abrir a cena e então salve-a dentro do projeto."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Erro ao carregar cena."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "A cena \"%s\" tem dependências quebradas:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Salvar Layout"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Excluir Layout"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Padrão"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Trocar Guia de Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "Mais %d arquivo(s)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "Mais %d arquivo(s) ou pasta(s)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Ir para cena aberta anteriormente."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Próxima guia"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Guia anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operações com arquivos de cena."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nova Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Nova Cena Herdada..."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Abrir Cena..."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Salvar Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Salvar todas as Cenas"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fechar Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Ir a Cena Fechada Anterior"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Abrir Recente"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Filtrar Arquivos Rapidamente..."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Converter Para..."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Strings Traduzíveis..."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary..."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet..."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Refazer"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Rodar Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Configurações do Projeto"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Reverter Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Sair para a Lista de Projetos"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Modo Sem Distrações"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Importar assets ao projeto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Importar"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Ferramentas diversas atuantes no projeto ou cena."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Exportar o projeto para diversas plataformas."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Exportar"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Roda o projeto."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Tocar"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Pausar a cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausa a cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Para a cena."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Parar"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Roda a cena editada."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Rodar Cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Rodar outra cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Rodar outra cena"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Opções de depuração"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Instalar Depuração Remota"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Quando exportando ou instalando, o programa resultante tentará conectar ao "
+"IP deste computador para poder ser depurado."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Instalação Pequena com FS em rede"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Quando esta opção está habilitada, a exportação ou instalação produzirá um "
+"executável mínimo.\n"
+"O sistema de arquivos (FS) será fornecido ao projeto pelo editor via rede.\n"
+"No Android, a instalação usará o cabo USB para melhor desempenho. Esta opção "
+"acelera os testes de jogos com muito conteúdo."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Formas de Colisão Visíveis"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Formas de colisão e nós do tipo RayCast (2D e 3D) serão visíveis durante a "
+"execução do jogo caso esta opção esteja habilitada."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navegação Visível"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Malhas e polígonos de navegação serão visíveis no jogo se esta opção estiver "
+"ligada."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sincronizar Alterações na Cena"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Quando essa opção está ativa, quaisquer modificações feitas à cena no editor "
+"serão replicadas no jogo em execução.\n"
+"Quando usado remotamente em um dispositivo, isso é mais eficiente com o "
+"sistema de arquivos via rede."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Sincronizar Mudanças no Script"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Quando essa opção está ativa, qualquer script que é salvo será recarregado "
+"no jogo em execução.\n"
+"Quando usado remotamente em um dispositivo, isso é mais eficiente com o "
+"sistema de arquivos via rede."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Configurações"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configurações do Editor"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Layout do Editor"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Toggle Fullscreen"
+msgstr "Modo Tela-Cheia"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Instalar Models de Exportação"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "Sobre"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Alerta quando um recurso externo foi alterado."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Gira quando a janela do editor atualiza!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Atualizar Sempre"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Atualizar nas Mudanças"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspetor"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Cria um novo recurso na memória e o edita."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Carrega um recurso existente do disco e o edita."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Salva o recurso editado atualmente."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Salvar Como..."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Ir ao objeto editado anteriormente no histórico."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Ir ao próximo objeto editado no histórico."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "Histórico dos objetos editados recentemente."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Propriedades do objeto."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "Arquivos"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Nó"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Saída"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Reimportar"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Atualizar"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Agradecimentos da comunidade Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Obrigado!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importar Modelos de um Arquivo ZIP"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exportar Projeto"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Exportar Biblioteca"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Fundir Com Existente"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Senha:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Abrir e Rodar um Script"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Erros de Carregamento"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Plugins Instalados:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Versão:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Status:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Parar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Iniciar Profiling"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Medida:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Tempo de Quadro (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Tempo Médio (seg)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "% de Quadro"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "% de Quadro Fixo"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Tempo:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusivo"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Mesmo"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Frame nº:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Por favor aguarde a verificação completar."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "Cena Atual só deve ser salva para re-importação."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Salvar e Re-Importar"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Re-Importar Recursos Alterados"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Escreva sua lógica no método _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Já existe uma cena editada."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Não foi possível instanciar o script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Você esqueceu da palavra-chave \"tool\"?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Não foi possível rodar o script:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Você esqueceu o método '_run'?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Padrão (Mesma do Editor)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selecionar Nó(s) para Importar"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Caminho da Cena:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importar a Partir do Nó:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Não pode abrir file_type_cache.cch para escrita, cache de tipos de arquivo "
+"não salvo!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Mesmos arquivos de destino e origem, nada a fazer."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Mesmo caminhos de destino e origem, nada a fazer."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Não é possível mover diretórios para dentro de si mesmos."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "Não é possível operar em \"..\""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Escolha Novo Nome e Localização Para:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Nenhum arquivo selecionado!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instanciar"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Editar Dependências.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Visualizar Proprietários..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copiar Caminho"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Renomear ou Mover..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Mover Para..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Informação"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Mostrar no Gerenciador de Arquivos"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Re-importar..."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Diretório Anterior"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Próximo Diretório"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Re-escanear Arquivos de Sistema"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Alternar status da pasta como Favorito"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Instancia a(s) cena(s) selecionada como filho do nó selecionado."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Mover"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Remover do Grupo"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Sem máscaras de bits para importar!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Caminho destino está vazio."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "Caminho destino deve ser um caminho completo a um recurso."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Caminho destino deve existir."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Caminho de salvamento vazio!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Importar Máscara de Bits"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Textura(s) de Origem:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Caminho Destino:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Aceitar"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Máscara de Bits"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Falta arquivo de fonte origem!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Falta recurso de fonte destino!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Extensão de arquivo inválida.\n"
+"Por favor use .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Não se pôde carregar/processar fonte de origem."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Não se pôde salvar fonte."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Fonte Origem:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Tamanho da Fonte de Origem:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Recurso Destino:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"À noite, vovô Kowalsky vê o ímã cair no pé do pinguim queixoso e vovó põe "
+"açúcar no chá de tâmaras do jabuti feliz."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Teste:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Opções:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Importar Fonte"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Este arquivo já é um arquivo de fonte Godot, por favor forneça um arquivo "
+"BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Falha ao abrir como arquivo BMFont."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Origem personalizada da fonte inválida."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Fonte"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Sem meshes para importar!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Importar Única Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Origem de Mesh(es):"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Superfície %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Sem amostras para importar!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Importar Amostras de Áudio"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Amostra(s) de Origem:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Amostra de Áudio"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Novo Clipe"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Opções da Animação"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Flags"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "Precalcular FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Otimizador"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Erro Linear Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Erro Angular Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Ângulo Máximo"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Clipes"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Início(s)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Fim(ns)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Repetir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Filtros"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Caminho de origem está vazio."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Não se pôde carregar script pós-importação."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Script pós-importação inválido/quebrado."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Erro ao importar cena."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Importar Cena 3D"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Cena de Origem:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Mesma da Cena Destino"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Compartilhado"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Pasta Destino para Textura:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Script de Pós-Processamento:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Tipo Personalizado de Nó Raiz:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Auto"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#, fuzzy
+msgid "Root Node Name:"
+msgstr "Nome do Nó:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Os Seguintes Arquivos estão Faltando:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Importar Mesmo Assim"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Importar e Abrir"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr "A cena editada não foi salva, abrir cena importada ainda assim?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importar Cena"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Importando Cena..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Rodando Script Personalizado..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Não se pôde carregar script pós-importação:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Script pós-importação inválido/quebrado (verifique o console):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Erro ao rodar script pós-importação:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Importar Imagem:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Não é possível importar arquivo sobre si mesmo:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Caminho não pôde ser localizado: %s (já é local)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Salvando..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Animação Cena 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Não comprimido"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Comprimido Sem Perdas (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Comprido Com Perdas (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Comprimido (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Formato da Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Qualidade da Compressão da Textura (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Opções da Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Por favor especifique alguns arquivos!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Pelo menos um arquivo é preciso para o Atlas."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Erro ao importar:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Apenas um arquivo é requerido para textura grande."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Tamanho Máximo de Textura:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Importar Texturas para Atlas (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Tamanho da Célula:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Textura Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Importar Texturas Grandes (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Textura Origem"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Textura Base do Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Textura(s) Origem(ns)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Importar Texturas para 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Importar Texturas para 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Importar Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "Textura 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "Textura 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Textura Atlas"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"AVISO: Importar texturas 2D não é obrigatório. Apenas copie arquivos png/jpg "
+"para o projeto."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Aparar espaço vazio."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Textura"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Importar Textura Grande"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Carregar Imagem Origem"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Fatiando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Inserindo"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Salvando"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Não se pôde salvar textura grande:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Montar Atlas Para:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Carregando Imagem:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Não se pôde carregar imagem:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Convertendo Imagens"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Aparando Imagens"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Fazendo Blitting das Imagens"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Não se pôde salva imagem de atlas:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Não se pôde salvar textura convertida:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Origem inválida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Origem de tradução inválida!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Coluna"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Idioma"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Nenhum item a importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Nenhum caminho destino!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Importar Traduções"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Não foi possível importar!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Importar Tradução"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "Arquivo CSV Origem:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Ignorar Primeira Linha"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Comprimir"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Adicionar ao Projeto (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Importar Idiomas:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Tradução"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "Múltiplos Nós definidos"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Grupos"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Selecione um Nó para editar Sinais e Grupos."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Alternar Inicio automático"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Novo Nome da Animação:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nova Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Alterar Nome da Animação:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Remover Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ERRO: Nome de animação inválido!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ERRO: Nome da animação já existe!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Renomear Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Adicionar Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Misturar com o Próximo Alterado"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Mudar Tempo de Mistura"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Carregar Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplicar Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ERRO: Nenhuma animação para copiar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ERRO: Nenhum recurso de animação na área de transferência!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animação Colada"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Colar Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ERRO: Nenhuma animação para editar!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Iniciar animação selecionada de trás pra frente a partir da posição atual. "
+"(A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+"Iniciar animação selecionada de trás pra frente a partir do fim. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Parar reprodução da animação. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Reproduzir animação selecionada do início. (Shift +D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Reproduzir animação selecionada da posição atual. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Posição da Animação (em segundos)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Escalonar reprodução da animação globalmente para o nó."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Criar nova animação no player."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Carregar uma animação do disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Carregar uma animação do disco."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Salvar a animação atual"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Salvar Como"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Mostrar lista de animações no player."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Auto-reprodução ao Carregar"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Editar alvos dos tempos de mistura"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Ferramentas de Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Copiar Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Criar Nova Animação"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nome da Animação:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Erro!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Tempos de Mistura:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Próximo (Auto-enfileirar):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Tempos de Mistura de Animação Cruzada"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animação"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Novo nome:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Escala:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Fade In (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Fade Out (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Misturar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Misturar"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Reinício Automático:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Reinício (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Reinício Randômico:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Iniciar!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Quantidade:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Misturar:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Misturar 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Misturar 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Tempo do X-Fade (s):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Atual:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Adicionar Entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Limpar Avanço Automático"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Definir Avanço Automático"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Deletar Entrada"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Renomear"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Árvore de Animação é válida."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Árvore de Animação é inválida."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nó de Animação"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nó de tipo Uma-Vez"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Misturar Nó"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nó Misturar2"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nó Misturar3"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nó Misturar4"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nó Tempo de Escala"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nó Tempo de Procura"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nó de Transição"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Importar Animações..."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Editar Filtros de Nó"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Filtros..."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Analisando %d Triângulos:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Triângulo nº"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Configurar Baker de Luz:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Analisando Geometria"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Consertando Luzes"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Fazendo BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Criando Luz Octree"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Criando Textura Octree"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Transferir para Mapas de Luz:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Alocando Textura nº"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Precalculando Triângulo nº"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Pós-Processando Textura nº"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Precalcular!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Redefinir o processo \"octree baking\" do lightmap (recomeçar)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Visualização"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Configurar o Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Deslocamento da grade:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Passo de grade:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Deslocamento de rotação:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Passo de Rotação:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Mover Pivô"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Ação de Mover"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Editar Cadeia de IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Editar CanvaItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Alterar Âncoras"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Ampliação (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Colar Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Select Mode"
+msgstr "Modo de Seleção (Q)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Arrastar: Rotacionar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Arrastar: Mover"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Aperte \"v\" para Mudar Pivô, \"Shift+v\" para Arrastar Pivô (enquanto "
+"movendo)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+RMB: Lista de seleção de profundidade"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Move Mode"
+msgstr "Modo Mover (W)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate Mode"
+msgstr "Modo Rotacionar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Mostrar uma lista de todos os objetos na posição clicada\n"
+"(mesmo como Alt+RMB no Modo de seleção)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Clique para mudar o pivô de rotação do objeto."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Modo Panorâmico"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Travar o objeto selecionado no local (não pode ser movido)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Destravar o objeto selecionado (pode ser movido)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Garante que os filhos do objeto não sejam selecionáveis."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Restaura a habilidade dos filhos do objeto de serem selecionados."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Usar Snap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Mostrar Grade"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Usar Snap de Rotação"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Snap Relativo"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Configurar Snap..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Usar Snap de Pixel"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Expandir para Pai"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Esqueleto..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Fazer Ossos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Limpar Ossos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Show Bones"
+msgstr "Fazer Ossos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Fazer Cadeia de IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Limpar Cadeia de IK"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Visualizar"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Restaurar Ampliação"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Definir Ampliação..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centralizar Seleção"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Seleção de Quadros"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Âncora"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Inserir Chaves"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Inserir Chave"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Inserir Chave (Trilhas Existentes)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copiar Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Limpar Pose"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Defina um Valor"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Snap (Pixels):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Add %s"
+msgstr "Adicionar Todos"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Criar Nó"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Erro ao instanciar cena de %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Sem nó pai onde instanciar um filho."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Essa operação requer um único nó selecionado."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Change default type"
+msgstr "Alterar Valor Padrão"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Criar polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Polígono (Remover Ponto)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Criar um novo polígono do zero."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Criar Polígono 3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Definir Manipulador"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Adicionar/Remover Ponto na Curva de Cor"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Modificar Curva de Cores"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Criando MeshLibrary"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Miniatura..."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Remover item %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Adicionar Item"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Remover Item Selecionado"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importar da Cena"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Atualizar a partir de Cena"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Item %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Itens"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Editor de Lista de Itens"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Criar Polígono de Oclusão"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Editar polígono existente:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "LMB: Mover Ponto."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl+LMB: Dividir Segmento."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "RMB: Apagar Ponto."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Mesh está vazia!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Criar Corpo Trimesh Estático"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Criar Corpo Convexo Estático"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Não funciona na raiz da cena!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Criar Forma Trimesh"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Criar Forma Convexa"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Criar Mesh de Navegação"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "Falta uma MeshInstance na Mesh!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "Mesh não tem superfície para criar contornos!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Não se pôde criar contorno!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Criar Contorno"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Criar Corpo Trimesh Estático"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Criar um Corpo Estático Convexo"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Criar Colisão Trimesh Irmã"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Criar Colisão Convexa Irmã"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Criar Mesh de Contorno..."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Criar Mesh de Contorno"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Tamanho do Contorno:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+"Nenhuma mesh de origem especificada (e nenhuma MultiMesh definida no nó)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "Nenhuma mesh de origem especificada (e MultiMesh contém nenhuma Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Mesh de origem é inválida (Caminho inválido)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Mesh de origem é inválida (não é uma MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Mesh de origem é inválida (contém nenhum recurso de Mesh)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Nenhuma superfície de origem especificada."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Superfície de origem é inválida (Caminho inválido)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Superfície de origem é inválida (sem geometria)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "Superfície de origem é inválida (sem faces)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Pai não tem faces sólidas para popular."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Não foi possível mapear área."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Selecione uma Mesh de origem:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Selecione uma Superfície Destino:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Popular Superfície"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Popular MultiMesh"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Superfície Destino:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Mesh de Origem:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Eixo-X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Eixo-Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Eixo-Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Mesh acima do Eixo:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotação aleatória:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinação aleatória:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Escala aleatória:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Popular"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Criar Polígono de Navegação"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Remover Polígono e Ponto"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Erro ao carregar imagem:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Nenhum pixel com transparência > 128 na imagem."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Definir Máscara de Emissão"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Limpar Máscara de Emissão"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Carregar Máscara de Emissão"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Gerar Contagem de Pontos:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "O nó não contém geometria."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "O nó não contém geometria (faces)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "As faces não têm área!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Nenhuma face!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Gerar AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Criar Emissor a partir de Mesh"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Criar Emissor a partir de Nó"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Limpar Emissor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Criar Emissor"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Posições de Emissão:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Preenchimento de Emissão:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Superfície"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volume"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Remover Ponto da Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Adicionar Ponto à Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Mover Ponto na Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Mover Controle de Entrada na Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Mover Controle de Saída na Curva"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Selecionar Pontos"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Arrastar: Selecionar Pontos de Controle"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Clique: Adicionar Ponto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Clique Direito: Excluir Ponto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Selecionar Pontos de Controle (Shift+Arrastar)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Adicionar Ponto (em espaço vazio)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Dividir Segmentos (na curva)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Excluir Ponto"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Fechar Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Ponto da Curva nº"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Definir Pos do Ponto da Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Definir Pos da Entrada da Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Definir Pos da Saída da Curva"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Dividir Caminho"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Remover Ponto do Caminho"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Criar Mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformar Mapa UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Editor UV de Polígonos 2D"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Mover Ponto"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Rotaciona"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Mover Todos"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Escala"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Mover Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Rotacionar Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Escalonar Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polígono->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Polígono"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Limpar UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Ativar Snap"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Grade"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ERRO: Não foi possível carregar recurso!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Adicionar Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Renomear Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Excluir Recurso"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Recurso da área de transferência está vazio!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Carregar Recurso"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Analisar BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Duração:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Abrir Arquivo(s) de Amostra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "ERRO: Não é possível carregar a amostra!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Adicionar Amostra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Renomear Amostra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Excluir Amostra"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bits"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Estéreo"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Mono"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Formato"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Pitch"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erro ao salvar tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erro ao salvar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Erro ao importar tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Erro ao importar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Salvar Tema Como..."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Próximo Script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script anterior"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Arquivo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Novo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Salvar Tudo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Recarregar Script (suave)"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Anterior no Histórico"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Próximo no Histórico"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Recarregar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Salvar Tema"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Salvar Tema Como"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fechar Docs"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Fechar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Localizar..."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Localizar próximo"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Depurar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Passo por cima"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Passo para dentro"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Pausar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continuar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Manter Depurador Aberto"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Janela"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Mover para Esquerda"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Mover para Direita"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Tutoriais"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Abre https://godotengine.org na seção tutoriais."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Classes"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Pesquise na hierarquia da classe."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Pesquise a documentação de referência."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Ir para o documento editado anteriormente."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Ir para o próximo documento editado."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Criar Script"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Os seguintes arquivos são mais recentes no disco.\n"
+"Que ação deve ser tomada?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Recarregar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Salve novamente"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Depurador"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Scripts embutidos só podem ser editados quando a cena a qual pertencem está "
+"carregada"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Pick Color"
+msgstr "Cor"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Mover para Cima"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Mover para Baixo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Recuar Esquerda"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Recuar Direita"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Alternar Comentário"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Clonar Abaixo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Completar Símbolo"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Apagar Espaços em Branco"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Auto Recuar"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Remover Todos os Pontos de Interrupção"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Ir ao Próximo Ponto de Interrupção"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Ir ao Ponto de Interrupção Anterior"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Encontrar Anterior"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Substituir..."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Ir para Função..."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Ir para linha..."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Ajuda Contextual"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Alterar Constante Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Alterar Constante Vet"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Alterar Constante RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Alterar Operador Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Alterar Operador Vet"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Alterar Operador Vet Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Alterar Operador RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Alternar Rotação Somente"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Alterar Função Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Alterar Função Vet"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Alterar Uniforme Escalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Alterar Uniforme Vet"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Alterar Uniforme RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Alterar Valor Padrão"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Alterar Uniforme XForm"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Alterar Uniforme da Textura"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Alterar Uniforme do Cubemap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Alterar Comentário"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Adicionar/Remover para Curva de Cores"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Adicionar/Remover para Curve Map"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Modificar Curve Map"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Alterar Nome de Entrada"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Conectar Nós de Grafos"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Desconectar Nós de Grafos"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Remover Nó de Shader Graph"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Mover Nó de Shader Graph"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Duplicar Nó(s) de Grafo(s)"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Deletar Nó(s) de Shader Graph(s)"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Erro: Vínculo de Conexão Cíclico"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Erro: Faltando Conexões de Entrada"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Adicionar Nó de Shader Graph"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ortogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspectiva"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transformação Abortada."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transformação do Eixo-X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transformação do Eixo-Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transformação do Eixo-Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Visualizar Transformação do Plano."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Escalonando para %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Rotacionando %s degraus."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Visão inferior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Baixo"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Visão Superior."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Cima"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Visão Traseira."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Traseira"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Visão Frontal."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Frente"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Visão Esquerda."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Esquerda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Visão Direita."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Direita"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Chaveamento está desativado (nenhuma chave inserida)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Chave de Animação Inserida."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Alinhar com Visão"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Ambiente"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Ouvinte de Áudio"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Diálogo XForm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Nenhuma cena selecionada para instanciar!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Instanciar no Cursor"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Não foi possível instanciar cena!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Modo Mover (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Modo Rotacionar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Modo Escala (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Visão inferior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Visão Superior"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Visão Traseira"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Visão Frontal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Visão Esquerda"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Visão Direita"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Alternar visão Perspectiva/Ortogonal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Inserir Chanve de Animação"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Focus Origin"
+msgstr "Ver Origem"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Focar Seleção"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Alinhar Seleção com Visualização"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformação"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Coordenadas Locais"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Diálogo Transformação..."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Usar Luz Padrão"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Usar sRGB Padrão"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Viewports (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Viewports (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Viewports"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Exibição Normal"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Exibição Wireframe"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Exibição Overdraw"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Exibição Shadeless"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Ver Origem"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Ver Grade"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Configurações do Snap"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Snap de Translação:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Rotacionar Snap (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Escala do Snap (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Configurações da Viewport"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Luz Normal Padrão:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Cor de Luz Ambiente:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "FOV Perspectiva (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Visão Z-Próximo:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Visão Z-Longe:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Mudar Transformação"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Translação:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Rotacionar (deg.):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Escalonar (taxa):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Tipo de Transformação"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pré"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Pós"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERRO: Não foi possível carregar recurso de quadro!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Adicionar Quadro"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Recurso da área de transferência está vazio ou não é uma textura!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Colar Quadro"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Adicionar Vazio"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Mudar Repetição da Animação"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Mudar FPS da Animação"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vazio)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Animações"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Velocidade (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Quadros da Animação"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Inserir Vazio (Antes)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Inserir Vazio (Depois)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Acima"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Abaixo"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "Pré-Visualização do StyleBox:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Modo Snap:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Nenhum>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Snap de Pixel"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Snap de Grade"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Auto Fatiar"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Deslocamento:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Passo:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Separação:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Região da Textura"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Editor de Região da Textura"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Não pôde salvar tema ao arquivo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Adicionar Todos os Itens"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Adicionar Todos"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Remover Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
+msgid "Theme"
+msgstr "Salvar Tema"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Adicionar Itens de Classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Remover Itens de Classe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Criar Modelo Vazio"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Criar Modelo de Editor Vazio"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "Rádio Checkbox 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "Rádio CheckBox 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Checar Item"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Item Checado"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Tem"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Muitos"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Opções"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Ter,Muitas,Várias,Opções!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Guia 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Guia 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Guia 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Tipo:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Tipo de Dados:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Ícone"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Estilo"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Cor"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Pintar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Apagar TileMap"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Apagar Seleção"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Localizar tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transpor"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Espelhar X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Espelhar Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Balde"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Pegar Tile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Selecionar"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Rotacionar 0 degraus"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Rotacionar 90 degraus"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Rotacionar 180 degraus"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Rotacionar 270 degraus"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Não se pôde achar tile:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Nome ou ID do item:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Criar a partir de cena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Fundir a partir de cena?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Criar a partir de Cena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Fundir a partir de Cena"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Erro"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Editar Opções de Script"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Por favor export para fora da pasta do projeto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Erro ao exportar o projeto!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Erro ao escrever o PCK do projeto!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Ainda não há exportador para a plataforma \"%s\"."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Criar Novo Recurso"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Nome Válido"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Transição"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Status:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Senha:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Novo nome:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Incluir"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Alterar Grupo de Imagens"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "O nome do grupo não pode estar vazio!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Caractere inválido no nome do grupo!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "O nome do grupo já existe!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Adicionar Grupo de Imagens"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Excluir Imagem do Grupo"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Visualização do Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Configurações de Exportação de Projeto"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Destino"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Exportar para Plataforma"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Recursos"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Exportar recursos selecionados (incluindo dependências)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Exportar todos os recursos no projeto."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Exportar todos os arquivos no diretório do projeto."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Modo de Exportação:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Recursos a Exportar:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Ação"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para exportar arquivos que não sejam recursos (separados por "
+"vírgula, e.g.: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Filtros para excluir da exportação (separados por vírgula, e.g.: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Converter cenas em formato texto para binário ao exportar."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Imagens"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Manter Original"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Comprimir para Disco (Com perdas, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Comprimir para RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Converter Imagens (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Qualidade da Compressão para Disco (com perdas):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Encolher Todas as Imagens:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Formatos de Compressão:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Grupos de Imagens"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Grupos:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Comprimir para Disco"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Comprimir para RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Modo de Compressão:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Qualidade com Perdas:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Encolher por:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Prever Atlas"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Filtrar Imagens:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Imagens:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Remover Seleção"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Grupo"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Amostras"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Modo de Conversão de Amostras (arquivos .wav):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Manter"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Comprimir (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Limite da Taxa de Amostragem (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Cortar"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Silêncio no Fim:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de Exportação de Scripts:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Criptografado (forneça chave abaixo)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chave de Criptografia dos Scripts (256-bit como hex):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exportar PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Exportar PCK do Projeto"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Exportar..."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Exportação de Projeto"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Preset de Exportação:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Caminho de projeto inválido, o caminho deve existir!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Caminho de projeto inválido, godot.cfg não deve existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Caminho de projeto inválido, godot.cfg deve existir."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Projeto Importado"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Caminho de projeto inválido (mudou alguma coisa?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Não se pôde criar godot.cfg no caminho do projeto."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Os arquivos a seguir falharam ao serem extraídos do pacote:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Pacote Instalado com Sucesso!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importar Projeto Existente"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Caminho do Projeto (Deve Existir):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nome do Projeto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Criar Novo Projeto"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Caminho do Projeto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Instalar Projeto:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Instalar"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Navegar"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Novo Projeto de Jogo"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "É um BINGO!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Projeto Sem Nome"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Are you sure to open more than one project?"
+msgstr "Tem certeza de que quer abrir mais de um projeto?"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Are you sure to run more than one project?"
+msgstr "Tem certeza de que quer rodar mais de um projeto?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr "Remover projeto da lista? (O conteúdo da pasta não será modificado)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Gerenciador de Projetos"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Lista de Projetos"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Rodar"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Escanear"
+
+#: tools/editor/project_manager.cpp
+#, fuzzy
+msgid "Select a Folder to Scan"
+msgstr "Selecione uma Pasta para Scanear"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Novo Projeto"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Sair"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Chave "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Botão do Joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Eixo do Joystick"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Botão do Mous"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Ação Inválida (qualquer coisa serve, exceto '/' ou ':')."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "A ação \"%s\" já existe!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Renomear Evento Ação de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Adicionar Evento Ação de Entrada"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Control+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Pressione uma Tecla..."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Botão do Mouse:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Botão Esquerdo"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Botão Direito"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Botão do Meio"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Roda para Cima"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Roda para Baixo"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Botão 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Botão 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Botão 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Botão 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Eixo do Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Botão do Joystick:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Adicionar Ação de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Apagar Evento Ação de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Erro ao salvar as configurações."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Configurações Salvas."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Adicionar Tradução"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Remover Tradução"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Adicionar Caminho Remapeado"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Remapeamento de Recurso Adicionar Remap"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Alterar Idioma de Remapeamento de Recuso"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Remover Remapeamento de Recurso"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Remover Opção de Remapeamento de Recurso"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Configurações do Projeto (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Geral"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Propriedade:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Del"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Copiar para a Plataforma..."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Mapa de Entrada"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Ação:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Dispositivo:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Índice:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Localização"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Traduções"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Traduções:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Adicionar..."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Remapeamentos"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Recursos:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Remapeamentos por Localidade:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Localidade"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Predefinição..."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Ease In"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ease Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zero"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Easing In-Out"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Easing Out-In"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Arquivo..."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Dir..."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Carregar"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Atribuir"
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Próximo Script"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Erro ao carregar arquivo: Não é um recurso!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Não pôde carregar a imagem"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, val %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "Ativo"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Propriedades:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Seções:"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Selecionar Pontos"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "Modo de Seleção (Q)"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "Não se pôde executar a ferramenta PVRTC:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "Não se pôde carregar de volta imagem convertida por PVRTC:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Reparentar Nó"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Local para Reparentar (Selecione Novo Pai):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Manter Transformação Global"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Reparentar"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Criar Novo Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Abrir Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Salvar Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Ferramentas de Recurso"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Tornar Local"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Modo de Início:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Cena Atual"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Cena Principal"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argumentos da Cena Principal:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Configurações de Carregamento da Cena"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "No parent to instance the scenes at."
+msgstr "Sem nó pai onde instanciar um filho."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Erro ao carregar cena de %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Não se pode instanciar a cena \"%s\" porque a cena atual existe dentro de um "
+"de seus nós."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Instanciar Cena(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Esta operação não pode ser feita na raiz da árvore."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Mover Nó no Pai"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Mover Nós no Pai"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplicar Nó(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Excluir Nó(s)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Essa operação não pode ser realizada sem uma cena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Essa operação não pode ser realizada em cenas instanciadas."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Salvar Nova Cena Como..."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Faz Sentido!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Não é possível operar em nós de uma cena externa!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Não é possível operar em nós que a cena atual herda!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Remover Nó(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Não é possível salvar a nova cena. Provavelmente dependências (instâncias) "
+"não foram satisfeitas."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Erro ao salvar cena."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Erro duplicando cena ao salvar."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Editar Grupos"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Editar Conexões"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Excluir Nó(s)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Adicionar Nó Filho"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instânciar Cena Filha"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Alterar Tipo"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Adicionar Script"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Criar Script"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Fundir a Partir de Cena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Salvar Ramo como Cena"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Excluir (Sem Confirmação)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Adicionar/Criar um Novo Nó"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instanciar um arquivo de cena como um Nó. Criar uma cena herdada se não "
+"existe um nó raiz."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach a new or existing script for the selected node."
+msgstr "Criar um script novo para o nó selecionado."
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear a script for the selected node."
+msgstr "Criar um script novo para o nó selecionado."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Alternar Spatial Visível"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Alternar CanvasItem Visível"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instância:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nome de nó Inválido, os seguintes caracteres não são permitidos:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Renomear Nó"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Árvore de Cena (Nós):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Filhos Editáveis"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Carregar como Substituto"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Descartar Instanciação"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir no Editor"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Limpar Herança"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Limpar Herança? (Irreversível!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Limpar!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Selecione um Nó"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Nome de classe pai inválido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Caracteres válidos:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Nome de classe inválido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Nome Válido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/D"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "O nome da classe é inválido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "O nome da classe pai é inválido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Caminho inválido!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Não foi possível criar o script no sistema de arquivos."
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "Erro ao carregar cena de %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "O caminho está vazio"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "O caminho não é local"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Caminho base inválido"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Extensão inválida"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Criar Script"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "Próximo Script"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nome da Classe:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Script Embutido"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Criar Script para Nó"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Aviso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Erro:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Origem:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Função:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Erros"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Processo Filho Conectado"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Inspecionar a Instância Anterior"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Inspecionar a Próxima Instância"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Pilha de Quadros"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Variável"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Erros:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Pilha de Rastreamento (se aplicável):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Inspetor Remoto"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Árvore de Cena ao vivo:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Propriedades do Objeto Remoto: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valor"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitores"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Listagem de Uso Memória de Vídeo por Recurso:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Total:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Memória de Vídeo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Caminho do recurso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tipo"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Uso"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Misc"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Controle Clicado:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tipo de Controle Clicado:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Edição de Root em tempo real:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Definir a partir da árvore"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Atalhos"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Mudar Raio da Luz"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Mudar FOV da Câmera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Mudar Tamanho da Câmera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Mudar Raio da Forma de Esfera"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Mudar Dimensões da Forma de Caixa"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Alterar o raio do Shape Capsule"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Alterar a altura do Shape Capsule"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Mudar o tamanho do Shape Ray"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Alterar a Extensão do Notificador"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Alterar a Extensão do Notificador"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance não contém um recurso BakedLight ."
+
+#~ msgid "Vertex"
+#~ msgstr "Vértice"
+
+#~ msgid "Fragment"
+#~ msgstr "Fragmento"
+
+#~ msgid "Lighting"
+#~ msgstr "Iluminação"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Alternar Persistência"
+
+#~ msgid "Global"
+#~ msgstr "Global"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Este item não pode se tornar visível porque o pai está escondido. Reexiba "
+#~ "o pai primeiro."
+
+#~ msgid "File exists"
+#~ msgstr "O arquivo existe"
+
+#~ msgid "Valid path"
+#~ msgstr "Caminho válido"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Não é possível ir ao subdiretório:"
+
+#~ msgid "Help"
+#~ msgstr "Ajuda"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Recursos Importados"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Inserir Chaves (Ins)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Cima (Num7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Baixo (Shift+Num7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Esquerda (Num3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Direita (Shift+Num3)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Frente (Num1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Traseira (Shift+Num1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Perspectiva (Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Ortogonal (Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Seleção (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Alinhar com Visão (Ctrl+Shift+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Mudar Interpolação do Loop da Animação"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Habilitar/Desabilitar interpolação quando repetindo a animação."
+
+#~ msgid "Load Layout"
+#~ msgstr "Carregar Layout"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Editor de Região de Escala"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "Sem textura nesse nó.\n"
+#~ "Defina uma textura para poder editar essa região."
+
+#~ msgid "New Scene Root"
+#~ msgstr "Nova Raiz de Cena"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Herdar Cena"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Ligações (Parâmetros Extra):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Método no Nó:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "Recarregar Tool Script (suave)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Editar Conexões..."
+
+#~ msgid "Set Params"
+#~ msgstr "Definir Parâmetros"
+
+#~ msgid "Live Editing"
+#~ msgstr "Edição ao vivo"
+
+#~ msgid "File Server"
+#~ msgstr "Servidor de Arquivos"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Instalar Clientes do Servidor de Arquivos"
+
+#~ msgid "Group Editor"
+#~ msgstr "Editor de Grupos"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Grupo(s) do Nó"
+
+#~ msgid "Set region_rect"
+#~ msgstr "Definir region_rect"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Lista de Plugins:"
+
+#~ msgid "Overwrite Existing Scene"
+#~ msgstr "Sobrescrever Cena Existente"
+
+#~ msgid "Overwrite Existing, Keep Materials"
+#~ msgstr "Sobrescrever Existente, Manter Materiais"
+
+#~ msgid "Keep Existing, Merge with New"
+#~ msgstr "Manter Existente, Fundir com Novo"
+
+#~ msgid "Keep Existing, Ignore New"
+#~ msgstr "Manter Existente, Ignorar Novo"
+
+#~ msgid "This Time:"
+#~ msgstr "This Time:"
+
+#~ msgid "Next Time:"
+#~ msgstr "Next Time:"
+
+#~ msgid "%d frames"
+#~ msgstr "%d quadros"
+
+#~ msgid ""
+#~ "NOTICE: You are not forced to import textures for 2D projects. Just copy "
+#~ "your .jpg or .png files to your project, and change export options later. "
+#~ "Atlases can be generated on export too."
+#~ msgstr ""
+#~ "AVISO: Você não é forçado a importar texturas para projetos 2D. Apenas "
+#~ "copie seus arquivos .jpg ou .png para o projeto e mude as opções de "
+#~ "exportação mais tarde. Também é possível gerar Atlases ao exportar."
+
+#~ msgid "Source Texture:"
+#~ msgstr "Textura de Origem:"
+
+#~ msgid "Merging.."
+#~ msgstr "Fundindo..."
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
new file mode 100644
index 0000000000..da9d971347
--- /dev/null
+++ b/editor/translations/pt_PT.po
@@ -0,0 +1,6763 @@
+# Portuguese (Portugal) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-11 15:42+0000\n"
+"Last-Translator: António Sarmento <antonio.luis.sarmento@gmail.com>\n"
+"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/"
+"godot-engine/godot/pt_PT/>\n"
+"Language: pt_PT\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Tipo de argumento inválido para convert(), use constantes TYPE_*."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Número de bytes insuficientes para descodificar, ou o formato é inválido."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "o argumento \"step\" é zero!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Não é um script com uma instância"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Não é baseado num script"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Não é baseado num ficheiro de recurso"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Formato de dicionário de instância inválido (falta @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Formato de dicionário de instância inválido (não foi possível carregar o "
+"script em @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Formato de dicionário de instância inválido (script inválido em @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Dicionário de instância inválido (subclasses inválidas)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Um nó fez yield sem memória para usar, por favor leia os documentos para "
+"saber como fazer yield correctamente!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"O nó fez yield, mas não retornou um estado de função na primeira memória de "
+"trabalho."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"O valor de retorno deve ser atribuído ao primeiro elemento da memória de "
+"trabalho de nós! Corrija o seu nó por favor."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "O nó retornou uma sequência de saída (output) incorrecta: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"A sequência foi encontrada mas não o nó na pilha (stack), faça report de bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Stack overflow com a profundidade da pilha (stack): "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funções:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variáveis:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Sinais:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "O nome não é um identificador válido:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Este nome já está a ser usado por outro func/var/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Alterar nome da Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Alterar nome da Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Alterar nome do Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Adicionar Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Adicionar Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Adicionar Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Remover Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Remover Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "A editar Variável:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Remover Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "A editar Sinal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Adicionar Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Adicionar Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Adicionar Nó da Árvore"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Adicionar propriedade Getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Adicionar propriedade Setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Editar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Tipo de Base:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Membros:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Nós Disponíveis:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Seleccione ou crie uma função para editar o grafo"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Fechar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Editar Argumentos do Sinal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Editar Variável:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Alterar"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Apagar Seleccionados"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Accionar Breakpoint"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Encontrar Tipo de Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Tipo de Input não iterável: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "O iterador tornou-se inválido"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "O iterador tornou-se inválido: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Nome de índice propriedade inválido."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Objecto de base não é un Nó!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Caminho não aponta para nenhum Nó!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nome de propriedade índice '%s' inválido em nó %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argumento inválido de tipo: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumentos inválidos: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Nome de índice propriedade inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Fechar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Adicionar propriedade Setter"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
new file mode 100644
index 0000000000..0595a675b3
--- /dev/null
+++ b/editor/translations/ru.po
@@ -0,0 +1,7093 @@
+# Russian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# DimOkGamer <dimokgamer@gmail.com>, 2016.
+# Maxim Kim <habamax@gmail.com>, 2016.
+# Maxim toby3d Lebedev <mail@toby3d.ru>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2016-12-14 17:04+0000\n"
+"Last-Translator: DimOkGamer <dimokgamer@gmail.com>\n"
+"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Неверный тип аргумента для convert(), используйте TYPE_* константы."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Не хватает байтов для декодирования байтов, или неверный формат."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "Аргумент шага равен нулю!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Скрипт без экземпляра"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Основан не на скрипте"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Основан не на файле ресурсов"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Недопустимый формат экземпляра словаря (отсутствует @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Недопустимый формат экземпляра словаря (невозможно загрузить скрипт из @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Недопустимый формат экземпляра словаря (неверный скрипт в @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Недопустимый экземпляр словаря (неверные подклассы)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Узел покинут без рабочей памяти, пожалуйста, прочитайте документацию о том, "
+"как правильно выходить!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Узел покинут, но не возвращает состояние функции в первой рабочей памяти."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Возвращаемое значение должно быть присвоено первому элементу узла рабочей "
+"памяти! Исправьте узел пожалуйста."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Узел вернул ошибочную последовательность: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Найдена последовательность бит, но не узел в стеке, сообщение об ошибке!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Переполнение стека с глубиной стека: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Функции:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Переменные:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Сигналы:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Имя не является допустимым идентификатором:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Имя уже используется другой функцией/переменной/сигналом:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Переименовать функцию"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Переименовать переменную"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Переименовать сигнал"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Добавить функцию"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Добавить переменную"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Добавить сигнал"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Удалить функцию"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Удалить переменную"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Редактирование переменной:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Удалить сигнал"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Редактирование сигнала:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Изменить выражение"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Добавить узел"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Зажмите Meta, чтобы добавить Getter. Зажмите Shift, чтобы добавить "
+"универсальную подпись."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Зажмите Ctrl, чтобы добавить Getter. Зажмите Shift, чтобы добавить "
+"универсальную подпись."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Зажмите Meta, чтобы добавить простую ссылку на узел."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Зажмите Ctrl, чтобы добавить простую ссылку на узел."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Зажмите Meta, чтобы добавить Variable Setter."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Зажмите Ctrl, чтобы добавить Variable Setter."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Добавить предзагрузочный узел"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Добавить узел(узлы) из дерева"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Добавить получающее свойство"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Добавить устанавливающее свойство"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Условие"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Последовательность"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Переключатель"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Итератор"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "Пока"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Возвращение"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Вызов"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Получить"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Задан"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Редактировать"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Базовый тип:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Участники:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Доступные узлы:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Выберите или создайте функцию для редактирования графа"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Закрыть"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Редактирование аргументов сигнала:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Редактировать переменную:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Изменить"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Удалить выделенное"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Точка остановки"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Найти тип узла"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Копировать узлы"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Вырезать узлы"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Вставить узлы"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Входной тип не итерируемый: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Итератор стал недействительным"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Итератор стал недействительным: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Неверный индекс свойства имени."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Базовый объект не является узлом!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Путь не приводит к узлу!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Неправильный индекс свойства имени '%s' в узле %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Недопустимый аргумент типа: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Недопустимые аргументы: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet не найден в скрипте: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet не найден в скрипте: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Пользовательский узел не имеет метода _step(), не возможно обрабатывать граф."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Недопустимое значение, возвращаемое _step(), должно быть целое число(seq "
+"out) или строка (error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "просто нажата"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "просто отпущена"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr "Не могу прочитать файл сертификата. Уверены, что путь и пароль верны?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "Ошибка при создании объекта подписи."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Ошибка при создании подписи пакета."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"Шаблоны экспорта не найдены.\n"
+"Скачайте и установите шаблоны экспорта."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Пользовательский отладочный пакет не найден."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Пользовательский релизный пакет не найден."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Неверное уникальное имя."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "Неверный GUID продукта."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "Неверный GUID издателя."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Недопустимый цвет фона."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Неверные размеры логотипа для магазина (должны быть 50х50)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "Неверные размеры квадратного логотипа 44x44 (должны быть 44x44)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "Неверные размеры квадратного логотипа 71x71 (должны быть 71x71)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "Неверные размеры квадратного логотипа 150x150 (должны быть 150x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "Неверные размеры квадратного логотипа 310x310 (должны быть 310x310)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "Неверные размеры широкого логотипа 310x150 (должны быть 310x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "Неверные размеры заставки (должны быть 620x300)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Чтобы AnimatedSprite отображал кадры, пожалуйста установите или создайте "
+"ресурс SpriteFrames в параметре 'Frames'."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Только один видимый CanvasModulate на сцену (или совокупность приведённых "
+"сцен). Будет работать первый созданный, остальные будут проигнорированы."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D служит только для обеспечения столкновений фигурам типа "
+"CollisionObject2D. Пожалуйста использовать его только в качестве дочернего "
+"для Area2D, StaticBody2D, RigidBody2D, KinematicBody2D и др. чтобы придать "
+"им форму."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Пустой CollisionPolygon2D не влияет на столкновения."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D служит только для обеспечения столкновений фигурам типа "
+"CollisionObject2D. Пожалуйста использовать его только в качестве дочернего "
+"для Area2D, StaticBody2D, RigidBody2D, KinematicBody2D и др. чтобы придать "
+"им форму."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Shape должен быть предусмотрен для функций CollisionShape2D. Пожалуйста, "
+"создайте shape-ресурс для этого!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+"Текстуры с формой света должны быть предоставлены параметру \"texture\"."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Заслоняющий полигон должен быть установлен (или нарисован) на этот окклюдер, "
+"чтобы работать."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+"Заслоняющий полигон для этого окклюдера пуст. Пожалуйста, нарисуйте полигон!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Ресурс NavigationPolygon должен быть установлен или создан для этого узла. "
+"Пожалуйста, установите свойство или нарисуйте многоугольник."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance должен быть ребёнком или внуком узла Navigation2D. "
+"Он предоставляет только навигационные данные."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"Узел ParallaxLayer работает только при установке его в качестве дочернего "
+"узла ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Для корректной работы свойство Path должно указывать на действующий узел "
+"Particles2D."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D работает только при установке его в качестве дочернего узла "
+"Path2D."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Для корректной работы свойство Path должно указывать на действующий узел "
+"Node2D."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"Чтобы SamplePlayer воспроизводил звук, нужно создать или установить ресурс "
+"SampleLibrary в параметре 'samples'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Для корректной работы свойство Path должно указывать на действующий узел "
+"Viewport. Такой Viewport должен быть установлен в режим 'цель рендеринга'."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Области просмотра установленная в свойстве path должна быть назначена "
+"\"целью визуализации\" для того, чтобы этот спрайт работал."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D работает наилучшим образом при использовании корня "
+"редактируемой сцены, как прямого родителя."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape служит только для обеспечения столкновений фигурам типа "
+"CollisionObject. Пожалуйста использовать его только в качестве дочернего для "
+"Area, StaticBody, RigidBody, KinematicBody и др. чтобы придать им форму."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Shape должен быть предусмотрен для функций CollisionShape. Пожалуйста, "
+"создайте shape-ресурс для этого!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon служит только для обеспечения столкновений фигурам типа "
+"CollisionObject. Пожалуйста использовать его только в качестве дочернего для "
+"Area, StaticBody, RigidBody, KinematicBody и др. чтобы придать им форму."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Пустой CollisionPolygon не влияет на столкновения."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Ресурс NavigationMesh должен быть установлен или создан для этого узла."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance должен быть дочерним или под-дочерним узлом "
+"Navigation. Он предоставляет только навигационные данные."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "Свойство Path должно указывать на действительный Spatial узел."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Только один WorldEnvironment допускается на сцену или совокупность "
+"приведённых сцен."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"Чтобы SpatialSamplePlayer воспроизводил звук, нужно создать или установить "
+"ресурс SampleLibrary в параметре 'samples'."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Чтобы AnimatedSprite3D отображал кадры, пожалуйста установите или создайте "
+"ресурс SpriteFrames в параметре 'Frames'."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Отмена"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Ок"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Внимание!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Подтверждение..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Файл существует, перезаписать?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Все разрешённые"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Все файлы (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Открыть"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Открыть файл"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Открыть файл(ы)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Открыть каталог"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Открыть каталог или файл"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Сохранить"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Сохранить файл"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Создать папку"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Путь:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Каталоги и файлы:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Файл:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Фильтр:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Имя:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Невозможно создать папку."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Нужно использовать доступное расширение."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Устройство"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Кнопка"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Левая кнопка."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Правая кнопка."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Средняя кнопка."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Колёсико вверх."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Колёсико вниз."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Ось"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Вырезать"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Копировать"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Вставить"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Выбрать все"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Очистить"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Отменить"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Всплывающие окна будут скрываться по-умолчанию, если Вы не вызовете popup() "
+"или любой из popup*(). Делая их доступными для редактирования хорошая мысль, "
+"хотя они будут прятаться при запуске."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Эта область не установлена в качестве цели рендеринга. Если вы собираетесь "
+"использовать его, чтобы отобразить его содержимое прямо на экране, сделать "
+"его потомком Control'а, чтобы он мог получить размер. В противном случае, "
+"сделайте его целью рендеринга и передайте его внутренние текстуры какому-то "
+"другому узлу для отображения."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "Ошибка инициализации FreeType."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Неизвестный формат шрифта."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Ошибка загрузки шрифта."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Недопустимый размер шрифта."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Отключить"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Все выбранные элементы"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Подвинут ключ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Изменён переход анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Изменено преобразование анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Изменено значение анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Изменён вызов анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Добавлен новый трек"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Дублированы ключи анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Трек передвинут вверх"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Трек передвинут вниз"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Трек удалён"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Установлен переход на:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Трэк переименован"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Изменена интреполяция"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Изменён режим значений"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Кривая изменена"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Выбор кривой изменён"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Ключ удалён"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Дублировать выделенное"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Дублировать перемещённый"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Удалить выделенное"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Непрерывная"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Дискретная"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Триггер"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Ключ добавлен"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Ключ передвинут"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Масштаб выбранного промежутка"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Масштаб относительно курсора"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Перейти к следующему шагу"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Перейти к предыдущему шагу"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Линейный"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Постоянный"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "В"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Из"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "В-Из"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Из-В"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Переходы"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Оптимизировать анимацию"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Подчистить анимацию"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Создать новую дорожку для %s и вставить ключ?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Создать %d новые дорожки и вставить ключи?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Создать"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Анимация создать и вставить"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Анимация вставка дорожки и ключа"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Вставка ключа анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Изменена длинна анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Изменено зацикливание анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Создан ключ с вводимым значением"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Вставка на анимацию"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Масштабирование ключей анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Добавлен ключ вызова в анимацию"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Масштаб анимации."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Длинна (сек.):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Длинна анимации (в секундах)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Шаг (сек.):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Шаг привязки курсора (в секундах)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Включить/отключить зацикливание в анимации."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Добавить новые дорожки."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Подвинуть текущую дорожку вверх."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Подвинуть текущую дорожку вниз."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Удалить текущую дорожку."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "Инструменты дорожек"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Включить индивидуальное редактирование ключей, кликая по ним."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Оптимизатор анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Макс. Линейные погрешности:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Макс. Угловые погрешности:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Максимальный оптимизируемы угол:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "Оптимизировать"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "Выберите AnimationPlayer из дерева сцены для редактирования анимаций."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Ключ"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Переход"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Коэффициент масштабирования:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Вызвать функции в каком узле?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Удалить недопустимые ключи"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Удалить не разрешенные и пустые дорожки"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Подчистить все анимации"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Подчистить анимацию(и) (Нельзя отменить!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Подчистить"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Изменить размер Массива"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Изменение типа значения массива"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Изменить значение массива"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Поиск:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Сортировать:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Обратный"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Категория:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Все"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Сайт:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Поддержка.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Официально"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Сообщество"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Тестируемые"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "ZIP файл ассетов"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "Список способ для '%s':"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Список методов:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Аргументы:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Возвращение:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Перейти к строке"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Номер строки:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Нет совпадений"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "Заменено %d совпадений."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Заменить"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Заменить всё"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Учитывать регистр"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Целые слова"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Только выделять"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Поиск"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Найти"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "Следующий"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "Заменено %d совпадений."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Не найдено!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Заменить чем"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Чувствительность регистра"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "В обратном направлении"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Подтверждение замены"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Пропустить"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Приблизить"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Отдалить"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Сбросить приближение"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Стр:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Стлб:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Метод должен быть указан в целевом Узле!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"Целевой метод не найден! Укажите правильный метод или прикрепите скрипт на "
+"целевой узел."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Присоединить к узлу:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Добавить"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Удалить"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Добавить дополнительный параметр вызова:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Дополнительные параметры вызова:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Путь к Узлу:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "Сделать функцию"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Отложенное"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Один раз"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Присоединить"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Присоединить '%s' к '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "Подключение сигнала:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Создать подписку"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Присоединить.."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Отсоединить"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "Сигналы"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Создать новый"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Избранное:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Недавнее:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Совпадения:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Описание:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Поиск замены для:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Зависимости для:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"Сцена '%s' в настоящее время редактируется.\n"
+"Изменения вступят в силу, после перезагрузки."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Ресурсу '% s' используется.\n"
+"Изменения вступят в силу после перезагрузки."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Зависимости"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Ресурс"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Путь"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Зависимости:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Исправить ошибку"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Редактор зависимостей"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Найти заменяемый ресурс:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Владельцы:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Удаляемый файл требуется для правильной работы других ресурсов.\n"
+"Всё равно удалить его? (Нельзя отменить!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Удалить выбранный файл из проекта? (Нельзя отменить!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Ошибка при загрузке:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Не удалось загрузить сцену из-за отсутствия зависимостей:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Всё равно открыть"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Какое действие следует выполнить?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Исправить зависимости"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Ошибки загрузки!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Навсегда удалить %d элемент(ов)? (Нельзя отменить!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Кол-во"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Ресурсы без явного владения:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Обзор подключённых ресурсов"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Удалить выбранные файлы?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Удалить"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Недопустимое имя."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Допустимые символы:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+"Недопустимое имя. Не должно конфликтовать с существующим именем класса "
+"движка."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+"Недопустимое имя. Не должно конфликтовать с существующим встроенным именем "
+"типа."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+"Недопустимое имя. Не должно конфликтовать с существующим глобальным именем "
+"константы."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Недопустимый путь."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Файл не существует."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Не в пути ресурсов."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Добавлена автозагрузка"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Автозагрузка '%s' уже существует!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Переименовать автозагрузку"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Переключена автозагрузка глобальных скриптов"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Передвинута автозагрузка"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Удалена автозагрузка"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Включить"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Перестановка автозагрузок"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Имя Узла:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Имя"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Синглтон"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Список:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Обновление сцены"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Сохранение локальных изменений.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Обновление сцены.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Выбрать каталог"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Выбрать"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Назад"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Вперёд"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Вверх"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Обновить"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Скрыть файлы"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Добавить в избранное"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Переключить режим отображения"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Фокус на пути"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Переместить избранное вверх"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Переместить избранное вниз"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Предпросмотр:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Просканировать исходники"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Поиск внутри классов"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Список классов:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Поиск классов"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Класс:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Наследует:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Унаследован:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Краткое описание:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Список методов:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Тема элементов GUI:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Константы:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Краткое описание:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Описание методов:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Искать текст"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Добавлено:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Удалено:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Ошибка сохранения атласа:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Невозможно сохранить текстуру атласа:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Сохранение файла:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Упаковывание"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "Экспортирование для %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Настройка.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Вывод:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Переимпортировать"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "Импортируется:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Узел со сцены"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Ошибка при сохранении ресурса!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Сохранить ресурс как.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Ясно.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Невозможно открыть файл для записи:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Неизвестный формат запрашиваемого файла:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Ошибка при сохранении."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Сохранение сцены"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Анализ"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Создание эскизов"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+"Не возможно сохранить сцену. Вероятно, зависимости (экземпляры) не могли "
+"быть удовлетворены."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Не удалось загрузить ресурс."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Невозможно загрузить библиотеку полисеток для слияния!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Ошибка сохранения библиотеки полисеток!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Невозможно загрузить набор тайлов для слияния!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Ошибка сохранения набора тайлов!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Не удаётся открыть архив шаблонов экспорта."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Загрузка шаблонов экспорта"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Ошибка при попытке сохранить макет!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Переопределить макет по-умолчанию."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Название макета не найдено!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Вернуть макет по-умолчанию к стандартному."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Копировать параметры"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Вставить параметры"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Вставить параметры"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Копировать параметры"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Сделать встроенным"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Сделать вложенные ресурсы уникальными"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Открыть в справке"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Нет определённой сцены, чтобы работать."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Не назначена главная сцена. Хотите выбрать?\n"
+"Позже вы можете указать её в параметре \"main_scene\" расположенном\n"
+"в \"Настройки проекта - Основное - application\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Выбранная сцена '%s' не существует. Хотите выбрать другую?\n"
+"Позже вы можете указать её в параметре \"main_scene\" расположенном\n"
+"в \"Настройки проекта - Основное - application\"."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Выбранный файл '%s' не является файлом сцены. Хотите выбрать другой файл?\n"
+"Позже вы можете указать её в параметре \"main_scene\" расположенном\n"
+"в \"Настройки проекта - Основное - application\"."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr "Текущая сцена никогда не была сохранена, сохраните его до выполнения."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Не удаётся запустить подпроцесс!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Открыть сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Открыть основную сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Быстро открыть сцену.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Быстро открыть скрипт.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Да"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Закрыть сцену? (Несохранённые изменения будут потеряны.)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Сохранить сцену как.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Эта сцена никогда не была сохранена. Сохранить перед запуском?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Пожалуйста сначала сохраните сцену."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Сохранить переводимые строки"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Экспортировать библиотеку полисеток"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Экспортировать набор тайлов"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Выйти"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Выйти из редактора?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Текущая сцена не сохранена. Открыть в любом случае?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Не возможно загрузить сцену, которая не была сохранена."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Откатить"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Это действие нельзя отменить. Восстановить в любом случае?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Быстро запустить сцену.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Открыть менеджер проектов? \n"
+"(Несохранённые изменения будут потеряны.)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Выберите главную сцену"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Ясно"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Ошибка при загрузке сцены, она должна быть внутри каталога проекта. "
+"Используйте \"Импорт\", чтобы открыть сцену, а затем сохраните её в каталоге "
+"проекта."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Ошибка загрузки сцены."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Сцена '%s' имеет испорченные зависимости:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Сохранить макет"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Удалить макет"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "По-умолчанию"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Смена вкладки со сценой"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "Ещё %d файла(ов)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "Ещё %d файла(ов) или папка(ок)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Сцена"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Перейти к предыдущей открытой сцене."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Следующая вкладка"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Предыдущая вкладка"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Операции с файлами сцены."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Новая сцена"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Новая унаследованная Сцена.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Открыть сцену.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Сохранить сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Сохранить все сцены"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Закрыть сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Закрыть и перейти к предыдущей сцене"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "Открыть последнее"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Быстро отсортировать файлы.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Конвертировать в.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Переводимые строки.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "Библиотека полисеток.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "Набор тайлов.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Повторить"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Запустить скрипт"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Параметры проекта"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Восстановить сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Выйти в список проектов"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Свободный режим"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Импортировать ассеты в проект."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "Импорт"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Прочие инструменты."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Инструменты"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Экспортировать проект на многие платформы."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Экспорт"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Запустить проект."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Воспроизвести"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Приостановить сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Приостановить сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Остановить сцену."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Остановить"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Запустить текущую сцену."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Запустить сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Запустить выборочную сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Запустить произвольную сцену"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Параметры отладки"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Развернуть с удалённой отладкой"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"При экспорте или развёртывании, полученный исполняемый файл будет пытаться "
+"подключиться к IP этого компьютера с целью отладки."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Небольшое развёртывание через сеть"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Когда эта опция включена, экспорт или развёртывание будет создавать "
+"минимальный исполняемый файл.\n"
+"Файловая система проекта будет предоставляться редактором через сеть.\n"
+"На Android развёртывание будет быстрее при подключении через USB.\n"
+"Эта опция ускоряет тестирование больших проектов."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Видимые области соприкосновения"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Когда эта опция включена, области соприкосновений и узлы Raycast(в 2D и 3D) "
+"будут видимыми в запущенной игре."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Видимые области навигации"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Когда эта опция включена, навигационные полисетки и полигоны будут видимыми "
+"в запущенной игре."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Синхронизация изменений на сцене"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Когда эта опция включена, все изменения, внесённые на сцену, в редакторе "
+"будут перенесены в запущенную игру.\n"
+"При удалённом использовании на устройстве, это работает более эффективно с "
+"сетевой файловой системой."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Синхронизация изменений в скриптах"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Когда эта опция включена, любой сохранённый скрипт будет перезагружен в "
+"запущенную игру.\n"
+"При удалённом использовании на устройстве, это работает более эффективно с "
+"сетевой файловой системой."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Настройки"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Настройки редактора"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Макет редактора"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Переключить полноэкранный режим"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Установить шаблоны экспорта"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "О движке"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Оповещения, когда внешний ресурс был изменён."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Вращается, когда окно редактора перерисовывается!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Обновлять всегда"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Обновлять при изменениях"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "Отключить счётчик обновлений"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Инспектор"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Создать новый ресурс в памяти, и редактировать его."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Загрузить существующий ресурс с диска и редактировать его."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Сохранить текущий редактируемый ресурс."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Сохранить как.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Перейти к предыдущему редактируемому объекту в истории."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Перейти к следующему редактируемому объекту в истории."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "История последних отредактированных объектов."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Свойства объекта."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "Файловая система"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Узел"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Вывод"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Импортировать снова"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Обновление"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Спасибо от сообщества Godot!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Спасибо!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Импортировать шаблоны из ZIP файла"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Экспортировать проект"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Экспортировать библиотеку"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Объединить с существующей"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Пароль:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Открыть и запустить скрипт"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Ошибки загрузки"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Установленные плагины:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Версия:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Автор:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Статус:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Остановить профилирование"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Запустить профилирование"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Единица измерения:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Время кадра (сек.)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Среднее время (сек.)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Кадр %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "Фиксированный кадр %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Время:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Включительно"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Сущность"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Кадр #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Пожалуйста дождитесь окончания сканирования."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "Текущая сцена должна быть сохранена для повторного импорта."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Сохранить и переимпортировать"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Переимпортировать изменённые ресурсы"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Пишите ваш код в методе _run()."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Уже существует отредактированная сцена."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Скрипт не соответствует требованиям:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Быть может вы забыли слово \"tool\" в начале?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Невозможно запустить скрипт:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Быть может вы забыли метод _run()?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "По-умолчанию (как редактор)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Выберите Узел(узлы) для импорта"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Путь к сцене:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Импортировать из Узла:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"Невозможно открыть file_type_cache.cch для записи. Не будет сохранён кэш "
+"типов файлов!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Файл назначения и исходный файлы совпадают, нечего делать."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Путь назначения и исходный пути совпадают, нечего делать."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Невозможно переместить каталоги внутрь себя."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "Невозможно работать с '..'"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Выберете новое имя и расположение для:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Файлы не выбраны!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Добавить экземпляр"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Редактировать зависимости.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Просмотреть владельцев.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Копировать путь"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Переименовать или Переместить.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Переместить в.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Информация"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Просмотреть в проводнике"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Переимпортировать.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Предыдущий каталог"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Следующий каталог"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Повторное сканирование файловой системы"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Переключить статус папки как избранной"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Добавить выбранную сцену(сцены), как потомка выбранного узла."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Переместить"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Добавить в группу"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Удалить из группы"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Нет битовой маски для импорта!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Конечный путь пуст."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "Конечный путь должен быть полным путём к ресурсу."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Конечный путь должен существовать."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Путь сохранения пуст!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "Импорт битовой маски"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Исходные текстура(ы):"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Целевой путь:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Принять"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Битовая маска"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Нет исходного файл шрифта!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Нет целевого ресурса шрифта!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Недопустимое расширение файла.\n"
+"Пожалуйста, используйте .fnt."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Не удалось загрузить/исполнить исходный шрифт."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Невозможно сохранить шрифт."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Исходный шрифт:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Исходный размер шрифта:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Ресурс назначения:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"Съешь ещё этих мягких французских булок да выпей чаю. \n"
+"The quick brown fox jumps over the lazy dog.\n"
+"0123456789`!@#$%^&*()_+-=\\/."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Проверка:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Параметры:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Импортирование шрифта"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Это уже файл шрифта Godot, пожалуйста используйте BitMapFont за место него."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "Ошибка открытия BitMapFont файла."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Недопустимый шрифт пользовательского источника."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Шрифт"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "Нет полисетки для импортирования!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Импорт одиночной полисетки"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Исходная полисетка(и):"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Полисетка"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Поверхностей %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Нет сэмплов для импорта!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Импорт аудио сэмплов"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Исходный сэмпл(ы):"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Аудио сэмпл"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Новый клип"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Параметры анимации"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Флаги"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "Оптимизатор"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "Макс. линейная погрешность"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "Макс. угловая погрешность"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "Макс. угол"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Клипы"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Нач(с.)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Кон(с.)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Зациклить"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Фильтры"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Путь к источнику пуст."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "Не могу загрузить скрипт пост-процесса."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "Поврежденный/сломанный сценарий для пост-импорта."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "Ошибка импортирования сцены."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "Импорт 3D сцены"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Исходная сцена:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Та же, что и у сцены"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Раздельно"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Целевая папка текстуры:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "Скрипт пост-процесса:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Настраиваемый тип корневого узла:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Авто"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "Имя корневого узла:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Отсутствуют следующие файлы:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Импорт в любом случае"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "Импортировать и Открыть"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+"Редактируемая сцена не была сохранена, открыть импортированную сцену в любом "
+"случае?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Импортировать сцену"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Импортирование сцены.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Запуск пользовательского скрипта.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Не могу загрузить скрипт для пост-импорта:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Повреждённый/сломанный скрипт для пост-импорта (проверьте консоль):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "Ошибка запуска пост-импорт скрипта:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Импорт изображения:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Невозможно импортировать файл поверх негоже:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Невозможно локализовать путь: %s (уже локальный)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Сохранение.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "Анимация 3D сцены"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Несжатый"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Сжатие без потери качества (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Сжатие с потерями (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Сжатие (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Формат текстуры"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Качество сжатия текстур (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Параметры текстуры"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Пожалуйста, укажите некоторые файлы!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Для атласа нужен хотя бы 1 файл."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "Ошибка импортирования:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Только один файл необходим для большой текстуры."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "Максимальный размер текстуры:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Импортировать текстуры для атласа (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Размер ячейки:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Большая текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Импорт больших текстур (2D)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Исходная текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Базовая текстура атласа"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Исходная текстура(ы)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "Импорт текстур для 2D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "Импорт текстур для 3D"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Импорт текстур"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3D текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Текстура атласа"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"ВНИМАНИЕ: Импортирование 2D текстур не обязательно. Просто скопируйте png/"
+"jpg файлы в папку проекта."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Обрезать пустое пространство."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Текстура"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Импорт большой текстуры"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Загрузка исходного изображения"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Нарезка"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Вставка"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Сохранение"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Невозможно сохранить большую текстуру:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Построение атласа для:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Загрузка изображения:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Невозможно загрузить изображение:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Преобразование изображений"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Обрезка изображений"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Блитирование Изображений"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Невозможно сохранить изображение атласа:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Невозможно сохранить конвертированную текстуру:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Неверный источник!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Неверный источник перевода!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Колонка"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Язык"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Нет элементов для импорта!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Нет конечного пути!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Импорт переводов"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Не удалось импортировать!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Импортирование перевода"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "Исходный CSV:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "Игнорировать первую строку"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Сжимать"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Добавить в проект (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Импортировать языки:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Перевод"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "Мульти-узловый набор"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Группы"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "Выберите узел для редактирования сигналов и групп."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Переключено автовоспроизведение"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Новое имя анимации:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Новая анимация"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Изменить имя анимации:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Удалить анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "ОШИБКА: Недопустимое название анимации!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "ОШИБКА: Такое название анимации уже существует!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Переименовать анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Добавить анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Изменена последующая анимация"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Изменено время \"смешивания\""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Загрузить анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Дублировать анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "ОШИБКА: Нет анимации для копирования!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "ОШИБКА: Нет анимации в буфере обмена!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Вставленная анимация"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Вставить анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "ОШИБКА: Нет анимации для редактирования!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Воспроизвести выбранную анимацию в обратном направлении с текущей позиции. "
+"(A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+"Воспроизвести выбранную анимацию в обратном направлении с конца. (Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Остановить воспроизведение анимации. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Воспроизвести выбранную анимацию сначала. (Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Воспроизвести выбранную анимацию с текущей позиции. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Текущий кадр анимации (в секундах)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Скорость воспроизведения анимации."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Создать новую анимацию."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Загрузить анимацию с диска."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Загрузить эту анимацию с диска."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Сохранить текущую анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Показать список анимаций."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Автовоспроизведение"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Редактировать время \"смешивания\""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Инструменты анимации"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Копировать анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Создать новую анимацию"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Название анимации:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Ошибка!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Время смешивания:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Следующая анимация (автоматический переход):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Межанимационный инструмент смешивания"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Анимация"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Новое имя:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Масштаб:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Проявление (сек.):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Исчезновение (сек.):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Смешивание"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Сочетание"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Авто перезапуск:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Перезапуск (сек.):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Случайность рестарта (сек.):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Запуск!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Величина:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Смешивание:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Смешивание 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Смешивание 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Время X-Fade (сек.):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Выбранный:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Добавить вход"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Автоматическая очистка"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Автоматическая установка"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Удалить вход"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Переименовать"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Дерево анимации действительно."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Дерево анимации не действительно."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Animation узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "OneShot узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Mix узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Blend2 узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Blend3 узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Blend4 узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "TimeScale узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "TimeSeek узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Transition узел"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Импортировать анимации.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Редактировать фильтры узла"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Фильтры.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "Парсинг %d треугольников:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Треугольник #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Параметры запекания света:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Парсинг геометрии"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Исправление света"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "Создание BVH"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Создание октодерева света"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Создание текстуры октодерева"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Передача в карты освещения:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Выделение текстуры #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Запекание треугольников #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "Пост-обработка текстуры #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Запечь!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Сброс запекания света (начать сначала)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Предпросмотр"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Настроить привязку"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Отступ сетку:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Шаг сетки:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Отступ поворота:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Шаг поворота:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Переместить точку вращения"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Переместить действие"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "Редактировать цепь ИК"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "Редактировать CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Изменить привязку"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Масштаб (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Вставить позу"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Режим выделения"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Тащить: Поворот"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Тащить: Перемещение"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Нажмите 'V' чтобы изменить точку вращения, 'Shift+V' чтобы перемещать точку "
+"вращения."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+ПКМ: Список выбора глубины"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Режим перемещения"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Режим поворота"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Показывает список всех объектов нажатой позиции,\n"
+"так же как и Alt+ПКМ в режиме выделения."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "При клике изменяет точку вращения объекта."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Режим осмотра"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Зафиксировать выбранный объект."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Разблокировать выбранный объект."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Делает потомков объекта невыбираемыми."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Восстанавливает возможность выбора потомков объекта."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Использовать привязку"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Показать сетку"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Использовать привязку вращения"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Относительная привязка"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Настроить привязку.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Использовать попиксельную привязку"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Растянуть до размера родителей"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "Скелет.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Создать кости"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Очистить кости"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Показать кости"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Создать цепь ИК"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Очистить цепь ИК"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Обзор"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Сбросить масштаб"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Установить масштаб.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Центрировать на выбранном"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Кадрировать выбранное"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Привязка"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Вставить ключи"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Вставить ключ"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Вставить ключ (существующие треки)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Копировать позу"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Очистить позу"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Установить значение"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Привязка (пиксели):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "Добавить %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "Добавление %s..."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Создать узел"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Ошибка добавления сцены из %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "Ок :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Не выбран родитель для добавления потомка."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Эта операция требует одного выбранного узла."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "Изменить тип по умолчанию"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Drag & drop + Shift : Добавить узел к выделению\n"
+"Drag & drop + Alt : Изменить тип узла"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Создан полигон"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Изменён полигон"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Удалена точка полигона"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Создать новый полигон с нуля."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Создан Poly3D"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Установить обработчик"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Добавить/Удалить точку Color Ramp"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Изменена Color Ramp"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Создание библиотеки полисеток"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Миниатюра.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Удалить элемент %d?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Добавить элемент"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Удалить выбранный элемент"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Импортировать из сцены"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Обновить из сцены"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Элемент %d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Элементы"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Редактор списка элементов"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Создан затеняющий полигон"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Редактировать существующий полигон:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "ЛКМ: Передвинуть точку."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl+ЛКМ: Разделить сегмент."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "ПКМ: Удалить точку."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Полисетка пуста!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Создано вогнутое статичное тело"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Создано выпуклое статичное тело"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Это не работает на корне сцены!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Создана вогнутая форма"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Создана выгнутая форма"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Создать полисетку навигации"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "В MeshInstance нет полисетки!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "Полиcетка не имеет поверхности для создания контура!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Невозможно создать контур!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Создать контур"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Создать вогнутое статичное тело"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Создать выпуклое статичное тело"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Создать вогнутую область столкновения"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Создать выпуклую область столкновения"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Создать полисетку обводки.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Создать полисетку обводки"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Размер обводки:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr "Не указан источник полисетки (и мульти полисетка не указана в узле)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "Не указана исходная полисетка (и в мульти полисетке нет полисетки)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Источник полисетки является недействительным (неверный путь)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Источник полисетки является недействительным (не MeshInstance)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Источник полисетки является недействительным (нет ресурса полисетки)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Поверхность источника не определена."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Поверхность источника недопустима (неверный путь)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Поверхность источника недопустима (нет геометрии)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "Поверхность источника недопустима (нет граней)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Родитель не имеет твёрдых граней для заполнения."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Не удалось отобразить область."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Выберите источник полисетки:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Выберите целевую поверхность:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Заполнить поверхность"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Заполнить мульти полисетку"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Целевая поверхность:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Исходная полисетка:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Ось X"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Ось Y"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Ось Z"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Сетка до оси:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Случайный поворот:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Случайный наклон:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Случайный размер:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Заполнить"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Создать Navigation Polygon"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Удалить полигон и точку"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Ошибка при загрузке изображения:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Никаких пикселей с прозрачностью > 128 в изображении.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Установлена маска выброса"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Маска выброса очищена"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Маска выброса загружена"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Количество создаваемых точек:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "Узел не содержит геометрии."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Узел не содержит геометрии (грани)."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Грани не содержат зоны!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Нет граней!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Сгенерировать AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Создать излучатель из полисетки"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Создать излучатель из узла"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Очистить излучатель"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Создать излучатель"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Количество выбросов:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Заполнение излучателя:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Поверхность"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Объём"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Удалена точка с кривой"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Добавить точку к кривой"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Точка кривой передвинута"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Передвинут входной луч у кривой"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Передвинут выходной луч у кривой"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Выбрать точки"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Тащить: Выбрать точки управления"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "ЛКМ: Добавить точку"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "ПКМ: Удалить точку"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Выбор точек управления (Shift+Тащить)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Добавить точку (в пустом пространстрве)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Разделить сегмент (в кривой)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Удалить точку"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Сомкнуть кривую"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Точка Кривой #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Установить позицию точки кривой"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Установить позицию входа кривой"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Установить позицию выхода кривой"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Разделить путь"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Удалить точку пути"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Создать UV карту"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Преобразовать UV карту"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Polygon 2D UV редактор"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Передвинуть точку"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Поворот"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Передвинуть все"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Масштаб"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Передвинуть полигон"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Повернуть полигон"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Масштабировать полигон"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Полигон -> UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV -> Полигон"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Очистить UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Привязка"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Активировать привязку"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Сетка"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ОШИБКА: Невозможно загрузить ресурс!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Добавить ресурс"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Переименовать ресурс"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Удалить ресурс"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Нет ресурса в буфере обмена!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Загрузить ресурс"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "Парсить BB Код"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Длинна:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Открыть сэмпл(ы)"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "ОШИБКА: Не удалось загрузить сэмпл!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Добавить сэмпл"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Переименовать сэмпл"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Удалить сэмпл"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 Бит"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Бит"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Стерео"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Моно"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Формат"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Высота"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Ошибка во время сохранения темы"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Ошибка сохранения"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Ошибка импортирования темы"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "Ошибка импортирования"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Импортировать тему"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Сохранить тему как.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Следующий скрипт"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Предыдущий сценарий"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Файл"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Новый"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Сохранить всё"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Мягко перезагрузить скрипты"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Предыдущий файл"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Следующий файл"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Перезагрузить тему"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Сохранить тему"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Сохранить тему как"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Закрыть документацию"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Закрыть всё"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Найти.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Найти следующее"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Отладка"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Шаг через"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Шаг в"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Пауза"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Продолжить"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Оставить отладчик открытым"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Окно"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Двигать влево"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Двигать вправо"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Уроки"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "Открыть https://godotengine.org с разделом уроков."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Классы"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Поиск в классовой иерархии."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Поиск справочной документации."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Перейти к предыдущему редактируемому документу."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Перейти к следующему редактируемому документу."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Создать скрипт"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Следующие файлы новее на диске.\n"
+"Какие меры должны быть приняты?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Перезагрузить"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Пересохранить"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Отладчик"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Встроенные скрипты могут быть изменены только, когда сцена, которой они "
+"принадлежат, загружена"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Выбрать цвет"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Переместить вверх"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Переместить вниз"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Убрать отступ слева"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Добавить отступ"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Переключить комментарий"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Копировать вниз"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Список автозавершения"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Удаление пробелов в конце строк"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Автоотступ"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Удалить все точки остановок"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Перейти к следующей точке остановки"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Перейти к предыдущей точке остановки"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Найти предыдущее"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Заменить.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "Перейти к функции.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Перейти к строке.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Контекстная справка"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Изменена числовая константа"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Изменена векторная константа"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "Изменён RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Изменён числовой оператор"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Изменён векторный оператор"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Изменён векторно числовой оператор"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "Изменён RGB оператор"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Переключён - только поворот"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Изменена числовая функция"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Изменена векторная функция"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Изменена числовая единица"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Изменена векторная единица"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "Изменена RGB единица"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Изменено стандартное значение"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "Изменена XForm единица"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Изменена тектурная единица"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Изменена единица кубической карты"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Изменён комментарий"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Добавлено/удалено с Color Ramp"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Добавлено/удалено с Curve Map"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Изменена карта кривой"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Изменено входное имя"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Изменено имя графа"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Графы разъединены"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Удалён граф шейдера"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Передвинут граф шейдера"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Граф(ы) дублированы"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Удалён(ы) графы шейдера"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Ошибка: Циклическая подключение"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Ошибка: Отсутствует входное подключение"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Добавлен граф шейдера"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ортогональность"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Перспектива"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Преобразования прерывается."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Преобразование по X."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Преобразование по Y."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Преобразование по Z."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Вид преобразования плоскости."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Масштабирование до %s%%."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "Поворот на %s градусов."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Вид Снизу."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Низ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Вид сверху."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Верх"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Вид сзади."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Зад"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Вид спереди."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Перед"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Вид слева."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Лево"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Вид справа."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Право"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Манипуляция отключена (без вставленного ключа)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Ключ анимации вставлен."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Совместить с видом"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Окружение"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Прослушиватель звука"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Вещицы"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "XForm диалоговое окно"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Не выбрана сцена!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Экземпляр на курсор"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Не возможно добавить сцену!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Режим перемещения (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Режим поворота (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Режим масштабирования (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Вид Снизу"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Вид сверху"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Вид сзади"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Вид спереди"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Вид слева"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Вид справа"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Переключить перспективный/ортогональный вид"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Вставить ключ анимации"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Фокус на центре"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Показать выбранное"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Совместить выбранное с видом"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Преобразование"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Локальные координаты"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Окно преобразования.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Использовать стандартный свет"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Использовать sRGB"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Окно"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Окна"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Окна (другой)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Окна"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Окна (другой)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Окна"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Режим нормалей"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Режим сетки"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Режим просвечивания"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Режим без теней"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Отображать начало координат"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Отображать сетку"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Параметры привязки"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Привязка преобразований:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Привязка поворота (градусы):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Привязка масштабирования (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Настройки окна просмотра"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Образец стандартного освещения:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Цвет окружающего света:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "FOV перспективы (градусы):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Ближний Z отображения:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Дальний Z отображения:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Изменение преобразования"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Преобразования:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Поворот (градусы):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Масштаб (соотношение):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Тип преобразования"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "До"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "После"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ОШИБКА: Невозможно загрузить кадр!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Добавить кадр"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Буфер обмена чист или не содержит текстуру!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Вставить кадр"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Добавить пустоту"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Изменить цикличность анимации"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Изменить FPS анимации"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(пусто)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Анимации"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Скорость (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Кадры анимации"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Вставить пустоту (До)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Вставить пустоту (После)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Вверх"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Вниз"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox предпросмотр:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Режим привязки:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Нет>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Попиксельная привязка"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Привязка по сетке"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Автоматически"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Отступ:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Шаг:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Разделение:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Область текстуры"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Редактор области текстуры"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Невозможно сохранить тему в файл:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Добавить все элементы"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Добавить все"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Удалить элемент"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Тема"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Добавить элемент класса"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Удалить элемент класса"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Создать пустой образец"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Создать пустой образец редактора"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "Чекбокс 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "Чекбокс 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Элемент"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Проверить пункт"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Проверенный пункт"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Имеет"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Много"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Параметры"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Имеет,Много,Разных,Опций!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Вкладка 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Вкладка 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Вкладка 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Тип:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Тип информации:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Иконка"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Стиль"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Цвет"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Рисовать карту тайлов"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Дублировать"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Стирать карту тайлов"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Очистить выделенное"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Найти тайл"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Транспонировать"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "Зеркально по X"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Зеркально по Y"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Заливка"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Выбрать тайл"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Выделение"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "Поворот на 0 градусов"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "Поворот на 90 градусов"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "Поворот на 180 градусов"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "Поворот на 270 градусов"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Невозможно найти тайл:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "ID или имя элемента:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Создать из сцены?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Слияние из сцены?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Создать из сцены"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Слияние из сцены"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Ошибка"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Редактировать параметры скрипта"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Пожалуйста экспортируйте вне папки проекта!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Ошибка экспортирования проекта!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Ошибка записи PCK файла!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Платформа '%s' пока не поддерживается."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Создать новый ресурс"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Допустимое имя"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Переход"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Статус:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Пароль:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Допустимые символы:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Новое имя:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Включить"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Измените изображение группы"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Название группы не может быть пустым!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Недопустимый символ в названии группы!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Название группы уже существует!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Добавлено изображение группы"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Удалено изображение группы"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Предварительный просмотр атласа"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Параметры экспорта проекта"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Цель"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Платформа для экспорта"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Ресурсы"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Экспортировать выбранные ресурсы (включая зависимости)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Экспортировать все ресурсы проекта."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Экспортировать все файлы в папке проекта."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Режим экспортирования:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Ресурсы для экспорта:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Действие"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Фильтр для экспорта не ресурсных файлов (через запятую, например: *.json, *."
+"txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr "Фильтр для исключения (через запятую, например: *.json, *.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Преобразовать текстовые сцены в двоичные при экспорте."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Изображения"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Оставить исходными"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Сжать для диска (с потерями, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "Сжать для RAM (BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Преобразовать изображения (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Качество сжатия для диска (с потерями):"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Уменьшить все изображения (1 - оригинал, 2 - сжать в два раза...):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Формат для сжатия:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Группы изображений"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Группы:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Сжать для Диска"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "Сжать для RAM"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Режим сжатия:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Потеря качества:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Атласы:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Степень сжатия:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Предпросмотр атласа"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Фильтр:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Изображения:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Сбросить выделение"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Группа"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Сэмплы"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Режим преобразования сэмплов (.wav файлы):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Оставить оригинал"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Сжать (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Ограничение частоты сэмплов (Гц):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Обрезать"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Удаление тишины:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Скрипт"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Режим экспортирования скриптов:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Текстовый"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Компилированный"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Зашифрованный (Напишите ключ ниже)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Ключ шифрования скрипта (256-бит, а в шестнадцатеричном виде):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Экспортировать PCK/Zip"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Экспортировать PCK проекта"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Экспортировать.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Экспортирование проекта"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Экспортировать настройки:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Неверный путь к проекту, путь должен существовать!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Недопустимый путь к проекту, godot.cfg не должен существовать."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Недопустимый путь к проекту, godot.cfg должен существовать."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Импортированный проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Неверный путь к проекту (Что-то изменили?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "Не могу создать godot.cfg в папке проекта."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Следующие файлы не удалось извлечения из пакета:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Пакет успешно установлен!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Импортировать существующий проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Путь к проекту (должен существовать):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Название проекта:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Создать новый проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Путь к проекту:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Установить проект:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Установить"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Обзор"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Новый игровой проект"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "Бинго!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Безымянный проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Вы уверены, что хотите открыть более одного проекта?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "Вы уверены, что хотите запустить более одного проекта?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr "Удалить проект из списка? (Содержимое папки не будет изменено)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"Вы собираетесь сканировать %s папки для существующих проектов Godot. "
+"Подтверждаете?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Менеджер проектов"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Список проектов"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Запустить"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Сканировать"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Выбрать папку для сканирования"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Новый проект"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Выход"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Кнопка "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Кнопка геймпада"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Ось геймпада"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Кнопка мыши"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Недопустимое название действия (подойдёт всё кроме '/' или ':')."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "Действие '%s' уже существует!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Переименовать действие"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Добавить действие"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Control+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Нажмите любую клавишу..."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Индекс клавиши мыши:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Левая кнопка мыши"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Правая кнопка мыши"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Средняя кнопка мыши"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Колёсико вверх"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Колёсико вниз"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Кнопка 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Кнопка 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Кнопка 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Кнопка 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Индекс оси джойстика:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Индекс кнопки джойстика:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Добавить действие"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Удалить действие"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Ошибка сохранения настроек."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Настройки сохранены нормально."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Добавлен перевод"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Перевод удалён"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Добавлен путь перенаправления"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Перенаправлен ресурс перенаправления"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Изменён язык перенаправления"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Удалён ресурс перенаправления"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Удалён параметр ресурса перенаправления"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Настройки проекта (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Основное"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Параметр:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Удалить"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Скопировать на платформу.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Список действий"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Действие:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Девайс:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Индекс:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Локализация"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Переводы"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Переводы:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Добавить.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Переназначения"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Ресурсы:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Заменить на язык:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Язык"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "Автозагрузка"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Плагины"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Предустановка.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Легко в"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Легко из"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Ноль"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Легко в-из"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Легко из-в"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Файл.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Папка.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Загрузить"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Назначить"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Новый скрипт"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Ошибка загрузки файла: Это не ресурс!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Невозможно загрузить изображение"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Бит %d, значение %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "Вкл"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Свойства:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Разделы:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Выбрать свойство"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Выбрать метод"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "Невозможно запустить PVRTC инструмент:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+"Не возможно загрузить обратно конвертированное изображение используя PVRTC "
+"инструмент:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Переподчинить узел"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Новое место (выберите нового Родителя):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Сохранить глобальные преобразования"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Переподчинить"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Создать новый ресурс"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Открыть ресурс"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Сохранить ресурс"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Инструменты ресурсов"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Сделать локальным"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Режим запуска:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Текущая сцена"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Главная сцена"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Аргументы главной сцены:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Параметры запуска сцены"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "Нет родителя для добавления сюда сцены."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Ошибка при загрузке сцены из %s"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ок"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Невозможно добавить сцену %s, потому что текущая сцена существует в одном из "
+"его узлов."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Дополнить сценой(ами)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Эта операция не может быть произведена над корнем дерева."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Перемещение узла в Родительский"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Перемещение узлов в Родительский"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Дублировать узел(узлы)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Удалить узел(узлы)?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Эта операция не может быть выполнена без сцены."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Эта операция не может быть сделана на редактируемой сцене."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Сохранить новую Сцену как.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Имеет смысл!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Не могу работать с узлами из внешней сцены!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Невозможно работать с узлами, от которых унаследована текущая сцена!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Удалить узел(узлы)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Не возможно сохранить новую сцену. Вероятно, зависимости (экземпляры) не "
+"могли быть удовлетворены."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Ошибка сохранения сцены."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Ошибка дублирования сцены, при её сохранении."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Редактировать группы"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Редактировать связи"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Удалить узел(узлы)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Добавить дочерний узел"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Добавить дочернюю сцену"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Изменить тип"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Прикрепить скрипт"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "Убрать скрипт"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Соединить со сценой"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Сохранить ветку, как сцену"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Удалить (без подтверждения)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Добавить/создать новый узел"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Добавить файл сцены как узел. Создаёт наследуемую сцену, если корневой узел "
+"не существует."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "Прикрепить новый или существующий скрипт к выбранному узлу."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "Убрать скрипт у выбранного узла."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Переключена видимость Spatial"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "Переключена видимость CanvasItem"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Экземпляр:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Некорректное имя узла, следующие символы недопустимы:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Переименовать узел"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Дерево сцены (Узлы):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Редактируемые потомки"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Загрузить как заполнитель"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Отбросить инстансинг"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Открыть в редакторе"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Очистить наследование"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Очистить наследование? (Нельзя отменить!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Очистить!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Выбрать узел"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Недопустимое имя вышестоящего класса"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Допустимые символы:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Недопустимое имя класса"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Допустимое имя"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "Н/Д"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Имя класса является недействительным!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Имя вышестоящего класса является недействительным!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Недопустимый путь!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Не удалось создать скрипт в файловой системе."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Ошибка при загрузке скрипта из %s"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Не указан путь"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Путь не локальный"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Недопустимый базовый путь"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Недопустимое расширение"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "Создать новый скрипт"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "Загрузить существующий скрипт"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Имя Класса:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Встроенный Скрипт"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Добавление скрипта"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Байты:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Ошибка:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Источник:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "Функция:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Ошибки"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Дочерний процесс связан"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Осмотреть предыдущий экземпляр"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Осмотреть следующий экземпляр"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Стек"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Переменная"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Ошибки:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "Трассировка стека (если применимо):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Удалённый отладчик"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Дерево сцены в реальном времени:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Параметры объекта: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Профайлер"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Параметр"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Значение"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Мониторинг"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Список использования видеопамяти ресурсами:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Всего:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "Видео память"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Путь ресурса"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Тип"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Использует"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Прочее"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Нажатый элемент управления:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Тип нажатого элемента управления:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Редактирование корня в реальном времени:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Установить из дерева"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Горячие клавиши"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Изменён радиус света"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Изменён FOV камеры"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Изменён размер камеры"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Изменён радиус сферы"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Изменены границы прямоугольника"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Изменён радиус капсулы"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Изменена высота капуслы"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Изменена длинна луча"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Изменены границы уведомителя"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Изменены границы уведомителя"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance не содержит BakedLight ресурс."
+
+#~ msgid "Vertex"
+#~ msgstr "Вертекс"
+
+#~ msgid "Fragment"
+#~ msgstr "Фрагмент"
+
+#~ msgid "Lighting"
+#~ msgstr "Освещение"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Параметр изменён"
+
+#~ msgid "Global"
+#~ msgstr "Глобальные"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Этот объект не может быть отображён, потому что его родитель скрыт. "
+#~ "Отобразите сначала родительский узел."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Путь не может начинаться с '/', абсолютные пути должны начинаться с "
+#~ "'res://', 'user://' или 'local://'"
+
+#~ msgid "File exists"
+#~ msgstr "Файл существует"
+
+#~ msgid "Valid path"
+#~ msgstr "Допустимый путь"
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Пользовательский узел не имеет _get_output_port_unsequenced(idx,wmem), но "
+#~ "неупорядоченные порты были указаны."
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "Невозможно перейти в подпапку:"
+
+#~ msgid "Help"
+#~ msgstr "Справка"
+
+#~ msgid "Imported Resources"
+#~ msgstr "Импортированные ресурсы"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "Вставить ключи (Ins)"
+
+#~ msgid "Top (Num7)"
+#~ msgstr "Вид сверху (Num 7)"
+
+#~ msgid "Bottom (Shift+Num7)"
+#~ msgstr "Вид снизу (Shift+Num7)"
+
+#~ msgid "Left (Num3)"
+#~ msgstr "Вид слева (Num3)"
+
+#~ msgid "Right (Shift+Num3)"
+#~ msgstr "Вид справа (Shift+)"
+
+#~ msgid "Front (Num1)"
+#~ msgstr "Вид спереди (Num1)"
+
+#~ msgid "Rear (Shift+Num1)"
+#~ msgstr "Вид сзади (Shift+Num1)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "Перспектива (Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "Ортогонально (Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "Показать выбранный узел (F)"
+
+#~ msgid "Align with view (Ctrl+Shift+F)"
+#~ msgstr "Совместите с видом (Ctrl+Shift+F)"
+
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "Изменена интерполяция анимации"
+
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "Включить/отключить интерполяцию при зацикливании анимации."
+
+#~ msgid "Load Layout"
+#~ msgstr "Загрузить макет"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "Редактор масштабируемой области текстуры"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr ""
+#~ "В этом узле нет текстуры.\n"
+#~ "Выберите текстуру, чтобы редактировать область."
+
+#~ msgid "New Scene Root"
+#~ msgstr "Новый корень сцены"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "Унаследовать сцену"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "Связи (необязательные параметры):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "Название метода:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "Перезагрузить инструм. скрипт (мягко)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "Изменить связи.."
+
+#~ msgid "Set Params"
+#~ msgstr "Назначить параметры"
+
+#~ msgid "Live Editing"
+#~ msgstr "Редактирование в реальном времени"
+
+#~ msgid "File Server"
+#~ msgstr "Файловый сервер"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "Развернуть файловый сервер для клиентов"
+
+#~ msgid "Group Editor"
+#~ msgstr "Редактор групп"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "Группа(ы) нода"
+
+#~ msgid "Set region_rect"
+#~ msgstr "Установить прямоугольник региона"
+
+#~ msgid "Plugin List:"
+#~ msgstr "Список плагинов:"
+
+#~ msgid "Overwrite Existing Scene"
+#~ msgstr "Перезаписать существующую сцену"
+
+#~ msgid "Overwrite Existing, Keep Materials"
+#~ msgstr "Перезаписать существующую сцену с сохранением материалов"
+
+#~ msgid "Keep Existing, Merge with New"
+#~ msgstr "Сохранить существующую сцену и объединить с новой"
+
+#~ msgid "Keep Existing, Ignore New"
+#~ msgstr "Сохранить существующую и игнорировать новую"
+
+#~ msgid "This Time:"
+#~ msgstr "В этот раз:"
+
+#~ msgid "Next Time:"
+#~ msgstr "В следующий раз:"
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
new file mode 100644
index 0000000000..6aa2e16664
--- /dev/null
+++ b/editor/translations/sk.po
@@ -0,0 +1,6775 @@
+# Slovak translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# J08nY <johnenter@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-06-25 14:16+0000\n"
+"Last-Translator: J08nY <johnenter@gmail.com>\n"
+"Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/"
+"godot/sk/>\n"
+"Language: sk\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.7-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Chybný argument convert(), použite TYPE_* konštanty."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Nedostatok bajtov na dekódovanie, možný chybný formát."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "argument \"step\"/krok je nulový!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signály:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Rename Function"
+msgstr "Všetky vybrané"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Signal"
+msgstr "Signály:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Function"
+msgstr "Všetky vybrané"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Signal"
+msgstr "Všetky vybrané"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Editing Signal:"
+msgstr "Signály:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "Vložiť"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Prázdny CollisionPolygon2D nemá žiaden efekt na kolíziu."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D slúži iba na pridelenie kolízneho tvaru objektu vydedeného "
+"z CollisionObject2D uzlu. Prosím, použite ho iba ako dieťa objektu Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, atď. aby ste im dali tvar."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Musíte nastaviť tvar objektu CollisionShape2D aby fungoval. Prosím, vytvorte "
+"preň tvarový objekt!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "Textúra s tvarom svetla musí mať nastavenú vlastnosť \"textúra\"."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Okluzorový polygón musí byť nastavený (alebo vykreslený) aby sa okluzor "
+"prejavil."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Všetko rozpoznané"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Otvoriť"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Otvoriť súbor"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Otvoriť súbor(y)"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Otvorit priečinok"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Otvoriť súbor / priečinok"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Uložiť"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Uložiť súbor"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Vytvoriť adresár"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Cesta:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Priečinky a Súbory:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Súbor:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Filter:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Meno:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Zariadenie"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Tlačidlo"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Os"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Kopírovať"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Vložiť"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Späť"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Všetky vybrané"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Remove Selection"
+msgstr "Všetky vybrané"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Stránka:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Komunita"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Popis:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Zoznam tried:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Trieda:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Konštanty:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Popis:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Save all Scenes"
+msgstr "Uložiť súbor"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Next script"
+msgstr "Popis:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Focus Selection"
+msgstr "Všetky vybrané"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Align Selection With View"
+msgstr "Všetky vybrané"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Separation:"
+msgstr "Popis:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Vytvoriť adresár"
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "Popis:"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "Popis:"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "Popis:"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "Popis:"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "Popis:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "Popis:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
new file mode 100644
index 0000000000..4934be97d7
--- /dev/null
+++ b/editor/translations/sl.po
@@ -0,0 +1,6782 @@
+# Slovenian translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# matevž lapajne <sivar.lapajne@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-08-12 09:47+0000\n"
+"Last-Translator: matevž lapajne <sivar.lapajne@gmail.com>\n"
+"Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/sl/>\n"
+"Language: sl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Neveljavena vrsta argumenta za convert(), uporabite TYPE_* konstanto."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Ni dovolj pomnilnika za dekodiranje bajtov, ali neveljaven format."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "stopnja argumenta je nič!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "To ni skripta z instanco"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Ne temelji na skripti"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Ne temelji na datoteki virov"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Neveljaven primer formata slovarja (manjka @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Neveljaven primer formata slovarja (ni mogoče naložiti skripte iz @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Neveljaven primer formata slovarja (neveljavna skripta v @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Neveljaven primer slovarja (neveljavni podrazredi)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Node je bil sprejet brez potrebnega pomnilnika, pravilen postopek je opisan "
+"v dokumentaciji!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Node pridobljen, vendar se ne vrne v funkcijalno stanje v prvem delavnem "
+"spominu."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Vrnjena vrednost mora biti dodeljena prvemu elementu v node-delavnemu "
+"spominu! Prosim, da popraviš node."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Node je vrnil napačno zaporedje na izhodu: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "Zaporedni bit najden, vendar ne node v skladu, prijavi napako!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Sklad prepoln z stack depth: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funkcije:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Spremenljivke:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "Signali:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Ime ni pravilen identifikator:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Ime že uporablja druga funkcija/sprem/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Preimenuj Funkcijo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Preimenuj Spremenljivko"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Preimenuj Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Dodaj Funkcijo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Dodaj Spremenljivko"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Dodaj Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Odstrani Funkcijo"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Odstrani Spremenljivko"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Urejanje Spremenljivke:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Odstrani Signal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "Urejanje Signala:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Dodaj Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "Dodaj Node"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Dodaj Node(e) iz Drevesa"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Dodaj Getter Lastnost"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Dodaj Setter Lastnost"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Uredi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Osnovni Tip:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Člani:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Na voljo Nodes:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Izberi ali ustvari funkcijo za urejanje grafa"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Zapri"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "Uredi Argumente Signala:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Uredi Spremenljivko:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Spremeni"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Izbriši Izbrano"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Preklopi na Zaustavitev"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Find Node Type"
+msgstr "Najdi Node Type"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Vhodni tip ni spremenljiv: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Iterator je bil neveljaven"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Iterator je neveljaven: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Neveljaven indeks lastnosti imena."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Osnovni objekt ni Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Pot ne vodi do Node!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Neveljaven indeks lastnosti imena '%s' v node %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Neveljaven argument od tipa: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Neveljavni argumenti: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet ni najden v skripti: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet ni najden v skripti: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "Custom node nima _step() metode, grafa ni mogoče obdelati."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Neveljavna vrnitev vrednosti od _step(), mora biti število (seq out), ali "
+"string (error)."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "Neveljaven indeks lastnosti imena."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Vir SpriteFrame mora biti ustvarjen ali nastavljen v 'Frames' lastnosti z "
+"namenom, da AnimatedSprite prikaže sličice."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Le en viden CanvasModulate je dovoljen na sceno (ali niz instanciranih "
+"scen). Prvi ustvarjen se bo uporabil, medtem ko bodo drugi prezrti."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D služi le, da zagotavlja collision obliko nodu "
+"CollisionObject2D, ki izhaja iz njega. Naprošamo vas, da ga uporabite le kot "
+"otroka od Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. da jim "
+"date obliko."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Prazen CollisionPolygon2D nima vpliva na collision."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D služi le, da zagotavlja collision obliko nodu "
+"CollisionObject2D, ki izhaja iz njega. Naprošamo vas, da ga uporabite le kot "
+"otroka od Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. da jim "
+"date obliko."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "Zapri"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "Dodaj Setter Lastnost"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid ""
+#~ "Custom node has no _get_output_port_unsequenced(idx,wmem), but "
+#~ "unsequenced ports were specified."
+#~ msgstr ""
+#~ "Custom node nima _get_output_port_unsequenced(idx,wmem), vendar "
+#~ "nezaporedni porti so bili določeni."
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
new file mode 100644
index 0000000000..5c0b6ebca8
--- /dev/null
+++ b/editor/translations/tr.po
@@ -0,0 +1,6953 @@
+# Turkish translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Aprın Çor Tigin <kabusturk38@gmail.com>, 2016.
+# Ceyhun Can Ulker <ceyhuncanu@gmail.com>, 2016.
+# Enes Kaya Öcal <ekayaocal@hotmail.com>, 2016.
+# M. Yavuz Uzun <myavuzuzun@yandex.com>, 2016.
+# Orkun Turan <holygatestudio@yandex.com>, 2016-2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2017-01-02 19:10+0000\n"
+"Last-Translator: Orkun Turan <holygatestudio@yandex.com>\n"
+"Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/"
+"godot/tr/>\n"
+"Language: tr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"convert() için geçersiz türde değiştirgen, TYPE_* sabitlerini kullanın."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Geçersiz biçem ya da kod çözmek için yetersiz byte sayısı."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "adım değiştirgeni sıfır!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Örneği bulunan bir betik değil"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "Bir betiğe bağlı değil"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Bir kaynak dizecine bağlı değil"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Geçersiz örnek sözlük biçemi (@path eksik)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "Geçersiz örnek sözlük biçemi (betik @path 'tan yüklenemiyor)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Geçersiz örnek sözlük biçemi (@path 'taki kod geçersiz)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Geçersiz örnek sözlüğü (geçersiz altbölütler)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Çalışan hafıza olmadan düğüm yerleştirilmiş, lütfen doğru yerleştirme "
+"üzerine olan belgeleri okuyun!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"Düğüm yerleştirilmiş, fakat çalışan ilk hafızada bir işlev koşulunu "
+"döndüremedi."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"Döndürülen değer, düğüm çalışan hafızasındaki ilk elemana atanmış olmalıdır! "
+"Lütfen düğümünüzü düzeltin."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "Düğüm geçersiz bir dizi çıktısı döndürdü: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "Bit dizisi bulundu fakat yığındaki düğüm değil, kusuru bildir!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Şu derinlikte yığın taşması: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "İşlevler:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Değişkenler:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "İşaretler:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "Ad doğru bir belirleyici değil:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Ad zaten başka bir işlev/değişken/işaret tarafından kullanılıyor:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "İşlevi Yeniden Adlandır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Değişkeni Yeniden Adlandır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "İşareti Yeniden Adlandır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "İşlev Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Değişken Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "İşaret Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "İşlevi Kaldır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Değişkeni Kaldır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "Değişken Düzenleniyor:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "İşareti Kaldır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "İşaret Düzenleniyor:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "İfadeyi Değiştir"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Düğüm Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Alıcı işlevini bırakmak için Alt'a basılı tutun. Genelgeçer imzayı bırakmak "
+"için Shift'e basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Alıcı işlevini bırakmak için Ctrl'e basılı tutun. Genelgeçer imzayı bırakmak "
+"için Shift'e basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "Bir düğüme basit bir başvuru bırakmak için Alt'a basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Bir düğüme basit bir başvuru bırakmak için Ctrl'e basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "Bir Değişken Atayıcı bırakmak için Alt'a basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Bir Değişken Atayıcı bırakmak için Ctrl'e basılı tutun."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Önyüklenen Düğüm Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Ağaçtan Düğüm(ler) Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Alıcı Özellik Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Düzenleyici Özellik Ekle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "Koşul"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "Dizi"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "Değiştir"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "Yineleyici"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "İken"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "Döndür"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "Çağır"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "Al"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "Ata"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "Düzenle"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "Taban Türü:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "Üyeler:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "Kullanışlı Düğümler:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "Çizgeyi düzenlemek için bir işlev seçin ya da oluşturun"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "Kapat"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "İşaret Değiştirgenlerini Düzenle:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "Değişkeni Düzenle:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "Değiştir"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Seçilenleri Sil"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Kesme Noktası Aç/Kapat"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Düğüm Türü Bul"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Düğümleri Tıpkıla"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Düğümleri Kes"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Düğümleri Yapıştır"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Girdi türü yinelenebilir değil: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "Yineleyici geçersiz durumda"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "Yineleyici geçersiz durumda: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Geçersiz dizin özelliği adı."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Taban nesne bir Düğüm değil!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Yol bir düğüme çıkmıyor!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "%s düğümünde geçersiz dizin özelliği adı '%s'."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Şu tür için geçersiz değiştirgen: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Geçersiz değiştirgenler: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet betikte bulunamadı: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet betikte bulunamadı: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "Özel düğüm _step() yöntemine sahip değil, çizgeyi işleyemez."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"_step()'ten geçersiz dönüş değeri, tam sayı (dizi çıkışı) ya da dizgi "
+"(sorunu) olmalı."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "yeni basıldı"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "yeni bırakıldı"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+"Onay belgesi dizeci okunamadı. Yol ve gizyazının her ikisi de doğru mu?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "İmza nesnesini oluşturmada sorun."
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "Çıkın imzasını oluşturmada sorun."
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"Hiçbir dışa aktarım kalıbı bulunamadı.\n"
+"Dışa aktarım kalıplarını indirin ve yükleyin.."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr "Özel kusur ayıklama çıkını bulunmadı."
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr "Özel yayınlama çıkını bulunamadı."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "Benzersiz Ad Geçersiz."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "Geçersiz ürün GUID'i."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "Geçersiz yayıncı GUID'i."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Geçersiz arkaplan rengi."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Geçersiz Yığım Belirtkesi, bedizin boyutları (50x50 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr "Geçersiz kare 44x44 belirtkenin bediz boyutları (44x44 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr "Geçersiz kare 71x71 belirtkenin bediz boyutları (71x71 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr "Geçersiz kare 150x150 belirtkenin bediz boyutları (150x150 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr "Geçersiz kare 310x310 belirtkenin bediz boyutları (310x310 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "Geçersiz kare 310x150 belirtkenin bediz boyutları (310x150 olmalı)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "Geçersiz açılış görüntülüğü bediz boyutları (620x300 olmalı)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Bir SpriteFrames kaynağı oluşturulmalı ya da 'Kareler' özelliğine atanmalı "
+"ki AnimatedSprite düğümü kareleri gösterebilsin."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Sahne başına (ya da bir öbek örneklenmiş sahneler için) yalnızca bir görünür "
+"CanvasModulate'e izin verilir. İlk oluşturulan çalışırken diğerleri ihmal "
+"edilecektir."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D yalnızca CollisionObject2D'den türeyen düğümlere bir "
+"şekil elde etmeye hizmet eder. Lütfen onu yalnızca şunların çocuğu olarak "
+"kullanın ve Area2D, StaticBody2D, RigidBody2D, KinematicBody2D vs.'ye bir "
+"şekil vermek için kullanın."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Boş bir CollisionPolygon2D'nin çarpışmaya hiçbir etkisi yoktur."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D yalnızca CollisionObject2D'den türeyen düğümlere bir şekil "
+"elde etmeye hizmet eder. Lütfen onu yalnızca şunların çocuğu olarak kullanın "
+"ve Area2D, StaticBody2D, RigidBody2D, KinematicBody2D vs.'ye bir şekil "
+"vermek için kullanın."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"CollisionShape2D'nin işlevini yerine getirmesi için ona bir şekil sağlanması "
+"gerekmektedir. Lütfen onun için bir şekil kaynağı oluşturun!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "Işık yüzeyli bir doku, \"doku\" niteliğine sağlanmalıdır."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Engelleyicinin etkili olabilmesi için bir engelleyici çokgeni ayarlanmalıdır "
+"(ya da çizilmelidir)."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "Bu engelleyici için engelleyici çokgeni boş. Lütfen bir çokgen çizin!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Bu düğüm(node) çalışmak için bir NavigationPolygon kaynağı ayarlanmasına ya "
+"da oluşturulmasına gereksinim duyar. Lütfen hazır bir tane seçin ya da bir "
+"çokgen çizin."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance, bir Navigation2D çocuğu olmalı ya da Navigation2D "
+"düğümünün torunu olması gerekir. Bu nesne yalnızca yönlendirme verisi sağlar."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer, yalnızca ParallaxBackground düğümünün çocuğu olduğu zaman "
+"çalışır."
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+"Yol niteliği çalışması için geçerli bir Particles2D düğümünü işaret "
+"etmelidir."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D yalnızca Path2D düğümünün çocuğu olarak ayarlanınca çalışır."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Yol niteliği çalışması için geçerli bir Node2D düğümüne işaret etmelidir."
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"SamplePlayer ın ses çalması için bir SampleLibrary kaynağı oluşturulmalı "
+"veya 'örnekler' niteliğinde ayarlanmalıdır."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Yol niteliği çalışması için geçerli bir Viewport düğümüne işaret etmelidir. "
+"Bu tür Viewport 'işleyici amacı' biçimine ayarlanmalıdır."
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"Bu sprite'ın çalışması için yol niteliğinde ayarlanan Viewport durumu "
+"'işleyici amacı' olarak ayarlanmalıdır."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnable2D düğümü düzenlenmiş sahne kökü doğrudan ata olarak "
+"kullanıldığında çalışır."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape sadece CollisionObject türetilmiş bir düğümde çarpışma yüzeyi "
+"sağlamaya yarar. Bunların yüzeyine şekil vermek için Area, StaticBody, "
+"RigidBody, KinematicBody, v.b. onu sadece bunların çocuğu olarak kullanın."
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"CollisionShape'in çalışması için bir şekil verilmelidir. Lütfen bunun için "
+"bir şekil kaynağı oluşturun!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon sadece CollisionObject türetilmiş bir düğümde çarpışma "
+"yüzeyi sağlamaya yarar. Bunların yüzeyine şekil vermek için Area, "
+"StaticBody, RigidBody, KinematicBody, v.b. onu sadece bunların çocuğu olarak "
+"kullanın."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Boş bir CollisionPolygon'un çarpışma üzerinde etkisi yoktur."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Bu düğümün çalışması için bir NavigationMesh kaynağı ayarlanmış veya "
+"oluşturulmuş olmalıdır."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance, bir Navigation düğümünün çocuğu ya da torunu "
+"olmalıdır. O yalnızca yönlendirme verisi sağlar."
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+"Yol niteliği, çalışmak için geçerli bir Spatial düğümü işaret etmelidir."
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Her sahne başına (ya da örneklenmiş sahneler dizisine) sadece bir tane "
+"WorldEnvironment 'a izin verilir."
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"SpatialSamplePlayer 'ın ses çalması için bir SampleLibrary kaynağı "
+"oluşturulmalı veya 'örnekler' niteliğinde ayarlanmalıdır."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"AnimatedSprite3D 'nin çerçeveleri görüntülemek için bir SpriteFrames kaynağı "
+"oluşturulmalı veya 'Çerçeveler' niteliğinde ayarlanmalıdır."
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "Vazgeç"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "Tamam"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Uyarı!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Lütfen Doğrulayın..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "Dizeç var. Üzerine Yazılsın mı?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "Tümü Onaylandı"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Tüm Dizeçler (*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "Aç"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Bir Dizeç Aç"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Dizeç(leri) Aç"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Bir dizin aç"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Bir Dizeç ya da Dizin Aç"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "Kaydet"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "Dizeci Kaydet"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "Dizin Oluştur"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "Dizeç yolu:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Dizinler & Dizeçler:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "Dizeç:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "Süzgeç:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "Ad:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Dizin oluşturulamadı."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Gecerli bir uzantı kullanılmalı."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "Aygıt"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "Düğme"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "Sol Düğme."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "Sağ Düğme."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "Orta Düğme."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "Tekerlek Yukarı."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "Tekerlek Aşağı."
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "Eksen"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "Kes"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "Tıpkıla"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "Yapıştır"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "Hepsini seç"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "Temizle"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "Geri"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Açılır pencereler popup() veya popup*() işlevlerini çağırmadıkça ön tanımlı "
+"olarak gizlenecektir. Onları düzenleme için görünür kılmak da iyidir, ancak "
+"çalışırken gizlenecekler."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Bu görüntü alanı, işleyici amacı olarak ayarlanmadı. İçeriğini doğrudan "
+"görüntlükte göstermek istiyorsanız, bir Denetimcinin çocuğu olun ve böylece "
+"bir boyut elde edin. Ya da, onu bir RenderTarget yapın ve iç dokusunu "
+"görüntülemesi için bir düğüme atayın."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "FreeType başlatılırken sorun oluştu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "Bilinmeyen yazı türü."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "Yazı türü yüklerken sorun oluştu."
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "Geçersiz yazı türü boyutu."
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "Devre dışı"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "Tüm seçim"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "Açar Eklemeyi Taşı"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Canln Geçişi Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Canln Dönüşümü Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "Canln Değeri Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "Canln Çağrıyı Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "Canln İz Ekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Canln Açarlarını İkile"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "Canln İzini Yukarı Hareket Ettir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "Canln İzini Aşağı Hareket Ettir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Canln İzini Sil"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "Geçişleri şuna ayarla:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "Canln İzini Yeniden Adlandır"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "Canln İz Ara Değer Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "Canln İzi Değer Değiştir Biçimi"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "Düğüm Eğrisini Düzenle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "Seçim Eğrisini Düzenle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Canln Açarları Sil"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Seçimi İkile"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Tersine Çevirmeyi İkile"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "Seçimi Kaldır"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "Kesintisiz"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "Ayrık"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "Tetikleyici"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "Canln Açar Ekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Canln Açarlarını Taşı"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "Seçimi Ölçekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Göstergeden Ölçekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "Sonraki Adıma Git"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "Önceki Adıma Git"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "Doğrusal"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Sabit"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "Giriş"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "Çıkış"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "Giriş-Çıkış"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "Çıkış-Giriş"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "Geçişler"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "Canlandırmayı İyileştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Canlandırmayı Temizle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "%s için yeni iz oluştur ve açar gir?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "%d için yeni izler oluştur ve açar gir?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Oluştur"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Canln Oluştur & Gir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Canln İz Gir & Açar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Canln Açar Gir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "Canln Uzunluğu Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "Canln Döngüsünü Değiştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "Canln Yazılı Değer Açarı Oluştur"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "Canln Gir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Canln Açarı Ölçekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "Canln İzi Çağırma Ekle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "Canlandırma yaklaş."
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "Uzunluk (lar):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "Canlandırma uzunluğu (saniye)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "Adım (lar):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "Gösterge şipşak adımla (saniyelerde)."
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "Canlandırma yinelemesini Aç/Kapat."
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "Yeni izler ekle."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "Mevcut izi yukarı al."
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "Mevcut izi aşağı al."
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "Seçilen izleri sil."
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "İz araçları"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "Özgün açarların düzenlenebilmesini onları tıklayarak etkinleştirin."
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Cnln. İyileştirici"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "En üst Doğrusal Sorun:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "En üst Açısal Sorun:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Max İyileştirilebilir Açı:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "İyileştir"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+"Sahne Ağacından canlandırmaları düzenleyebilmek için bir AnimationPlayer "
+"seçin."
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "Açar"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "Geçiş"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Ölçek Oranı:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "Hangi düğümdeki İşlevler Çağrılsın?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Geçersiz açarları kaldır"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Çözümlenmemiş ve boş izleri sil"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Tüm canlandırmaları temizle"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Canlandırma(ları) Temizle (GERİ ALINAMAZ!)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "Temizle"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Sırayı Yeniden Boyutlandır"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Dizinin türünü degistir"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Dizi Değerini Değiştir"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "Ara:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "Sırala:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "Tersi"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "Katman:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Hepsi"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Yer:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "Destek..."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Resmi"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Topluluk"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Deneme"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Varlıkların ZIP Dizeci"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "'%s' İçin Yöntem Dizelgesi:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "Yöntem Dizelgesi:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "Değiştirgenler:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "Döndür:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Dizeye Git"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Dize Numarası:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "Eşleşme Bulunamadı"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "%d Olgusu(ları) ile Değiştirildi."
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "Değiştir"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Tümünü Değiştir"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "Durumla Eşleştir"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "Tüm Sözcükler"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Yalnızca Seçim"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "Ara"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "Bul"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "İleri"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "%d Olgusu(ları) ile Değiştirildi."
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "Bulunamadı!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "Şununla Değiştir"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "Büyük Küçük Damga Duyarlı"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "Terse doğru"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "Değişimi Sor"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "Geç"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "Yaklaş"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "Uzaklaştır"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Yaklaşmayı Sıfırla"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "Dize:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "Dik:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "Hedef Node daki Yöntem belirtilmeli!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+"Amaçlanan yöntem bulunamadı! Geçerli bir yöntem belirtin veya amaçlanan "
+"Düğüme bir betik iliştirin."
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "Düğüme Bağlan:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "Ekle"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "Kaldır"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Ayrı Çağrı Değiştirgeni Ekleyin:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Ayrıca Çağrı Değiştirgenler:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "Düğüm Yolu:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "İşlev Yap"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Ertelenmiş"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Tek sefer"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Bağla"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Bunu '%s' şuna '%s' Bağla"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "İşarete Bağlanıyor:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "Üyelik Oluştur"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "Bağlan..."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Bağlantıyı kes"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "İşaretler"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "Yeni oluştur"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Beğeniler:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Yakın zamanda:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "Eşleşmeler:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "Açıklama:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Şunun İçin Değişikliği Ara:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Şunun İçin Bağımlılıklar:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+"'%s' Sahnesi şu anda düzenleniyor.\n"
+"Yeniden yüklenene kadar değişiklikler etki etmeyecek."
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+"Kaynak '%s' kullanımda.\n"
+"Değişiklikler yeniden yükleme yapılınca etkin olacak."
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "Bağımlılık"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Kaynak"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "Yol"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Bağımlılıklar:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Bozulanı Onar"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Bağımlılık Düzenleyicisi"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Değişim Kaynağını Ara:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Bunun Sahibi:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Kaldırılmakta olan dizeçler başka dizeçlerin çalışması için gerekli.\n"
+"Yine de kaldırmak istiyor musunuz? (Geri alınamaz)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "Seçili dizeçleri tasarıdan kaldır? (Geri alınamaz)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Yüklerken sorun:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "Sahnedeki kayıp bağımlılıklar yüzünden sahneyi yükleme başarısız oldu:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "Yine de Aç"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Hangi eylem alınmalı?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Bağımlılıkları düzelt"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Yükleme sorunları!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "%d Öğeleri kalıcı olarak silsin mi? (Geri alınamaz!)"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Sahipler"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Belirgin Sahipliği Olmayan Kaynaklar:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Orphan Kaynak Gezgini"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "Seçili dizeçleri sil?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Sil"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Geçersiz ad."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Geçerli damgalar:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "Geçersiz ad. Devinimcide kullanılan bölüt adları kullanılamaz."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "Geçersiz ad. Var olan gömülü türdeki ad ile çakışmamalı."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr "Geçersiz ad. Var olan genel değişmeyen bir adla çakışmamalıdır."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "Gecersiz Yol."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "Dizeç yok."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "Kaynak yolunda değil."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "KendindenYüklenme Ekle"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "KendindenYüklenme '%s' zaten var!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "KendindenYüklenme'yi Yeniden Adlandır"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "KendindenYüklenme Bütünsellerini Aç / Kapat"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "KendindenYüklenme'yi Taşı"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "KendindenYüklenme'yi Kaldır"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "Etkin"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "KendindenYüklenme'leri Yeniden Sırala"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Düğüm adı:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "Ad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Tekil"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "Dizelge:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "Sahne Güncelleniyor"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "Yerel değişiklikler kayıt ediliyor.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "Sahne güncelleniyor.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Dizin Seç"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Seç"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Geri dön"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "İleri Git"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Yukarı Git"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "Yenile"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Gizli Dizeçleri Aç / Kapat"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Beğenileni Aç / Kapat"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Aç / Kapat Biçimi"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Yola Odaklan"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Beğenileni Yukarı Taşı"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Beğenileni Aşağı Taşı"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "Önizleme:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "KaynaklarıTara"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Yardım Ara"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "Bölüt Dizelgesi:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "Bölütleri Ara"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "Bölüt:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Kalıtçılar:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Tarafından kalıt alındı:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "Kısa Açıklama:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "Açık Yöntemler:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "Arayüz Kalıbı Öğeleri:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "Sabitler:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "Kısa Açıklama:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "Yöntem Açıklaması:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "Yazı Ara"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "Eklenen:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "Silinen:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "Atlas kaydedilirken sorun oluştu:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "Atlas alt dokusu kaydedilemedi:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "Dizeci Depoluyor:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "Çıkınla"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "%s için Dışa Aktarım"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "Kurulum..."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " Çıktı:"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "Yeniden-İçe Aktarım"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "İçe Aktarım:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "Sahneden Düğüm(node)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "Kaynak kaydedilirken sorun!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "Kaynağı Başkaca Kaydet.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "Anlıyorum.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Dizeç yazmak için açılamıyor:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "İstenilen dizeç formatı bilinmiyor:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Kaydedilirken sorun oluştu."
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "Sahne Kaydediliyor"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "Çözümleniyor"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "Küçük Bediz Oluşturuluyor"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr "Sahne kaydedilemedi. Anlaşılan bağımlılıklar (örnekler) karşılanamadı."
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "Kaynak yüklenirken sorun oluştu."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Birleştirme için MeshLibrary yüklenemedi!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "MeshLibrary kayıt edilirken sorun!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "TileSet birleştirme için yüklenemedi!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "TileSet kayıt edilirken sorun!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "Dışa aktarım kalıplarının zipi açılamadı."
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "Dışa Aktarım Kalıpları Yükleniyor"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Tasarım kaydedilmeye çalışılırken sorun oluştu!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "Önyüklü düzenleyici tasarımı geçersiz kılındı."
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Tasarım adı bulunamadı!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Önyüklü tasarım temel ayarlara onarıldı."
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "Değişkenleri Tıpkıla"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "Parametreleri Yapıştır"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Kaynağı Yapıştır"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "Kaynağı Tıpkıla"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "Gömülü Yap"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Alt Kaynakları Eşsiz Yap"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "Yardımda Aç"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Çalıştırmak için herhangi bir sahne seçilmedi."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"Hiçbir ana sahne tanımlanmadı, birini seçiniz?\n"
+"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan "
+"değiştirebilirsiniz."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Seçilen sahne '%s' mevcut değil, geçerli bir tane seçin?\n"
+"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan "
+"değiştirebilirsiniz."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Seçilen sahne '%s' bir sahne dizeci değil, geçerli bir tane seç?\n"
+"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan "
+"değiştirebilirsiniz."
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr "Şimdiki sahne hiç kaydedilmedi, lütfen çalıştırmadan önce kaydediniz."
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Alt işlem başlatılamadı!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "Sahneyi Aç"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Ana Sahneyi Aç"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "Sahneyi Hızlı Aç.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "Betiği Hızlı Aç.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "Evet"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "Sahneyi kapatsın mı? (Kaydedilmemiş değişiklikler yok olacak)"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "Sahneyi Başkaca Kaydet.."
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Sahne hiç kaydedilmedi. Çalıştırmadan önce kaydedilsin mi?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "Lütfen önce sahneyi kaydediniz."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "Çevirilebilir Metinleri Kaydet"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Örüntü Betikevini Dışa Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Döşenti Dizi Dışa Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "Çıkış"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Düzenleyiciden çık?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "Var olan sahne kaydedilmedi. Yine de açılsın mı?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Hiç kaydedilmemiş bir sahne yeniden yüklenemiyor."
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "Geri dön"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "Bu eylem geri alınamaz. Yine de geri dönsün mü?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "Sahneyi Hızlı Çalıştır.."
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+"Tasarı Yöneticisini Aç\n"
+"(Kaydedilmemiş değişiklikler kaybolacak!)"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Bir Ana Sahne Seç"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "Öff"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Sahne yüklenirken sorun oluştu, tasarı yolunun içinde olmalı. Sahneyi açmak "
+"için 'İçe Aktar' seçeneğini kullanın, ardından tasarının yolunun içine "
+"kaydedin."
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "Sahne yüklenirken sorun oluştu."
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Sahne '%s' bağımlılıkları koptu:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Tasarımı Kaydet"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Tasarımı Sil"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "Önyüklü"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Sahne Sekmesine Geç"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "%d daha çok dizeç(ler)"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "%d daha çok dizeç(ler) veya dizin(ler)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "Sahne"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Daha önce açılan sahneye git."
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Sonraki sekme"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Önceki sekme"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Sahne dizeçlerinin işlemleri."
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Yeni Sahne"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "Yeni Kalıt Alınmış Sahne .."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "Sahne Aç.."
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Sahne Kaydet"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "Tüm Sahneleri Kaydet"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Sahneyi Kapat"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "Önc. Sahneye Git sekmesini Kapat"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "En Sonuncuyu Aç"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "Hızlı Süzgeç Dizeçleri.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "Şuna Dönüştür.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "Çevirilebilir Dizeler.."
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary .."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "TileSet .."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "Geri"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "Betiği Çalıştır"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "Tasarı Ayarları"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "Sahneyi Eski Durumuna Çevir"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Tasarı Dizelgesine Git"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Dikkat Dağıtmayan Biçim"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "Varlıkları tasarının içine aktar."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "İçe Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Türlü tasarı ya da sahne genişliğinde araçlar."
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "Araçlar"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "Tasarıyı pek çok ortama aktarın."
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "Dışa Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Tasarıyı oynat."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "Oynat"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "Sahneyi duraklat"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Sahneyi Duraklat"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Sahneyi durdur."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "Durdur"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Düzenlenmiş sahneyi oynat."
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Sahneyi Oynat"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Özel sahneyi oynat"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Özel Sahneyi Oynat"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "Sorun ayıklama seçenekleri"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Uzaktan Sorun Ayıklama ile Dağıt"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"Verilen yürütülebilir dizeç, dışa aktarılırken veya dağıtıldığında, sorun "
+"ayıklanacak şekilde bu bilgisayarın IP'sine bağlanmaya çalışacaktır."
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "Ağ DS'li Küçük Dağıtım"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"Bu seçenek etkinleştirildiğinde, dışa aktarma veya dağıtma çok küçük bir "
+"çalıştırılabilir dizeç üretir.\n"
+"Dizeç düzeni, ağ üzerindeki düzenleyici tarafından tasarıdan sağlanacaktır.\n"
+"Android'de daha hızlı verim için dağıtım uygulaması USB kablosunu "
+"kullanacak. Bu seçenek, ayak izi büyük olan oyunları denemeyi hızlandırır."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Görünür Çarpışma Şekilleri"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+"Bu seçenek açıksa, çalışan oyunda çarpışma şekilleri ve raycast düğümleri "
+"(2B ve 3B için) görünür olacaktır."
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Görünür Yönlendirici"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+"Bu seçenek açıksa, çalışan oyunda yönlendirici örüntüleri ve çokgenler "
+"görünür olacaktır."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "Sahne Değişikliklerini Eşzamanla"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Bu seçenek etkinleştirildiğinde, düzenleyicide bulunan sahnedeki "
+"değişiklikler çalışmakta olan oyununda çoğaltılır.\n"
+"Bir cihazda uzaktan kullanıldığında, ağ dizeç düzeni ile bu işlem daha "
+"verimli olur."
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "Betik Değişikliklerini Eşzamanla"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"Bu seçenek etkinleştirildiğinde, kaydedilen tüm betik çalışan oyunda yeniden "
+"yüklenecektir.\n"
+"Bir cihazda uzaktan kullanıldığında, ağ dizeç düzeni ile bu işlem daha "
+"verimli olur."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Düzenleyici Ayarları"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Düzenleyici Tasarımı"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Tam Ekran Aç / Kapat"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "Dışa Aktarım Kalıplarını Yükle"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "İlişkin"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "Dış kaynaklar değişince uyarır."
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "Düzenleyici penceresi yeniden boyandığında döndürülür!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "Sürekli Güncelle"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "Değişiklikleri güncelle"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr "Güncelleme Topacını Devre Dışı Bırak"
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Denetçi"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Bellekte yeni bir kaynak oluşturun ve onu düzenleyin."
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Var olan bir kaynağı saklaktan yükleyin ve düzenleyin."
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "Düzenlenen kaynağı kaydedin."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "Başkaca Kaydet.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Geçmişte bir önceki düzenlenmiş nesneye gidin."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "Geçmişte bir sonraki düzenlenmiş nesneye gidin."
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "En son düzenlenen nesnelerin geçmişi."
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "Nesne özellikleri."
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "DizeçDüzeni"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "Düğüm"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "Çıktı"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "Yeniden İçe Aktar"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "Güncelle"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Godot Topluluğu Sağ Olmanızı Diliyor!"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "Sağ olun!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Kalıpları ZIP Dizecinden İçe Aktar"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "Tasarıyı Dışa Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Betikevini Dışa Aktar"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Var Olanla Birleştir"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "Gizyazı:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Aç & Bir Betik Çalıştır"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Sorunları Yükle"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Yüklü Eklentiler:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "Sürüm:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "Yazar:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Durum:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "Kesitlemeyi Durdur"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "Kesitlemeyi Başlat"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Ölçüm:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Kare Zamanı (sn)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Ortalama Zaman (sn)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Kare %"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "Sabit Kare %"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "Süre:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Kapsayıcı"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Kendi"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Kare #:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "Tarama için bitmesini bekleyin."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "Yeniden içe aktarmak için şu anki sahneyi kaydet."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "Kaydet & Yeniden İçe Aktar"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "Değiştirilmiş Kaynakları Yeniden İçe Aktar"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Mantığını _run() yöntemine yaz."
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Düzenlenmiş bir sahne zaten var."
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Betik dizeci alınamadı:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "'araç' anahtar sözcüğünü unuttunuz mu?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Betik çalıştırılamadı:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "'_run()' yöntemini unuttunuz mu?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "Önyüklü(Düzenleyici ile aynı)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Düğüm(leri) içe Aktarmak için Seç"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Sahne Yolu:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Düğümden İçe Aktar:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+"file_type_cache.cch yazma için açılamıyor! Dizeç türü önbelleğe "
+"kaydedilmiyor!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "Özdeş kaynak ve varış dizeçleri, hiçbir şey yapılmıyor."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "Özdeş kaynak ve varış yolları, hiçbir şey yapılmıyor."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "Dizinleri kendi içlerine taşıyamazsınız."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "'..' üzerinde çalışılamıyor"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "Şunun için yeni ad ile konum seçin:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "Hiçbir Dizeç Seçilmedi!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Örnek"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "Bağımlılıkları Düzenle.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "Sahipleri Görüntüle.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Dizeç Yolunu Tıpkıla"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "Yeniden Adlandır ya da Taşı.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "Şuraya Taşı.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "Bilgi"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "Dizeç Yöneticisinde Göster"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "Yeniden İçe Aktar.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "Önceki Dizin"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "Sıradaki Dizin"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Dizeç Düzenini Yeniden Tara"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "Dizin Durumlarını Beğenilen Olarak Aç/Kapat"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "Seçilen sahneyi/sahneleri seçilen düğüme çocuk olarak örneklendir."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Taşı"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Öbeğe Ekle"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Öbekten Kaldır"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "Alınacak hiç bit örteci yok!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "Amaçlanan dizeç yolu boş."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "Amaçlanan yol, tam bir kaynak yolu olmalıdır."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "Amaçlanan dizeç yolu var olmalı."
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "Kayıt yolu boş!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "BitMasks İçe Aktar"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "Kaynak Doku(lar):"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "Amaçlanan Dizeç Yolu :"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "Kabul"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr "Bit Örteci"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "Kaynak yazı türü dizeci yok!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "Amaçlanan yazı türü kaynağı yok!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"Geçersiz dizeç uzantısı.\n"
+"Lütfen .fnt uzantısını kullanın."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "Kaynak yazı tipi yüklenemiyor / işlenemiyor."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "Yazı türü kaydedilemedi."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "Yazı Türü Kaynağı:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "Kaynak Yazı Türü Boyutu:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "Varış Kaynağı:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr "Hızlı kahverengi tilki üşengeç köpeğin üstünden atlar."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "Deneme:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "Seçenekler:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "Yazı Türü İçe Aktar"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+"Bu dizeç zaten bir Godot yazı türü dizecidir , lütfen bunun yerine bir "
+"BMFont türü dizeci sağlayın."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "BMFont dizeci olarak açma başarısız oldu."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "Geçersiz yazı türü özel kaynağı."
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Yazı Tipi"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "İçe aktarılacak örüntü yok!"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "Tekil Örüntü İçe Aktar"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "Kaynak Örüntü(leri):"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Örüntü"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr "Yüzey %d"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "Alınacak örnek yok!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "Ses Örneklerini İçe Aktar"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "Kaynak Örnek(leri):"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "Ses Örneği"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "Yeni Parça"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "Canlandırma Seçenekleri"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "Bayraklar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "FPS'i Pişir:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "İyileştirici"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "En üst Doğrusal Sorun"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "En üst Açısal Sorun"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "En üst Açı"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "Parçalar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "Başlangıç(lar)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "Son(lar)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Döngü"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "Süzgeçler"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "Kaynak yol boş."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "İçe aktarma sonrası betik dizeci yüklenemedi."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "İçe aktarma sonrası için geçersiz/bozuk betik dizeci."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "İçe aktarırken sorun oluştu."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "3B Sahneyi İçe Aktar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "Kaynak Sahne:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "Hedef Sahne ile Aynı"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "Paylaşılan"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "Amaçlanan Doku Dizini:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "İşlem Sonrası Betik Dizeci:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "Özel Kök Düğüm Türü:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "Kendiliğinden"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "Kök Düğüm adı:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "Aşağıdaki Dizeçler Eksik:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "Yine de İçe Aktar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "İçe Aktar & Aç"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr "Düzenlenen sahne kaydedilmedi, yine de içe aktarılan sahne açılsın mı?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Sahneyi İçe Aktar"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "Sahneyi İçe Aktarıyor..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "Çalışan Özel Betik.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "İçe aktarma sonrası betik dizeci yüklenemedi:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+"İçe aktarma işlemi sonrası için geçersiz/bozuk betik dizeci (konsolu "
+"denetleyin):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "İçe aktarma sonrası betik dizeci çalıştırılırken sorun oluştu:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "Bedizi İçe Aktar:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "Bir dizeç kendisi üzerine içe aktaramıyor:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "Yol yerelleştirilemedi: %s (zaten yerel)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "Kaydediliyor..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "3B Sahne Canlandırması"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "Sıkıştırılmamış"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "Kayıpsız Sıkıştırma (PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "Kayıplı Sıkıştırma (WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "Sıkıştır (VRAM)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "Doku Biçemi"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "Doku Sıkıştırma Niteliği (WebP):"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "Doku Seçenekleri"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "Lütfen bazı dizeçleri belirtin!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "Atlas için en az bir dizeç gerekli."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "İçe aktarırken sorun:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "Büyük doku için yalnızca bir dizeç gereklidir."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "En üst Doku Boyutu:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "Dokuları Atlas(2B) için içe aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "Odacık Boyutu:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "Geniş Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "Büyük Boyutlu(2D) Dokuları İçe Aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "Kaynak Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "Temel Atlas Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "Kaynak Doku(lar)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "2B için Dokuları İçe Aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "3B için Dokuları İçe Aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "Dokuları İçe Aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2B Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3B Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "Atlas Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"UYARI: 2B dokuların içe aktarılması zorunlu değildir. Png / jpg dizeçlerini "
+"tasarıya tıpkılamanız yeterlidir."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "Boş alanı kırp."
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "Doku"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "Büyük Dokuyu İçe Aktar"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "Kaynak Bedizi Yükle"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "Dilimleme"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "Girdileme"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "Kaydediyor"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "Büyük doku kaydedilemedi:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "Atlası Şunun için Oluştur:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "Bediz Yükleniyor:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "Bediz yüklenemedi:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "Bedizleri Dönüştürüyor"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "Bedizleri Kırpıyor"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr "Bedizleri Blitle"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "Atlas bedizi kaydedilemedi:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "Dönüştürülmüş doku kaydedilemedi:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "Geçersiz kaynak!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "Geçersiz çeviri kaynağı!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "Dikeç"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "Dil"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "Alınacak öğe yok!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "Amaçlanan yol yok!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "Çevirileri İçe Aktar"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "Alınamadı!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "Çeviriyi İçe Aktar"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "Kaynak CSV:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "İlk Sırayı Yoksay"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "Sıkıştır"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "Tasarıya Ekle (godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "Dilleri İçe Aktar:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "Çeviri"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "MultiNode Kur"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "Öbekler"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "İşaretleri ve Öbekleri düzenlemek için bir Düğüm seçin."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "KendindenOynatmayı Aç/Kapat"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Yeni Canlandırma Adı:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Yeni Canlandırma"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Canlandırmanın Adını Değiştir:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Canlandırmayı Kaldır"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "SORUN: Geçersiz canlandırma adı!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "SORUN: Bu canlandırma adı zaten var!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Canlandırmayı Yeniden Adlandır"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Canlandırma Ekle"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Sonraki Değişeni Karıştır"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Karışım Süresini Değiştir"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Canlandırma Yükle"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Canlandırmayı İkile"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "SORUN: Tıpkılamak için bir canlandırma yok!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "SORUN: Bellemde canlandırma kaynağı yok!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Yapıştırılan Canlandırma"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Canlandırmayı Yapıştır"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "SORUN: Düzenlemek için bir canlandırma yok!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "Seçilen canlandırmayı geçerli konumdan geriye doğru oynat. (A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Seçilen canlandırmayı geriye doğru oynat. (Shift + A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Canlandırmayı oynatmayı durdur. (S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Seçilen canlandırmayı başlangıç anından oynat. (ÜstKrkt + D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Seçilen calandırmayı geçerli konumdan oynat. (D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Canlandırma konumu (saniye olarak)."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Düğüm için canlandırma arka oynatmasını ölçeklendir."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "Oynatıcıda yeni canlandırma oluşturun."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "Canlandırmayı saklaktan yükle."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "Bir canlandırmayı saklaktan yükle."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "Geçerli canlandırmayı kaydet"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "Başkaca Kaydet"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Oyuncudaki canlandırmaların dizelgesini görüntüle."
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Yükleme sırasında KendindenOynat"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "Amaçlanan Karışma Zamanlarını Düzenle"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Canlandırma Araçları"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "Canlandırmayı Tıpkıla"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Yeni Canlandırma Oluştur"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Canlandırma Adı:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "Sorun!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Süreleri Karıştır:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Sonraki (Kendiliğinden Kuyruğu):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Çapraz Canlandırma Karışma Süreleri"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "Canlandırma"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "Yeni ad:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Ölçekle:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Açılma (sn):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Karartma (sn):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "Karıştır"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "Çırp"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Kendiliğinden Yeniden Başlat:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Yeniden Başlat (sn):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Rastgele Yeniden Başlama (sn):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "Başlat!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Değer:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Karışma:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Karışma 0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Karışma 1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "X-Sönülme Süresi (sn):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "Geçerli:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "Giriş Ekle"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Kendiliğinden İlerlemeyi Temizle"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Kendiliğinden İlerlemeyi Ayarla"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Girişi Sil"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "Yeniden Adlandır"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Canlandırma ağacı geçerlidir."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Canlandırma ağacı geçersizdir."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Canlandırma Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "OneShot Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Düğümü Çırp"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Karıştır2 Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Karıştır3 Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Karıştır4 Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "TimeScale Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "TimeSeek Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Geçiş Düğümü"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "Canlandırmaları İçe Aktar.."
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Düğüm Süzgeçlerini Düzenle"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "Süzgeçler..."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "%d Üçgenlerini Ayrıştırma:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "Üçgen #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "Işık Pişirici Kurulumu:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "Uzambilgisini Ayrıştırıyor"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "Işıkları Sabitliyor"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr "BVH Yapıyor"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr "Işık Sekağacı Oluşturuyor"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr "Sekağaç Dokusu Oluşturuyor"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr "Işık Haritalarına Aktar:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "Doku Paylaşımı #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "Pişirme Üçgeni #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr "İşleme-Sonrası Dokusu #"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "Pişir!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr "Işık haritası sekağacı pişirme işlemini sıfırlayın (baştan başlayın)."
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "Önizleme"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Yapışmayı Yapılandır"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Izgarayı Kaydır:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Izgara Adımı:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Dönme Kayması:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Dönme Adımı:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "Ekseni Taşı"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "Eylemi Taşı"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "IK Zincirini Düzenle"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "CanvasItem Düzenle"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Çapaları Değiştir"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "Yaklaş (%):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Duruşu Yapıştır"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Biçim Seç"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Sürükle: Döndürür"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Sürükle: Taşır"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Ekseni Değiştirmek için 'v' dokunacına basın, Ekseni Sürüklemek için "
+"(sürüklerken) 'Shift + v' dokunaçlarına basın."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt + RMB: Derin dizelge seçimi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Biçimi Taşı"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Döndürme Biçimi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Tıklanan konumdaki tüm nesnelerin bir dizelgesini gösterin\n"
+"(Seçme biçiminde Alt + RMB ile özdeş)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Nesnenin dönüş eksenini değiştirmek için tıklayın."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Kaydırma Biçimi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Seçilen nesneyi yerine kilitleyin (taşınamaz)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Seçilen nesnenin kilidini açın (taşınabilir)."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Nesnenin çocuğunun seçilemez olduğundan kuşkusuz olur."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Nesnenin çocuğunun seçilebilme yeteneğini geri kazandırır."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Yapışma Kullan"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Izgarayı Göster"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Döndürme Yapışması Kullan"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Göreceli Yapış"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "Yapışmayı Yapılandır.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Nokta Yapışması Kullan"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "Ataya genişletin"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "İskelet.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "Kemik Yap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Kemikleri Temizle"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Kemikleri Göster"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "IK Zinciri Yap"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "IK Zincirini Temizle"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Görüş"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "Yakınlaşmayı Sıfırla"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "Yakınlaşmayı Ayarla.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "İçre Seçimi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Kafes Seçimi"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "Çapa"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "Açarlar Gir"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Açar Gir"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Açar Gir (Var Olan İzler)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Duruşu Tıpkıla"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Duruşu Temizle"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "Bir Değer Ata"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "Yapış (Noktalara):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "Ekle %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "Ekliyor %s.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Düğüm Oluştur"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "%s sahne örnekleme sorunu"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "Tamam :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Çocuğun örnek alacağı bir ata yok."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Bu işlem, seçilmiş tek bir düğüm gerektirir."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "Önyüklü tipi değiştir"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Sürükle & bırak + Shift: Kardeş olarak düğüm ekle\n"
+"Sürükle & bırak + Alt: Düğüm türünü değiştir"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "Çoklu Oluşturun"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Çokluyu Düzenleyin"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Çokluyu Düzenleyin (Noktayı Silin)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr "Sıfırdan yeni bir çokgen oluşturun."
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr "Çoklu3B Oluştur"
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Tutamacı Ayarla"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr "Renk Yokuşu Noktası Ekle / Kaldır"
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr "Renk Yokuşunu Değiştir"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr "Örüntü Betikevi Oluştur"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr "Küçük Bediz.."
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "%d öğe kaldırılsın mı?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Öğe Ekle"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Seçilen Öğeyi Kaldır"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Sahneden İçe Aktar"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Sahneden Güncelle"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Öğe%d"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Öğeler"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Öğe Dizelgesi Düzenleyicisi"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Engelleyici Çokgeni Oluştur"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "Var olan çokgeni düzenleyin:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "LMB: Taşıma Noktası."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl + LMB: Parçayı Böl."
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "RMB: Noktayı Sil."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Örüntü boş!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Durağan Üçlü Örüntü Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr "Durağan Dışbükey Gövde Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Bu, sahne kökünde çalışmaz!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr "Üçlü Örüntü Yüzeyi Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr "Dışbükey Şekil Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Yönlendirici Örüntüsü Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "MeshInstance herhangi bir Örüntüden yoksun!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "Örüntü anahat oluşturmak için bir yüzeye sahip değil!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Anahat oluşturulamadı!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Anahat Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Üçlü Örüntü Durağan Gövdesi Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr "Dışbükey Durağan Gövde Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Üçlü Örüntü Çarpışma Kardeşi Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr "Dışbükey Çarpışma Kardeşi Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr "Anahat Örüntüsü Oluştur.."
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Anahat Örüntüsü Oluştur"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Anahat Ölçüsü:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr "Örüntü kaynağı belirtilmedi (düğümde MultiMesh yok)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "Hiçbir örüntü kaynağı belirtilmedi (ve MultiMesh, Örüntü içermiyor)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "Örüntü kaynağı geçersiz (geçersiz yol)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "Örüntü kaynağı geçersiz (bir MeshInstance değil)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "Örüntü kaynağı geçersiz (Örüntü kaynağı içermiyor)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Yüzey kaynağı belirtilmedi."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "Yüzey kaynağı geçersiz (geçersiz yol)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "Yüzey kaynağı geçersiz (uzambilgisi yok)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "Yüzey kaynağı geçersiz (yüzler yok)."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr "Atanın doldurmak için eksiksiz yüzleri yok."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "Alan eşleştirilemedi."
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Bir Kaynak Örüntü Seçin:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Bir Amaçlanan Yüzeyi Seçin:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Yüzeyi Doldur"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "MultiMesh'i Doldur"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Amaçlanan Yüzey:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Kaynak Örüntü:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "X-Ekseni"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Y-Ekseni"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Z-Ekseni"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Örüntü Üst Ekseni:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rastgele Döndürme:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Rastgele Eğilme:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Rastgele Ölçek:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Doldur"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Yönlendirici Çokgeni Oluştur"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "Çokluyu ve Noktayı Kaldır"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "Bediz yüklenirken sorun oluştu:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr "Saydamlığı olan nokta yok > 128 bedizde.."
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr "Yayma Örtecini Ayarla"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Yayma Örtecini Temizle"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Yayma Örtecini Yükle"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Üretilen Nokta Say:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr "Düğüm uzambilgisi içermiyor."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr "Düğüm uzambilgisi (yüzler) içermiyor."
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr "Yüzler alan içermez!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr "Yüzler yok!"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "AABB Üret"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr "Örüntüden Yayıcı Oluştur"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr "Düğümden Yayıcı Oluştur"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr "Yayıcıyı Temizle"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Yayıcı Oluştur"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr "Yayma Konumları:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr "Yayma Dolumu:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr "Yüzey"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Oylum"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Noktayı Eğriden Kaldır"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Noktayı Eğriye Ekle"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Noktayı Eğriye Taşı"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Eğriye Denetimli Taşı"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Eğriye Denetimsiz Taşı"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Noktaları Seç"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift + Sürükle: Denetim Noktalarını Seç"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Tıkla: Nokta Ekle"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Sağ tıkla: Nokta Sil"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Denetim Noktalarını Seç (Shift + Sürükle)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Nokta Ekle (boşlukta)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Parçayı Ayır (eğriye göre)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Noktayı Sil"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Eğriyi Kapat"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Eğrisel Nokta #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "Eğri Noktası Konumu Ayarla"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr "Eğriyi Konumda Ayarla"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr "Eğri Çıkış Konumunu Ayarla"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Yolu Ayır"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Yol Noktasını Kaldır"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "UV Haritası Oluştur"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "UV Haritasını Dönüştür"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Çokgen 2B UV Düzenleyicisi"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "Noktayı Taşı"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Döndür"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "ÜstKrkt: Tümünü Taşı"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "ÜstKrkt+Ctrl: Ölçek"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Çokgeni Taşı"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Çokgeni Döndür"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Çokgeni Ölçekle"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Çokgen->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Çokgen"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "UV yi Temizle"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Yapış"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Yapışmayı Enkinleştir"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Izgara"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "SORUN: Kaynak yüklenemedi!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Kaynak Ekle"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Kaynağı Yeniden Adlandır"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Kaynağı Sil"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Kaynak bellemi boş!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Kaynak Yükle"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "BBCode'u Ayrıştır"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "Uzunluk:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "Örnek Dizeçleri Aç"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "SORUN: Örnek yüklenemedi!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "Örnek Ekle"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "Örneği Yeniden Addlandır"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "Örneği Sil"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16 bit"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8 Bit"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "Çiftli"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr "Tekli"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Biçem"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Perde"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Kalıp kaydedilirken sorun oluştu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Kaydetme sorunu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "Kalıp içe aktarılırken sorun oluştu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "İçe aktarma sorunu"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Kalıbı İçe Aktar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "Kalıbı Başkaca Kaydet.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Sonraki betik"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Önceki betik"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "Dizeç"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "Yeni"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Tümünü kaydet"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Betiği Yeniden Duyarlı Yükle"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "Öceki Geçmiş"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Sonraki Geçmiş"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Kalıbı Yeniden Yükle"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Kalıbı Kaydet"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "Kalıbı Başkaca Kaydet"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Belgeleri Kapat"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Tümünü Kapat"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "Bul.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "Sonraki Bul"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "Kusur Ayıkla"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Adımla"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "İçeri Adımla"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Ara Ver"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Devam Et"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Kusurayıkları Açık Tut"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "Pencere"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "Sola Taşı"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "Sağa Taşı"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "Öğreticiler"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "https://godotengine.org bağlantısını öğreticiler bölümünde aç."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "Bölütler"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "Bölüt sıradüzenini Ara."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Başvuru belgelerinde arama yap."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Daha önce düzenlenmiş belgeye git."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Düzenlenmiş bir sonraki belgeye git."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Betik Oluştur"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Aşağıdaki dizeçler saklakta daha yeni.\n"
+"Hangi eylem yapılsın?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "Yeniden Yükle"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "Yeniden Kaydet"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Kusurayıklar"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+"Gömülü betik dizeçleri yalnızca ait oldukları sahne yüklendiğinde "
+"düzenlenebilirler"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Renk Seç"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "Yukarı Taşı"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "Aşağı Taşı"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Sola Girintile"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Sağa Girintile"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Yorumu Aç / Kapat"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Aşağıya Eşle"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Simgeyi Tamamla"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "İzleyenin Boşluklarını Kırp"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Kendinden Girintili"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Tüm Kesme Noktalarını Kaldır"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "Sonraki Kesme Noktasına Git"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "Önceki Kesme Noktasına Git"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "Öncekini Bul"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "Değiştir.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "İşleve Git.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "Dizeye Git.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Bağlamsal Yardım"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "Basamaklı Sabiti Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "Vec Sabitini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "RGB Sabitini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr "Basamaklı İşletmeni Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr "Vec İşletmenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr "Vec Basamaklı İşletmeni Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr "RGB İşletmenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "Yalnız Döndürmeye Geçiş Yap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "Basamaklı İşlevi Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "Vec İşlevini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "Basamaklı Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "Vec Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "RGB Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "Önyüklü Değeri Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "XForm Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "Doku Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "Küp Eşleşme Tekdüzenini Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "Yorumu Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr "Renk Yokuşuna Ekle / Kaldır"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr "Eğri Haritası Ekle / Kaldır"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr "Eğri Haritasını Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "Giriş Adını Değiştir"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "Çizge Düğümlerini Bağla"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "Çizge Düğümlerinin Bağlantılarını Kes"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "Gölgelendirici Çizge Düğümünü Kaldır"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "Gölgelendirici Çizge Düğümünü Taşı"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "Çizge Düğüm(lerini) İkile"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "Gölgelendirici Çizge Düğümünü Sil"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "Sorun: Döngüsel İlişki Bağlantısı"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "Sorun: Giriş Bağlantıları Eksik"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "Gölgelendirici Çizge Düğümü Ekle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Dikey"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Derinlik"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Dönüşüm Durduruldu."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "X-Ekseni Dönüşümü."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Y-Eksen Dönüşümü."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Z-Eksen Dönüşümü."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Düzlem Dönüşümünü Görüntüle."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "Şuna %s%% Ölçeklendiriliyor."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "%s Düzey Dönüyor."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Alttan Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Alt"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Üstten Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Üst"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Arkadan Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Arka"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Önden Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Ön"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Soldan Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Sol"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Sağdan Görünüm."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Sağ"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Açar ekleme devre dışı (eklenmiş açar yok)."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Canlandırma Açarı Eklendi."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr "Görünüme Ayarla"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "Çevre"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Ses Dinleyici"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Zımbırtılar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "XForm İletişim Kutusu"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "Örnek vermek için hiçbir sahne seçilmedi!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr "Göstergede Örnekle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "Sahne Örneklenemedi!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "Taşıma Biçimi (W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "Döndürme Biçimi (E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "Ölçek Biçimi (R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Alttan Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Üstten Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Arkadan Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Önden Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Soldan Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Sağdan Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "Derinlik / Dikey Görünüme Değiştir"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Canlandırma Açarı Ekle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Başlatıma Odaklan"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Seçime Odaklan"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "Seçimi Görünüme Ayarla"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "Dönüşüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "Yerel Konaçlar"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "Dönüştürme İletişim Kutusu.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "Önyüklü Işık Kullan"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "Önyüklü sRGB'yi Kullan"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Görünüm (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Görünüm (Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Görünüm"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Olağanı Görüntüle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Telkafes Görüntüle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Abartı Görüntüle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr "Gölgesiz Görüntüle"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Başlatım Görünümü"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Izgara Görünümü"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Yapışma Ayarları"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Yapışmayı Çevir:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Yapışmayı Döndür (düzey):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Yapışmayı Ölçekle (%):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Görüntüleme Ayarları"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "Önyüklü Işığın Olağanı:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "Ortam Işığı Rengi:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "Perspektif FOV (düzey):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Z-Yakını Göster:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Z-Uzağı Görüntüle:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Dönüşümü Değiştir"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Çevir:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Döndür (düzey):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Ölçek (oran):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Dönüştürme Türü"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Öncesi"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Sonrası"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "SORUN: Kare kaynağı yüklenemedi!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Çerçeve Ekle"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Kaynak bellem boş ya da bu bir doku değil!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Çerçeveyi Yapıştır"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Boş Ekle"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Canlandırma Döngüsünü Değiştir"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Canlandırma FPS'sini Değiştir"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(boş)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "Canlandırmalar"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "Hız (FPS):"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "Canlandırma Çerçeveleri"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Boş Ekle (Önce)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Boş Ekle (Sonra)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "Yukarı"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "Aşağı"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox Önizleme:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Yapışma Biçimi:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "<Yok>"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Nokta Yapışması"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Izgara Yapışması"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Kendinden Dilimle"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Kaydırma:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Adım:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "Ayrım:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "Doku Bölgesi"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "Doku Bölgesi Düzenleyicisi"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "Kalıbı dizece kaydedemiyoruz:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Tüm Öğeleri Ekle"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Tümünü Ekle"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Öğeyi Kaldır"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Kalıp"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Bölüt Öğeleri Ekle"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Bölüt Öğelerini Kaldır"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Boş Kalıp Oluştur"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Boş Düzenleyici Kalıbı Oluştur"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "OnayKutusu Radyo1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "OnayKutusu Radyo2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Öğe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Öğeyi Denetle"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Denetlenen Öğe"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Var"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Çok"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "Seçenekler"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr "Bir Çok,Seçenek,Var!"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Sekme 1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Sekme 2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Sekme 3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "Tür:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Veri Türü:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "Simge"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "Yoldam"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Renk"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "TileMap'i Boya"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "İkile"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "TileMap'i Sil"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "Seçimi Sil"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "Döşentiyi Bul"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Tersine Çevir"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "X'e Aynala"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "Y'ye Aynala"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr "Kova"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Karo Seç"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Seç"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "0 Düzeyde Döndür"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "90 Düzeyde Döndür"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "180 Düzeyde Döndür"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "270 Düzeyde Döndür"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "Karo Bulunamadı:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "Öğe adı yada kimliği:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "Sahneden mi oluşturulsun?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Sahneden birleştirilsin mi?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Sahneden Oluştur"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Sahneden Birleştir"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "Sorun"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "Betik Seçeneklerini Düzenle"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "Lütfen tasarı dizininin dışına aktarın!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "Tasarı gönderilirken sorun oluştu!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "Tasarının PCK'ini yazarken sorun oluştu!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "Şu anda '%s' ortamı için dışa aktarıcı yok."
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "Yeni Kaynak Oluştur"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "Uygun ad"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "Geçiş"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "Durum:"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "Gizyazı:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "Geçerli damgalar:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "Yeni ad:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "Katıştır"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "Bediz Öbeğini Değiştir"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "Öbek adı boş olamaz!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "Öbek adında geçersiz damga!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "Öbek adı zaten var!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "Bediz Öbeği Ekle"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "Bediz Öbeğini Sil"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "Atlas Önizleme"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "Tasarıyı Dışa Aktarma Ayarları"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "Amaç"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "Ortama Aktar"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "Kaynaklar"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)."
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "Tasarıdaki tüm kaynakları dışa aktarın."
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "Tasarı dizinindeki tüm dizeçleri dışa aktarın."
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Dışa Aktarma Biçimi:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "Dışa Aktarılacak Kaynaklar:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "Eylem"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Kaynak olmayan dizeçleri dışa aktarmak için kullanılan süzgeçler (virgülle "
+"ayrılmış, ör. * .json, * .txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+"Dışa aktarma işleminden hariç tutulacak süzgeçler (virgülle ayrılmış, ör. * ."
+"json, * .txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "Dışa aktarmada yazı sahnelerini ikili hale getirin."
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "Bedizler"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "Özgün Tut"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "Saklak İçin Sıkıştır (Kayıplı, WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "RAM için Sıkıştır (BC / PVRTC / ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "Bedizleri Dönüştür (*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "Saklak İçin Sıkıştır (Kayıplı) Nitelik:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "Tüm Bedizleri Küçült:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "Sıkıştırma Biçemleri:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "Bediz Öbekleri"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "Öbekler:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "Saklağı Sıkıştır"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "RAM'i Sıkıştır"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "Sıkıştırma Biçimi:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "Kayıplı Nitelik:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "Atlas :"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "Küçült:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "Atlası Önizle"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "Bediz Süzgeci:"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "Bedizler:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "Hiçbir Şey Seçilmedi"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "Öbek"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "Örnekler"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "Örnek Dönüşüm Biçimi: (.wav dizeçleri):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "Tut"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "Sıkıştır (RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "Örnekleme Oranının Sınırı (Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "Buda"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr "Sessizliği İzliyor:"
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "Betik"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Betik Dışa Aktarım Biçimi:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "Yazı"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "Derlenmiş"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Şifreli (Açarı Aşağıda Belirtin)"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Betik Şifreleme Açarı (Hex olarak 256-bit):"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "PCK/Zip Dizecini Dışa Aktar"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "Tasarı PCK Dışa Aktar"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "Dışa Aktar.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "Tasarı Dışa Aktar"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "Ön Ayarları Dışa Aktar:"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "Geçersiz tasarı yolu, yolun var olması gerekir!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "Geçersiz tasarı yolu, godot.cfg var olmaması gerekir."
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "Geçersiz tasarı yolu, godot.cfg var olması gerekir."
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "İçe Aktarılan Tasarı"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Geçersiz tasarı yolu (bir şey değişti mi?)."
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "godot.cfg tasarı yolunda oluşturulamadı."
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Aşağıdaki dizeçlerin, çıkından ayıklanma işlemi başarısız oldu:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr "Çıkın Başarı ile Kuruldu!"
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Var olan Tasarıyı İçe Aktar"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "Tasarı Yolu (Var Olması Gerekir):"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Tasarı Adı:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Yeni Tasarı Oluştur"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Tasarı Yolu:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Tasarıyı Kur:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "Kur"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "Gözat"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Yeni Oyun Tasarısı"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "Yaşa BE!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Adsız Tasarı"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Birden fazla tasarı açmakta kararlı mısınız?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "Birden fazla tasarıyı çalıştırmaya kararlı mısınız?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+"Tasarıyı dizelgeden kaldırmak mı istiyorsunuz? (Dizin içeriği değiştirilmez)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+"Var olan Godot tasarıları için %s dizin taraması yapıyorsunuz. Onaylıyor "
+"musunuz?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Tasarı Yöneticisi"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "Tasarı Dizelgesi"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "Çalıştır"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "Tara"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Tarama için bir Dizin Seç"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "Yeni Tasarı"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "Çık"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "Dokunaç "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "Eğlence Düğmesi"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "Eğlence Ekseni"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "Fare Düğmesi"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Geçersiz işlem (her şey ancak şu '/' ya da şuna ':' gider)."
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "İşlem '%s' zaten var!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "Giriş İşlem Olayını Yeniden Adlandır"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "Giriş İşlem Olayı Ekle"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Denetim+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "Bir Dokunaca Basın.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "Fare Düğme Dizini:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "Sol Düğme"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "Sağ Düğme"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "Orta Düğme"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "Tekerlek Yukarı Düğmesi"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "Tekerlek Aşağı Düğmesi"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "Düğme 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "Düğme 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "Düğme 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "Düğme 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "Oyunçubuğu Ekseni Dizini:"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "Oyunçubuğu Düğme Dizini:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "Giriş Eylemi Ekle"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "Giriş Eylemi Olayını Sil"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "Ayarları kaydetme sorunu."
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "Ayarlar kaydedildi TAMAM."
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "Çeviri Ekle"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "Çeviriyi Kaldır"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "Yeniden Eşlenmiş Yol Ekle"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Kaynak Yeniden Eşleme Ekle Eşle"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "Kaynak Yeniden Eşleme Dilini Değiştir"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "Kaynak Yeniden Eşlemesini Kaldır"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Kaynak Yeniden Eşle Seçeneğini Kaldır"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "Tasarı Ayarları (godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Genel"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "Özellik:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "Sil"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "Düzleme Tıpkıla.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "Eşleme Gir"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "Eylem:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "Aygıt:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "Dizin:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "Yerelleştirme"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "Çeviriler"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "Çeviriler:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "Ekle.."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "Yeniden Eşlemeler"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "Kaynaklar:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "Yerel Ayara Göre Yeniden Eşlemeler:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "Yerel"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "KendindenYükle"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "Eklentiler"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "Ön ayar.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Açılma"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Kararma"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "Sıfır"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Açılma Kararma"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Kararma Açılma"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "Dizeç.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "Diz.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Yükle"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr "Ata"
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "Yeni Betik"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Dizeç yüklenirken sorun oluştu: Bir kaynak değil!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "Bediz yüklenemedi"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, val %d."
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "Açık"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "Özellikleri:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "Bölümler:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Nitelik Seç"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Yöntem Seç"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "PVRTC aracı çalıştırılamadı:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "PVRTC aracını kullanarak dönüştürülen bedizi geri yükleyemiyor:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Yeniden Ata Düğümü"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Yeniden Ata Konumu (Yeni Ata Seç):"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Bütünsel Dönüşümü Tut"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Yeniden Ata Yap"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "Yeni Kaynak Oluştur"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "Kaynak Aç"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "Kaynağı Kaydet"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "Kaynak Araçları"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr "Yerelleştir"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Çalışma Biçimi:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Şu anki Sahne"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Ana Sahne"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Ana Sahne Değiştirgenleri:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Sahne Çalıştırma Ayarları"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "Sahneleri örneklemek için ata yok."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "%s Adlı sahne yüklenirken sorun oluştu"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Tamam"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Geçerli sahne, düğümlerinden birinin içinde bulunduğu için '%s' sahnesi "
+"örneklenemiyor."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Sahne(leri) Örnekle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Bu işlem, ağaç kökü üzerinde yapılamaz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Düğümü Ataya Taşı"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Düğümleri Ataya Taşı"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "İkile Düğüm(leri)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "Düğüm(ler) Silinsin mi?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Bu işlem bir sahne olmadan yapılamaz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Bu işlem örneklenmiş sahnelerde yapılamaz."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "Yeni Sahneyi Başkaca Kaydet .."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "Anlamlı!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Yad bir sahnedeki düğümler üzerinde çalışamaz!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Geçerli sahneden kalıt aldığı düğümler üzerinde çalışamaz!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Düğümleri Kaldır"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Yeni sahne kaydedilemedi. Olası bağımlılıklar (örnekler) karşılanamadı."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Sahne kaydedilirken sorun oluştu."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Kaydetmek için sahne ikilenirken sorun oluştu."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "Öbekleri Düzenle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "Bağlantıları Düzenle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Düğümleri Sil"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Çocuk Düğüm Ekle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Çocuk Sahnesini Örnekle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Türü Değiştir"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Betik İliştir"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "Betiği Temizle"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Sahneden Birleştir"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "Dalı Sahne olarak Kaydet"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Sil (Doğrulama Yok)"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "Yeni Bir Düğüm Ekle / Oluştur"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Sahne dizecini Düğüm olarak örneklendirin. Kök düğüm yoksa kalıtsal bir "
+"sahne oluşturur."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "Seçili düğüm için yeni veya mevcut bir betik iliştir."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "Seçilen düğüm için betik temizle."
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "Uzaysal Görünürlüğü Aç / Kapat"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "CanvasItem'ı Görünür Duruma Getir"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Örnek:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Geçersiz düğüm adı, aşağıdaki damgalara izin verilmiyor:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Düğümü Yeniden Adlandır"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Sahne Ağacı (Düğümler):"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "Düzenlenebilir Çocuklar"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "Yer Tutucu Olarak Yükle"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr "Örneği Boşalt"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Düzenleyicide Aç"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "Kalıtı Temizle"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Kalıt Silinsin mi? (Geri Alınamaz!)"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "Temiz!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Bir Düğüm Seç"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "Geçersiz ata bölüt adı"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "Geçerli damgalar:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "Geçersiz bölüt adı"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "Uygun ad"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "Uygulanamaz"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "Bölüt adı geçersiz!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "Ata bölüt adı geçersiz!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "Geçersiz yol!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "Dizeç düzeninde betik oluşturulamadı."
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Yazı tipi %s yüklerken sorun oluştu"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "Yol boş"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "Yol yerel değil"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "Geçersiz üst yol"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "Geçersiz uzantı"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "Yeni Betik Oluştur"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "Var olan betiği yükle"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Bölüt Adı:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "Gömme Betik"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Düğüm Betiği İliştir"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Baytlar:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "Uyarı"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Sorun:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Kaynak:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "İşlev:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Sorunlar"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "Çocuk Süreç Bağlandı"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Önceki Örneği İncele"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Sonraki Örneğ İncele"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Çerçeveleri Yığ"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "Değişken"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "Sorunlar:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "İzi Yığ (uygulanabilirse):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "Dolaylı Denetçi"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "Canlı Sahne Ağacı:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "Dolaylı Nesne Özellikleri: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Kesitçi"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Görüntülük"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Değer"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Görüntülükler"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Kaynağa Göre İzleti Belleği Kullanımının Dizelgesi:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Toplam:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "İzleti Belleği"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Kaynak Yolu"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tür"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Kullanım"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Türlü"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Tıklanan Denetim:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tıklanan Denetim Türü:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Canlı Kök Düzenle:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Ağaçtan Ayarla"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Kısayollar"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Işın Çapını Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Kamera FOV'sunu Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Kamera Boyutunu Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Küresel Şeklin Çapını Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Kübik Şekli Genişlet"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Kapsülün Çapını Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Kapsülün Yüksekliğini Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Işın Şeklinin Uzunluğunu Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "Bildirim Kapsamını Değiştir"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "Bildirim Kapsamını Değiştir"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance, bir BakedLight kaynağı içermez."
+
+#~ msgid "Vertex"
+#~ msgstr "Başucu"
+
+#~ msgid "Fragment"
+#~ msgstr "Bölümlenme"
+
+#~ msgid "Lighting"
+#~ msgstr "Aydınlatma"
+
+#~ msgid "Toggle Persisting"
+#~ msgstr "Sürdürmeyi Aç/Kapat"
+
+#~ msgid "Global"
+#~ msgstr "Bütünsel"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr ""
+#~ "Ata gizli olduğu için bu öğe görünür hale getirilemiyor. Önce atayı "
+#~ "göster."
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "Yollar '/' ile başlayamaz, mutlak yollar 'res://', 'user://' veya "
+#~ "'local://' ile başlamalıdır"
+
+#~ msgid "File exists"
+#~ msgstr "Dosya mevcut"
+
+#~ msgid "Valid path"
+#~ msgstr "Geçerli yol"
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
new file mode 100644
index 0000000000..b898301d0c
--- /dev/null
+++ b/editor/translations/ur_PK.po
@@ -0,0 +1,6769 @@
+# Urdu (Pakistan) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Muhammad Ali <ali@codeonion.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-07-01 05:14+0000\n"
+"Last-Translator: Muhammad Ali <ali@codeonion.com>\n"
+"Language-Team: Urdu (Pakistan) <https://hosted.weblate.org/projects/godot-"
+"engine/godot/ur_PK/>\n"
+"Language: ur_PK\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.7-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+".استمال کیجۓ TYPE_* constants .کے لیے غلط ہیں convert() دیے گئے ارگمنٹس."
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "یا تو ڈیکوڈ کرنے کے لئے بائیٹس کم ہیں یا پھر ناقص فارمیٹ ھے."
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "سٹیپ کے ارگمنٹس سفر ہیں!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ".یہ انسٹینس کے بغیر سکرپٹ نہی ہوتی"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ".یہ سکرپٹ پر مبنی نہی ہے"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ".یہ ریسورس فائل پر مبنی نہی ہے"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Rename Function"
+msgstr ".تمام کا انتخاب"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Function"
+msgstr ".تمام کا انتخاب"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Signal"
+msgstr ".تمام کا انتخاب"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ".سب کچھ تسلیم ہوچکا ہے"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ".تمام کا انتخاب"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ".اینیمیشن کی کیز کو ڈیلیٹ کرو"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Remove Selection"
+msgstr ".تمام کا انتخاب"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "سائٹ:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ".سپورٹ"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "کمیونٹی"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "اثاثہ کی زپ فائل"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Not in resource path."
+msgstr ".یہ ریسورس فائل پر مبنی نہی ہے"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Move Favorite Up"
+msgstr "پسندیدہ اوپر منتقل کریں"
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Move Favorite Down"
+msgstr "پسندیدہ نیچے منتقل کریں"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Pick a Main Scene"
+msgstr "ایک مینو منظر چنیں"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "ایکشن منتقل کریں"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Move Mode"
+msgstr "ایکشن منتقل کریں"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Next script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Focus Selection"
+msgstr ".تمام کا انتخاب"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Align Selection With View"
+msgstr ".تمام کا انتخاب"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "نمونے"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ".نوٹفئر کے اکسٹنٹ کو تبدیل کیجیۓ"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr ".نوٹفئر کے اکسٹنٹ کو تبدیل کیجیۓ"
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
new file mode 100644
index 0000000000..47c77f6170
--- /dev/null
+++ b/editor/translations/zh_CN.po
@@ -0,0 +1,6953 @@
+# Chinese (China) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# 纯洁的坏蛋 <tqj.zyy@gmail.com>, 2016.
+# 孤月蓝风 <trlanfeng@foxmail.com>, 2016.
+# ageazrael <ageazrael@gmail.com>, 2016.
+# Bruce Guo <guoboism@hotmail.com>, 2016.
+# Geequlim <geequlim@gmail.com>, 2016-2017.
+# Luo Jun <vipsbpig@gmail.com>, 2016.
+# oberon-tonya <360119124@qq.com>, 2016.
+# wanfang liu <wanfang.liu@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2017-01-04 14:55+0000\n"
+"Last-Translator: Geequlim <geequlim@gmail.com>\n"
+"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/godot-"
+"engine/godot/zh_CN/>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "convert函数参数类型非法,请传入以“TYPE_”打头的常量。"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "没有足够的字节来解码或格式不正确。"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "step参数为0!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "脚本没有实例化"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr "没有基于脚本"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr "没有基于一个资源文件"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "实例字典格式不正确(缺少@path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "实例字典格式不正确(无法加载脚本@path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "实例字典格式不正确(无效脚本@path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "非法的字典实例(派生类非法)"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"一个节点在无工作内存的情况下被yielded,请阅读文档来查看如何适当的yield!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr "节点已yielded,但并没有在第一个工作内存中返回一个函数状态。"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr "节点工作内存的第一个节点的返回值必须已赋值!请修正你的节点。"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "节点返回了一个无效的连续输出: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr "在非堆栈中的节点中找到连续bit,报告bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "堆栈深度溢出: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "函数:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "变量:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "事件:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "名称不是有效的标识符:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "名称已经被其他的函数/变量/事件占用:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "重命名函数"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "重命名变量"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "重命名事件"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "添加函数"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "添加变量"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "添加事件"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "删除函数"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "删除变量"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "编辑变量:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "删除事件"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "编辑事件:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "更改表达式"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "添加节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr "按住Meta键放置一个Getter节点,按住Shift键放置一个通用签名。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr "按住Ctrl键放置一个Getter节点。按住Shift键放置一个通用签名。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr "按住Meta键放置一个场景节点的引用节点。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "按住Ctrl键放置一个场景节点的引用节点。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr "按住Meta键放置变量的Setter节点。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "按住Ctrl键放置变量的Setter节点。"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "添加Preload节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "从场景导入节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "添加 Getter Property"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "添加 Setter Property"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr "条件节点(Condition)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr "序列节点(Sequence)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr "选择节点(Switch)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr "遍历节点(Iterator)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr "条件循环节点(While)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr "返回节点(Return)"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr "调用到"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr "获取"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr "设置"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "编辑"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr "基础类型:"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr "成员:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr "有效节点:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr "选择或创建一个函数来编辑图"
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "关闭"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr "编辑事件参数:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr "编辑变量:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr "更改"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "删除选择的节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "设置断点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "查找节点类型"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "复制节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "剪切节点"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "粘贴节点"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "输入类型不可迭代: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "迭代器失效"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "迭代器失效: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "属性名称非法"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "基础对象不是一个节点!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "路径必须指向节点"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "节点%s的'%s'为无效索引属性名。"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ":无效参数类型: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ":无效参数: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "脚本中未找到VariableGet: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "脚本中未找到VariableSet: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr "自定义脚本节点不包含_step()方法,不能生成图。"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr "_step()的返回值无效,必须是整形(seq out)或字符串(error)。"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr "正好按下"
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr "刚好释放"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr "无法读取证书文件。路径和密码是否都正确?"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr "创建包(PCK)签名对象出错。"
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr "创建包(PCK)签名时出错。"
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+"找不到导出模版。\n"
+"下载并安装导出模版。"
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr "名称非法:"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "产品GUID非法。"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "发布GUID非法"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "无效的背景颜色。"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Logo图片尺寸无效(图像尺寸必须是50x50)。"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"SpriteFrames资源必须是通过AnimatedSprite节点的frames属性创建的,否则无法显示"
+"动画帧。"
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"每个场景中只允许有一个CanvasModulate类型的节点,场景中的第一个CanvasModulate"
+"节点能正常工作,其余的将被忽略。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D类型节点只能为CollisionObject2D的派生类提供碰撞形状数据,请"
+"将其放在Area2D、StaticBody2D、RigidBody2D或KinematicBody2D节点下。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "空的CollisionPolygon2D不起任何碰撞检测作用。"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D类型节点只能为CollisionObject2D的派生类提供碰撞形状数据,请将"
+"其放在Area2D、StaticBody2D、RigidBody2D或者是KinematicBody2D节点下。"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr "形状资源必须是通过CollisionShape2D节点的shape属性创建的!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "光照的形状与纹理必须提供给纹理属性。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr "此遮光体必须设置遮光形状才能起到遮光作用。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "此遮光体的遮光形状为空,请为其绘制一个遮光形状!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"请为此节点设置一个NavigationPolygon类型的资源作为形状,这样它才能正常工作。"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance类型的节点必须作为Navigation2D的子孙才能为其提供导航"
+"数据。"
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"ParallaxLayer类型的节点必须作为ParallaxBackground的子节点才能正常工作。"
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr "path属性必须指向一个合法的Particles2D节点才能正常工作。"
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr "PathFollow2D类型的节点只有放在Path2D节点下才能正常工作。"
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr "path属性必须指向一个合法的Node2D节点才能正常工作。"
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+"SampleLibrary类型的资源必须是通过SamplePlayer类型节点的samples属性创建的,这"
+"样的资源才能用于播放声音。"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+"Path属性必须指向一个合法的Viewport节点才能工作,同时此Viewport还需要启"
+"用'render target'。"
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+"为了让此精灵正常工作,它的path属性所指向的Viewport需要开启'render target'。"
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr "VisibilityEnable2D类型的节点用于场景的根节点才能获得最好的效果。"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape类型节点只能为CollisionObject的派生类提供碰撞形状数据,请将其放"
+"在Area、StaticBody、RigidBody或KinematicBody节点下。"
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"CollisionShape节点必须拥有一个形状才能进行碰撞检测工作,请为它创建一个形状资"
+"源!"
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon类型节点只能为CollisionObject的派生类提供碰撞形状数据,请将其"
+"放在Area、StaticBody、RigidBody或KinematicBody节点下。"
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "空CollisionPolygon节点不起碰撞检测作用。"
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr "此节点需要设置NavigationMesh资源才能工作。"
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance类型节点必须作为Navigation节点的子孙才能提供导航数据。"
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr "path属性必须指向一个合法的Spatial节点才能正常工作。"
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr "每个场景中只允许有一个WorldEnvironment类型的节点。"
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+"SampleLibrary类型的资源必须通过SpatialSamplePlayer节点的'samples'属性创建才能"
+"正常播放声音。"
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"SpriteFrame资源必须是通过AnimatedSprite3D节点的Frames属性创建的,否则无法显示"
+"动画帧。"
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "取消"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "好的"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "提示!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "请确认..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "文件已存在,确定要覆盖它吗?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "所有可用类型"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "所有文件(*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "打开"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "打开文件"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "打开文件"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "打开目录"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "打开文件或目录"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "保存"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "保存文件"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "新建目录"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "路径:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "目录|文件:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "文件:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "筛选:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "名称:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "无法创建目录。"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "必须使用合法的拓展名。"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "设备"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "按钮"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "左键"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "右键"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "中键(滚轮)"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "滚轮向上滚动"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "滚轮向下滚动"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr "轴"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "剪切"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "复制"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "粘贴"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "全选"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "清除"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "撤销"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+"Popup对象默认保持隐藏,除非你调用popup()方法。编辑时可以让它们保持可见,但运"
+"行时它们会自动隐藏。"
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"这个Viewport未设置为render target。如果你刻意打算让其直接在屏幕上显示其内容,"
+"使其成为子控件的所以它可以有一个尺寸大小值。否则请设置为Render target,并将其"
+"内部纹理分配给一些节点以显示。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr "初始化FreeType出错。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "未知的字体格式。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "加载字体出错。"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "字体大小非法。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "已禁用"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "所有选中项"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr "移动已添加关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr "修改过度效果"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr "修改变换"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr "修改动画值"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr "修改回调"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr "添加轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "复制关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr "上移轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr "下移轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr "移除轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr "设置过渡效果:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr "重命名轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr "轨道修改为插值模式"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr "轨道修改为值模式"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr "编辑节点曲线"
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr "编辑选项曲线"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "删除关键帧"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "复制选中项"
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "复制并转置"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "移除选中项"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr "连续"
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr "分离"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr "触发器"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr "添加关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr "移动关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr "缩放选中项"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr "通过光标缩放"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr "前往下一步"
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr "前往上一步"
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr "线性"
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "常量"
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr "缓入"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr "缓出"
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr "缓入缓出"
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr "反缓入缓出"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr "过渡"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr "优化动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "清理动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "为%s创建新轨道并插入关键帧?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "创建%d个新轨道并插入关键帧?"
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "创建"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "创建|插入动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "创建|插入 轨道和关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr "插入关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr "修改动画时长"
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr "修改动画循环"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr "创建输入值的动画关键帧"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr "插入动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "缩放键"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr "添加回调轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr "动画时间缩放"
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr "时长(秒):"
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr "动画时长(秒)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr "步长(秒)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr "步进吸附(秒)"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr "启用/禁用循环"
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr "新建轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr "上移当前轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr "下移当前轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr "移除选中轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr "轨道工具"
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr "允许通过单击启用各个键的编辑。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "优化动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "最大线性错误:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "最大角错误:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "调整最大的角度:"
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr "优化"
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr "在场景树中选择一个AnimationPlayer来编辑动画。"
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr "键"
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr "过渡"
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr "缩放比率"
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr "在那个节点中调用函数?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr "移除无效键"
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "移除未分解的空轨道"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr "清除所有动画"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "清除所有动画吗(无法撤销)?"
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr "清理"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "修改数组大小"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "修改数组类型"
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "修改数组值"
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr "搜索:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr "排序:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr "反选"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "分类:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "全部"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "站点:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr "支持.."
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "官方"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "社区"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "测试"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "ZIP资源包"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr "%s的方法列表"
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr "方法列表:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr "参数:"
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr "返回:"
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "转到行"
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "行号:"
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr "无匹配项"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr "替换了%d项"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "替换"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "全部替换"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "大小写匹配"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "全字匹配"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "仅选中"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "搜索"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "查找"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "下一项"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr "替换了%d项。"
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "未找到!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "替换"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "区分大小写"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr "向后"
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr "更换时提示"
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "跳过"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "放大"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "缩小"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "重置缩放"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr "行:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "列:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr "必须设置方法的对象节点!"
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr "连接到节点:"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "添加"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "移除"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "添加附加调用参数:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "额外调用参数:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr "节点路径:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr "创建方法"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "延时"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "单次"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "连接"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "连接'%s'到'%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "连接事件:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr "创建订阅"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "连接事件"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "删除事件连接"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "信号"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "新建"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "收藏:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "最近文件:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr "匹配项:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr "描述:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "搜索替换:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "依赖项:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr "场景%s已被修改,重新加载后生效。"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr "资源%s正在使用中,修改将在重新加载后生效。"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr "依赖"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "资源"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "路径"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "依赖:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "修复依赖"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "依赖编辑器"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "查找替换资源:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "拥有者:"
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr "要删除的文件被其他资源所依赖,仍然要删除吗(无法撤销)?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr "确定从项目中删除文件(此操作无法撤销)?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "加载出错:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr "加载场景失败,找不到以下依赖项目:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "仍然打开"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "应采取哪项行动?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "修复依赖项"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "加载出错!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "永久删除选中的%d条项目吗(此操作无法撤销!)?"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "拥有对象"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "没有指定所属关系的资源:"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr "查看孤立资源"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "删除选中的文件?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "删除"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "名称非法:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "字符合法:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr "名称非法,与引擎内置类型名称冲突。"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr "名称非法,与引擎内置类型名称冲突。"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr "名称非法,与已存在的全局常量名称冲突。"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "路径非法!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "文件不存在"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr "不在资源路径下"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "添加Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Autoload %s已存在!"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "移除Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "切换全局AutoLoad"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "移动Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "移除Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr "启用"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "重排序Autoload"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "节点名称:"
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "名称"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Singleton"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr "列表:"
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "更新场景"
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr "保存修改中.."
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "更新场景中.."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "选择目录"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "选择"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "后退"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "前进"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "上一级"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "刷新"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "切换显示隐藏文件"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "切换收藏"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "切换模式"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "设置路径焦点"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "向上移动收藏"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "向下移动收藏"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "预览"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "扫描源文件"
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "搜索帮助"
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr "类型列表"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr "搜索类型"
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr "类:"
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "基类:"
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "派生类:"
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr "简介:"
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr "公共方法:"
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr "GUI主题:"
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr "常量:"
+
+#: tools/editor/editor_help.cpp
+#, fuzzy
+msgid "Property Description:"
+msgstr "简介:"
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr "方法描述:"
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr "搜索文本"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr "已添加:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr "已移除:"
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr "保存贴图集出错:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr "无法保存精灵集子贴图:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr "文件排序:"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr "打包中"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr "正在导出 %s"
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr "配置.."
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr " 输出"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr "重新导入"
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "导入:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr "从场景导入节点"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr "保存资源出错!"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "资源另存为.."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "好吧.."
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "无法以可写模式打开文件:"
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "未知的文件类型请求:"
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "保存出错。"
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "正在保存场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "正在分析"
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "创建缩略图"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr "无法保存场景,依赖项(实例)验证失败。"
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr "加载资源失败。"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "无法加载要合并的MeshLibrary"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "保存MeshLibrary出错!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "无法加载要合并的砖块集!"
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "保存砖块集失败!"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr "无法打开ZIP导出模板"
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr "正在加载导出模板"
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "保存布局出错!"
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "覆盖编辑器默认布局。"
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "布局名称未找到!"
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "重置为默认布局设置。"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr "拷贝参数"
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr "粘贴帧"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "粘贴资源"
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr "拷贝资源"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr "使之内置"
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "使子资源唯一化"
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr "查看帮助"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "没有设置要执行的场景。"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+"尚未定义主场景。\n"
+"请在项目设置的application分类下设置选择主场景。"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"尚未定义主场景。\n"
+"请在项目设置的application分类下设置选择主场景。"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"选中的%s场景并非一个场景文件,请选择合法的场景。\n"
+"请在项目设置的application分类下设置选择主场景。"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr "当前场景尚未保存,请保存后再尝试执行。"
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "无法启动子进程!"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "打开场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "打开父场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr "快速打开场景.."
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr "快速打开脚本.."
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "是"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr "确定要关闭场景吗,未保存的修改将丢失?"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "场景另存为"
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "此场景尚未保存,要在运行之前保存它吗?"
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "请先保存场景。"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr "保存可翻译字符串"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "导出MeshLibrary"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "导出砖块集"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "退出"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "确定要退出编辑器吗?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "当前场景尚未保存,仍要打开?"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "无法重新加载未保存的场景。"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr "恢复"
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr "此操作无法撤销,确定要继续吗?"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr "快速运行场景"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr "退出到项目管理窗口(未保存的修改将丢失)?"
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "选择主场景"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr "额"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"加载场景出错,场景必须放在项目目录下。请尝试使用'导入'菜单导入此场景后再试。"
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr "加载场景出错。"
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "场景%s的依赖已被破坏:"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "保存布局"
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "删除布局"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "默认"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "切换场景标签页"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr "更多的%d个文件"
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr "更多的%d个文件或目录"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "前往上一个打开的场景。"
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr "下一项"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "上一个目录:"
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "操作场景文件。"
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "新建场景"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr "从现有场景中创建.."
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "打开场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "保存场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "保存所有场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "关闭场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr "关闭并前往上一个场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "最近打开"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr "快速筛选文件.."
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "转换为.."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr "可翻译字符串"
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr "MeshLibrary.."
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr "砖块集.."
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "重做"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "运行脚本"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr "项目设置"
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr "恢复场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "退出到项目列表"
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "无干扰模式"
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr "导入资源"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "导入"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "其他工程或全场景工具"
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "工具"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr "导出项目到多个平台。"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr "导出"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr "运行此项目(F5)"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr "播放"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr "暂停运行场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "暂停运行场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "停止运行场景"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr "停止"
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "打开并运行场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "运行场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "运行自定义场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "运行自定义场景"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr "调试选项"
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "部署远程调试"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+"导出或发布项目时,为了能够调试项目,可执行文件将试图通过本机IP连接到调试器。"
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr "发布基于网络文件系统的最小应用包"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+"当启用此项后,将在导出或发布项目时生成最小化可自行文件。\n"
+"文件系统将通过网络连接到编辑器来实现。\n"
+"在Android平台,通过USB发布能获得更快的效率。\n"
+"此选项用于加快游戏的测试。"
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "碰撞区域可见"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr "如果启用此项,节点的碰撞区域和raycast将在游戏运行时可见。"
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navigation可见"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr "如果启用此项,用于导航的mesh和多边形将在游戏运行时可见。"
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr "同步场景修改"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"开启此项后,在编辑器中对场景的所有修改都会被应用与正在运行的游戏中。\n"
+"当使用远程设备调试时,使用网络文件系统能有效提高编辑效率。"
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "同步脚本变更"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+"开启此项后,所有脚本在保存时都会被正在运行的游戏重新加载。\n"
+"当使用远程设备调试时,使用网络文件系统能有效提高编辑效率。"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "设置"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "编辑器设置"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "编辑器布局"
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "全屏模式"
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr "安装导出模板"
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "关于"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr "外部资源改变后弹出提示。"
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr "旋转时,重新绘制编辑器窗口!"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "持续更新UI"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "有更改时更新UI"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "属性面板"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "在内存中新建资源并编辑。"
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "从磁盘中加载资源并编辑。"
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr "保存当前编辑的资源。"
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "另存为"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr "前往上一个编辑对象。"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr "前往下一个编辑对象。"
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr "最近编辑历史对象。"
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr "对象属性。"
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "文件系统"
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr "节点"
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr "输出"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr "重新导入"
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr "更新"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr "感谢Godot社区"
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "谢谢!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "从ZIP文件中导入模板"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr "导出项目"
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr "导出库"
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "与现有合并"
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "密码"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "打开并运行脚本"
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "加载错误"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "已安装插件:"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr "版本"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr "作者"
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "状态"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr "停止"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr "开始"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "测量:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "帧时间(秒)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "平均帧时间(秒)"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "渲染速度"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr "物理速度"
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr "时间:"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "包含"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr "自身"
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "帧序号:"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr "扫描中,请稍后..."
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr "需要先保存当前场景才能重新导入。"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr "保存并重新导入"
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr "重新导入改变的资源"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "在_run()方中填写您的逻辑代码。"
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "已经存在一个正在编辑的场景。"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "无法实例化脚本:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "您是否遗漏了tool关键字?"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "无法执行脚本:"
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "您是否遗漏了_run()方法?"
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr "默认(与编辑器相同)"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "选择要导入的节点"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "场景路径:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "从节点中导入:"
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr "无法以可写方式打开file_type_cache.cch!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr "源文件和目标文件相同,操作忽略。"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr "源路径和目标路径相同,操作忽略。"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr "无法将目录移动到自身下。"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr "无法对'..'引用操作。"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr "选择新名称和路径:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr "没有选中任何文件!"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "创建实例节点"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr "编辑依赖.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr "查看所有者"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "拷贝路径"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr "移动或重命名"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr "移动"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr "信息"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr "在资源管理器中打开"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr "重新导入.."
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr "上一个目录:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr "下一个目录:"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "重新扫描文件系统"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr "收藏目录"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr "将选中的场景实例为选中节点的子节点。"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "移动"
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "添加到分组"
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "从分组中移除"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr "没有要导入的bit masks!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr "目标路径为空。"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr "目标路径必须是一个完整的资源文件路径。"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr "目标路径必须存在。"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr "保存路径为空!"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr "导入BitMask"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr "源贴图:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr "目标路径:"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr "接受"
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr "请设置源字体文件!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr "请设置目标字体资源!"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+"文件扩展名不合法\n"
+"请使用.fnt文件"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr "无法加载/处理源字体。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr "无法保存字体。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr "源字体文件:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr "源字体大小:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr "目标资源:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+"The quick brown fox jumps over the lazy dog.\n"
+"我能吞下玻璃而不伤身体。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr "测试:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr "选项:"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr "导入字体"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr "此文件已经是一个Godot的字体文件,请提供一个位图字体(BMFont)文件。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr "打开位图字体失败。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr "自定义字体文件非法。"
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "字体"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr "没有要导入的Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr "导入单个Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr "源Mesh:"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Mesh"
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr "没有音效要导入!"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr "导入声音文件"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr "源音效文件:"
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr "音效"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr "新片段"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr "动画选项"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr "标记"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr "烘培FPS:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr "优化"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr "最大线性误差"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr "最大角度误差"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr "最大角度"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr "片段"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr "起点"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr "终点"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "循环"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr "筛选"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr "源路径为空。"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr "无法载入后导入脚本"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr "后导入脚本被损坏或不合法"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr "导入场景出错。"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr "导入3D场景"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr "源场景:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr "与目标场景相同"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr "共享的"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr "目标贴图目录:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr "后处理脚本:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr "自定义根节点类型:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr "自动"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr "节点名称:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr "找不到下列文件:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr "仍然导入"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr "导入|打开"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr "正在编辑的场景尚未保存,仍然要打开导入的场景吗?"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "导入场景"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr "导入场景"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr "执行自定义脚本.."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr "无法载入后导入脚本:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "后处理脚本被损坏或不合法(查看控制台):"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr "后处理脚本运行发生错误"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr "导入图片:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr "不允许导入文件本身:"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr "无法本地化路径:%s (已经是本地路径)"
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr "保存中..."
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr "3D场景动画"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr "不压缩"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr "无损压缩(PNG)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr "有损压缩(WebP)"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr "VRAM压缩"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr "纹理格式"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr "高质量(WebP)压缩方式:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr "纹理选项"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr "请添加文件!"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr "精灵集至少需要一个文件。"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr "导入出错:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr "大图导入仅支持一个输入文件。"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr "最大纹理尺寸:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr "导入2D精灵集"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr "单元尺寸:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr "大图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr "导入2D大图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr "源贴图:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr "基础图集纹理"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr "源贴图:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr "导入2D贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr "导入3D贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr "导入贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr "2D贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr "3D贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr "精灵图集"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+"提示:大多数2D贴图并不需要导入操作,只要将png/jpg文件放到项目目录下即可。"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr "切除空白区域。"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr "贴图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr "导入大图"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr "加载源图片"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr "切片中"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr "插入中"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr "正在保存文件"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr "无法保存大图:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr "使用以下图片生成精灵集:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr "加载图片中:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr "无法加载图片:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr "正在转换图片"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr "剪裁图片"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr "无法保存精灵集图片:"
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr "无法保存转换的贴图:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr "输入源非法!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr "源语言文件非法!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr "列"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "语言:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr "没有要导入的项目!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr "目标路径为空!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr "导入多种语言翻译"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr "无法导入!"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr "导入语言翻译"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr "源CSV文件:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr "忽略第一行"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr "压缩"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr "添加到项目(godot.cfg)"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr "导入语言:"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr "语言"
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "多节点组"
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr "分组:"
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr "请选择一个节点来设置信号或分组。"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "切换AutoPlay"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "新动画名称:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "新建动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "重命名动画:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "移除动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr "错误:动画名不合法!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr "错误:已存在同名动画!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "重命名动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "添加动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "更改混合时间"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "加载动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "复制动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr "错误:没有拷贝的动画!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr "错误:剪切板中没有动画资源!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "已粘贴的动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "粘贴动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr "错误:没有选中要编辑的动画!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr "从当前位置倒放选中动画(A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "从结束时间倒放选中动画(Shift+A)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "停止动画回放。(S)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "从头播放选中动画(Shift+D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "从当前位置播放选中动画(D)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "动画位置(单位:秒)"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "节点全局缩放动画回放"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr "在播放中创建动画。"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr "从磁盘中加载动画。"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr "从磁盘中加载动画。"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr "保存当前动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "另存为"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "在播放器中显示动画列表。"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "加载后自动播放"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr "编辑目标混合时间"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "动画工具"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr "拷贝动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "创建新动画"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "动画名称:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "错误!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "混合时间:"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "接下来(自动排列):"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "跨动画时间混合"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr "动画"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr "新名称:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "缩放"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "淡入(秒)"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "淡出(秒)"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr "混合"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr "混合"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "自动重新开始:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "重新开始(秒):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "随机开始(秒):"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr "开始!"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "数量:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr "混合:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "混合0:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "混合1:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr "当前:"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr "添加输入事件"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "清除Auto-Advance"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "设置清除Auto-Advance"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "删除输入事件"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr "重命名"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "动画树可用。"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "动画树不可用。"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "动画节点"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "时间缩放节点"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "过渡节点"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr "导入动画"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "编辑节点筛选"
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr "筛选.."
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr "正在解析第%d个三角形:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr "三角形 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr "建立烘培:"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr "解析多边形中"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr "修正光照"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr "分配纹理 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr "烘培三角形 #"
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr "烘培!"
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr "预览"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "设置吸附"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "网格偏移量:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "网格大小:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "旋转偏移量:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "旋转步长:"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr "移动旋转中心位置"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr "移动动作"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr "编辑IK链"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr "编辑CanvasItem"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "编辑锚点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr "缩放(%)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "粘贴姿势"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "选择模式"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "拖动来旋转"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "按住Alt拖动: 移动"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr "按下V键修改旋转中心,在移动时按下Shift+V来拖动它。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+鼠标右键:显示鼠标点击位置下的所有节点列表"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "移动模式"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "旋转模式"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr "显示鼠标点击位置的所有节点(同Alt+鼠标右键)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "点击设置对象的旋转中心。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "移动画布"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "锁定选中对象的位置。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "解锁选中对象的位置。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "确保节点的子孙无法被选中。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "恢复节点的子孙能够被选中。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "使用吸附"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "显示网格"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "使用旋转吸附"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "相对吸附"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr "设置吸附.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "使用像素吸附"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr "展开父节点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr "骨骼.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr "添加骨骼"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "清除骨骼"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "显示骨骼"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "添加IK链"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "清除IK链"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "视图"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr "重置缩放"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr "设置缩放.."
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "居中显示选中节点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "最大化显示选中节点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr "锚点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr "插入关键帧"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "插入关键帧"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "插入关键帧(已有轨道)"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "拷贝姿势"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "清除姿势"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr "设置值"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr "吸附(像素):"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "添加 %s"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "新节点"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "从%s实例化场景出错!"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "好吧"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "没有选中节点来添加实例。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "此操作只能应用于单个选中节点。"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr "修改默认值"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr "创建多边形"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "编辑多边形"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "编辑多边形(移除顶点)"
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "确定要移除项目%d吗?"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr "添加项目"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "移除选中项目"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "从场景中导入"
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "从场景中更新"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "第%d项"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "项目"
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "列表编辑器"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "添加遮光多边形"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr "编辑已存在的多边形:"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr "鼠标左键:移动点"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr "Ctrl+鼠标左键:分割视图块"
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr "鼠标右键:移除点"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "Mesh为空!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "此操作无法引用在根节点上!"
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr "无法绘制区域。"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "选择源Mesh:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "选择一个目标曲面:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "目标曲面:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "源Mesh:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "X轴"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Y轴"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Z轴"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "随机旋转:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "随机砖块:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "随机缩放:"
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "创建导航多边形"
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr "移除多边形及顶点"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr "加载图片出错:"
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "生成顶点计数:"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "生成AABB"
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "从曲线中移除顶点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "向曲线添加顶点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "在曲线中移动顶点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "移动曲线内控制点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "移动曲线外控制点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "选择顶点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+拖拽:选择控制点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "鼠标左键:添加点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "鼠标右键:删除点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "选择控制点(Shift+拖动)"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "删除顶点"
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "关闭曲线"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "曲线定点 #"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr "设置曲线顶点坐标"
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "移除路径顶点"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "创建UV贴图"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "变换UV贴图"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "2D多边形UV编辑器"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr "移动点"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl:旋转"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: 移动所有"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: 缩放"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "移动多边形"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "旋转多边形"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "缩放多边形"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "多边形->UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->多边形"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "清除UV"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "吸附"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "启用吸附"
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "网格"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "错误:无法加载资源!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "添加资源"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "重命名资源"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "删除资源"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "资源剪切板中无内容!"
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "加载资源"
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr "解析BBCode"
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr "长度:"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr "打开声音文件"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr "错误:无法加载音效!"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr "添加音效"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr "重命名音效"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr "删除音效"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr "16位"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr "8位"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr "立体声"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "格式"
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "保存主题出错。"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "保存出错"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr "导入主题出错。"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr "导入出错"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "导入主题"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr "主题另存为"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "下一个脚本"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "上一个脚本"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "文件"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr "新建"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "全部保存"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "软重载脚本"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr "后退"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "前进"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "重新加载主题"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "保存主题"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr "主题另存为"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "关闭文档"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "关闭全部"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr "查找.."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr "查找下一项"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr "调试"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "单步跳过"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "单步进入"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "跳过"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "继续"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "保持调试器打开"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr "窗口"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr "向左移动"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr "向右移动"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr "教程"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr "打开 https://godotengine.org 中的教程."
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr "类型"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr "搜索类"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "搜索文档"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "前往上一个编辑文档"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "前往下一个编辑文档"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "创建脚本"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"磁盘中的下列文件已更新。\n"
+"请选择执行那项操作?:"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr "重新加载"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr "重新保存"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "调试器"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr "内建脚本只有在其所属的节点读取后才能被修改"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "拾取颜色"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "向上移动"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "向下移动"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "向左缩进"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "向右缩进"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "切换注释"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "拷贝到下一行"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "代码补全"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "修剪行后空白"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "自动缩进"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "移除所有断点"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr "前往下一个断点"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr "前往上一个断点"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr "查找上一项"
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr "替换.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr "前往函数.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr "前往行.."
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "搜索光标位置"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr "修改Scalar常量系数"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr "修改Vec常量系数"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr "修改RGB常量系数"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr "切换旋转模式"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr "修改Function Scalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr "修改Function Vec"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr "修改Uniform Scalar"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr "修改Uniform Vec"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr "修改Uniform RGB"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr "修改默认值"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr "修改Uniform XForm"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr "修改Uniform纹理"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr "修改Uniform Cubemap"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr "修改注释"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr "更改输入名称"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr "连接Graph Node"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr "断开Graph Node连接"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr "移除Graph Node节点"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr "移动Graph Node节点"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr "复制Graph Node节点"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr "删除Graph Node节点"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr "错误:循环的连接"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr "错误:缺少输入连接"
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr "添加着色器Graph Node"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "正交"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "透视"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "已忽略变换。"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "X轴变换。"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Y轴变换。"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Z轴变换。"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr "缩放到%s%%"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "旋转%s度"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr "环境"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "XForm对话框"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr "没有选用要实例化的场景!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr "无法实例化场景!"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr "移动模式(W)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr "旋转模式(E)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr "缩放模式(R)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Top视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Rear视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "正面视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "左视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "右视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr "切换投影(正交)视图"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "插入动画帧"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "显示原点"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "选中选中项"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr "选中项与视图对齐"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr "变换"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr "本地坐标"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr "变换对话框.."
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr "使用默认光照"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr "使用默认sRGB"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1个视口"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2个视口"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2个视口(Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3个视口(Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3个视口(Alt)"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4个视口"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "显示法线"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "显示线框"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "显示原点"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "显示网格"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Viewport设置"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr "默认光照法线:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr "环境光颜色:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "透视视角(角度):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "查看Z-Near"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "查看Z-Far"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "修改变换"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "移动:"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "旋转(角度):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "缩放(比率):"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "变换类型"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "错误:无法加载帧资源!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "添加帧"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "资源剪切板中无内容,或内容不是纹理贴图!"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "粘贴帧"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "添加空白帧"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "修改循环"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "修改FPS"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(空)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr "动画"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr "速度(FPS)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr "动画帧"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "插入空白帧(之前)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "插入空白帧(之后)"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr "向上"
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr "向下"
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr "StyleBox预览:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "吸附模式:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr "无"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "像素吸附"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "网格吸附"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "自动裁剪"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "网格偏移量:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "步长(秒)"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr "分隔:"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr "纹理区域"
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr "纹理区域编辑器"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr "无法保存主题到文件:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "添加所有项目"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "添加所有"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "移除项目"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "主题"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "添加类项目"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "移除类项目"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "创建主题模板"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "创建编辑器主题模板"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr "复选框 选项1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr "复选框 选项2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "选项"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "分页1"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "分页2"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "分页3"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr "类型:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "数据类型:"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr "图标"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr "样式"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "颜色"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "绘制砖块地图"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "拷贝"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "擦除砖块地图"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr "擦除选中"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr "查找砖块"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "转置"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr "沿X轴翻转"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr "沿Y轴翻转"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "选择砖块"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "选择"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr "旋转0度"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr "旋转90度"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr "旋转180度"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr "旋转270度"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr "找不到砖块:"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr "项目名称或ID"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr "从场景中创建?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "确定要合并场景?"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "从场景中创建"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "从场景中合并"
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr "错误"
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "脚本编辑器选项"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr "请导出到项目目录之外!"
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr "导出项目出错!"
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr "写入项目PCK文件出错!"
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr "没有针对'%s'平台的导出模板。"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "创建资源"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "名称可用"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "过渡"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "State"
+msgstr "状态"
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "密码"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "字符合法:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "新名称:"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "包含"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr "修改图片分组"
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr "分组名称不能为空!"
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr "分组名称中包含非法字符!"
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr "分组名称已存在!"
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr "添加图片分组"
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr "删除图片分组"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr "预览精灵集"
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr "项目导出设置"
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "平台"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr "导出到平台"
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "资源"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr "导出选中的资源(包括其依赖资源)"
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr "导出项目中的所有资源"
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr "导出项目目录下的所有文件"
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "导出模式:"
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr "导出的资源:"
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "动作"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr "导出非资源文件筛选(使用英文逗号分隔,如:*.json,*.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr "排除导出的非资源文件筛选(使用英文逗号分隔,如:*.json,*.txt):"
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr "导出时将文本场景写入二进制文件。"
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "图片"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "保持原样"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr "节省磁盘空间(有损压缩,WebP)"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr "节省内存(BC/PVRTC/ETC)"
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr "转换图片(*.png):"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr "高质量(有损)节省磁盘空间"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr "收缩所有图片:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr "压缩格式:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr "图片分组"
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr "分组:"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr "节省磁盘空间"
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr "节省内存"
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr "压缩方式:"
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr "图片质量:"
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr "精灵集:"
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr "收缩方式:"
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr "精灵集预览:"
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr "纹理过滤:\t\t"
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "图片"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "取消选择"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr "分组"
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr "音效"
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr "音效转换方式(.wav文件):"
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "保持不变"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr "压缩(RAM - IMA-ADPCM)"
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr "采样率(Hz):"
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr "修剪"
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "脚本"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "脚本导出方式:"
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "文本"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr "编译"
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "使用下列密码加密"
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "脚本密匙(256位16进制码)"
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "导出 PCK/ZIP"
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr "导出项目PCK文件"
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr "导出.."
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr "项目导出"
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr "导出预设"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr "项目目录不存在!"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr "项目目录下必须包含engin.cfg文件。"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr "项目目录下必须包含engin.cfg文件。"
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "已导入的项目"
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "项目路径非法(被外部修改?)。"
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr "无法在项目目录下创建godot.cfg文件。"
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "提取以下文件失败:"
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "导入现有项目"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr "项目目录(必须存在)"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "项目名称:"
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "新建项目"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "项目目录"
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "安装项目:"
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr "安装"
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "浏览"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "新建游戏项目"
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr "碉堡了!"
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "未命名项目"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "您确定要打开多个项目吗?"
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr "您确定要执行多个项目吗?"
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr "移除此项目(项目的文件不受影响)"
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr "您确认要扫描%s目录下现有的Godot项目吗?"
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "项目管理器"
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr "项目列表"
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "运行"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr "扫描"
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "选择要扫描的目录"
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr "新建"
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "退出"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr "键 "
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr "手柄按钮"
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr "摇杆轴"
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr "鼠标按键:"
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr "Action名非法(不得包含'/'或':')"
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr "动作%s已存在!"
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr "重命名输入事件"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr "添加输入事件"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr "Ctrl+"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr "按下一个键.."
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr "鼠标按键:"
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr "左键"
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr "右键"
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr "中键"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr "滚轮向上"
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr "滚轮向下"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr "按键 6"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr "按键 7"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr "按键 8"
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr "按键 9"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr "手柄摇杆"
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr "手柄按钮"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr "添加输入动作"
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr "移除输入事件"
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr "保存设置出错。"
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr "保存设置成功。"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr "添加语言"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr "移除语言"
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr "添加重定向路径"
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr "添加资源重定向"
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr "修改语言资源重定向"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr "移除资源重定向"
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr "移除资源重定向选项"
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr "项目设置(godot.cfg)"
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "一般"
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr "属性:"
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr "删除"
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr "复制到平台.."
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr "事件表"
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr "动作:"
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr "设备:"
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr "序号:"
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "本地化"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "语言"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "语言:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "添加:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr "重定向"
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr "资源:"
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr "地区重定向:"
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr "地区"
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr "AutoLoad"
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "插件"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr "预设.."
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr "缓入"
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "缓出"
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr "置零"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "缓入缓出"
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "反缓入缓出"
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr "文件.."
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr "目录.."
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "加载"
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr "新建脚本"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "加载文件出错:不是资源文件!"
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr "无法加载图片"
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr "启用"
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr "属性:"
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr "选项:"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr "选择属性"
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr "选择方式"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr "无法执行PVPTC工具:"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr "无法加载使用PVRTC工具转换的图片:"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "重设父节点"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "重设位置(选择父节点)"
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "保持全局变换"
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "重设父节点"
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr "创建资源"
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr "打开资源"
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr "保存资源"
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr "资源工具"
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "运行模式:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "当前场景"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "主场景"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "主场景参数:"
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "场景运行设置"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "没有选中节点来添加实例。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "从%s加载场景出错!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "好的"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr "无法实例化场景%s当前场景已存在于它的子节点中。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "实例化场景"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "此操作不能被用于根节点。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "在父节点中移动"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "在父节点中移动多个节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "复制节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr "确定要删除节点吗?"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "此操作必须在打开一个场景后才能执行。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "此操作不能应用于实例化的场景。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr "将新场景另存为.."
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr "有道理!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "无法操作外部场景的节点!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "无法操作此节点,因为当前场景继承自该节点!"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "移除节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr "无法保存场景,场景或其实例的的依赖存在问题。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "保存场景出错。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "复制场景出错。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr "编辑分组"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr "编辑事件连接"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "删除节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "添加子节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "实例化子场景"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "更改类型"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "添加脚本"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr "清除脚本"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "从场景中合并"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr "将分支保存为场景"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "确认删除"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr "添加/创建节点"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr "实例化场景文件为一个节点,如果没有根节点则创建一个继承自该文件的场景。"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr "为选中节点创建或设置脚本"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr "清除选中节点的脚本"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr "切换Spatial可见"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr "切换CanvasItem可见"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "实例:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "节点名称非法,不允许包含以下字符:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "重命名节点"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "场景树:"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr "允许编辑子孙节点"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr "加载为占位符"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "在编辑器中打开"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr "清除继承"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "确定要清除继承吗(无法撤销!)?"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr "清除!"
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "选择一个节点"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr "基类名称非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr "合法的字符:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr "类名非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "名称可用"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr "类名非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr "基类名称非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr "路径非法!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr "无法创建脚本。"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "从%s加载脚本出错!"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "文件路径为空"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr "必须是项目路径"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr "父路径非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "扩展名非法"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr "创建新脚本"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr "加载现有脚本"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "类名:"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr "内置脚本"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "设置节点的脚本"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "字节:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr "警告:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "错误:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "源:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr "函数:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "错误"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr "子进程已连接"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "编辑上一个实例"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "编辑下一个实例"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr "变量"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "错误:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr "调用堆栈:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr "远程属性面板"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr "即时场景树:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr "远程对象属性: "
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "性能分析"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "显示"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "值"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "显示"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "占用显存的资源列表:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "合计:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "显存"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "资源路径"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "类型"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "用量"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "杂项"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "点击的控件:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "点击的控件类型:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "实时编辑根节点:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "从场景树设置"
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "快捷键"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "设置光照半径"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "更改摄像机视角"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "修改摄像机尺寸"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "更改球体半径"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "改变方框大小"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "更改胶囊半径"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "更改胶囊高度"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "更改射线形状长度"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr "更改通知器级别"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "更改通知器级别"
+
+#~ msgid "BakedLightInstance does not contain a BakedLight resource."
+#~ msgstr "BakedLightInstance未包含BakedLight资源。"
+
+#~ msgid "Vertex"
+#~ msgstr "顶点"
+
+#~ msgid "Fragment"
+#~ msgstr "片段"
+
+#~ msgid "Lighting"
+#~ msgstr "光照"
+
+#~ msgid "Global"
+#~ msgstr "全局"
+
+#~ msgid ""
+#~ "This item cannot be made visible because the parent is hidden. Unhide the "
+#~ "parent first."
+#~ msgstr "无法显示此节点,请先取消隐藏其父节点。"
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "路径不能以'/'符号打头,绝对路径必须以'res://'、'user://'或者'local://'打头"
+
+#~ msgid "File exists"
+#~ msgstr "文件已存在"
+
+#~ msgid "Valid path"
+#~ msgstr "路径可用"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "无法打开目录:"
+
+#~ msgid "Help"
+#~ msgstr "帮助"
+
+#~ msgid "Imported Resources"
+#~ msgstr "已导入的资源"
+
+#~ msgid "Insert Keys (Ins)"
+#~ msgstr "插入关键帧( 创建轨道)"
+
+#~ msgid "Perspective (Num5)"
+#~ msgstr "透视(Num5)"
+
+#~ msgid "Orthogonal (Num5)"
+#~ msgstr "正交(Num5)"
+
+#~ msgid "Selection (F)"
+#~ msgstr "选中项(F)"
+
+#, fuzzy
+#~ msgid "Change Anim Loop Interpolation"
+#~ msgstr "修改动画循环"
+
+#, fuzzy
+#~ msgid "Enable/Disable interpolation when looping animation."
+#~ msgstr "启用/禁用循环"
+
+#~ msgid "Load Layout"
+#~ msgstr "加载布局"
+
+#~ msgid "Scale Region Editor"
+#~ msgstr "缩放区域编辑"
+
+#~ msgid ""
+#~ "No texture in this node.\n"
+#~ "Set a texture to be able to edit region."
+#~ msgstr "此节点没有贴图,请先为它设置贴图后再试。"
+
+#~ msgid "New Scene Root"
+#~ msgstr "创建场景根节点"
+
+#~ msgid "Inherit Scene"
+#~ msgstr "继承场景"
+
+#~ msgid "Binds (Extra Params):"
+#~ msgstr "绑定(附加参数):"
+
+#~ msgid "Method In Node:"
+#~ msgstr "节点方法:"
+
+#~ msgid "Reload Tool Script (Soft)"
+#~ msgstr "重新加载Tool脚本(Soft)"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "编辑事件连接"
+
+#~ msgid "Set Params"
+#~ msgstr "设置参数"
+
+#~ msgid "Live Editing"
+#~ msgstr "实时编辑"
+
+#~ msgid "File Server"
+#~ msgstr "文件服务"
+
+#~ msgid "Deploy File Server Clients"
+#~ msgstr "部署文件服务客户端"
+
+#~ msgid "Group Editor"
+#~ msgstr "分组编辑"
+
+#~ msgid "Node Group(s)"
+#~ msgstr "节点分组"
+
+#~ msgid "Set region_rect"
+#~ msgstr "设置纹理区域"
+
+#~ msgid "Plugin List:"
+#~ msgstr "插件列表"
+
+#~ msgid "Keep Existing, Merge with New"
+#~ msgstr "保留已有,与新的合并。"
+
+#~ msgid "Keep Existing, Ignore New"
+#~ msgstr "保留已有,忽略新的。"
+
+#~ msgid ""
+#~ "NOTICE: You are not forced to import textures for 2D projects. Just copy "
+#~ "your .jpg or .png files to your project, and change export options later. "
+#~ "Atlases can be generated on export too."
+#~ msgstr ""
+#~ "注意:对于大多数2D纹理图片,一般不需要导入操作。只需要将.jpg或.png文件放到"
+#~ "项目目录下,并存导出选项即可。精灵集也可以在导出时生成。"
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
new file mode 100644
index 0000000000..b0bb11d527
--- /dev/null
+++ b/editor/translations/zh_HK.po
@@ -0,0 +1,6812 @@
+# Chinese (Honk Kong) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-09-05 13:21+0000\n"
+"Last-Translator: zx-wt <ZX_WT@ymail.com>\n"
+"Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/"
+"godot-engine/godot/zh_HK/>\n"
+"Language: zh_HK\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.8\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Functions:"
+msgstr "行為"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr "訊號:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Rename Function"
+msgstr "只限選中"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Function"
+msgstr "行為"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "新增訊號"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Function"
+msgstr "只限選中"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Remove Signal"
+msgstr "只限選中"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Editing Signal:"
+msgstr "連接"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "新增節點"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Add Preload Node"
+msgstr "新增節點"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "由主幹新增節點"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr "編輯"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr "關閉"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Change"
+msgstr "當改變時更新"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "刪除選中檔案"
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
+msgid "Paste Nodes"
+msgstr "貼上"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid unique name."
+msgstr "無效名稱"
+
+#: platform/uwp/export/export.cpp
+#, fuzzy
+msgid "Invalid product GUID."
+msgstr "無效字型"
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr "取消"
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr "OK"
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "警告!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "請確認..."
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "檔案已存在, 要覆蓋嗎?"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr "所有類型"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr "所有檔案(*)"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr "開啟"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "開啟檔案"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "開啟檔案"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "開啟資料夾"
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "選擇資料夾/檔案"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr "儲存"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr "儲存檔案"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr "新增資料夾"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr "路徑:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "資料夾和檔案:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr "檔案:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr "篩選:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr "名稱:"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr "無法新增資料夾"
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "請用有效的副檔名"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr "Shift+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr "Alt+"
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr "Ctrl+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr "Meta+"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr "設備"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr "按鍵"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr "左𨫡"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr "右𨫡"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr "中𨫡"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr "上滾"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr "下滾"
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#, fuzzy
+msgid "Axis"
+msgstr "中軸"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr "剪下"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr "複製"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr "貼上"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr "全選"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr "清空"
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr "復原"
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr "字形格式不明"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr "載入字形出現錯誤"
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr "無效字型"
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr "已停用"
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr "所有選項"
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Move Add Key"
+msgstr "移動"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Remove Anim Track"
+msgstr "移除動畫"
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr "移除選項"
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#, fuzzy
+msgid "Discrete"
+msgstr "中斷"
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "新增"
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr "分類:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "全部"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "地址:"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "官方"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "社群"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "測試"
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr "替換"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr "全部替換"
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr "符合大小寫"
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr "完整詞語"
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "只限選中"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr "搜尋"
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr "查找"
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr "下一個"
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr "找不到!"
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr "替換為"
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr "符合大小寫"
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr "跳過"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr "放大"
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr "縮小"
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "重設縮放比例"
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Line:"
+msgstr "行:"
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr "列:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#, fuzzy
+msgid "Connect To Node:"
+msgstr "連到"
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr "添加"
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr "移除"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "連到"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "由 '%s' 連到 '%s'"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr "連接訊號:"
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr "連到..."
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "中斷"
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr "訊號"
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr "新增"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "最近:"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#, fuzzy
+msgid "Matches:"
+msgstr "吻合"
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "資源"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr "路徑"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "載入錯誤:"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr "照常開啓"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "載入錯誤!"
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr "要刪除選中檔案?"
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "刪除"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "無效名稱"
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Valid characters:"
+msgstr "有效字符:"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr "有效的路徑"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr "檔案不存在."
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#, fuzzy
+msgid "Enable"
+msgstr "啟用"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr "名稱"
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr "正在更新場景..."
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "選擇資料夾"
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "選擇"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr "重新整理"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Move Favorite Up"
+msgstr "上移"
+
+#: tools/editor/editor_file_dialog.cpp
+#, fuzzy
+msgid "Move Favorite Down"
+msgstr "下移"
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr "預覽:"
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr "導入中:"
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr "把資源另存為..."
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr "如來如此"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "儲存時出現錯誤"
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "場景儲存中"
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "分析中"
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Creating Thumbnail"
+msgstr "正在建立縮圖"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Failed to load resource."
+msgstr "資源加載失敗"
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Open in Help"
+msgstr "開啓場景"
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr "開啓場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr "是"
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr "把場景另存為"
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr "請先儲存場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr "離開"
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "要離開編輯器嗎?"
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "選擇主場景"
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr "預設"
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr "場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#, fuzzy
+msgid "Next tab"
+msgstr "下一個"
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr "新增場景"
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr "開啓場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "儲存場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr "儲存所有場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "關閉場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr "開啓最近的"
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr "轉為..."
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr "重製"
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr "運行腳本"
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr "導入"
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr "工具"
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "暫停場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "運行修改的場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "運行場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "運行場景"
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr "同步更新腳本"
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr "設定"
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "編輯器設定"
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr "關於"
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr "不停更新"
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr "當改變時更新"
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr "監視器"
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr "另存為.."
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr "多謝!"
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr "密碼:"
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "場景路徑:"
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "複製路徑"
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr "語言"
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr "另存為"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr "錯誤!"
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "選擇模式"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "移動模式"
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr "OK :("
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "下一個腳本"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr "檔案"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close Docs"
+msgstr "關閉場景"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Close All"
+msgstr "關閉"
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr "上移"
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr "下移"
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Focus Selection"
+msgstr "只限選中"
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr "選項"
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "複製"
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr "編輯腳本選項"
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Create Android keystore"
+msgstr "新增資料夾"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Full name"
+msgstr "有效名稱"
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Organization"
+msgstr "本地化"
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "Password"
+msgstr "密碼:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "at least 6 characters"
+msgstr "有效字符:"
+
+#: tools/editor/project_export.cpp
+#, fuzzy
+msgid "File name"
+msgstr "有效名稱"
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr "包括"
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr "目標"
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr "資源"
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr "行為"
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr "圖片"
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr "保持原貌"
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr "圖片:"
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr "不選"
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr "保留"
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr "腳本"
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr "文字"
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr "瀏覽"
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr "運行"
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr "離開"
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr "本地化"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr "翻譯"
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr "翻譯:"
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr "添加..."
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr "插件"
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+#, fuzzy
+msgid "New Script"
+msgstr "下一個腳本"
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Property"
+msgstr "選擇模式"
+
+#: tools/editor/property_selector.cpp
+#, fuzzy
+msgid "Select Method"
+msgstr "選擇模式"
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr "Ok"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Attach Script"
+msgstr "腳本"
+
+#: tools/editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Clear Script"
+msgstr "下一個腳本"
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr "有效名稱"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Error loading script from %s"
+msgstr "載入字形出現錯誤"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr "路徑為空"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr "無效副檔名"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Create new script"
+msgstr "新增"
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Load existing script"
+msgstr "下一個腳本"
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Attach Node Script"
+msgstr "下一個腳本"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "錯誤:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "來源:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "錯誤"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr "錯誤:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Live Scene Tree:"
+msgstr "儲存場景"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#~ msgid "File exists"
+#~ msgstr "檔案已存在"
+
+#~ msgid "Valid path"
+#~ msgstr "有效路徑"
+
+#~ msgid "Cannot go into subdir:"
+#~ msgstr "無法進入次要資料夾"
+
+#~ msgid "Edit Connections.."
+#~ msgstr "編輯連接"
+
+#~ msgid "Live Editing"
+#~ msgstr "即時編輯"
+
+#~ msgid "Plugin List:"
+#~ msgstr "插件列表:"
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
new file mode 100644
index 0000000000..3e9b61ec0f
--- /dev/null
+++ b/editor/translations/zh_TW.po
@@ -0,0 +1,6774 @@
+# Chinese (Taiwan) translation of the Godot Engine editor
+# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+#
+# popcade <popcade@gmail.com>, 2016.
+# Sam Pan <sampan66@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2016-10-23 19:47+0000\n"
+"Last-Translator: Sam Pan <sampan66@gmail.com>\n"
+"Language-Team: Chinese (Taiwan) <https://hosted.weblate.org/projects/godot-"
+"engine/godot/zh_TW/>\n"
+"Language: zh_TW\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: modules/gdscript/gd_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "解碼字節位元不足,或為無效格式。"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "step argument is zero!"
+msgstr "step引數為0!"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Not a script with an instance"
+msgstr "非為單一事件腳本"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not based on a script"
+msgstr "未依據腳本"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Not based on a resource file"
+msgstr "未依據資源檔案"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "無效的事件詞典格式(遺失 @path)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr "無效的事件詞典格式(無法載入腳本 @path)"
+
+#: modules/gdscript/gd_functions.cpp
+#, fuzzy
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "無效的事件詞典格式(無效的腳本 @path)"
+
+#: modules/gdscript/gd_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr "回傳值需被指定為運算記憶體節點的第一要素!請修正該節點。"
+
+#: modules/visual_script/visual_script.cpp
+#, fuzzy
+msgid "Node returned an invalid sequence output: "
+msgstr "節點回傳一個無效的連續輸出: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Signals:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Meta to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Condition"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Switch"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Iterator"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "While"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Return"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+msgid "Call"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Get"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/property_editor.cpp
+msgid "Set"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Edit"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/editor_help.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp tools/editor/call_dialog.cpp
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+#: tools/editor/run_settings_dialog.cpp tools/editor/settings_config_dialog.cpp
+msgid "Close"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just pressed"
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "just released"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"Couldn't read the certficate file. Are the path and password both correct?"
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the signature object."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Error creating the package signature."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid ""
+"No export templates found.\n"
+"Download and install export templates."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom debug package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Custom release package not found."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid unique name."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr ""
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr "SpriteFrames資源必須在Frames屬性中被創建或設置才能夠顯示動畫格。"
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"每個場景中僅允許一個可見的CanvasModulate,只有第一個CanvasModulate會有作用,"
+"其餘的將被忽略。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D只能為CollisionObject2D衍生的節點提供碰撞形狀資訊,請將其使"
+"用於Area2D、StaticBody2D、RigidBody2D、KinematicBody2D這類的節點下。"
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "空白的CollisionPolygon2D不起碰撞偵測的作用。"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D只能為CollisionObject2D衍生的節點提供碰撞形狀資訊,請將其使用"
+"於Area2D、StaticBody2D、RigidBody2D、KinematicBody2D這類的節點下。"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr "CollisionShape2D必須被賦予形狀才能運作,請為它建立個形狀吧!"
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr "光照形狀的材質必須被賦與在材質的屬性中。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr "此遮光體必須被建立或設置遮蔽形狀才能發揮遮蔽作用。"
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr "此遮光體沒有被賦予形狀,請繪製一個吧!"
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid "Path property must point to a valid Particles2D node to work."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/sample_player_2d.cpp scene/audio/sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport "
+"must be set to 'render target' mode."
+msgstr ""
+
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in "
+"order for this sprite to work."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Cancel"
+msgstr ""
+
+#: scene/gui/dialogs.cpp tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Open"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "File:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Filter:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Name:"
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_dir_dialog.cpp
+#: tools/editor/editor_file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: scene/gui/file_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: scene/gui/input_action.cpp
+msgid "Ctrl+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Meta+"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Device"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Button"
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Left Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Right Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: scene/gui/input_action.cpp tools/editor/project_settings.cpp
+msgid "Axis"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Cut"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Copy"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/resources_dock.cpp
+msgid "Paste"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Select All"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_log.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Clear"
+msgstr ""
+
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Undo"
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Disabled"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "All Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Value"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Up"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move Anim Track Down"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Set Transitions to:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Rename"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Interpolation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Track Change Value Mode"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Node Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Edit Selection Curve"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Next Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Goto Prev Step"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "In-Out"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Out-In"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transitions"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/project_manager.cpp tools/editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Len"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Change Anim Loop"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Create Typed Value Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim Add Call Track"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation zoom."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Length (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Animation length (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Step (s):"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Cursor step snap (in seconds)."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable/Disable looping in animation."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Add new tracks."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track up."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Move current track down."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove selected track."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Track tools"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Enable editing of individual keys by clicking them."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Select an AnimationPlayer from the Scene Tree to edit animations."
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Key"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Transition"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Call Functions in Which Node?"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: tools/editor/animation_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: tools/editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp tools/editor/create_dialog.cpp
+#: tools/editor/editor_help.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+#: tools/editor/settings_config_dialog.cpp
+msgid "Search:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Sort:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Category:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Support.."
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: tools/editor/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List For '%s':"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Method List:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Arguments:"
+msgstr ""
+
+#: tools/editor/call_dialog.cpp
+msgid "Return:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "No Matches"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d Ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Match Case"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Search"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
+msgid "Find"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Next"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replaced %d ocurrence(s)."
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Not found!"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Replace By"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Case Sensitive"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Backwards"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Prompt On Replace"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Skip"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
+msgid "Line:"
+msgstr ""
+
+#: tools/editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/editor_autoload_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp
+msgid "Add"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Remove"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connecting Signal:"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Create Subscription"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+msgid "Connect.."
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: tools/editor/connections_dialog.cpp tools/editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp
+msgid "Create New"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+#: tools/editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_selector.cpp tools/editor/quick_open.cpp
+msgid "Matches:"
+msgstr ""
+
+#: tools/editor/create_dialog.cpp tools/editor/editor_help.cpp
+#: tools/editor/property_selector.cpp tools/editor/script_editor_debugger.cpp
+msgid "Description:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_autoload_settings.cpp
+#: tools/editor/project_manager.cpp tools/editor/project_settings.cpp
+msgid "Path"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Scene failed to load due to missing dependencies:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
+#: tools/editor/filesystem_dock.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Name"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: tools/editor/editor_autoload_settings.cpp
+msgid "List:"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Storing local changes.."
+msgstr ""
+
+#: tools/editor/editor_data.cpp
+msgid "Updating scene.."
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: tools/editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: tools/editor/editor_file_dialog.cpp
+msgid "Preview:"
+msgstr ""
+
+#: tools/editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Class List:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Classes"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/property_editor.cpp
+msgid "Class:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Public Methods:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "GUI Theme Items:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Property Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Method Description:"
+msgstr ""
+
+#: tools/editor/editor_help.cpp
+msgid "Search Text"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Added:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Removed:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp tools/editor/project_export.cpp
+msgid "Error saving atlas:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Could not save atlas subtexture:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Exporting for %s"
+msgstr ""
+
+#: tools/editor/editor_import_export.cpp
+msgid "Setting Up.."
+msgstr ""
+
+#: tools/editor/editor_log.cpp
+msgid " Output:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Importing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Importing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Node From Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "I see.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Loading Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in later in \"Project Settings\" under the "
+"'application' category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Open Script.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close scene? (Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Please save the scene first."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Translatable Strings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Run Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Open Project Manager? \n"
+"(Unsaved changes will be lost)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp tools/editor/script_create_dialog.cpp
+msgid "Ugh"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Error loading scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Default"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "%d more file(s) or folder(s)"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "New Inherited Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Scene.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save all Scenes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Close Goto Prev. Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quick Filter Files.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Convert To.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Translatable Strings.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "MeshLibrary.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "TileSet.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Redo"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Run Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import assets to the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Tools"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export the project to many platforms."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Play"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stop"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Debug options"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Install Export Templates"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Alerts when an external resource has changed."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save As.."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Object properties."
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/node_dock.cpp
+msgid "Node"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Output"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/editor_plugin_settings.cpp
+msgid "Update"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Thanks!"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: tools/editor/editor_node.cpp tools/editor/project_export.cpp
+msgid "Password:"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: tools/editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Version:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Author:"
+msgstr ""
+
+#: tools/editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Stop Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Start Profiling"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Fixed Frame %"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp tools/editor/script_editor_debugger.cpp
+msgid "Time:"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: tools/editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Please wait for scan to complete."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Current scene must be saved to re-import."
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Save & Re-Import"
+msgstr ""
+
+#: tools/editor/editor_reimport_dialog.cpp
+msgid "Re-Import Changed Resources"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: tools/editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: tools/editor/editor_settings.cpp
+msgid "Default (Same as Editor)"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: tools/editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: tools/editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination files, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Same source and destination paths, doing nothing."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't move directories to within themselves."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Can't operate on '..'"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Pick New Name and Location For:"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "No files selected!"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Edit Dependencies.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "View Owners.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Rename or Move.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move To.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Info"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Show In File Manager"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Import.."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Toggle folder status as Favorite"
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: tools/editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: tools/editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "No bit masks to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must be a complete resource path."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Target path must exist."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Save path is empty!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Import BitMasks"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "Target Path:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Accept"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_bitmask_import_plugin.cpp
+msgid "Bit Mask"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No source font file!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "No target font resource!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"Invalid file extension.\n"
+"Please use .fnt."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Can't load/process source font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Couldn't save font."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Source Font Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Dest Resource:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "The quick brown fox jumps over the lazy dog."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Test:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Options:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Font Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Failed opening as BMFont file."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid "Invalid font custom source."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "No meshes to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Single Mesh Import"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Source Mesh(es):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
+msgid "Surface %d"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "No samples to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Import Audio Samples"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Source Sample(s):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+msgid "Audio Sample"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "New Clip"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Animation Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Flags"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Bake FPS:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Optimizer"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Linear Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angular Error"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Max Angle"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Clips"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Start(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "End(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Filters"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source path is empty."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error importing scene."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import 3D Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Source Scene:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Same as Target Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Shared"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Target Texture Folder:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Post-Process Script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Custom Root Node Type:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Auto"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Root Node Name:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "The Following Files are Missing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Anyway"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import & Open"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Edited scene has not been saved, open imported scene anyway?"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Importing Scene.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Running Custom Script.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Import Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Can't import a file over itself:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Couldn't localize path: %s (already local)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "Saving.."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+msgid "3D Scene Animation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Uncompressed"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossless (PNG)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress Lossy (WebP)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Compress (VRAM)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Format"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Compression Quality (WebP):"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture Options"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Please specify some files!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "At least one file needed for Atlas."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Error importing:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Only one file is required for large texture."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Max Texture Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for Atlas (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cell Size:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Textures (2D)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Base Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Source Texture(s)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 2D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures for 3D"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Textures"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "2D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "3D Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Atlas Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to "
+"the project."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Crop empty space."
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Import Large Texture"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Load Source Image"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Slicing"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Inserting"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Saving"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save large texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Build Atlas For:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Loading Image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't load image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Converting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Cropping Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Blitting Images"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save atlas image:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid "Couldn't save converted texture:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Invalid translation source!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Column"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No items to import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "No target path!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translations"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Couldn't import!"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Translation"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Source CSV:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Ignore First Row"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Compress"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Add to Project (godot.cfg)"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Import Languages:"
+msgstr ""
+
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+msgid "Translation"
+msgstr ""
+
+#: tools/editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: tools/editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Invalid animation name!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: Animation name already exists!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to copy!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation resource on clipboard!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "ERROR: No animation to edit!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create new animation in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load an animation from disk."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save the current animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save As"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Target Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Copy Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Rename"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Import Animations.."
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+msgid "Filters.."
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing %d Triangles:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Light Baker Setup:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Parsing Geometry"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Fixing Lights"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Making BVH"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Light Octree"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Creating Octree Texture"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Transfer to Lightmaps:"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Allocating Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Baking Triangle #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_baker.cpp
+msgid "Post-Processing Texture #"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Bake!"
+msgstr ""
+
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
+msgid "Reset the lightmap octree baking process (start over)."
+msgstr ""
+
+#: tools/editor/plugins/camera_editor_plugin.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Preview"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Pivot"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Action"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Edit CanvasItem"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom (%):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Expand to Parent"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Zoom Set.."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchor"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Keys"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Set a Value"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap (Pixels):"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "OK :("
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create a new polygon from scratch."
+msgstr ""
+
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Poly3D"
+msgstr ""
+
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+msgid "Add/Remove Color Ramp Point"
+msgstr ""
+
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Creating Mesh Library"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Thumbnail.."
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: tools/editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Edit existing polygon:"
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "LMB: Move Point."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Ctrl+LMB: Split Segment."
+msgstr ""
+
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "RMB: Erase Point."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh.."
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: tools/editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+msgid "Remove Poly And Point"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image.."
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Set Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Mesh"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter From Node"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Clear Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Positions:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Fill:"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Surface"
+msgstr ""
+
+#: tools/editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Pos"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: tools/editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Point"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+msgid "Parse BBCode"
+msgstr ""
+
+#: tools/editor/plugins/sample_editor_plugin.cpp
+msgid "Length:"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Open Sample File(s)"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "ERROR: Couldn't load sample!"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Add Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Rename Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Delete Sample"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "16 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "8 Bits"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Stereo"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Mono"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Error importing"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/project_export.cpp
+msgid "File"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/property_editor.cpp
+msgid "New"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Prev"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find.."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Next"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Debug"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Window"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Left"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Move Right"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Tutorials"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Open https://godotengine.org at tutorials section."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Classes"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the class hierarchy."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Up"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp tools/editor/scene_tree_dock.cpp
+msgid "Move Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Next Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Previous Breakpoint"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Replace.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Goto Function.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+msgid "Goto Line.."
+msgstr ""
+
+#: tools/editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Constant"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Scalar Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Operator"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Toggle Rot Only"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Function"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Scalar Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Vec Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change RGB Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Default Value"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change XForm Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Texture Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Cubemap Uniform"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Comment"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Color Ramp"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add/Remove to Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Modify Curve Map"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Change Input Name"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Connect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Disconnect Graph Nodes"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Remove Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Move Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Duplicate Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Delete Shader Graph Node(s)"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Cyclic Connection Link"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Error: Missing Input Connections"
+msgstr ""
+
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+msgid "Add Shader Graph Node"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling to %s%%."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Environment"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "No scene selected to instance!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Instance at Cursor"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Could not instance scene!"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog.."
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default Light"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Default sRGB"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Shadeless"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Default Light Normal:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Ambient Light Color:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: tools/editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Up"
+msgstr ""
+
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Down"
+msgstr ""
+
+#: tools/editor/plugins/style_box_editor_plugin.cpp
+msgid "StyleBox Preview:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "<None>"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Separation:"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region"
+msgstr ""
+
+#: tools/editor/plugins/texture_region_editor_plugin.cpp
+msgid "Texture Region Editor"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp tools/editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Have,Many,Several,Options!"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/project_settings.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Style"
+msgstr ""
+
+#: tools/editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase selection"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 0 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 90 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 180 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate 270 degrees"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Could not find tile:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Item name or ID:"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Edit Script Options"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Please export outside the project folder!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error exporting project!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Error writing the project PCK!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "No exporter for platform '%s' yet."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Create Android keystore"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Full name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organizational unit"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Organization"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "City"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "State"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "2 letter country code"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "User alias"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "at least 6 characters"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "File name"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Path : (better to save outside of project)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Release keystore is not set.\n"
+"Do you want to create one?"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Fill Keystore/Release User and Release Password"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Include"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Change Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name can't be empty!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Invalid character in group name!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group name already exists!"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Add Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Delete Image Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas Preview"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export Settings"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Target"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export to Platform"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export selected resources (including dependencies)."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all resources in the project."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export all files in the project directory."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Resources to Export:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Action"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert text scenes to binary on export."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep Original"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy, WebP)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for RAM (BC/PVRTC/ETC)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Convert Images (*.png):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress for Disk (Lossy) Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink All Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Formats:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Groups"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Groups:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Disk"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress RAM"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Lossy Quality:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Atlas:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Shrink By:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Preview Atlas"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Image Filter:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Images:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Select None"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Group"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Samples"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sample Conversion Mode: (.wav files):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Keep"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compress (RAM - IMA-ADPCM)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Sampling Rate Limit (Hz):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trim"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Trailing Silence:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Project PCK"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export.."
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Project Export"
+msgstr ""
+
+#: tools/editor/project_export.cpp
+msgid "Export Preset:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, the path must exist!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must not exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path, godot.cfg must exist."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Couldn't create godot.cfg in project path."
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Package Installed Successfully!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path (Must Exist):"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Install"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "That's a BINGO!"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: tools/editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Key "
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Invalid action (anything goes but '/' or ':')."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "Press a Key.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Left Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Right Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 6"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 7"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 8"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Button 9"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Axis Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Joystick Button Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Project Settings (godot.cfg)"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Del"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Copy To Platform.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Input Map"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Action:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Device:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Index:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Localization"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Translations:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Add.."
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Resources:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Locale"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: tools/editor/project_settings.cpp
+msgid "Plugins"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Preset.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "File.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Dir.."
+msgstr ""
+
+#: tools/editor/property_editor.cpp tools/editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Couldn't load image"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "On"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Properties:"
+msgstr ""
+
+#: tools/editor/property_editor.cpp
+msgid "Sections:"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: tools/editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: tools/editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Create New Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Open Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Save Resource"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Resource Tools"
+msgstr ""
+
+#: tools/editor/resources_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: tools/editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Ok"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save New Scene As.."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Makes Sense!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Groups"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Edit Connections"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle Spatial Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Toggle CanvasItem Visible"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Discard Instancing"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Clear!"
+msgstr ""
+
+#: tools/editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid parent class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid chars:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Valid name"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Parent class name is invalid!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid path!"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Could not create script in filesystem."
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Create new script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Load existing script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Built-In Script"
+msgstr ""
+
+#: tools/editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Warning"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Function:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Variable"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Errors:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Stack Trace (if applicable):"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Inspector"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Scene Tree:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Remote Object Properties: "
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Monitors"
+msgstr "監看畫面"
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "List of Video Memory Usage by Resource:"
+msgstr "影片記憶體使用容量列表(依資源別):"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "總計:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr "影片記憶體"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "資源路徑"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "類型"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "使用量"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "雜項"
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Clicked Control:"
+msgstr "點擊控制:"
+
+#: tools/editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Clicked Control Type:"
+msgstr "點擊控制類型:"
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: tools/editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: tools/editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "捷徑"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "變更光源半徑"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "變更鏡頭視野(FOV)"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "變更鏡頭尺寸"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "變更球型半徑"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "變更框型範圍"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "變更楕圓體半徑"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "變更楕圓體高度"
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier Extents"
+msgstr ""
+
+#: tools/editor/spatial_editor_gizmos.cpp
+#, fuzzy
+msgid "Change Probe Extents"
+msgstr "變更框型範圍"
+
+#~ msgid ""
+#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
+#~ "'user://', or 'local://'"
+#~ msgstr ""
+#~ "路徑不可以\"/\"為起始,完整路徑需以'res://'、'user://'、或 'local://'做為"
+#~ "起始"